diff --git a/src/config.ts b/src/config.ts index 3afb100..1cb6321 100644 --- a/src/config.ts +++ b/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 = ()=>{ diff --git a/src/gdscript/definitionprovider.ts b/src/gdscript/definitionprovider.ts index 188cd3b..d4ffd21 100644 --- a/src/gdscript/definitionprovider.ts +++ b/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 diff --git a/src/gdscript/hoverprovider.ts b/src/gdscript/hoverprovider.ts index 6fec187..3aa18b8 100644 --- a/src/gdscript/hoverprovider.ts +++ b/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]; } }; diff --git a/src/gdscript/symbolparser.ts b/src/gdscript/symbolparser.ts index 4fa4d3d..3a347cd 100644 --- a/src/gdscript/symbolparser.ts +++ b/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; } diff --git a/src/gdscript/symbolprovider.ts b/src/gdscript/symbolprovider.ts index 6bc5ea1..3c1f710 100644 --- a/src/gdscript/symbolprovider.ts +++ b/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; } diff --git a/src/gdscript/workspace_symbol_provider.ts b/src/gdscript/workspace_symbol_provider.ts index f21efe9..c6ac550 100644 --- a/src/gdscript/workspace_symbol_provider.ts +++ b/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; }