workspace_symbol_provider.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import * as vscode from 'vscode';
  2. import config from '../config';
  3. class GDScriptWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
  4. public provideWorkspaceSymbols(query: string, token: vscode.CancellationToken): vscode.SymbolInformation[] {
  5. const scripts = config.getAllSymbols();
  6. const symbols: vscode.SymbolInformation[] = [];
  7. for (let path of Object.keys(scripts)) {
  8. const queryMembers = (query, members, kind: vscode.SymbolKind, path:string, extra=(text)=>text)=> {
  9. for (let name of Object.keys(members)) {
  10. const range: vscode.Range = members[name];
  11. if(name.toLowerCase().indexOf(query.toLowerCase()) != -1) {
  12. const symbol: vscode.SymbolInformation = {
  13. name: extra(name),
  14. kind,
  15. containerName: "",
  16. location: {
  17. uri: vscode.Uri.file(path),
  18. range
  19. }
  20. };
  21. symbols.push(symbol);
  22. }
  23. }
  24. }
  25. const scrip = scripts[path];
  26. const signatures = scrip.signatures;
  27. queryMembers(query, scrip.functions, vscode.SymbolKind.Function, path, (name)=>(name+signatures[name]));
  28. queryMembers(query, scrip.signals, vscode.SymbolKind.Interface, path, (name)=>(name+signatures[name]));
  29. queryMembers(query, scrip.variables, vscode.SymbolKind.Variable, path);
  30. queryMembers(query, scrip.constants, vscode.SymbolKind.Constant, path);
  31. queryMembers(query, scrip.classes, vscode.SymbolKind.Class, path);
  32. if(scrip.enumerations)
  33. queryMembers(query, scrip.enumerations, vscode.SymbolKind.Enum, path);
  34. }
  35. return symbols;
  36. }
  37. }
  38. export default GDScriptWorkspaceSymbolProvider;