@theia/plugin-ext 1.53.0-next.5 → 1.53.0-next.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -54
- package/lib/common/plugin-api-rpc.d.ts +19 -4
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +4 -2
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/rpc-protocol.d.ts +14 -13
- package/lib/common/rpc-protocol.d.ts.map +1 -1
- package/lib/common/rpc-protocol.js +56 -53
- package/lib/common/rpc-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +1 -0
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +22 -12
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +13 -1
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/main/browser/authentication-main.d.ts +6 -5
- package/lib/main/browser/authentication-main.d.ts.map +1 -1
- package/lib/main/browser/authentication-main.js +15 -9
- package/lib/main/browser/authentication-main.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +9 -3
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +120 -31
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts +7 -4
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.js +21 -7
- package/lib/main/browser/custom-editors/custom-editor-widget.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts +3 -4
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.js +5 -55
- package/lib/main/browser/custom-editors/custom-editors-main.js.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts +4 -3
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js +24 -16
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js.map +1 -1
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +3 -0
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.d.ts.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts +1 -0
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js +22 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts +2 -2
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js +2 -0
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.js +22 -3
- package/lib/main/browser/notebooks/notebook-documents-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.js +16 -2
- package/lib/main/browser/notebooks/notebook-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js +86 -86
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +18 -0
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +20 -20
- package/lib/main/browser/plugin-shared-style.js +14 -14
- package/lib/main/browser/uri-main.d.ts +16 -0
- package/lib/main/browser/uri-main.d.ts.map +1 -0
- package/lib/main/browser/uri-main.js +64 -0
- package/lib/main/browser/uri-main.js.map +1 -0
- package/lib/main/browser/view/plugin-view-registry.js +3 -3
- package/lib/main/browser/webview/webview-frontend-security-warnings.js +2 -2
- package/lib/main/browser/webview/webview-secondary-window-support.js +10 -10
- package/lib/main/browser/webview/webview.d.ts +1 -3
- package/lib/main/browser/webview/webview.d.ts.map +1 -1
- package/lib/main/browser/webview/webview.js +5 -4
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/main/browser/webviews-main.d.ts.map +1 -1
- package/lib/main/browser/webviews-main.js +6 -1
- package/lib/main/browser/webviews-main.js.map +1 -1
- package/lib/main/browser/workspace-main.d.ts +2 -0
- package/lib/main/browser/workspace-main.d.ts.map +1 -1
- package/lib/main/node/plugin-service.d.ts +1 -1
- package/lib/main/node/webview-backend-security-warnings.js +6 -6
- package/lib/plugin/authentication-ext.d.ts +3 -2
- package/lib/plugin/authentication-ext.d.ts.map +1 -1
- package/lib/plugin/authentication-ext.js +8 -5
- package/lib/plugin/authentication-ext.js.map +1 -1
- package/lib/plugin/custom-editors.d.ts +2 -4
- package/lib/plugin/custom-editors.d.ts.map +1 -1
- package/lib/plugin/custom-editors.js +5 -7
- package/lib/plugin/custom-editors.js.map +1 -1
- package/lib/plugin/env.d.ts +2 -0
- package/lib/plugin/env.d.ts.map +1 -1
- package/lib/plugin/env.js +4 -1
- package/lib/plugin/env.js.map +1 -1
- package/lib/plugin/known-commands.d.ts.map +1 -1
- package/lib/plugin/known-commands.js +1 -0
- package/lib/plugin/known-commands.js.map +1 -1
- package/lib/plugin/languages.d.ts +1 -0
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/notebook/notebook-kernels.d.ts +2 -0
- package/lib/plugin/notebook/notebook-kernels.d.ts.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +17 -6
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +2 -1
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/scm.d.ts +1 -0
- package/lib/plugin/scm.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.d.ts +3 -0
- package/lib/plugin/terminal-ext.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.js +2 -0
- package/lib/plugin/terminal-ext.js.map +1 -1
- package/lib/plugin/type-converters.d.ts +6 -0
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +24 -3
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +8 -2
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +9 -1
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/uri-ext.d.ts +37 -0
- package/lib/plugin/uri-ext.d.ts.map +1 -0
- package/lib/plugin/uri-ext.js +50 -0
- package/lib/plugin/uri-ext.js.map +1 -0
- package/lib/plugin/webviews.js +1 -1
- package/lib/plugin/webviews.js.map +1 -1
- package/lib/plugin/workspace.d.ts +4 -0
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/package.json +29 -29
- package/src/common/arrays.ts +70 -70
- package/src/common/assert.ts +23 -23
- package/src/common/cache.ts +51 -51
- package/src/common/character-classifier.ts +73 -73
- package/src/common/collections.ts +54 -54
- package/src/common/commands.ts +19 -19
- package/src/common/connection.ts +137 -137
- package/src/common/disposable-util.ts +39 -39
- package/src/common/editor-options.ts +74 -74
- package/src/common/env.ts +19 -19
- package/src/common/errors.ts +63 -63
- package/src/common/id-generator.ts +26 -26
- package/src/common/index.ts +24 -24
- package/src/common/language-pack-service.ts +34 -34
- package/src/common/link-computer.ts +354 -354
- package/src/common/object-identifier.ts +33 -33
- package/src/common/objects.ts +50 -50
- package/src/common/paths-util.ts +158 -158
- package/src/common/plugin-api-rpc-model.ts +907 -907
- package/src/common/plugin-api-rpc.ts +2752 -2738
- package/src/common/plugin-ext-api-contribution.ts +115 -115
- package/src/common/plugin-identifiers.ts +84 -84
- package/src/common/plugin-protocol.ts +1094 -1094
- package/src/common/reference-map.ts +38 -38
- package/src/common/rpc-protocol.ts +306 -310
- package/src/common/semantic-tokens-dto.ts +182 -182
- package/src/common/test-types.ts +154 -154
- package/src/common/types.ts +129 -129
- package/src/common/uint.ts +37 -37
- package/src/common/uri-components.ts +81 -81
- package/src/hosted/browser/hosted-plugin-watcher.ts +54 -54
- package/src/hosted/browser/hosted-plugin.ts +635 -624
- package/src/hosted/browser/plugin-worker.ts +52 -52
- package/src/hosted/browser/worker/debug-stub.ts +29 -29
- package/src/hosted/browser/worker/plugin-manifest-loader.ts +114 -114
- package/src/hosted/browser/worker/worker-env-ext.ts +40 -40
- package/src/hosted/browser/worker/worker-main.ts +212 -212
- package/src/hosted/browser/worker/worker-plugin-module.ts +80 -80
- package/src/hosted/common/hosted-plugin.ts +456 -456
- package/src/hosted/node/hosted-plugin-cli-contribution.ts +75 -75
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +274 -274
- package/src/hosted/node/hosted-plugin-localization-service.ts +410 -410
- package/src/hosted/node/hosted-plugin-process.ts +248 -248
- package/src/hosted/node/hosted-plugin-protocol.ts +49 -49
- package/src/hosted/node/hosted-plugin.ts +116 -116
- package/src/hosted/node/metadata-scanner.ts +64 -64
- package/src/hosted/node/plugin-activation-events.ts +112 -112
- package/src/hosted/node/plugin-ext-hosted-backend-module.ts +94 -94
- package/src/hosted/node/plugin-host-module.ts +69 -69
- package/src/hosted/node/plugin-host-proxy.ts +82 -82
- package/src/hosted/node/plugin-host-rpc.ts +377 -377
- package/src/hosted/node/plugin-host.ts +110 -110
- package/src/hosted/node/plugin-language-pack-service.ts +43 -43
- package/src/hosted/node/plugin-manifest-loader.ts +32 -32
- package/src/hosted/node/plugin-reader.ts +136 -136
- package/src/hosted/node/plugin-service.ts +197 -197
- package/src/hosted/node/scanners/backend-init-theia.ts +71 -71
- package/src/hosted/node/scanners/file-plugin-uri-factory.ts +32 -32
- package/src/hosted/node/scanners/grammars-reader.ts +57 -57
- package/src/hosted/node/scanners/plugin-uri-factory.ts +33 -33
- package/src/hosted/node/scanners/scanner-theia.ts +963 -952
- package/src/hosted/node-electron/plugin-ext-hosted-electron-backend-module.ts +26 -26
- package/src/hosted/node-electron/scanner-theia-electron.ts +32 -32
- package/src/main/browser/authentication-main.ts +401 -388
- package/src/main/browser/clipboard-main.ts +38 -38
- package/src/main/browser/command-registry-main.ts +130 -130
- package/src/main/browser/commands.ts +104 -104
- package/src/main/browser/comments/comment-glyph-widget.ts +66 -66
- package/src/main/browser/comments/comment-thread-widget.tsx +696 -696
- package/src/main/browser/comments/comments-context-key-service.ts +68 -68
- package/src/main/browser/comments/comments-contribution.ts +268 -268
- package/src/main/browser/comments/comments-decorator.ts +110 -110
- package/src/main/browser/comments/comments-main.ts +482 -482
- package/src/main/browser/comments/comments-service.ts +205 -205
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +205 -105
- package/src/main/browser/custom-editors/custom-editor-service.ts +108 -108
- package/src/main/browser/custom-editors/custom-editor-undo-redo-handler.ts +41 -41
- package/src/main/browser/custom-editors/custom-editor-widget-factory.ts +44 -44
- package/src/main/browser/custom-editors/custom-editor-widget.ts +127 -118
- package/src/main/browser/custom-editors/custom-editors-main.ts +526 -585
- package/src/main/browser/custom-editors/plugin-custom-editor-registry.ts +126 -120
- package/src/main/browser/data-transfer/data-transfer-type-converters.ts +68 -68
- package/src/main/browser/debug/debug-main.ts +397 -397
- package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +48 -48
- package/src/main/browser/debug/plugin-debug-configuration-provider.ts +63 -63
- package/src/main/browser/debug/plugin-debug-service.ts +427 -427
- package/src/main/browser/debug/plugin-debug-session-contribution-registry.ts +76 -76
- package/src/main/browser/debug/plugin-debug-session-factory.ts +115 -115
- package/src/main/browser/decorations/decorations-main.ts +146 -146
- package/src/main/browser/dialogs/modal-notification.ts +112 -112
- package/src/main/browser/dialogs/style/modal-notification.css +123 -123
- package/src/main/browser/dialogs-main.ts +185 -185
- package/src/main/browser/documents-main.ts +275 -275
- package/src/main/browser/editors-and-documents-main.ts +425 -425
- package/src/main/browser/env-main.ts +60 -60
- package/src/main/browser/file-system-main-impl.ts +267 -267
- package/src/main/browser/hierarchy/hierarchy-types-converters.ts +189 -189
- package/src/main/browser/keybindings/keybindings-contribution-handler.ts +66 -66
- package/src/main/browser/label-service-main.ts +51 -51
- package/src/main/browser/languages-main.ts +1439 -1439
- package/src/main/browser/localization-main.ts +34 -34
- package/src/main/browser/main-context.ts +210 -206
- package/src/main/browser/main-file-system-event-service.ts +76 -76
- package/src/main/browser/menus/menus-contribution-handler.ts +172 -171
- package/src/main/browser/menus/plugin-menu-command-adapter.ts +358 -337
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +118 -116
- package/src/main/browser/message-registry-main.ts +43 -43
- package/src/main/browser/notebooks/notebook-documents-and-editors-main.ts +249 -249
- package/src/main/browser/notebooks/notebook-documents-main.ts +202 -182
- package/src/main/browser/notebooks/notebook-dto.ts +131 -131
- package/src/main/browser/notebooks/notebook-editors-main.ts +88 -75
- package/src/main/browser/notebooks/notebook-kernels-main.ts +339 -339
- package/src/main/browser/notebooks/notebook-renderers-main.ts +47 -47
- package/src/main/browser/notebooks/notebooks-main.ts +164 -164
- package/src/main/browser/notebooks/renderers/cell-output-webview.tsx +452 -452
- package/src/main/browser/notebooks/renderers/output-webview-internal.ts +636 -636
- package/src/main/browser/notebooks/renderers/webview-communication.ts +107 -107
- package/src/main/browser/notification-main.ts +26 -26
- package/src/main/browser/output-channel-registry-main.ts +53 -53
- package/src/main/browser/plugin-authentication-service.ts +71 -71
- package/src/main/browser/plugin-contribution-handler.ts +698 -698
- package/src/main/browser/plugin-ext-frontend-module.ts +291 -272
- package/src/main/browser/plugin-ext-widget.tsx +132 -132
- package/src/main/browser/plugin-frontend-contribution.ts +70 -70
- package/src/main/browser/plugin-frontend-view-contribution.ts +38 -38
- package/src/main/browser/plugin-icon-service.ts +92 -92
- package/src/main/browser/plugin-icon-theme-service.ts +625 -625
- package/src/main/browser/plugin-shared-style.ts +154 -154
- package/src/main/browser/plugin-storage.ts +55 -55
- package/src/main/browser/plugin-terminal-registry.ts +27 -27
- package/src/main/browser/preference-registry-main.ts +123 -123
- package/src/main/browser/quick-open-main.ts +367 -367
- package/src/main/browser/scm-main.ts +472 -472
- package/src/main/browser/secrets-main.ts +82 -82
- package/src/main/browser/selection-provider-command.ts +45 -45
- package/src/main/browser/status-bar-message-registry-main.ts +90 -90
- package/src/main/browser/style/comments.css +345 -345
- package/src/main/browser/style/index.css +84 -84
- package/src/main/browser/style/plugin-sidebar.css +73 -73
- package/src/main/browser/style/tree.css +54 -54
- package/src/main/browser/style/webview.css +55 -55
- package/src/main/browser/tabs/tabs-main.ts +384 -384
- package/src/main/browser/tasks-main.ts +268 -268
- package/src/main/browser/terminal-main.ts +370 -370
- package/src/main/browser/test-main.ts +632 -632
- package/src/main/browser/text-editor-main.ts +478 -478
- package/src/main/browser/text-editor-model-service.ts +111 -111
- package/src/main/browser/text-editors-main.ts +234 -234
- package/src/main/browser/theme-icon-override.ts +246 -246
- package/src/main/browser/theming-main.ts +42 -42
- package/src/main/browser/timeline-main.ts +80 -80
- package/src/main/browser/uri-main.ts +72 -0
- package/src/main/browser/view/dnd-file-content-store.ts +42 -42
- package/src/main/browser/view/plugin-tree-view-node-label-provider.ts +81 -81
- package/src/main/browser/view/plugin-view-registry.ts +967 -967
- package/src/main/browser/view/plugin-view-widget.ts +221 -221
- package/src/main/browser/view/tree-view-decorator-service.ts +51 -51
- package/src/main/browser/view/tree-view-widget.tsx +931 -931
- package/src/main/browser/view/tree-views-main.ts +205 -205
- package/src/main/browser/view/view-context-key-service.ts +64 -64
- package/src/main/browser/webview/pre/fake.html +14 -14
- package/src/main/browser/webview/pre/host.js +130 -130
- package/src/main/browser/webview/pre/index.html +17 -17
- package/src/main/browser/webview/pre/main.js +682 -682
- package/src/main/browser/webview/pre/service-worker.js +296 -295
- package/src/main/browser/webview/webview-context-keys.ts +62 -62
- package/src/main/browser/webview/webview-environment.ts +87 -87
- package/src/main/browser/webview/webview-frontend-security-warnings.ts +59 -59
- package/src/main/browser/webview/webview-preferences.ts +72 -72
- package/src/main/browser/webview/webview-resource-cache.ts +88 -88
- package/src/main/browser/webview/webview-secondary-window-support.ts +47 -47
- package/src/main/browser/webview/webview-theme-data-provider.ts +124 -124
- package/src/main/browser/webview/webview.ts +718 -719
- package/src/main/browser/webview-views/webview-views-main.ts +154 -154
- package/src/main/browser/webview-views/webview-views.ts +43 -43
- package/src/main/browser/webviews-main.ts +287 -282
- package/src/main/browser/window-activity-tracker.ts +96 -96
- package/src/main/browser/window-state-main.ts +85 -85
- package/src/main/browser/workspace-main.ts +424 -424
- package/src/main/common/basic-message-registry-main.ts +53 -53
- package/src/main/common/basic-notification-main.ts +86 -86
- package/src/main/common/env-main.ts +44 -44
- package/src/main/common/plugin-paths-protocol.ts +26 -26
- package/src/main/common/plugin-theia-environment.ts +36 -36
- package/src/main/common/webview-protocol.ts +28 -28
- package/src/main/electron-browser/plugin-ext-frontend-electron-module.ts +25 -25
- package/src/main/electron-browser/webview/electron-webview-widget-factory.ts +59 -59
- package/src/main/node/errors.spec.ts +37 -37
- package/src/main/node/handlers/plugin-theia-directory-handler.ts +137 -137
- package/src/main/node/handlers/plugin-theia-file-handler.ts +66 -66
- package/src/main/node/paths/const.ts +21 -21
- package/src/main/node/paths/plugin-paths-service.ts +163 -163
- package/src/main/node/plugin-cli-contribution.ts +85 -85
- package/src/main/node/plugin-deployer-contribution.ts +35 -35
- package/src/main/node/plugin-deployer-directory-handler-context-impl.ts +45 -45
- package/src/main/node/plugin-deployer-entry-impl.ts +132 -132
- package/src/main/node/plugin-deployer-file-handler-context-impl.ts +33 -33
- package/src/main/node/plugin-deployer-impl.ts +375 -375
- package/src/main/node/plugin-deployer-proxy-entry-impl.ts +96 -96
- package/src/main/node/plugin-deployer-resolver-context-impl.ts +55 -55
- package/src/main/node/plugin-ext-backend-module.ts +106 -106
- package/src/main/node/plugin-github-resolver.ts +139 -139
- package/src/main/node/plugin-http-resolver.ts +92 -92
- package/src/main/node/plugin-localization-server.ts +42 -42
- package/src/main/node/plugin-mgmt-cli-contribution.ts +64 -64
- package/src/main/node/plugin-remote-cli-contribution.ts +36 -36
- package/src/main/node/plugin-remote-copy-contribution.ts +36 -36
- package/src/main/node/plugin-server-handler.ts +69 -69
- package/src/main/node/plugin-service.ts +97 -97
- package/src/main/node/plugin-theia-deployer-participant.ts +32 -32
- package/src/main/node/plugin-uninstallation-manager.ts +74 -74
- package/src/main/node/plugins-key-value-storage.spec.ts +110 -110
- package/src/main/node/plugins-key-value-storage.ts +161 -161
- package/src/main/node/resolvers/local-directory-plugin-deployer-resolver.ts +37 -37
- package/src/main/node/resolvers/local-plugin-deployer-resolver.ts +56 -56
- package/src/main/node/temp-dir-util.ts +36 -36
- package/src/main/node/webview-backend-security-warnings.ts +45 -45
- package/src/main/style/status-bar.css +35 -35
- package/src/plugin/authentication-ext.ts +140 -136
- package/src/plugin/clipboard-ext.ts +43 -43
- package/src/plugin/command-registry.ts +219 -219
- package/src/plugin/comments.ts +549 -549
- package/src/plugin/custom-editors.ts +334 -336
- package/src/plugin/debug/debug-ext.ts +549 -549
- package/src/plugin/debug/plugin-debug-adapter-creator.ts +50 -50
- package/src/plugin/debug/plugin-debug-adapter-session.ts +106 -106
- package/src/plugin/debug/plugin-debug-adapter-tracker.ts +85 -85
- package/src/plugin/decorations.ts +140 -140
- package/src/plugin/dialogs.ts +96 -96
- package/src/plugin/document-data.ts +366 -366
- package/src/plugin/documents.ts +283 -283
- package/src/plugin/editors-and-documents.ts +176 -176
- package/src/plugin/env.ts +134 -129
- package/src/plugin/file-system-event-service-ext-impl.ts +256 -256
- package/src/plugin/file-system-ext-impl.ts +415 -415
- package/src/plugin/known-commands.spec.ts +50 -50
- package/src/plugin/known-commands.ts +429 -428
- package/src/plugin/label-service.ts +36 -36
- package/src/plugin/languages/call-hierarchy.ts +124 -124
- package/src/plugin/languages/code-action.ts +162 -162
- package/src/plugin/languages/color.ts +75 -75
- package/src/plugin/languages/completion.ts +183 -183
- package/src/plugin/languages/declaration.ts +72 -72
- package/src/plugin/languages/definition.ts +73 -73
- package/src/plugin/languages/diagnostics.ts +325 -325
- package/src/plugin/languages/document-drop-edit.ts +44 -44
- package/src/plugin/languages/document-formatting.ts +47 -47
- package/src/plugin/languages/document-highlight.ts +61 -61
- package/src/plugin/languages/evaluatable-expression.ts +47 -47
- package/src/plugin/languages/folding.ts +46 -46
- package/src/plugin/languages/hover.ts +58 -58
- package/src/plugin/languages/implementation.ts +73 -73
- package/src/plugin/languages/inlay-hints.ts +149 -149
- package/src/plugin/languages/inline-completion.ts +126 -126
- package/src/plugin/languages/inline-values.ts +50 -50
- package/src/plugin/languages/lens.ts +102 -102
- package/src/plugin/languages/link-provider.ts +81 -81
- package/src/plugin/languages/linked-editing-range.ts +48 -48
- package/src/plugin/languages/on-type-formatting.ts +50 -50
- package/src/plugin/languages/outline.ts +126 -126
- package/src/plugin/languages/range-formatting.ts +48 -48
- package/src/plugin/languages/reference.ts +58 -58
- package/src/plugin/languages/rename.ts +130 -130
- package/src/plugin/languages/selection-range.ts +80 -80
- package/src/plugin/languages/semantic-highlighting.ts +211 -211
- package/src/plugin/languages/signature.ts +82 -82
- package/src/plugin/languages/type-definition.ts +73 -73
- package/src/plugin/languages/type-hierarchy.ts +117 -117
- package/src/plugin/languages/util.ts +26 -26
- package/src/plugin/languages/workspace-symbol.ts +66 -66
- package/src/plugin/languages-utils.ts +68 -68
- package/src/plugin/languages.ts +1022 -1022
- package/src/plugin/localization-ext.ts +89 -89
- package/src/plugin/markdown-string.ts +115 -115
- package/src/plugin/message-registry.ts +70 -70
- package/src/plugin/node/debug/debug.spec.ts +98 -98
- package/src/plugin/node/debug/plugin-node-debug-adapter-creator.ts +167 -167
- package/src/plugin/node/env-node-ext.ts +64 -64
- package/src/plugin/node/plugin-container-module.ts +165 -165
- package/src/plugin/notebook/notebook-document.ts +446 -446
- package/src/plugin/notebook/notebook-documents.ts +58 -58
- package/src/plugin/notebook/notebook-editor.ts +116 -116
- package/src/plugin/notebook/notebook-editors.ts +71 -71
- package/src/plugin/notebook/notebook-kernels.ts +631 -631
- package/src/plugin/notebook/notebook-renderers.ts +71 -71
- package/src/plugin/notebook/notebooks.ts +449 -449
- package/src/plugin/notification.ts +80 -80
- package/src/plugin/output-channel/log-output-channel.ts +108 -108
- package/src/plugin/output-channel/output-channel-item.ts +73 -73
- package/src/plugin/output-channel-registry.ts +52 -52
- package/src/plugin/path.spec.ts +40 -40
- package/src/plugin/path.ts +68 -68
- package/src/plugin/plugin-context.ts +1606 -1595
- package/src/plugin/plugin-icon-path.ts +53 -53
- package/src/plugin/plugin-manager.ts +508 -507
- package/src/plugin/plugin-storage.ts +138 -138
- package/src/plugin/preference-registry.spec.ts +288 -288
- package/src/plugin/preference-registry.ts +335 -335
- package/src/plugin/prefix-sum-computer.ts +218 -218
- package/src/plugin/quick-open.ts +735 -735
- package/src/plugin/scm.ts +919 -919
- package/src/plugin/secrets-ext.ts +104 -104
- package/src/plugin/status-bar/status-bar-item.ts +193 -193
- package/src/plugin/status-bar-message-registry.ts +103 -103
- package/src/plugin/tabs.ts +431 -431
- package/src/plugin/tasks/task-provider.ts +57 -57
- package/src/plugin/tasks/tasks.ts +252 -252
- package/src/plugin/telemetry-ext.ts +298 -298
- package/src/plugin/terminal-ext.ts +569 -566
- package/src/plugin/test-item.ts +174 -174
- package/src/plugin/tests.ts +545 -545
- package/src/plugin/text-editor.ts +581 -581
- package/src/plugin/text-editors.ts +157 -157
- package/src/plugin/theming.ts +73 -73
- package/src/plugin/timeline.ts +186 -186
- package/src/plugin/tree/tree-views.ts +682 -682
- package/src/plugin/type-converters.spec.ts +476 -476
- package/src/plugin/type-converters.ts +1768 -1748
- package/src/plugin/types-impl.spec.ts +85 -85
- package/src/plugin/types-impl.ts +4011 -4001
- package/src/plugin/uri-ext.ts +60 -0
- package/src/plugin/webview-views.ts +228 -228
- package/src/plugin/webviews.ts +468 -468
- package/src/plugin/window-state.ts +75 -75
- package/src/plugin/word-helper.ts +162 -162
- package/src/plugin/workspace.ts +505 -505
- package/src/plugin-ext-backend-electron-module.ts +24 -24
- package/src/plugin-ext-backend-module.ts +24 -24
- package/src/plugin-ext-frontend-electron-module.ts +19 -19
- package/src/plugin-ext-frontend-module.ts +19 -19
- package/lib/common/proxy-handler.d.ts +0 -73
- package/lib/common/proxy-handler.d.ts.map +0 -1
- package/lib/common/proxy-handler.js +0 -106
- package/lib/common/proxy-handler.js.map +0 -1
- package/src/common/proxy-handler.ts +0 -143
|
@@ -1,698 +1,698 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 Red Hat, Inc. and others.
|
|
3
|
-
//
|
|
4
|
-
// This program and the accompanying materials are made available under the
|
|
5
|
-
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
-
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
-
//
|
|
8
|
-
// This Source Code may also be made available under the following Secondary
|
|
9
|
-
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
-
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
-
// with the GNU Classpath Exception which is available at
|
|
12
|
-
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
-
//
|
|
14
|
-
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
|
18
|
-
import { ITokenTypeMap, IEmbeddedLanguagesMap } from 'vscode-textmate';
|
|
19
|
-
import { StandardTokenType } from 'vscode-textmate/release/encodedTokenAttributes';
|
|
20
|
-
import { TextmateRegistry, getEncodedLanguageId, MonacoTextmateService, GrammarDefinition } from '@theia/monaco/lib/browser/textmate';
|
|
21
|
-
import { MenusContributionPointHandler } from './menus/menus-contribution-handler';
|
|
22
|
-
import { PluginViewRegistry } from './view/plugin-view-registry';
|
|
23
|
-
import { PluginCustomEditorRegistry } from './custom-editors/plugin-custom-editor-registry';
|
|
24
|
-
import {
|
|
25
|
-
PluginContribution, IndentationRules, FoldingRules, ScopeMap, DeployedPlugin,
|
|
26
|
-
GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions, IconContribution, PluginPackage
|
|
27
|
-
} from '../../common';
|
|
28
|
-
import {
|
|
29
|
-
DefaultUriLabelProviderContribution,
|
|
30
|
-
LabelProviderContribution,
|
|
31
|
-
PreferenceSchemaProvider
|
|
32
|
-
} from '@theia/core/lib/browser';
|
|
33
|
-
import { DefaultOverridesPreferenceSchemaId, PreferenceLanguageOverrideService, PreferenceSchema, PreferenceSchemaProperties } from '@theia/core/lib/browser/preferences';
|
|
34
|
-
import { KeybindingsContributionPointHandler } from './keybindings/keybindings-contribution-handler';
|
|
35
|
-
import { MonacoSnippetSuggestProvider } from '@theia/monaco/lib/browser/monaco-snippet-suggest-provider';
|
|
36
|
-
import { PluginSharedStyle } from './plugin-shared-style';
|
|
37
|
-
import { CommandRegistry, Command, CommandHandler } from '@theia/core/lib/common/command';
|
|
38
|
-
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
39
|
-
import { Emitter } from '@theia/core/lib/common/event';
|
|
40
|
-
import { TaskDefinitionRegistry, ProblemMatcherRegistry, ProblemPatternRegistry } from '@theia/task/lib/browser';
|
|
41
|
-
import { NotebookRendererRegistry, NotebookTypeRegistry } from '@theia/notebook/lib/browser';
|
|
42
|
-
import { PluginDebugService } from './debug/plugin-debug-service';
|
|
43
|
-
import { DebugSchemaUpdater } from '@theia/debug/lib/browser/debug-schema-updater';
|
|
44
|
-
import { MonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service';
|
|
45
|
-
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
|
46
|
-
import { PluginIconService } from './plugin-icon-service';
|
|
47
|
-
import { PluginIconThemeService } from './plugin-icon-theme-service';
|
|
48
|
-
import { ContributionProvider } from '@theia/core/lib/common';
|
|
49
|
-
import * as monaco from '@theia/monaco-editor-core';
|
|
50
|
-
import { ContributedTerminalProfileStore, TerminalProfileStore } from '@theia/terminal/lib/browser/terminal-profile-service';
|
|
51
|
-
import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget';
|
|
52
|
-
import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service';
|
|
53
|
-
import { PluginTerminalRegistry } from './plugin-terminal-registry';
|
|
54
|
-
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
55
|
-
import { LanguageService } from '@theia/core/lib/browser/language-service';
|
|
56
|
-
import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/base/common/themables';
|
|
57
|
-
|
|
58
|
-
@injectable()
|
|
59
|
-
export class PluginContributionHandler {
|
|
60
|
-
|
|
61
|
-
private injections = new Map<string, string[]>();
|
|
62
|
-
|
|
63
|
-
@inject(TextmateRegistry)
|
|
64
|
-
private readonly grammarsRegistry: TextmateRegistry;
|
|
65
|
-
|
|
66
|
-
@inject(PluginViewRegistry)
|
|
67
|
-
private readonly viewRegistry: PluginViewRegistry;
|
|
68
|
-
|
|
69
|
-
@inject(PluginCustomEditorRegistry)
|
|
70
|
-
private readonly customEditorRegistry: PluginCustomEditorRegistry;
|
|
71
|
-
|
|
72
|
-
@inject(MenusContributionPointHandler)
|
|
73
|
-
private readonly menusContributionHandler: MenusContributionPointHandler;
|
|
74
|
-
|
|
75
|
-
@inject(PreferenceSchemaProvider)
|
|
76
|
-
private readonly preferenceSchemaProvider: PreferenceSchemaProvider;
|
|
77
|
-
|
|
78
|
-
@inject(PreferenceLanguageOverrideService)
|
|
79
|
-
private readonly preferenceOverrideService: PreferenceLanguageOverrideService;
|
|
80
|
-
|
|
81
|
-
@inject(MonacoTextmateService)
|
|
82
|
-
private readonly monacoTextmateService: MonacoTextmateService;
|
|
83
|
-
|
|
84
|
-
@inject(KeybindingsContributionPointHandler)
|
|
85
|
-
private readonly keybindingsContributionHandler: KeybindingsContributionPointHandler;
|
|
86
|
-
|
|
87
|
-
@inject(MonacoSnippetSuggestProvider)
|
|
88
|
-
protected readonly snippetSuggestProvider: MonacoSnippetSuggestProvider;
|
|
89
|
-
|
|
90
|
-
@inject(CommandRegistry)
|
|
91
|
-
protected readonly commands: CommandRegistry;
|
|
92
|
-
|
|
93
|
-
@inject(LanguageService)
|
|
94
|
-
protected readonly languageService: LanguageService;
|
|
95
|
-
|
|
96
|
-
@inject(PluginSharedStyle)
|
|
97
|
-
protected readonly style: PluginSharedStyle;
|
|
98
|
-
|
|
99
|
-
@inject(TaskDefinitionRegistry)
|
|
100
|
-
protected readonly taskDefinitionRegistry: TaskDefinitionRegistry;
|
|
101
|
-
|
|
102
|
-
@inject(ProblemMatcherRegistry)
|
|
103
|
-
protected readonly problemMatcherRegistry: ProblemMatcherRegistry;
|
|
104
|
-
|
|
105
|
-
@inject(ProblemPatternRegistry)
|
|
106
|
-
protected readonly problemPatternRegistry: ProblemPatternRegistry;
|
|
107
|
-
|
|
108
|
-
@inject(PluginDebugService)
|
|
109
|
-
protected readonly debugService: PluginDebugService;
|
|
110
|
-
|
|
111
|
-
@inject(DebugSchemaUpdater)
|
|
112
|
-
protected readonly debugSchema: DebugSchemaUpdater;
|
|
113
|
-
|
|
114
|
-
@inject(MonacoThemingService)
|
|
115
|
-
protected readonly monacoThemingService: MonacoThemingService;
|
|
116
|
-
|
|
117
|
-
@inject(ColorRegistry)
|
|
118
|
-
protected readonly colors: ColorRegistry;
|
|
119
|
-
|
|
120
|
-
@inject(PluginIconService)
|
|
121
|
-
protected readonly iconService: PluginIconService;
|
|
122
|
-
|
|
123
|
-
@inject(PluginIconThemeService)
|
|
124
|
-
protected readonly iconThemeService: PluginIconThemeService;
|
|
125
|
-
|
|
126
|
-
@inject(TerminalService)
|
|
127
|
-
protected readonly terminalService: TerminalService;
|
|
128
|
-
|
|
129
|
-
@inject(PluginTerminalRegistry)
|
|
130
|
-
protected readonly pluginTerminalRegistry: PluginTerminalRegistry;
|
|
131
|
-
|
|
132
|
-
@inject(ContributedTerminalProfileStore)
|
|
133
|
-
protected readonly contributedProfileStore: TerminalProfileStore;
|
|
134
|
-
|
|
135
|
-
@inject(NotebookTypeRegistry)
|
|
136
|
-
protected readonly notebookTypeRegistry: NotebookTypeRegistry;
|
|
137
|
-
|
|
138
|
-
@inject(NotebookRendererRegistry)
|
|
139
|
-
protected readonly notebookRendererRegistry: NotebookRendererRegistry;
|
|
140
|
-
|
|
141
|
-
@inject(ContributionProvider) @named(LabelProviderContribution)
|
|
142
|
-
protected readonly contributionProvider: ContributionProvider<LabelProviderContribution>;
|
|
143
|
-
|
|
144
|
-
@inject(ContextKeyService)
|
|
145
|
-
protected readonly contextKeyService: ContextKeyService;
|
|
146
|
-
|
|
147
|
-
protected readonly commandHandlers = new Map<string, CommandHandler['execute'] | undefined>();
|
|
148
|
-
|
|
149
|
-
protected readonly onDidRegisterCommandHandlerEmitter = new Emitter<string>();
|
|
150
|
-
readonly onDidRegisterCommandHandler = this.onDidRegisterCommandHandlerEmitter.event;
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Always synchronous in order to simplify handling disconnections.
|
|
154
|
-
* @throws never, loading of each contribution should handle errors
|
|
155
|
-
* in order to avoid preventing loading of other contributions or extensions
|
|
156
|
-
*/
|
|
157
|
-
handleContributions(clientId: string, plugin: DeployedPlugin): Disposable {
|
|
158
|
-
const contributions = plugin.contributes;
|
|
159
|
-
if (!contributions) {
|
|
160
|
-
return Disposable.NULL;
|
|
161
|
-
}
|
|
162
|
-
const toDispose = new DisposableCollection(Disposable.create(() => { /* mark as not disposed */ }));
|
|
163
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
164
|
-
const logError = (message: string, ...args: any[]) => console.error(`[${clientId}][${plugin.metadata.model.id}]: ${message}`, ...args);
|
|
165
|
-
const logWarning = (message: string, ...args: any[]) => console.warn(`[${clientId}][${plugin.metadata.model.id}]: ${message}`, ...args);
|
|
166
|
-
const pushContribution = (id: string, contribute: () => Disposable) => {
|
|
167
|
-
if (toDispose.disposed) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
try {
|
|
171
|
-
toDispose.push(contribute());
|
|
172
|
-
} catch (e) {
|
|
173
|
-
logError(`Failed to load '${id}' contribution.`, e);
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const configuration = contributions.configuration;
|
|
178
|
-
if (configuration) {
|
|
179
|
-
for (const config of configuration) {
|
|
180
|
-
pushContribution('configuration', () => this.preferenceSchemaProvider.setSchema(config));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const configurationDefaults = contributions.configurationDefaults;
|
|
185
|
-
if (configurationDefaults) {
|
|
186
|
-
pushContribution('configurationDefaults', () => this.updateDefaultOverridesSchema(configurationDefaults));
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const languages = contributions.languages;
|
|
190
|
-
if (languages && languages.length) {
|
|
191
|
-
for (const lang of languages) {
|
|
192
|
-
// it is not possible to unregister a language
|
|
193
|
-
monaco.languages.register({
|
|
194
|
-
id: lang.id,
|
|
195
|
-
aliases: lang.aliases,
|
|
196
|
-
extensions: lang.extensions,
|
|
197
|
-
filenamePatterns: lang.filenamePatterns,
|
|
198
|
-
filenames: lang.filenames,
|
|
199
|
-
firstLine: lang.firstLine,
|
|
200
|
-
mimetypes: lang.mimetypes
|
|
201
|
-
});
|
|
202
|
-
if (lang.icon) {
|
|
203
|
-
const languageIcon = this.style.toFileIconClass(lang.icon);
|
|
204
|
-
pushContribution(`language.${lang.id}.icon`, () => languageIcon);
|
|
205
|
-
pushContribution(`language.${lang.id}.iconRegistration`, () => this.languageService.registerIcon(lang.id, languageIcon.object.iconClass));
|
|
206
|
-
}
|
|
207
|
-
const langConfiguration = lang.configuration;
|
|
208
|
-
if (langConfiguration) {
|
|
209
|
-
pushContribution(`language.${lang.id}.configuration`, () => monaco.languages.setLanguageConfiguration(lang.id, {
|
|
210
|
-
wordPattern: this.createRegex(langConfiguration.wordPattern),
|
|
211
|
-
autoClosingPairs: langConfiguration.autoClosingPairs,
|
|
212
|
-
brackets: langConfiguration.brackets,
|
|
213
|
-
comments: langConfiguration.comments,
|
|
214
|
-
folding: this.convertFolding(langConfiguration.folding),
|
|
215
|
-
surroundingPairs: langConfiguration.surroundingPairs,
|
|
216
|
-
indentationRules: this.convertIndentationRules(langConfiguration.indentationRules),
|
|
217
|
-
onEnterRules: this.convertOnEnterRules(langConfiguration.onEnterRules),
|
|
218
|
-
}));
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const grammars = contributions.grammars;
|
|
224
|
-
if (grammars && grammars.length) {
|
|
225
|
-
const grammarsWithLanguage: GrammarsContribution[] = [];
|
|
226
|
-
for (const grammar of grammars) {
|
|
227
|
-
if (grammar.injectTo) {
|
|
228
|
-
for (const injectScope of grammar.injectTo) {
|
|
229
|
-
pushContribution(`grammar.injectTo.${injectScope}`, () => {
|
|
230
|
-
const injections = this.injections.get(injectScope) || [];
|
|
231
|
-
injections.push(grammar.scope);
|
|
232
|
-
this.injections.set(injectScope, injections);
|
|
233
|
-
return Disposable.create(() => {
|
|
234
|
-
const index = injections.indexOf(grammar.scope);
|
|
235
|
-
if (index !== -1) {
|
|
236
|
-
injections.splice(index, 1);
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
if (grammar.language) {
|
|
243
|
-
// processing is deferred.
|
|
244
|
-
grammarsWithLanguage.push(grammar);
|
|
245
|
-
}
|
|
246
|
-
pushContribution(`grammar.textmate.scope.${grammar.scope}`, () => this.grammarsRegistry.registerTextmateGrammarScope(grammar.scope, {
|
|
247
|
-
async getGrammarDefinition(): Promise<GrammarDefinition> {
|
|
248
|
-
return {
|
|
249
|
-
format: grammar.format,
|
|
250
|
-
content: grammar.grammar || '',
|
|
251
|
-
location: grammar.grammarLocation
|
|
252
|
-
};
|
|
253
|
-
},
|
|
254
|
-
getInjections: (scopeName: string) =>
|
|
255
|
-
this.injections.get(scopeName)!
|
|
256
|
-
}));
|
|
257
|
-
}
|
|
258
|
-
// load grammars on next tick to await registration of languages from all plugins in current tick
|
|
259
|
-
// see https://github.com/eclipse-theia/theia/issues/6907#issuecomment-578600243
|
|
260
|
-
setTimeout(() => {
|
|
261
|
-
for (const grammar of grammarsWithLanguage) {
|
|
262
|
-
const language = grammar.language!;
|
|
263
|
-
pushContribution(`grammar.language.${language}.scope`, () => this.grammarsRegistry.mapLanguageIdToTextmateGrammar(language, grammar.scope));
|
|
264
|
-
pushContribution(`grammar.language.${language}.configuration`, () => this.grammarsRegistry.registerGrammarConfiguration(language, {
|
|
265
|
-
embeddedLanguages: this.convertEmbeddedLanguages(grammar.embeddedLanguages, logWarning),
|
|
266
|
-
tokenTypes: this.convertTokenTypes(grammar.tokenTypes),
|
|
267
|
-
balancedBracketSelectors: grammar.balancedBracketScopes ?? ['*'],
|
|
268
|
-
unbalancedBracketSelectors: grammar.balancedBracketScopes,
|
|
269
|
-
}));
|
|
270
|
-
}
|
|
271
|
-
// activate grammars only once everything else is loaded.
|
|
272
|
-
// see https://github.com/eclipse-theia/theia-cpp-extensions/issues/100#issuecomment-610643866
|
|
273
|
-
setTimeout(() => {
|
|
274
|
-
for (const grammar of grammarsWithLanguage) {
|
|
275
|
-
const language = grammar.language!;
|
|
276
|
-
pushContribution(`grammar.language.${language}.activation`,
|
|
277
|
-
() => this.monacoTextmateService.activateLanguage(language)
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
pushContribution('commands', () => this.registerCommands(contributions));
|
|
285
|
-
pushContribution('menus', () => this.menusContributionHandler.handle(plugin));
|
|
286
|
-
pushContribution('keybindings', () => this.keybindingsContributionHandler.handle(contributions));
|
|
287
|
-
|
|
288
|
-
if (contributions.customEditors) {
|
|
289
|
-
for (const customEditor of contributions.customEditors) {
|
|
290
|
-
pushContribution(`customEditors.${customEditor.viewType}`,
|
|
291
|
-
() => this.customEditorRegistry.registerCustomEditor(customEditor, plugin)
|
|
292
|
-
);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if (contributions.viewsContainers) {
|
|
297
|
-
for (const location in contributions.viewsContainers) {
|
|
298
|
-
if (contributions.viewsContainers!.hasOwnProperty(location)) {
|
|
299
|
-
for (const viewContainer of contributions.viewsContainers[location]) {
|
|
300
|
-
pushContribution(`viewContainers.${viewContainer.id}`,
|
|
301
|
-
() => this.viewRegistry.registerViewContainer(location, viewContainer)
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
if (contributions.views) {
|
|
308
|
-
// eslint-disable-next-line guard-for-in
|
|
309
|
-
for (const location in contributions.views) {
|
|
310
|
-
for (const view of contributions.views[location]) {
|
|
311
|
-
pushContribution(`views.${view.id}`,
|
|
312
|
-
() => this.viewRegistry.registerView(location, view)
|
|
313
|
-
);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (contributions.viewsWelcome) {
|
|
319
|
-
for (const [index, viewWelcome] of contributions.viewsWelcome.entries()) {
|
|
320
|
-
pushContribution(`viewsWelcome.${viewWelcome.view}.${index}`,
|
|
321
|
-
() => this.viewRegistry.registerViewWelcome(viewWelcome)
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (contributions.snippets) {
|
|
327
|
-
for (const snippet of contributions.snippets) {
|
|
328
|
-
pushContribution(`snippets.${snippet.uri}`, () => this.snippetSuggestProvider.fromURI(snippet.uri, {
|
|
329
|
-
language: snippet.language,
|
|
330
|
-
source: snippet.source
|
|
331
|
-
}));
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (contributions.themes && contributions.themes.length) {
|
|
336
|
-
const pending = {};
|
|
337
|
-
for (const theme of contributions.themes) {
|
|
338
|
-
pushContribution(`themes.${theme.uri}`, () => this.monacoThemingService.register(theme, pending));
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
if (contributions.iconThemes && contributions.iconThemes.length) {
|
|
343
|
-
for (const iconTheme of contributions.iconThemes) {
|
|
344
|
-
pushContribution(`iconThemes.${iconTheme.uri}`, () => this.iconThemeService.register(iconTheme, plugin));
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (contributions.icons && contributions.icons.length) {
|
|
349
|
-
for (const icon of contributions.icons) {
|
|
350
|
-
const defaultIcon = icon.defaults;
|
|
351
|
-
let key: string;
|
|
352
|
-
if (IconContribution.isIconDefinition(defaultIcon)) {
|
|
353
|
-
key = defaultIcon.location;
|
|
354
|
-
} else {
|
|
355
|
-
key = defaultIcon.id;
|
|
356
|
-
}
|
|
357
|
-
pushContribution(`icons.${key}`, () => this.iconService.register(icon, plugin));
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
const colors = contributions.colors;
|
|
362
|
-
if (colors) {
|
|
363
|
-
pushContribution('colors', () => this.colors.register(...colors));
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
if (contributions.taskDefinitions) {
|
|
367
|
-
for (const taskDefinition of contributions.taskDefinitions) {
|
|
368
|
-
pushContribution(`taskDefinitions.${taskDefinition.taskType}`,
|
|
369
|
-
() => this.taskDefinitionRegistry.register(taskDefinition)
|
|
370
|
-
);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
if (contributions.problemPatterns) {
|
|
375
|
-
for (const problemPattern of contributions.problemPatterns) {
|
|
376
|
-
pushContribution(`problemPatterns.${problemPattern.name || problemPattern.regexp}`,
|
|
377
|
-
() => this.problemPatternRegistry.register(problemPattern)
|
|
378
|
-
);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
if (contributions.problemMatchers) {
|
|
383
|
-
for (const problemMatcher of contributions.problemMatchers) {
|
|
384
|
-
pushContribution(`problemMatchers.${problemMatcher.label}`,
|
|
385
|
-
() => this.problemMatcherRegistry.register(problemMatcher)
|
|
386
|
-
);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
if (contributions.debuggers && contributions.debuggers.length) {
|
|
391
|
-
toDispose.push(Disposable.create(() => this.debugSchema.update()));
|
|
392
|
-
for (const contribution of contributions.debuggers) {
|
|
393
|
-
pushContribution(`debuggers.${contribution.type}`,
|
|
394
|
-
() => this.debugService.registerDebugger(contribution)
|
|
395
|
-
);
|
|
396
|
-
}
|
|
397
|
-
this.debugSchema.update();
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
if (contributions.resourceLabelFormatters) {
|
|
401
|
-
for (const formatter of contributions.resourceLabelFormatters) {
|
|
402
|
-
for (const contribution of this.contributionProvider.getContributions()) {
|
|
403
|
-
if (contribution instanceof DefaultUriLabelProviderContribution) {
|
|
404
|
-
pushContribution(`resourceLabelFormatters.${formatter.scheme}`,
|
|
405
|
-
() => contribution.registerFormatter(formatter)
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
const self = this;
|
|
413
|
-
if (contributions.terminalProfiles) {
|
|
414
|
-
for (const profile of contributions.terminalProfiles) {
|
|
415
|
-
pushContribution(`terminalProfiles.${profile.id}`, () => {
|
|
416
|
-
this.contributedProfileStore.registerTerminalProfile(profile.title, {
|
|
417
|
-
async start(): Promise<TerminalWidget> {
|
|
418
|
-
const terminalId = await self.pluginTerminalRegistry.start(profile.id);
|
|
419
|
-
const result = self.terminalService.getById(terminalId);
|
|
420
|
-
if (!result) {
|
|
421
|
-
throw new Error(`Error starting terminal from profile ${profile.id}`);
|
|
422
|
-
}
|
|
423
|
-
return result;
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
return Disposable.create(() => {
|
|
428
|
-
this.contributedProfileStore.unregisterTerminalProfile(profile.id);
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
if (contributions.notebooks) {
|
|
435
|
-
for (const notebook of contributions.notebooks) {
|
|
436
|
-
pushContribution(`notebook.${notebook.type}`,
|
|
437
|
-
() => this.notebookTypeRegistry.registerNotebookType(notebook, plugin.metadata.model.displayName)
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
if (contributions.notebookRenderer) {
|
|
443
|
-
for (const renderer of contributions.notebookRenderer) {
|
|
444
|
-
pushContribution(`notebookRenderer.${renderer.id}`,
|
|
445
|
-
() => this.notebookRendererRegistry.registerNotebookRenderer(renderer, PluginPackage.toPluginUrl(plugin.metadata.model, ''))
|
|
446
|
-
);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
if (contributions.notebookPreload) {
|
|
451
|
-
for (const preload of contributions.notebookPreload) {
|
|
452
|
-
pushContribution(`notebookPreloads.${preload.type}:${preload.entrypoint}`,
|
|
453
|
-
() => this.notebookRendererRegistry.registerStaticNotebookPreload(preload.type, preload.entrypoint, PluginPackage.toPluginUrl(plugin.metadata.model, ''))
|
|
454
|
-
);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return toDispose;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
protected registerCommands(contribution: PluginContribution): Disposable {
|
|
462
|
-
if (!contribution.commands) {
|
|
463
|
-
return Disposable.NULL;
|
|
464
|
-
}
|
|
465
|
-
const toDispose = new DisposableCollection();
|
|
466
|
-
for (const { iconUrl, themeIcon, command, category, shortTitle, title, originalTitle, enablement } of contribution.commands) {
|
|
467
|
-
const reference = iconUrl && this.style.toIconClass(iconUrl);
|
|
468
|
-
const icon = themeIcon && ThemeIcon.fromString(themeIcon);
|
|
469
|
-
let iconClass;
|
|
470
|
-
if (reference) {
|
|
471
|
-
toDispose.push(reference);
|
|
472
|
-
iconClass = reference.object.iconClass;
|
|
473
|
-
} else if (icon) {
|
|
474
|
-
iconClass = ThemeIcon.asClassName(icon);
|
|
475
|
-
}
|
|
476
|
-
toDispose.push(this.registerCommand({ id: command, category, shortTitle, label: title, originalLabel: originalTitle, iconClass }, enablement));
|
|
477
|
-
}
|
|
478
|
-
return toDispose;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
registerCommand(command: Command, enablement?: string): Disposable {
|
|
482
|
-
if (this.hasCommand(command.id)) {
|
|
483
|
-
console.warn(`command '${command.id}' already registered`);
|
|
484
|
-
return Disposable.NULL;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const commandHandler: CommandHandler = {
|
|
488
|
-
execute: async (...args) => {
|
|
489
|
-
const handler = this.commandHandlers.get(command.id);
|
|
490
|
-
if (!handler) {
|
|
491
|
-
throw new Error(`command '${command.id}' not found`);
|
|
492
|
-
}
|
|
493
|
-
return handler(...args);
|
|
494
|
-
},
|
|
495
|
-
// Always enabled - a command can be executed programmatically or via the commands palette.
|
|
496
|
-
isEnabled: () => {
|
|
497
|
-
if (enablement) {
|
|
498
|
-
return this.contextKeyService.match(enablement);
|
|
499
|
-
}
|
|
500
|
-
return true;
|
|
501
|
-
},
|
|
502
|
-
// Visibility rules are defined via the `menus` contribution point.
|
|
503
|
-
isVisible(): boolean { return true; }
|
|
504
|
-
};
|
|
505
|
-
|
|
506
|
-
if (enablement) {
|
|
507
|
-
const contextKeys = this.contextKeyService.parseKeys(enablement);
|
|
508
|
-
if (contextKeys && contextKeys.size > 0) {
|
|
509
|
-
commandHandler.onDidChangeEnabled = (listener: () => void) => this.contextKeyService.onDidChange(e => {
|
|
510
|
-
if (e.affects(contextKeys)) {
|
|
511
|
-
listener();
|
|
512
|
-
}
|
|
513
|
-
});
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
const toDispose = new DisposableCollection();
|
|
518
|
-
if (this.commands.getCommand(command.id)) {
|
|
519
|
-
// overriding built-in command, i.e. `type` by the VSCodeVim extension
|
|
520
|
-
toDispose.push(this.commands.registerHandler(command.id, commandHandler));
|
|
521
|
-
} else {
|
|
522
|
-
toDispose.push(this.commands.registerCommand(command, commandHandler));
|
|
523
|
-
}
|
|
524
|
-
this.commandHandlers.set(command.id, undefined);
|
|
525
|
-
toDispose.push(Disposable.create(() => this.commandHandlers.delete(command.id)));
|
|
526
|
-
return toDispose;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
registerCommandHandler(id: string, execute: CommandHandler['execute']): Disposable {
|
|
530
|
-
if (this.hasCommandHandler(id)) {
|
|
531
|
-
console.warn(`command handler '${id}' already registered`);
|
|
532
|
-
return Disposable.NULL;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
this.commandHandlers.set(id, execute);
|
|
536
|
-
this.onDidRegisterCommandHandlerEmitter.fire(id);
|
|
537
|
-
return Disposable.create(() => this.commandHandlers.set(id, undefined));
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
hasCommand(id: string): boolean {
|
|
541
|
-
return this.commandHandlers.has(id);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
hasCommandHandler(id: string): boolean {
|
|
545
|
-
return !!this.commandHandlers.get(id);
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
protected updateDefaultOverridesSchema(configurationDefaults: PreferenceSchemaProperties): Disposable {
|
|
549
|
-
const defaultOverrides: PreferenceSchema = {
|
|
550
|
-
id: DefaultOverridesPreferenceSchemaId,
|
|
551
|
-
title: 'Default Configuration Overrides',
|
|
552
|
-
properties: {}
|
|
553
|
-
};
|
|
554
|
-
// eslint-disable-next-line guard-for-in
|
|
555
|
-
for (const key in configurationDefaults) {
|
|
556
|
-
const defaultValue = configurationDefaults[key];
|
|
557
|
-
if (this.preferenceOverrideService.testOverrideValue(key, defaultValue)) {
|
|
558
|
-
// language specific override
|
|
559
|
-
defaultOverrides.properties[key] = {
|
|
560
|
-
type: 'object',
|
|
561
|
-
default: defaultValue,
|
|
562
|
-
description: `Configure editor settings to be overridden for ${key} language.`
|
|
563
|
-
};
|
|
564
|
-
} else {
|
|
565
|
-
// regular configuration override
|
|
566
|
-
defaultOverrides.properties[key] = {
|
|
567
|
-
default: defaultValue,
|
|
568
|
-
description: `Configure default setting for ${key}.`
|
|
569
|
-
};
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
if (Object.keys(defaultOverrides.properties).length) {
|
|
573
|
-
return this.preferenceSchemaProvider.setSchema(defaultOverrides);
|
|
574
|
-
}
|
|
575
|
-
return Disposable.NULL;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
private createRegex(value: string | RegExpOptions | undefined): RegExp | undefined {
|
|
579
|
-
if (typeof value === 'string') {
|
|
580
|
-
return new RegExp(value, '');
|
|
581
|
-
}
|
|
582
|
-
if (typeof value == 'undefined') {
|
|
583
|
-
return undefined;
|
|
584
|
-
}
|
|
585
|
-
return new RegExp(value.pattern, value.flags);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
private convertIndentationRules(rules?: IndentationRules): monaco.languages.IndentationRule | undefined {
|
|
589
|
-
if (!rules) {
|
|
590
|
-
return undefined;
|
|
591
|
-
}
|
|
592
|
-
return {
|
|
593
|
-
decreaseIndentPattern: this.createRegex(rules.decreaseIndentPattern)!,
|
|
594
|
-
increaseIndentPattern: this.createRegex(rules.increaseIndentPattern)!,
|
|
595
|
-
indentNextLinePattern: this.createRegex(rules.indentNextLinePattern),
|
|
596
|
-
unIndentedLinePattern: this.createRegex(rules.unIndentedLinePattern)
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
private convertFolding(folding?: FoldingRules): monaco.languages.FoldingRules | undefined {
|
|
601
|
-
if (!folding) {
|
|
602
|
-
return undefined;
|
|
603
|
-
}
|
|
604
|
-
const result: monaco.languages.FoldingRules = {
|
|
605
|
-
offSide: folding.offSide
|
|
606
|
-
};
|
|
607
|
-
|
|
608
|
-
if (folding.markers) {
|
|
609
|
-
result.markers = {
|
|
610
|
-
end: this.createRegex(folding.markers.end)!,
|
|
611
|
-
start: this.createRegex(folding.markers.start)!
|
|
612
|
-
};
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
return result;
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
private convertTokenTypes(tokenTypes?: ScopeMap): ITokenTypeMap | undefined {
|
|
619
|
-
if (typeof tokenTypes === 'undefined' || tokenTypes === null) {
|
|
620
|
-
return undefined;
|
|
621
|
-
}
|
|
622
|
-
const result = Object.create(null);
|
|
623
|
-
const scopes = Object.keys(tokenTypes);
|
|
624
|
-
const len = scopes.length;
|
|
625
|
-
for (let i = 0; i < len; i++) {
|
|
626
|
-
const scope = scopes[i];
|
|
627
|
-
const tokenType = tokenTypes[scope];
|
|
628
|
-
switch (tokenType) {
|
|
629
|
-
case 'string':
|
|
630
|
-
result[scope] = StandardTokenType.String;
|
|
631
|
-
break;
|
|
632
|
-
case 'other':
|
|
633
|
-
result[scope] = StandardTokenType.Other;
|
|
634
|
-
break;
|
|
635
|
-
case 'comment':
|
|
636
|
-
result[scope] = StandardTokenType.Comment;
|
|
637
|
-
break;
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
return result;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
private convertEmbeddedLanguages(languages: ScopeMap | undefined, logWarning: (warning: string) => void): IEmbeddedLanguagesMap | undefined {
|
|
644
|
-
if (typeof languages === 'undefined' || languages === null) {
|
|
645
|
-
return undefined;
|
|
646
|
-
}
|
|
647
|
-
const result = Object.create(null);
|
|
648
|
-
const scopes = Object.keys(languages);
|
|
649
|
-
const len = scopes.length;
|
|
650
|
-
for (let i = 0; i < len; i++) {
|
|
651
|
-
const scope = scopes[i];
|
|
652
|
-
const langId = languages[scope];
|
|
653
|
-
result[scope] = getEncodedLanguageId(langId);
|
|
654
|
-
if (!result[scope]) {
|
|
655
|
-
logWarning(`Language for '${scope}' not found.`);
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
return result;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
private convertOnEnterRules(onEnterRules?: OnEnterRule[]): monaco.languages.OnEnterRule[] | undefined {
|
|
662
|
-
if (!onEnterRules) {
|
|
663
|
-
return undefined;
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
const result: monaco.languages.OnEnterRule[] = [];
|
|
667
|
-
for (const onEnterRule of onEnterRules) {
|
|
668
|
-
const rule: monaco.languages.OnEnterRule = {
|
|
669
|
-
beforeText: this.createRegex(onEnterRule.beforeText)!,
|
|
670
|
-
afterText: this.createRegex(onEnterRule.afterText),
|
|
671
|
-
previousLineText: this.createRegex(onEnterRule.previousLineText),
|
|
672
|
-
action: this.createEnterAction(onEnterRule.action),
|
|
673
|
-
};
|
|
674
|
-
result.push(rule);
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
return result;
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
private createEnterAction(action: EnterAction): monaco.languages.EnterAction {
|
|
681
|
-
let indentAction: monaco.languages.IndentAction;
|
|
682
|
-
switch (action.indent) {
|
|
683
|
-
case 'indent':
|
|
684
|
-
indentAction = monaco.languages.IndentAction.Indent;
|
|
685
|
-
break;
|
|
686
|
-
case 'indentOutdent':
|
|
687
|
-
indentAction = monaco.languages.IndentAction.IndentOutdent;
|
|
688
|
-
break;
|
|
689
|
-
case 'outdent':
|
|
690
|
-
indentAction = monaco.languages.IndentAction.Outdent;
|
|
691
|
-
break;
|
|
692
|
-
default:
|
|
693
|
-
indentAction = monaco.languages.IndentAction.None;
|
|
694
|
-
break;
|
|
695
|
-
}
|
|
696
|
-
return { indentAction, appendText: action.appendText, removeText: action.removeText };
|
|
697
|
-
}
|
|
698
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 Red Hat, Inc. and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
|
18
|
+
import { ITokenTypeMap, IEmbeddedLanguagesMap } from 'vscode-textmate';
|
|
19
|
+
import { StandardTokenType } from 'vscode-textmate/release/encodedTokenAttributes';
|
|
20
|
+
import { TextmateRegistry, getEncodedLanguageId, MonacoTextmateService, GrammarDefinition } from '@theia/monaco/lib/browser/textmate';
|
|
21
|
+
import { MenusContributionPointHandler } from './menus/menus-contribution-handler';
|
|
22
|
+
import { PluginViewRegistry } from './view/plugin-view-registry';
|
|
23
|
+
import { PluginCustomEditorRegistry } from './custom-editors/plugin-custom-editor-registry';
|
|
24
|
+
import {
|
|
25
|
+
PluginContribution, IndentationRules, FoldingRules, ScopeMap, DeployedPlugin,
|
|
26
|
+
GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions, IconContribution, PluginPackage
|
|
27
|
+
} from '../../common';
|
|
28
|
+
import {
|
|
29
|
+
DefaultUriLabelProviderContribution,
|
|
30
|
+
LabelProviderContribution,
|
|
31
|
+
PreferenceSchemaProvider
|
|
32
|
+
} from '@theia/core/lib/browser';
|
|
33
|
+
import { DefaultOverridesPreferenceSchemaId, PreferenceLanguageOverrideService, PreferenceSchema, PreferenceSchemaProperties } from '@theia/core/lib/browser/preferences';
|
|
34
|
+
import { KeybindingsContributionPointHandler } from './keybindings/keybindings-contribution-handler';
|
|
35
|
+
import { MonacoSnippetSuggestProvider } from '@theia/monaco/lib/browser/monaco-snippet-suggest-provider';
|
|
36
|
+
import { PluginSharedStyle } from './plugin-shared-style';
|
|
37
|
+
import { CommandRegistry, Command, CommandHandler } from '@theia/core/lib/common/command';
|
|
38
|
+
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
39
|
+
import { Emitter } from '@theia/core/lib/common/event';
|
|
40
|
+
import { TaskDefinitionRegistry, ProblemMatcherRegistry, ProblemPatternRegistry } from '@theia/task/lib/browser';
|
|
41
|
+
import { NotebookRendererRegistry, NotebookTypeRegistry } from '@theia/notebook/lib/browser';
|
|
42
|
+
import { PluginDebugService } from './debug/plugin-debug-service';
|
|
43
|
+
import { DebugSchemaUpdater } from '@theia/debug/lib/browser/debug-schema-updater';
|
|
44
|
+
import { MonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service';
|
|
45
|
+
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
|
46
|
+
import { PluginIconService } from './plugin-icon-service';
|
|
47
|
+
import { PluginIconThemeService } from './plugin-icon-theme-service';
|
|
48
|
+
import { ContributionProvider } from '@theia/core/lib/common';
|
|
49
|
+
import * as monaco from '@theia/monaco-editor-core';
|
|
50
|
+
import { ContributedTerminalProfileStore, TerminalProfileStore } from '@theia/terminal/lib/browser/terminal-profile-service';
|
|
51
|
+
import { TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget';
|
|
52
|
+
import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service';
|
|
53
|
+
import { PluginTerminalRegistry } from './plugin-terminal-registry';
|
|
54
|
+
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
55
|
+
import { LanguageService } from '@theia/core/lib/browser/language-service';
|
|
56
|
+
import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/base/common/themables';
|
|
57
|
+
|
|
58
|
+
@injectable()
|
|
59
|
+
export class PluginContributionHandler {
|
|
60
|
+
|
|
61
|
+
private injections = new Map<string, string[]>();
|
|
62
|
+
|
|
63
|
+
@inject(TextmateRegistry)
|
|
64
|
+
private readonly grammarsRegistry: TextmateRegistry;
|
|
65
|
+
|
|
66
|
+
@inject(PluginViewRegistry)
|
|
67
|
+
private readonly viewRegistry: PluginViewRegistry;
|
|
68
|
+
|
|
69
|
+
@inject(PluginCustomEditorRegistry)
|
|
70
|
+
private readonly customEditorRegistry: PluginCustomEditorRegistry;
|
|
71
|
+
|
|
72
|
+
@inject(MenusContributionPointHandler)
|
|
73
|
+
private readonly menusContributionHandler: MenusContributionPointHandler;
|
|
74
|
+
|
|
75
|
+
@inject(PreferenceSchemaProvider)
|
|
76
|
+
private readonly preferenceSchemaProvider: PreferenceSchemaProvider;
|
|
77
|
+
|
|
78
|
+
@inject(PreferenceLanguageOverrideService)
|
|
79
|
+
private readonly preferenceOverrideService: PreferenceLanguageOverrideService;
|
|
80
|
+
|
|
81
|
+
@inject(MonacoTextmateService)
|
|
82
|
+
private readonly monacoTextmateService: MonacoTextmateService;
|
|
83
|
+
|
|
84
|
+
@inject(KeybindingsContributionPointHandler)
|
|
85
|
+
private readonly keybindingsContributionHandler: KeybindingsContributionPointHandler;
|
|
86
|
+
|
|
87
|
+
@inject(MonacoSnippetSuggestProvider)
|
|
88
|
+
protected readonly snippetSuggestProvider: MonacoSnippetSuggestProvider;
|
|
89
|
+
|
|
90
|
+
@inject(CommandRegistry)
|
|
91
|
+
protected readonly commands: CommandRegistry;
|
|
92
|
+
|
|
93
|
+
@inject(LanguageService)
|
|
94
|
+
protected readonly languageService: LanguageService;
|
|
95
|
+
|
|
96
|
+
@inject(PluginSharedStyle)
|
|
97
|
+
protected readonly style: PluginSharedStyle;
|
|
98
|
+
|
|
99
|
+
@inject(TaskDefinitionRegistry)
|
|
100
|
+
protected readonly taskDefinitionRegistry: TaskDefinitionRegistry;
|
|
101
|
+
|
|
102
|
+
@inject(ProblemMatcherRegistry)
|
|
103
|
+
protected readonly problemMatcherRegistry: ProblemMatcherRegistry;
|
|
104
|
+
|
|
105
|
+
@inject(ProblemPatternRegistry)
|
|
106
|
+
protected readonly problemPatternRegistry: ProblemPatternRegistry;
|
|
107
|
+
|
|
108
|
+
@inject(PluginDebugService)
|
|
109
|
+
protected readonly debugService: PluginDebugService;
|
|
110
|
+
|
|
111
|
+
@inject(DebugSchemaUpdater)
|
|
112
|
+
protected readonly debugSchema: DebugSchemaUpdater;
|
|
113
|
+
|
|
114
|
+
@inject(MonacoThemingService)
|
|
115
|
+
protected readonly monacoThemingService: MonacoThemingService;
|
|
116
|
+
|
|
117
|
+
@inject(ColorRegistry)
|
|
118
|
+
protected readonly colors: ColorRegistry;
|
|
119
|
+
|
|
120
|
+
@inject(PluginIconService)
|
|
121
|
+
protected readonly iconService: PluginIconService;
|
|
122
|
+
|
|
123
|
+
@inject(PluginIconThemeService)
|
|
124
|
+
protected readonly iconThemeService: PluginIconThemeService;
|
|
125
|
+
|
|
126
|
+
@inject(TerminalService)
|
|
127
|
+
protected readonly terminalService: TerminalService;
|
|
128
|
+
|
|
129
|
+
@inject(PluginTerminalRegistry)
|
|
130
|
+
protected readonly pluginTerminalRegistry: PluginTerminalRegistry;
|
|
131
|
+
|
|
132
|
+
@inject(ContributedTerminalProfileStore)
|
|
133
|
+
protected readonly contributedProfileStore: TerminalProfileStore;
|
|
134
|
+
|
|
135
|
+
@inject(NotebookTypeRegistry)
|
|
136
|
+
protected readonly notebookTypeRegistry: NotebookTypeRegistry;
|
|
137
|
+
|
|
138
|
+
@inject(NotebookRendererRegistry)
|
|
139
|
+
protected readonly notebookRendererRegistry: NotebookRendererRegistry;
|
|
140
|
+
|
|
141
|
+
@inject(ContributionProvider) @named(LabelProviderContribution)
|
|
142
|
+
protected readonly contributionProvider: ContributionProvider<LabelProviderContribution>;
|
|
143
|
+
|
|
144
|
+
@inject(ContextKeyService)
|
|
145
|
+
protected readonly contextKeyService: ContextKeyService;
|
|
146
|
+
|
|
147
|
+
protected readonly commandHandlers = new Map<string, CommandHandler['execute'] | undefined>();
|
|
148
|
+
|
|
149
|
+
protected readonly onDidRegisterCommandHandlerEmitter = new Emitter<string>();
|
|
150
|
+
readonly onDidRegisterCommandHandler = this.onDidRegisterCommandHandlerEmitter.event;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Always synchronous in order to simplify handling disconnections.
|
|
154
|
+
* @throws never, loading of each contribution should handle errors
|
|
155
|
+
* in order to avoid preventing loading of other contributions or extensions
|
|
156
|
+
*/
|
|
157
|
+
handleContributions(clientId: string, plugin: DeployedPlugin): Disposable {
|
|
158
|
+
const contributions = plugin.contributes;
|
|
159
|
+
if (!contributions) {
|
|
160
|
+
return Disposable.NULL;
|
|
161
|
+
}
|
|
162
|
+
const toDispose = new DisposableCollection(Disposable.create(() => { /* mark as not disposed */ }));
|
|
163
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
164
|
+
const logError = (message: string, ...args: any[]) => console.error(`[${clientId}][${plugin.metadata.model.id}]: ${message}`, ...args);
|
|
165
|
+
const logWarning = (message: string, ...args: any[]) => console.warn(`[${clientId}][${plugin.metadata.model.id}]: ${message}`, ...args);
|
|
166
|
+
const pushContribution = (id: string, contribute: () => Disposable) => {
|
|
167
|
+
if (toDispose.disposed) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
toDispose.push(contribute());
|
|
172
|
+
} catch (e) {
|
|
173
|
+
logError(`Failed to load '${id}' contribution.`, e);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const configuration = contributions.configuration;
|
|
178
|
+
if (configuration) {
|
|
179
|
+
for (const config of configuration) {
|
|
180
|
+
pushContribution('configuration', () => this.preferenceSchemaProvider.setSchema(config));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const configurationDefaults = contributions.configurationDefaults;
|
|
185
|
+
if (configurationDefaults) {
|
|
186
|
+
pushContribution('configurationDefaults', () => this.updateDefaultOverridesSchema(configurationDefaults));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const languages = contributions.languages;
|
|
190
|
+
if (languages && languages.length) {
|
|
191
|
+
for (const lang of languages) {
|
|
192
|
+
// it is not possible to unregister a language
|
|
193
|
+
monaco.languages.register({
|
|
194
|
+
id: lang.id,
|
|
195
|
+
aliases: lang.aliases,
|
|
196
|
+
extensions: lang.extensions,
|
|
197
|
+
filenamePatterns: lang.filenamePatterns,
|
|
198
|
+
filenames: lang.filenames,
|
|
199
|
+
firstLine: lang.firstLine,
|
|
200
|
+
mimetypes: lang.mimetypes
|
|
201
|
+
});
|
|
202
|
+
if (lang.icon) {
|
|
203
|
+
const languageIcon = this.style.toFileIconClass(lang.icon);
|
|
204
|
+
pushContribution(`language.${lang.id}.icon`, () => languageIcon);
|
|
205
|
+
pushContribution(`language.${lang.id}.iconRegistration`, () => this.languageService.registerIcon(lang.id, languageIcon.object.iconClass));
|
|
206
|
+
}
|
|
207
|
+
const langConfiguration = lang.configuration;
|
|
208
|
+
if (langConfiguration) {
|
|
209
|
+
pushContribution(`language.${lang.id}.configuration`, () => monaco.languages.setLanguageConfiguration(lang.id, {
|
|
210
|
+
wordPattern: this.createRegex(langConfiguration.wordPattern),
|
|
211
|
+
autoClosingPairs: langConfiguration.autoClosingPairs,
|
|
212
|
+
brackets: langConfiguration.brackets,
|
|
213
|
+
comments: langConfiguration.comments,
|
|
214
|
+
folding: this.convertFolding(langConfiguration.folding),
|
|
215
|
+
surroundingPairs: langConfiguration.surroundingPairs,
|
|
216
|
+
indentationRules: this.convertIndentationRules(langConfiguration.indentationRules),
|
|
217
|
+
onEnterRules: this.convertOnEnterRules(langConfiguration.onEnterRules),
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const grammars = contributions.grammars;
|
|
224
|
+
if (grammars && grammars.length) {
|
|
225
|
+
const grammarsWithLanguage: GrammarsContribution[] = [];
|
|
226
|
+
for (const grammar of grammars) {
|
|
227
|
+
if (grammar.injectTo) {
|
|
228
|
+
for (const injectScope of grammar.injectTo) {
|
|
229
|
+
pushContribution(`grammar.injectTo.${injectScope}`, () => {
|
|
230
|
+
const injections = this.injections.get(injectScope) || [];
|
|
231
|
+
injections.push(grammar.scope);
|
|
232
|
+
this.injections.set(injectScope, injections);
|
|
233
|
+
return Disposable.create(() => {
|
|
234
|
+
const index = injections.indexOf(grammar.scope);
|
|
235
|
+
if (index !== -1) {
|
|
236
|
+
injections.splice(index, 1);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (grammar.language) {
|
|
243
|
+
// processing is deferred.
|
|
244
|
+
grammarsWithLanguage.push(grammar);
|
|
245
|
+
}
|
|
246
|
+
pushContribution(`grammar.textmate.scope.${grammar.scope}`, () => this.grammarsRegistry.registerTextmateGrammarScope(grammar.scope, {
|
|
247
|
+
async getGrammarDefinition(): Promise<GrammarDefinition> {
|
|
248
|
+
return {
|
|
249
|
+
format: grammar.format,
|
|
250
|
+
content: grammar.grammar || '',
|
|
251
|
+
location: grammar.grammarLocation
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
getInjections: (scopeName: string) =>
|
|
255
|
+
this.injections.get(scopeName)!
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
// load grammars on next tick to await registration of languages from all plugins in current tick
|
|
259
|
+
// see https://github.com/eclipse-theia/theia/issues/6907#issuecomment-578600243
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
for (const grammar of grammarsWithLanguage) {
|
|
262
|
+
const language = grammar.language!;
|
|
263
|
+
pushContribution(`grammar.language.${language}.scope`, () => this.grammarsRegistry.mapLanguageIdToTextmateGrammar(language, grammar.scope));
|
|
264
|
+
pushContribution(`grammar.language.${language}.configuration`, () => this.grammarsRegistry.registerGrammarConfiguration(language, {
|
|
265
|
+
embeddedLanguages: this.convertEmbeddedLanguages(grammar.embeddedLanguages, logWarning),
|
|
266
|
+
tokenTypes: this.convertTokenTypes(grammar.tokenTypes),
|
|
267
|
+
balancedBracketSelectors: grammar.balancedBracketScopes ?? ['*'],
|
|
268
|
+
unbalancedBracketSelectors: grammar.balancedBracketScopes,
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
// activate grammars only once everything else is loaded.
|
|
272
|
+
// see https://github.com/eclipse-theia/theia-cpp-extensions/issues/100#issuecomment-610643866
|
|
273
|
+
setTimeout(() => {
|
|
274
|
+
for (const grammar of grammarsWithLanguage) {
|
|
275
|
+
const language = grammar.language!;
|
|
276
|
+
pushContribution(`grammar.language.${language}.activation`,
|
|
277
|
+
() => this.monacoTextmateService.activateLanguage(language)
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
pushContribution('commands', () => this.registerCommands(contributions));
|
|
285
|
+
pushContribution('menus', () => this.menusContributionHandler.handle(plugin));
|
|
286
|
+
pushContribution('keybindings', () => this.keybindingsContributionHandler.handle(contributions));
|
|
287
|
+
|
|
288
|
+
if (contributions.customEditors) {
|
|
289
|
+
for (const customEditor of contributions.customEditors) {
|
|
290
|
+
pushContribution(`customEditors.${customEditor.viewType}`,
|
|
291
|
+
() => this.customEditorRegistry.registerCustomEditor(customEditor, plugin)
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (contributions.viewsContainers) {
|
|
297
|
+
for (const location in contributions.viewsContainers) {
|
|
298
|
+
if (contributions.viewsContainers!.hasOwnProperty(location)) {
|
|
299
|
+
for (const viewContainer of contributions.viewsContainers[location]) {
|
|
300
|
+
pushContribution(`viewContainers.${viewContainer.id}`,
|
|
301
|
+
() => this.viewRegistry.registerViewContainer(location, viewContainer)
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (contributions.views) {
|
|
308
|
+
// eslint-disable-next-line guard-for-in
|
|
309
|
+
for (const location in contributions.views) {
|
|
310
|
+
for (const view of contributions.views[location]) {
|
|
311
|
+
pushContribution(`views.${view.id}`,
|
|
312
|
+
() => this.viewRegistry.registerView(location, view)
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (contributions.viewsWelcome) {
|
|
319
|
+
for (const [index, viewWelcome] of contributions.viewsWelcome.entries()) {
|
|
320
|
+
pushContribution(`viewsWelcome.${viewWelcome.view}.${index}`,
|
|
321
|
+
() => this.viewRegistry.registerViewWelcome(viewWelcome)
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (contributions.snippets) {
|
|
327
|
+
for (const snippet of contributions.snippets) {
|
|
328
|
+
pushContribution(`snippets.${snippet.uri}`, () => this.snippetSuggestProvider.fromURI(snippet.uri, {
|
|
329
|
+
language: snippet.language,
|
|
330
|
+
source: snippet.source
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (contributions.themes && contributions.themes.length) {
|
|
336
|
+
const pending = {};
|
|
337
|
+
for (const theme of contributions.themes) {
|
|
338
|
+
pushContribution(`themes.${theme.uri}`, () => this.monacoThemingService.register(theme, pending));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (contributions.iconThemes && contributions.iconThemes.length) {
|
|
343
|
+
for (const iconTheme of contributions.iconThemes) {
|
|
344
|
+
pushContribution(`iconThemes.${iconTheme.uri}`, () => this.iconThemeService.register(iconTheme, plugin));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (contributions.icons && contributions.icons.length) {
|
|
349
|
+
for (const icon of contributions.icons) {
|
|
350
|
+
const defaultIcon = icon.defaults;
|
|
351
|
+
let key: string;
|
|
352
|
+
if (IconContribution.isIconDefinition(defaultIcon)) {
|
|
353
|
+
key = defaultIcon.location;
|
|
354
|
+
} else {
|
|
355
|
+
key = defaultIcon.id;
|
|
356
|
+
}
|
|
357
|
+
pushContribution(`icons.${key}`, () => this.iconService.register(icon, plugin));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const colors = contributions.colors;
|
|
362
|
+
if (colors) {
|
|
363
|
+
pushContribution('colors', () => this.colors.register(...colors));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (contributions.taskDefinitions) {
|
|
367
|
+
for (const taskDefinition of contributions.taskDefinitions) {
|
|
368
|
+
pushContribution(`taskDefinitions.${taskDefinition.taskType}`,
|
|
369
|
+
() => this.taskDefinitionRegistry.register(taskDefinition)
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (contributions.problemPatterns) {
|
|
375
|
+
for (const problemPattern of contributions.problemPatterns) {
|
|
376
|
+
pushContribution(`problemPatterns.${problemPattern.name || problemPattern.regexp}`,
|
|
377
|
+
() => this.problemPatternRegistry.register(problemPattern)
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (contributions.problemMatchers) {
|
|
383
|
+
for (const problemMatcher of contributions.problemMatchers) {
|
|
384
|
+
pushContribution(`problemMatchers.${problemMatcher.label}`,
|
|
385
|
+
() => this.problemMatcherRegistry.register(problemMatcher)
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (contributions.debuggers && contributions.debuggers.length) {
|
|
391
|
+
toDispose.push(Disposable.create(() => this.debugSchema.update()));
|
|
392
|
+
for (const contribution of contributions.debuggers) {
|
|
393
|
+
pushContribution(`debuggers.${contribution.type}`,
|
|
394
|
+
() => this.debugService.registerDebugger(contribution)
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
this.debugSchema.update();
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (contributions.resourceLabelFormatters) {
|
|
401
|
+
for (const formatter of contributions.resourceLabelFormatters) {
|
|
402
|
+
for (const contribution of this.contributionProvider.getContributions()) {
|
|
403
|
+
if (contribution instanceof DefaultUriLabelProviderContribution) {
|
|
404
|
+
pushContribution(`resourceLabelFormatters.${formatter.scheme}`,
|
|
405
|
+
() => contribution.registerFormatter(formatter)
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const self = this;
|
|
413
|
+
if (contributions.terminalProfiles) {
|
|
414
|
+
for (const profile of contributions.terminalProfiles) {
|
|
415
|
+
pushContribution(`terminalProfiles.${profile.id}`, () => {
|
|
416
|
+
this.contributedProfileStore.registerTerminalProfile(profile.title, {
|
|
417
|
+
async start(): Promise<TerminalWidget> {
|
|
418
|
+
const terminalId = await self.pluginTerminalRegistry.start(profile.id);
|
|
419
|
+
const result = self.terminalService.getById(terminalId);
|
|
420
|
+
if (!result) {
|
|
421
|
+
throw new Error(`Error starting terminal from profile ${profile.id}`);
|
|
422
|
+
}
|
|
423
|
+
return result;
|
|
424
|
+
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
return Disposable.create(() => {
|
|
428
|
+
this.contributedProfileStore.unregisterTerminalProfile(profile.id);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
if (contributions.notebooks) {
|
|
435
|
+
for (const notebook of contributions.notebooks) {
|
|
436
|
+
pushContribution(`notebook.${notebook.type}`,
|
|
437
|
+
() => this.notebookTypeRegistry.registerNotebookType(notebook, plugin.metadata.model.displayName)
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (contributions.notebookRenderer) {
|
|
443
|
+
for (const renderer of contributions.notebookRenderer) {
|
|
444
|
+
pushContribution(`notebookRenderer.${renderer.id}`,
|
|
445
|
+
() => this.notebookRendererRegistry.registerNotebookRenderer(renderer, PluginPackage.toPluginUrl(plugin.metadata.model, ''))
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (contributions.notebookPreload) {
|
|
451
|
+
for (const preload of contributions.notebookPreload) {
|
|
452
|
+
pushContribution(`notebookPreloads.${preload.type}:${preload.entrypoint}`,
|
|
453
|
+
() => this.notebookRendererRegistry.registerStaticNotebookPreload(preload.type, preload.entrypoint, PluginPackage.toPluginUrl(plugin.metadata.model, ''))
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return toDispose;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
protected registerCommands(contribution: PluginContribution): Disposable {
|
|
462
|
+
if (!contribution.commands) {
|
|
463
|
+
return Disposable.NULL;
|
|
464
|
+
}
|
|
465
|
+
const toDispose = new DisposableCollection();
|
|
466
|
+
for (const { iconUrl, themeIcon, command, category, shortTitle, title, originalTitle, enablement } of contribution.commands) {
|
|
467
|
+
const reference = iconUrl && this.style.toIconClass(iconUrl);
|
|
468
|
+
const icon = themeIcon && ThemeIcon.fromString(themeIcon);
|
|
469
|
+
let iconClass;
|
|
470
|
+
if (reference) {
|
|
471
|
+
toDispose.push(reference);
|
|
472
|
+
iconClass = reference.object.iconClass;
|
|
473
|
+
} else if (icon) {
|
|
474
|
+
iconClass = ThemeIcon.asClassName(icon);
|
|
475
|
+
}
|
|
476
|
+
toDispose.push(this.registerCommand({ id: command, category, shortTitle, label: title, originalLabel: originalTitle, iconClass }, enablement));
|
|
477
|
+
}
|
|
478
|
+
return toDispose;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
registerCommand(command: Command, enablement?: string): Disposable {
|
|
482
|
+
if (this.hasCommand(command.id)) {
|
|
483
|
+
console.warn(`command '${command.id}' already registered`);
|
|
484
|
+
return Disposable.NULL;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
const commandHandler: CommandHandler = {
|
|
488
|
+
execute: async (...args) => {
|
|
489
|
+
const handler = this.commandHandlers.get(command.id);
|
|
490
|
+
if (!handler) {
|
|
491
|
+
throw new Error(`command '${command.id}' not found`);
|
|
492
|
+
}
|
|
493
|
+
return handler(...args);
|
|
494
|
+
},
|
|
495
|
+
// Always enabled - a command can be executed programmatically or via the commands palette.
|
|
496
|
+
isEnabled: () => {
|
|
497
|
+
if (enablement) {
|
|
498
|
+
return this.contextKeyService.match(enablement);
|
|
499
|
+
}
|
|
500
|
+
return true;
|
|
501
|
+
},
|
|
502
|
+
// Visibility rules are defined via the `menus` contribution point.
|
|
503
|
+
isVisible(): boolean { return true; }
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
if (enablement) {
|
|
507
|
+
const contextKeys = this.contextKeyService.parseKeys(enablement);
|
|
508
|
+
if (contextKeys && contextKeys.size > 0) {
|
|
509
|
+
commandHandler.onDidChangeEnabled = (listener: () => void) => this.contextKeyService.onDidChange(e => {
|
|
510
|
+
if (e.affects(contextKeys)) {
|
|
511
|
+
listener();
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
const toDispose = new DisposableCollection();
|
|
518
|
+
if (this.commands.getCommand(command.id)) {
|
|
519
|
+
// overriding built-in command, i.e. `type` by the VSCodeVim extension
|
|
520
|
+
toDispose.push(this.commands.registerHandler(command.id, commandHandler));
|
|
521
|
+
} else {
|
|
522
|
+
toDispose.push(this.commands.registerCommand(command, commandHandler));
|
|
523
|
+
}
|
|
524
|
+
this.commandHandlers.set(command.id, undefined);
|
|
525
|
+
toDispose.push(Disposable.create(() => this.commandHandlers.delete(command.id)));
|
|
526
|
+
return toDispose;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
registerCommandHandler(id: string, execute: CommandHandler['execute']): Disposable {
|
|
530
|
+
if (this.hasCommandHandler(id)) {
|
|
531
|
+
console.warn(`command handler '${id}' already registered`);
|
|
532
|
+
return Disposable.NULL;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
this.commandHandlers.set(id, execute);
|
|
536
|
+
this.onDidRegisterCommandHandlerEmitter.fire(id);
|
|
537
|
+
return Disposable.create(() => this.commandHandlers.set(id, undefined));
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
hasCommand(id: string): boolean {
|
|
541
|
+
return this.commandHandlers.has(id);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
hasCommandHandler(id: string): boolean {
|
|
545
|
+
return !!this.commandHandlers.get(id);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
protected updateDefaultOverridesSchema(configurationDefaults: PreferenceSchemaProperties): Disposable {
|
|
549
|
+
const defaultOverrides: PreferenceSchema = {
|
|
550
|
+
id: DefaultOverridesPreferenceSchemaId,
|
|
551
|
+
title: 'Default Configuration Overrides',
|
|
552
|
+
properties: {}
|
|
553
|
+
};
|
|
554
|
+
// eslint-disable-next-line guard-for-in
|
|
555
|
+
for (const key in configurationDefaults) {
|
|
556
|
+
const defaultValue = configurationDefaults[key];
|
|
557
|
+
if (this.preferenceOverrideService.testOverrideValue(key, defaultValue)) {
|
|
558
|
+
// language specific override
|
|
559
|
+
defaultOverrides.properties[key] = {
|
|
560
|
+
type: 'object',
|
|
561
|
+
default: defaultValue,
|
|
562
|
+
description: `Configure editor settings to be overridden for ${key} language.`
|
|
563
|
+
};
|
|
564
|
+
} else {
|
|
565
|
+
// regular configuration override
|
|
566
|
+
defaultOverrides.properties[key] = {
|
|
567
|
+
default: defaultValue,
|
|
568
|
+
description: `Configure default setting for ${key}.`
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
if (Object.keys(defaultOverrides.properties).length) {
|
|
573
|
+
return this.preferenceSchemaProvider.setSchema(defaultOverrides);
|
|
574
|
+
}
|
|
575
|
+
return Disposable.NULL;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
private createRegex(value: string | RegExpOptions | undefined): RegExp | undefined {
|
|
579
|
+
if (typeof value === 'string') {
|
|
580
|
+
return new RegExp(value, '');
|
|
581
|
+
}
|
|
582
|
+
if (typeof value == 'undefined') {
|
|
583
|
+
return undefined;
|
|
584
|
+
}
|
|
585
|
+
return new RegExp(value.pattern, value.flags);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
private convertIndentationRules(rules?: IndentationRules): monaco.languages.IndentationRule | undefined {
|
|
589
|
+
if (!rules) {
|
|
590
|
+
return undefined;
|
|
591
|
+
}
|
|
592
|
+
return {
|
|
593
|
+
decreaseIndentPattern: this.createRegex(rules.decreaseIndentPattern)!,
|
|
594
|
+
increaseIndentPattern: this.createRegex(rules.increaseIndentPattern)!,
|
|
595
|
+
indentNextLinePattern: this.createRegex(rules.indentNextLinePattern),
|
|
596
|
+
unIndentedLinePattern: this.createRegex(rules.unIndentedLinePattern)
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
private convertFolding(folding?: FoldingRules): monaco.languages.FoldingRules | undefined {
|
|
601
|
+
if (!folding) {
|
|
602
|
+
return undefined;
|
|
603
|
+
}
|
|
604
|
+
const result: monaco.languages.FoldingRules = {
|
|
605
|
+
offSide: folding.offSide
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
if (folding.markers) {
|
|
609
|
+
result.markers = {
|
|
610
|
+
end: this.createRegex(folding.markers.end)!,
|
|
611
|
+
start: this.createRegex(folding.markers.start)!
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
return result;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
private convertTokenTypes(tokenTypes?: ScopeMap): ITokenTypeMap | undefined {
|
|
619
|
+
if (typeof tokenTypes === 'undefined' || tokenTypes === null) {
|
|
620
|
+
return undefined;
|
|
621
|
+
}
|
|
622
|
+
const result = Object.create(null);
|
|
623
|
+
const scopes = Object.keys(tokenTypes);
|
|
624
|
+
const len = scopes.length;
|
|
625
|
+
for (let i = 0; i < len; i++) {
|
|
626
|
+
const scope = scopes[i];
|
|
627
|
+
const tokenType = tokenTypes[scope];
|
|
628
|
+
switch (tokenType) {
|
|
629
|
+
case 'string':
|
|
630
|
+
result[scope] = StandardTokenType.String;
|
|
631
|
+
break;
|
|
632
|
+
case 'other':
|
|
633
|
+
result[scope] = StandardTokenType.Other;
|
|
634
|
+
break;
|
|
635
|
+
case 'comment':
|
|
636
|
+
result[scope] = StandardTokenType.Comment;
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return result;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
private convertEmbeddedLanguages(languages: ScopeMap | undefined, logWarning: (warning: string) => void): IEmbeddedLanguagesMap | undefined {
|
|
644
|
+
if (typeof languages === 'undefined' || languages === null) {
|
|
645
|
+
return undefined;
|
|
646
|
+
}
|
|
647
|
+
const result = Object.create(null);
|
|
648
|
+
const scopes = Object.keys(languages);
|
|
649
|
+
const len = scopes.length;
|
|
650
|
+
for (let i = 0; i < len; i++) {
|
|
651
|
+
const scope = scopes[i];
|
|
652
|
+
const langId = languages[scope];
|
|
653
|
+
result[scope] = getEncodedLanguageId(langId);
|
|
654
|
+
if (!result[scope]) {
|
|
655
|
+
logWarning(`Language for '${scope}' not found.`);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return result;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
private convertOnEnterRules(onEnterRules?: OnEnterRule[]): monaco.languages.OnEnterRule[] | undefined {
|
|
662
|
+
if (!onEnterRules) {
|
|
663
|
+
return undefined;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
const result: monaco.languages.OnEnterRule[] = [];
|
|
667
|
+
for (const onEnterRule of onEnterRules) {
|
|
668
|
+
const rule: monaco.languages.OnEnterRule = {
|
|
669
|
+
beforeText: this.createRegex(onEnterRule.beforeText)!,
|
|
670
|
+
afterText: this.createRegex(onEnterRule.afterText),
|
|
671
|
+
previousLineText: this.createRegex(onEnterRule.previousLineText),
|
|
672
|
+
action: this.createEnterAction(onEnterRule.action),
|
|
673
|
+
};
|
|
674
|
+
result.push(rule);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
return result;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
private createEnterAction(action: EnterAction): monaco.languages.EnterAction {
|
|
681
|
+
let indentAction: monaco.languages.IndentAction;
|
|
682
|
+
switch (action.indent) {
|
|
683
|
+
case 'indent':
|
|
684
|
+
indentAction = monaco.languages.IndentAction.Indent;
|
|
685
|
+
break;
|
|
686
|
+
case 'indentOutdent':
|
|
687
|
+
indentAction = monaco.languages.IndentAction.IndentOutdent;
|
|
688
|
+
break;
|
|
689
|
+
case 'outdent':
|
|
690
|
+
indentAction = monaco.languages.IndentAction.Outdent;
|
|
691
|
+
break;
|
|
692
|
+
default:
|
|
693
|
+
indentAction = monaco.languages.IndentAction.None;
|
|
694
|
+
break;
|
|
695
|
+
}
|
|
696
|
+
return { indentAction, appendText: action.appendText, removeText: action.removeText };
|
|
697
|
+
}
|
|
698
|
+
}
|