UNPKG

plaxtony

Version:

Static code analysis of SC2 Galaxy Script

56 lines (45 loc) 1.77 kB
import { SourceFile, NamedDeclaration, Node, SyntaxKind } from '../compiler/types'; import { forEachChild } from '../compiler/utils'; import { fuzzysearch } from './utils'; import { AbstractProvider } from './provider'; function collectDeclarations(sourceFile: SourceFile): NamedDeclaration[] { let declarations: NamedDeclaration[] = []; function registerDeclaration(node: NamedDeclaration) { declarations.push(node); } function visitNode(node: Node) { if ( node.kind === SyntaxKind.VariableDeclaration || node.kind === SyntaxKind.FunctionDeclaration || node.kind === SyntaxKind.StructDeclaration ) { registerDeclaration(<NamedDeclaration>node); } if (node.kind === SyntaxKind.SourceFile) { forEachChild(node, child => visitNode(child)); } } visitNode(sourceFile); return declarations; } export class NavigationProvider extends AbstractProvider { public getDocumentSymbols(uri: string): NamedDeclaration[] { const sourceFile = this.store.documents.get(uri); if (!sourceFile) return []; return collectDeclarations(sourceFile); } public getWorkspaceSymbols(query?: string): NamedDeclaration[] { let declarations: NamedDeclaration[] = []; outer: for (const document of this.store.documents.values()) { for (const decl of collectDeclarations(document)) { if (!query || fuzzysearch(query, decl.name.name)) { declarations.push(decl); if (declarations.length >= 1000) { break outer; } } } } return declarations; } }