Browse Source

parse named enunmerations

geequlim 8 years ago
parent
commit
25afaedfb3

+ 2 - 0
src/config.ts

@@ -169,6 +169,8 @@ class Config {
         items = [...items, ...addScriptItems(script.variables, CompletionItemKind.Variable, "Variable")];
         items = [...items, ...addScriptItems(script.signals, CompletionItemKind.Interface, "Signal")];
         items = [...items, ...addScriptItems(script.constants, CompletionItemKind.Enum, "Constant")];
+        if(script.enumerations)
+          items = [...items, ...addScriptItems(script.enumerations, CompletionItemKind.Enum, "Enumeration")];
       }
 
       const addSceneNodes = ()=>{

+ 2 - 0
src/gdscript/definitionprovider.ts

@@ -54,6 +54,8 @@ class GDScriptDefinitionProivder implements DefinitionProvider {
                     scriptitems = [...scriptitems, ...checkDifinition(script.functions)];
                     scriptitems = [...scriptitems, ...checkDifinition(script.signals)];
                     scriptitems = [...scriptitems, ...checkDifinition(script.classes)];
+                    if(script.enumerations)
+                        scriptitems = [...scriptitems, ...checkDifinition(script.enumerations)];
                     locations = [...locations, ...scriptitems];
                 }
                 // check from builtin

+ 2 - 0
src/gdscript/hoverprovider.ts

@@ -70,6 +70,8 @@ class GDScriptHoverProvider implements HoverProvider {
                 scriptips = [...scriptips, ...getHoverText(script.functions, 'func', path)];
                 scriptips = [...scriptips, ...getHoverText(script.signals, 'signal', path)];
                 scriptips = [...scriptips, ...getHoverText(script.classes, 'class', path)];
+                if(script.enumerations)
+                    scriptips = [...scriptips, ...getHoverText(script.enumerations, 'const', path)];
                 tips = [...tips, ...scriptips];
             }
         };

+ 33 - 6
src/gdscript/symbolparser.ts

@@ -13,7 +13,8 @@ interface GDScript {
   // symbol: marked string
   documents: {},
   // name : value
-  constvalues: {}
+  constvalues: {},
+  enumerations: {}
 }
 
 class GDScriptSymbolParser {
@@ -31,7 +32,8 @@ class GDScriptSymbolParser {
         native: "Object",
         signatures: {},
         documents: {},
-        constvalues: {}
+        constvalues: {},
+        enumerations: {}
     }
     const text  = content;
     const lines = text.split(/\r?\n/);
@@ -172,14 +174,39 @@ class GDScriptSymbolParser {
         script.constvalues[key] = match[2];
     }
     
-    let classnames = getMatches(/class\s+([_A-Za-z]+[_A-Za-z0-9]*)\s*extends\s+/, 1);
-    const classes = findLineRanges(classnames, "class\\s+$X$\\s*extends\\s+");
+    let classnames = getMatches(/class\s+([_A-Za-z]+[_A-Za-z0-9]*)(\s|\:)/, 1);
+    const classes = findLineRanges(classnames, "class\\s+$X$(\\s|\\:)");
     for (let key of Object.keys(classes)) {
       const r:Range = determRange(key, classes)
-      script.classes[key] = determRange(key, classes);
+      script.classes[key] = r;
       script.documents[key] = parseDocument(r);
     }
-    // console.log(script);
+
+    let enumnames = getMatches(/enum\s+([_A-Za-z]+[_A-Za-z0-9]*)\s+\{/, 1);
+    const enums = findLineRanges(enumnames, "enum\\s+$X$\\s+\{");
+    for (let key of Object.keys(enums)) {
+      const r:Range = determRange(key, enums)
+      script.constants[key] = r;
+      script.documents[key] = parseDocument(r);
+      
+      let curindex = r.start.line
+      while (curindex < lines.length) {
+        const line = lines[curindex];
+        let matchs = line.match(/([_A-Za-z]+[_A-Za-z0-9]*)/g);
+        if(matchs && matchs.length >= 1 ){
+          for (var i = 0; i < matchs.length; i++)
+            if(line.indexOf(matchs[i]) > line.indexOf("{"))
+              script.enumerations[matchs[i]] = new Range(curindex, 0, curindex, line.length);
+        }
+        if(line.indexOf("}") == -1)
+          curindex += 1;
+        else
+          break;
+      }
+    }
+    // TODO: enumerations without name
+    // const unnamedEnums = text.match(/enum\s+\{.*\}/gm)
+
 
     return script;
   }

+ 6 - 0
src/gdscript/symbolprovider.ts

@@ -48,6 +48,12 @@ class GDScriptSymbolProvider implements DocumentSymbolProvider {
     for (let key of Object.keys(classes))
       symbols.push(new SymbolInformation(key, SymbolKind.Class, classes[key]));
     
+    if(script.enumerations) {
+      const enumerations = script.enumerations;
+      for (let key of Object.keys(enumerations))
+        symbols.push(new SymbolInformation(key, SymbolKind.Enum, enumerations[key]));
+    }
+
     return symbols;
   }
 

+ 2 - 0
src/gdscript/workspace_symbol_provider.ts

@@ -30,6 +30,8 @@ class GDScriptWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider
         queryMembers(query, scrip.variables, vscode.SymbolKind.Variable, path);
         queryMembers(query, scrip.constants, vscode.SymbolKind.Constant, path);
         queryMembers(query, scrip.classes, vscode.SymbolKind.Class, path);
+        if(scrip.enumerations)
+          queryMembers(query, scrip.enumerations, vscode.SymbolKind.Enum, path);
       }
       return symbols;
     }