parse named enunmerations

This commit is contained in:
geequlim
2017-05-23 22:43:43 +08:00
parent 39c642ae82
commit 25afaedfb3
6 changed files with 47 additions and 6 deletions

View File

@@ -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 = ()=>{

View File

@@ -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

View File

@@ -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];
}
};

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}