diff --git a/src/extension.ts b/src/extension.ts index 7299975..e77a49f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,7 +8,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( vscode.languages.registerDocumentSymbolProvider( - {language: "swmf-config"}, + {scheme: "file", language: "swmf-config"}, new SwmfConfigDocumentSymbolProvider() ) ); @@ -18,45 +18,73 @@ class SwmfConfigDocumentSymbolProvider implements vscode.DocumentSymbolProvider public provideDocumentSymbols( document: vscode.TextDocument, - token: vscode.CancellationToken): Thenable + token: vscode.CancellationToken): Promise { - return new Promise((resolve, reject) => { - var symbols = []; + return new Promise((resolve, reject) => + { + let symbols: vscode.DocumentSymbol[] = []; + let nodes = [symbols] + let inside_marker = false + let inside_run = false + let inside_cmd = false for (var i = 0; i < document.lineCount; i++) { var line = document.lineAt(i); - var marker - if (line.text.startsWith("#BEGIN_COMP")) { - let marker_symbol = { - name: line.text.substr(1,13), - kind: vscode.SymbolKind.Namespace, - location: new vscode.Location(document.uri, line.range) + let marker_symbol = new vscode.DocumentSymbol( + line.text.substr(1,13), + 'Marker', + vscode.SymbolKind.Class, + line.range, line.range) + + + nodes[nodes.length-1].push(marker_symbol) + if (!inside_marker) { + nodes.push(marker_symbol.children) + inside_marker = true } - marker = marker_symbol + // marker_symbol.children.push(_boot) + } + else if (line.text.startsWith("#END_COMP")) { + // TODO check if nodes has length 1 before popping. + if (inside_marker) { + nodes.pop() + inside_marker = false + } + } + else if (line.text.startsWith("#RUN") || line.text.startsWith("#END")) { + let run_symbol = new vscode.DocumentSymbol( + line.text.substr(1,4), + 'Session', + vscode.SymbolKind.Subroutine, + line.range, line.range) + + if (inside_run) { + nodes.pop() + } + + nodes[nodes.length-1].push(run_symbol) + nodes.push(run_symbol.children) + inside_run = true } else if (line.text.startsWith("#")) { - let boo = line.text.substr(1) + let marker_symbol = new vscode.DocumentSymbol( + line.text.substr(1,13).toLowerCase(), + 'Command', + vscode.SymbolKind.Constructor, + line.range, line.range) - symbols.push({ - name: boo, - kind: vscode.SymbolKind.Module, - location: new vscode.Location(document.uri, line.range) - }) - } - else { - let boo = line.text - var regex = /^[1-9]\d{0,2}$/g - regex.test("2") - symbols.push({ - name: boo, - kind: vscode.SymbolKind.Variable, - location: new vscode.Location(document.uri, line.range) - }) + + nodes[nodes.length-1].push(marker_symbol) + // nodes.push(marker_symbol.children) + // marker_symbol.children.push(_boot) + inside_cmd = true } } + // Need this otherwise the outline view just says + // "Loading document symbols for ..." forever. resolve(symbols); }); }