{"version":3,"sources":["browser/workspace-symbol-command.ts"],"names":[],"mappings":"AACA,OAAO,EACH,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACH,iBAAiB,EAEjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEH,iBAAiB,EACjB,aAAa,EACb,UAAU,EACb,MAAM,4CAA4C,CAAC;AAIpD,OAAO,EAAkB,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAC,eAAe,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAE5E,qBACa,sBAAuB,YAAW,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,cAAc,EAAE,uBAAuB;IACtK,gBAAuB,MAAM,OAAO;IACX,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAC5C,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC7C,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IACtD,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACvE,OAAO,CAAC,OAAO,CAGZ;IAEH,SAAS,IAAI,OAAO;IAIpB,OAAO,IAAI,IAAI;IAIf,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAIjD,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAO7C,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAO1D,2BAA2B,IAAI,IAAI;IAS7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAkC7E,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,aAAa;IAmCxI,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS;IAQxF,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,OAAO;CAKlB;AAED,aAAK,UAAU;IACX,IAAI,IAAI;IACR,MAAM,IAAI;IACV,SAAS,IAAI;IACb,OAAO,IAAI;IACX,KAAK,IAAI;IACT,MAAM,IAAI;IACV,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,WAAW,IAAI;IACf,IAAI,KAAK;IACT,SAAS,KAAK;IACd,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb,QAAQ,KAAK;IACb,MAAM,KAAK;IACX,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,KAAK,KAAK;IACV,MAAM,KAAK;IACX,GAAG,KAAK;IACR,IAAI,KAAK;IACT,UAAU,KAAK;IACf,MAAM,KAAK;IACX,KAAK,KAAK;IACV,QAAQ,KAAK;IACb,aAAa,KAAK;CACrB","file":"../../src/browser/workspace-symbol-command.d.ts","sourcesContent":["import {inject, injectable} from 'inversify';\r\nimport {\r\n    KeybindingContribution,\r\n    KeybindingRegistry,\r\n    LabelProvider,\r\n    OpenerService,\r\n    QuickAccessContribution,\r\n    QuickAccessProvider,\r\n    QuickAccessRegistry\r\n} from '@tartjs/core';\r\nimport {\r\n    CancellationToken,\r\n    Command,\r\n    CommandContribution,\r\n    CommandHandler,\r\n    CommandRegistry,\r\n    MenuContribution,\r\n    MenuModelRegistry,\r\n    SelectionService\r\n} from '@tartjs/core/lib/common';\r\nimport {\r\n    findMatches,\r\n    QuickInputService,\r\n    QuickPickItem,\r\n    QuickPicks\r\n} from '@tartjs/core/lib/common/quick-pick-service';\r\nimport {nls} from '@tartjs/core/lib/common/nls';\r\nimport {WorkspaceSymbolParams} from 'vscode-languageserver-protocol';\r\nimport URI from '@tartjs/core/lib/common/uri';\r\nimport {Position, Range, SymbolInformation} from 'vscode-languageserver-types';\r\nimport {MonacoLanguages, WorkspaceSymbolProvider} from './monaco-languages';\r\n\r\n@injectable()\r\nexport class WorkspaceSymbolCommand implements QuickAccessProvider, CommandContribution, KeybindingContribution, MenuContribution, CommandHandler, QuickAccessContribution {\r\n    public static readonly PREFIX = '#';\r\n    @inject(MonacoLanguages) protected readonly languages: MonacoLanguages;\r\n    @inject(OpenerService) protected readonly openerService: OpenerService;\r\n    @inject(QuickInputService) protected quickInputService: QuickInputService;\r\n    @inject(QuickAccessRegistry) protected quickAccessRegistry: QuickAccessRegistry;\r\n    @inject(SelectionService) protected selectionService: SelectionService;\r\n    @inject(LabelProvider) protected readonly labelProvider: LabelProvider;\r\n    private command = Command.toDefaultLocalizedCommand({\r\n        id: 'languages.json.workspace.symbol',\r\n        label: 'Go to Symbol in Workspace...'\r\n    });\r\n\r\n    isEnabled(): boolean {\r\n        return this.languages.workspaceSymbolProviders !== undefined;\r\n    }\r\n\r\n    execute(): void {\r\n        this.quickInputService.open(WorkspaceSymbolCommand.PREFIX);\r\n    }\r\n\r\n    registerCommands(commands: CommandRegistry): void {\r\n        commands.registerCommand(this.command, this);\r\n    }\r\n\r\n    registerMenus(menus: MenuModelRegistry): void {\r\n        // menus.registerMenuAction(EditorMainMenu.WORKSPACE_GROUP, {\r\n        //     commandId: this.command.id,\r\n        //     order: '2'\r\n        // });\r\n    }\r\n\r\n    registerKeybindings(keybindings: KeybindingRegistry): void {\r\n        keybindings.registerKeybinding({\r\n            command: this.command.id,\r\n            keybinding: this.isElectron() ? 'ctrlcmd+t' : 'ctrlcmd+o',\r\n        });\r\n    }\r\n\r\n    registerQuickAccessProvider(): void {\r\n        this.quickAccessRegistry.registerQuickAccessProvider({\r\n            getInstance: () => this,\r\n            prefix: WorkspaceSymbolCommand.PREFIX,\r\n            placeholder: '',\r\n            helpEntries: [{description: nls.localizeByDefault('Go to Symbol in Workspace'), needsEditor: false}]\r\n        });\r\n    }\r\n\r\n    async getPicks(filter: string, token: CancellationToken): Promise<QuickPicks> {\r\n        const items: QuickPicks = [];\r\n        if (this.languages.workspaceSymbolProviders) {\r\n            const param: WorkspaceSymbolParams = {\r\n                query: filter\r\n            };\r\n\r\n            const workspaceProviderPromises = [];\r\n            for (const provider of this.languages.workspaceSymbolProviders) {\r\n                workspaceProviderPromises.push((async () => {\r\n                    const symbols = await provider.provideWorkspaceSymbols(param, token);\r\n                    if (symbols && !token.isCancellationRequested) {\r\n                        for (const symbol of symbols) {\r\n                            items.push(this.createItem(symbol, provider, filter, token));\r\n                        }\r\n                    }\r\n                    return symbols;\r\n                })());\r\n            }\r\n            await Promise.all(workspaceProviderPromises.map(p => p.then(sym => sym, _ => undefined)))\r\n                .then(symbols => {\r\n                    const filteredSymbols = symbols.filter(el => el && el.length !== 0);\r\n                    if (filteredSymbols.length === 0) {\r\n                        items.push({\r\n                            label: filter.length === 0\r\n                                ? nls.localize('wm/monaco/typeToSearchForSymbols', 'Type to search for symbols')\r\n                                : nls.localize('wm/monaco/noSymbolsMatching', 'No symbols matching'),\r\n                        });\r\n                    }\r\n                }).catch();\r\n        }\r\n        return items;\r\n    }\r\n\r\n    protected createItem(sym: SymbolInformation, provider: WorkspaceSymbolProvider, filter: string, token: CancellationToken): QuickPickItem {\r\n        const uri = new URI(sym.location.uri);\r\n        const iconClasses = this.toCssClassName(sym.kind);\r\n        let parent = sym.containerName;\r\n        if (parent) {\r\n            parent += ' - ';\r\n        }\r\n        const description = (parent || '') + this.labelProvider.getName(uri);\r\n        return ({\r\n            label: sym.name,\r\n            description,\r\n            ariaLabel: uri.toString(),\r\n            iconClasses,\r\n            highlights: {\r\n                label: findMatches(sym.name, filter),\r\n                description: findMatches(description, filter)\r\n            },\r\n            execute: () => {\r\n                if (provider.resolveWorkspaceSymbol) {\r\n                    provider.resolveWorkspaceSymbol(sym, token).then(resolvedSymbol => {\r\n                        if (resolvedSymbol) {\r\n                            this.openURL(uri, resolvedSymbol.location.range.start, resolvedSymbol.location.range.end);\r\n                        } else {\r\n                            // the symbol didn't resolve -> use given symbol\r\n                            this.openURL(uri, sym.location.range.start, sym.location.range.end);\r\n                        }\r\n                    });\r\n                } else {\r\n                    // resolveWorkspaceSymbol wasn't specified\r\n                    this.openURL(uri, sym.location.range.start, sym.location.range.end);\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    protected toCssClassName(symbolKind: SymbolKind, inline?: boolean): string[] | undefined {\r\n        const kind = SymbolKind[symbolKind];\r\n        if (!kind) {\r\n            return undefined;\r\n        }\r\n        return [`codicon ${inline ? 'inline' : 'block'} codicon-symbol-${kind.toLowerCase() || 'property'}`];\r\n    }\r\n\r\n    private isElectron(): boolean {\r\n        return false;\r\n    }\r\n\r\n    private openURL(uri: URI, start: Position, end: Position): void {\r\n        this.openerService.getOpener(uri).then(opener => opener.open(uri, {\r\n            selection: Range.create(start, end)\r\n        }));\r\n    }\r\n}\r\n\r\nenum SymbolKind {\r\n    File = 1,\r\n    Module = 2,\r\n    Namespace = 3,\r\n    Package = 4,\r\n    Class = 5,\r\n    Method = 6,\r\n    Property = 7,\r\n    Field = 8,\r\n    Constructor = 9,\r\n    Enum = 10,\r\n    Interface = 11,\r\n    Function = 12,\r\n    Variable = 13,\r\n    Constant = 14,\r\n    String = 15,\r\n    Number = 16,\r\n    Boolean = 17,\r\n    Array = 18,\r\n    Object = 19,\r\n    Key = 20,\r\n    Null = 21,\r\n    EnumMember = 22,\r\n    Struct = 23,\r\n    Event = 24,\r\n    Operator = 25,\r\n    TypeParameter = 26\r\n}\r\n"]}