@theia/plugin-ext 1.34.2 → 1.34.3
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/LICENSE +641 -641
- package/README.md +54 -54
- package/lib/common/arrays.d.ts +19 -19
- package/lib/common/arrays.js +46 -46
- package/lib/common/assert.d.ts +1 -1
- package/lib/common/assert.js +25 -25
- package/lib/common/cache.d.ts +11 -11
- package/lib/common/cache.js +47 -47
- package/lib/common/character-classifier.d.ts +18 -18
- package/lib/common/character-classifier.js +60 -60
- package/lib/common/collections.d.ts +4 -4
- package/lib/common/collections.js +39 -39
- package/lib/common/connection.d.ts +54 -54
- package/lib/common/connection.js +107 -107
- package/lib/common/disposable-util.d.ts +6 -6
- package/lib/common/disposable-util.js +37 -37
- package/lib/common/editor-options.d.ts +30 -30
- package/lib/common/editor-options.js +72 -72
- package/lib/common/env.d.ts +3 -3
- package/lib/common/env.js +17 -17
- package/lib/common/errors.d.ts +3 -3
- package/lib/common/errors.js +42 -42
- package/lib/common/id-generator.d.ts +6 -6
- package/lib/common/id-generator.js +28 -28
- package/lib/common/index.d.ts +3 -3
- package/lib/common/index.js +33 -33
- package/lib/common/link-computer.d.ts +41 -41
- package/lib/common/link-computer.js +275 -275
- package/lib/common/object-identifier.d.ts +8 -8
- package/lib/common/object-identifier.js +32 -32
- package/lib/common/objects.d.ts +1 -1
- package/lib/common/objects.js +46 -46
- package/lib/common/paths-util.d.ts +3 -3
- package/lib/common/paths-util.js +144 -144
- package/lib/common/plugin-api-rpc-model.d.ts +728 -728
- package/lib/common/plugin-api-rpc-model.js +173 -173
- package/lib/common/plugin-api-rpc.d.ts +1710 -1710
- package/lib/common/plugin-api-rpc.js +279 -279
- package/lib/common/plugin-ext-api-contribution.d.ts +58 -58
- package/lib/common/plugin-ext-api-contribution.js +5 -5
- package/lib/common/plugin-identifiers.d.ts +40 -40
- package/lib/common/plugin-identifiers.js +80 -80
- package/lib/common/plugin-protocol.d.ts +840 -840
- package/lib/common/plugin-protocol.js +67 -67
- package/lib/common/proxy-handler.d.ts +65 -65
- package/lib/common/proxy-handler.js +97 -97
- package/lib/common/reference-map.d.ts +7 -7
- package/lib/common/reference-map.js +39 -39
- package/lib/common/rpc-protocol.d.ts +65 -65
- package/lib/common/rpc-protocol.js +229 -229
- package/lib/common/semantic-tokens-dto.d.ts +18 -18
- package/lib/common/semantic-tokens-dto.js +162 -162
- package/lib/common/types.d.ts +37 -37
- package/lib/common/types.js +121 -121
- package/lib/common/uint.d.ts +7 -7
- package/lib/common/uint.js +33 -33
- package/lib/common/uri-components.d.ts +39 -39
- package/lib/common/uri-components.js +66 -66
- package/lib/hosted/browser/hosted-plugin-watcher.d.ts +15 -15
- package/lib/hosted/browser/hosted-plugin-watcher.js +59 -59
- package/lib/hosted/browser/hosted-plugin.d.ts +145 -145
- package/lib/hosted/browser/hosted-plugin.js +787 -787
- package/lib/hosted/browser/plugin-worker.d.ts +6 -6
- package/lib/hosted/browser/plugin-worker.js +57 -57
- package/lib/hosted/browser/worker/debug-stub.d.ts +3 -3
- package/lib/hosted/browser/worker/debug-stub.js +29 -29
- package/lib/hosted/browser/worker/plugin-manifest-loader.d.ts +2 -2
- package/lib/hosted/browser/worker/plugin-manifest-loader.js +107 -107
- package/lib/hosted/browser/worker/worker-env-ext.d.ts +14 -14
- package/lib/hosted/browser/worker/worker-env-ext.js +38 -38
- package/lib/hosted/browser/worker/worker-main.d.ts +1 -1
- package/lib/hosted/browser/worker/worker-main.js +192 -192
- package/lib/hosted/node/hosted-plugin-cli-contribution.d.ts +16 -16
- package/lib/hosted/node/hosted-plugin-cli-contribution.js +76 -76
- package/lib/hosted/node/hosted-plugin-deployer-handler.d.ts +42 -42
- package/lib/hosted/node/hosted-plugin-deployer-handler.js +264 -264
- package/lib/hosted/node/hosted-plugin-localization-service.d.ts +34 -34
- package/lib/hosted/node/hosted-plugin-localization-service.js +239 -239
- package/lib/hosted/node/hosted-plugin-process.d.ts +47 -47
- package/lib/hosted/node/hosted-plugin-process.js +224 -224
- package/lib/hosted/node/hosted-plugin-protocol.d.ts +21 -21
- package/lib/hosted/node/hosted-plugin-protocol.js +36 -36
- package/lib/hosted/node/hosted-plugin.d.ts +36 -36
- package/lib/hosted/node/hosted-plugin.js +118 -118
- package/lib/hosted/node/metadata-scanner.d.ts +17 -17
- package/lib/hosted/node/metadata-scanner.js +82 -82
- package/lib/hosted/node/plugin-ext-hosted-backend-module.d.ts +3 -3
- package/lib/hosted/node/plugin-ext-hosted-backend-module.js +73 -73
- package/lib/hosted/node/plugin-host-proxy.d.ts +17 -17
- package/lib/hosted/node/plugin-host-proxy.js +69 -69
- package/lib/hosted/node/plugin-host-rpc.d.ts +21 -21
- package/lib/hosted/node/plugin-host-rpc.js +216 -216
- package/lib/hosted/node/plugin-host.d.ts +1 -1
- package/lib/hosted/node/plugin-host.js +101 -101
- package/lib/hosted/node/plugin-manifest-loader.d.ts +1 -1
- package/lib/hosted/node/plugin-manifest-loader.js +34 -34
- package/lib/hosted/node/plugin-reader.d.ts +25 -25
- package/lib/hosted/node/plugin-reader.js +141 -141
- package/lib/hosted/node/plugin-service.d.ts +39 -39
- package/lib/hosted/node/plugin-service.js +193 -193
- package/lib/hosted/node/scanners/backend-init-theia.d.ts +2 -2
- package/lib/hosted/node/scanners/backend-init-theia.js +60 -60
- package/lib/hosted/node/scanners/file-plugin-uri-factory.d.ts +10 -10
- package/lib/hosted/node/scanners/file-plugin-uri-factory.js +40 -40
- package/lib/hosted/node/scanners/grammars-reader.d.ts +5 -5
- package/lib/hosted/node/scanners/grammars-reader.js +63 -63
- package/lib/hosted/node/scanners/plugin-uri-factory.d.ts +16 -16
- package/lib/hosted/node/scanners/plugin-uri-factory.js +19 -19
- package/lib/hosted/node/scanners/scanner-theia.d.ts +56 -56
- package/lib/hosted/node/scanners/scanner-theia.js +842 -842
- package/lib/hosted/node-electron/plugin-ext-hosted-electron-backend-module.d.ts +2 -2
- package/lib/hosted/node-electron/plugin-ext-hosted-electron-backend-module.js +26 -26
- package/lib/hosted/node-electron/scanner-theia-electron.d.ts +5 -5
- package/lib/hosted/node-electron/scanner-theia-electron.js +40 -40
- package/lib/main/browser/authentication-main.d.ts +51 -51
- package/lib/main/browser/authentication-main.js +299 -299
- package/lib/main/browser/clipboard-main.d.ts +9 -9
- package/lib/main/browser/clipboard-main.js +32 -32
- package/lib/main/browser/command-registry-main.d.ts +23 -23
- package/lib/main/browser/command-registry-main.js +97 -97
- package/lib/main/browser/commands.d.ts +12 -12
- package/lib/main/browser/commands.js +102 -102
- package/lib/main/browser/comments/comment-glyph-widget.d.ts +12 -12
- package/lib/main/browser/comments/comment-glyph-widget.js +42 -42
- package/lib/main/browser/comments/comment-thread-widget.d.ts +153 -153
- package/lib/main/browser/comments/comment-thread-widget.js +466 -466
- package/lib/main/browser/comments/comments-context-key-service.d.ts +17 -17
- package/lib/main/browser/comments/comments-context-key-service.js +80 -80
- package/lib/main/browser/comments/comments-contribution.d.ts +31 -31
- package/lib/main/browser/comments/comments-contribution.js +264 -264
- package/lib/main/browser/comments/comments-decorator.d.ts +15 -15
- package/lib/main/browser/comments/comments-decorator.js +107 -107
- package/lib/main/browser/comments/comments-main.d.ts +106 -106
- package/lib/main/browser/comments/comments-main.js +341 -341
- package/lib/main/browser/comments/comments-service.d.ts +75 -75
- package/lib/main/browser/comments/comments-service.js +120 -120
- package/lib/main/browser/custom-editors/custom-editor-contribution.d.ts +6 -6
- package/lib/main/browser/custom-editors/custom-editor-contribution.js +50 -50
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +21 -21
- package/lib/main/browser/custom-editors/custom-editor-opener.js +111 -111
- package/lib/main/browser/custom-editors/custom-editor-service.d.ts +16 -16
- package/lib/main/browser/custom-editors/custom-editor-service.js +102 -102
- package/lib/main/browser/custom-editors/custom-editor-widget-factory.d.ts +9 -9
- package/lib/main/browser/custom-editors/custom-editor-widget-factory.js +39 -39
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts +36 -36
- package/lib/main/browser/custom-editors/custom-editor-widget.js +115 -115
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts +120 -120
- package/lib/main/browser/custom-editors/custom-editors-main.js +447 -447
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts +23 -23
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js +142 -142
- package/lib/main/browser/custom-editors/undo-redo-service.d.ts +23 -23
- package/lib/main/browser/custom-editors/undo-redo-service.js +110 -110
- package/lib/main/browser/debug/debug-main.d.ts +48 -48
- package/lib/main/browser/debug/debug-main.js +295 -295
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts +18 -18
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.js +42 -42
- package/lib/main/browser/debug/plugin-debug-configuration-provider.d.ts +12 -12
- package/lib/main/browser/debug/plugin-debug-configuration-provider.js +38 -38
- package/lib/main/browser/debug/plugin-debug-service.d.ts +52 -52
- package/lib/main/browser/debug/plugin-debug-service.js +283 -283
- package/lib/main/browser/debug/plugin-debug-session-contribution-registry.d.ts +30 -30
- package/lib/main/browser/debug/plugin-debug-session-contribution-registry.js +75 -75
- package/lib/main/browser/debug/plugin-debug-session-factory.d.ts +55 -55
- package/lib/main/browser/debug/plugin-debug-session-factory.js +70 -70
- package/lib/main/browser/decorations/decorations-main.d.ts +15 -15
- package/lib/main/browser/decorations/decorations-main.js +119 -119
- package/lib/main/browser/dialogs/modal-notification.d.ts +18 -18
- package/lib/main/browser/dialogs/modal-notification.js +107 -107
- package/lib/main/browser/dialogs-main.d.ts +16 -16
- package/lib/main/browser/dialogs-main.js +162 -162
- package/lib/main/browser/documents-main.d.ts +50 -50
- package/lib/main/browser/documents-main.js +249 -249
- package/lib/main/browser/editors-and-documents-main.d.ts +32 -32
- package/lib/main/browser/editors-and-documents-main.js +301 -301
- package/lib/main/browser/env-main.d.ts +15 -15
- package/lib/main/browser/env-main.js +82 -82
- package/lib/main/browser/file-system-main-impl.d.ts +27 -27
- package/lib/main/browser/file-system-main-impl.js +199 -199
- package/lib/main/browser/hierarchy/hierarchy-types-converters.d.ts +24 -24
- package/lib/main/browser/hierarchy/hierarchy-types-converters.js +174 -174
- package/lib/main/browser/keybindings/keybindings-contribution-handler.d.ts +9 -9
- package/lib/main/browser/keybindings/keybindings-contribution-handler.js +77 -77
- package/lib/main/browser/label-service-main.d.ts +10 -10
- package/lib/main/browser/label-service-main.js +46 -46
- package/lib/main/browser/languages-main.d.ts +136 -136
- package/lib/main/browser/languages-main.js +1116 -1116
- package/lib/main/browser/main-context.d.ts +3 -3
- package/lib/main/browser/main-context.js +137 -137
- package/lib/main/browser/main-file-system-event-service.d.ts +7 -7
- package/lib/main/browser/main-file-system-event-service.d.ts.map +1 -1
- package/lib/main/browser/main-file-system-event-service.js +65 -68
- package/lib/main/browser/main-file-system-event-service.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.d.ts +29 -29
- package/lib/main/browser/menus/menus-contribution-handler.js +194 -194
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts +43 -43
- package/lib/main/browser/menus/plugin-menu-command-adapter.js +279 -279
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts +17 -17
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js +93 -93
- package/lib/main/browser/message-registry-main.d.ts +8 -8
- package/lib/main/browser/message-registry-main.js +52 -52
- package/lib/main/browser/notification-main.d.ts +18 -18
- package/lib/main/browser/notification-main.js +75 -75
- package/lib/main/browser/output-channel-registry-main.d.ts +10 -10
- package/lib/main/browser/output-channel-registry-main.js +60 -60
- package/lib/main/browser/plugin-authentication-service.d.ts +13 -13
- package/lib/main/browser/plugin-authentication-service.js +80 -80
- package/lib/main/browser/plugin-contribution-handler.d.ts +66 -66
- package/lib/main/browser/plugin-contribution-handler.js +580 -580
- package/lib/main/browser/plugin-ext-frontend-module.d.ts +7 -7
- package/lib/main/browser/plugin-ext-frontend-module.js +216 -216
- package/lib/main/browser/plugin-ext-widget.d.ts +28 -28
- package/lib/main/browser/plugin-ext-widget.js +129 -129
- package/lib/main/browser/plugin-frontend-contribution.d.ts +6 -6
- package/lib/main/browser/plugin-frontend-contribution.js +45 -45
- package/lib/main/browser/plugin-frontend-view-contribution.d.ts +6 -6
- package/lib/main/browser/plugin-frontend-view-contribution.js +50 -50
- package/lib/main/browser/plugin-icon-theme-service.d.ts +135 -135
- package/lib/main/browser/plugin-icon-theme-service.js +519 -519
- package/lib/main/browser/plugin-shared-style.d.ts +36 -36
- package/lib/main/browser/plugin-shared-style.js +126 -126
- package/lib/main/browser/plugin-storage.d.ts +13 -13
- package/lib/main/browser/plugin-storage.js +46 -46
- package/lib/main/browser/plugin-terminal-registry.d.ts +4 -4
- package/lib/main/browser/plugin-terminal-registry.js +34 -34
- package/lib/main/browser/preference-registry-main.d.ts +19 -19
- package/lib/main/browser/preference-registry-main.js +104 -104
- package/lib/main/browser/quick-open-main.d.ts +31 -31
- package/lib/main/browser/quick-open-main.js +274 -274
- package/lib/main/browser/scm-main.d.ts +100 -100
- package/lib/main/browser/scm-main.js +330 -330
- package/lib/main/browser/secrets-main.d.ts +12 -12
- package/lib/main/browser/secrets-main.js +67 -67
- package/lib/main/browser/selection-provider-command.d.ts +12 -12
- package/lib/main/browser/selection-provider-command.js +57 -57
- package/lib/main/browser/status-bar-message-registry-main.d.ts +16 -16
- package/lib/main/browser/status-bar-message-registry-main.js +55 -55
- package/lib/main/browser/tabs/tabs-main.d.ts +40 -40
- package/lib/main/browser/tabs/tabs-main.js +282 -282
- package/lib/main/browser/tasks-main.d.ts +33 -33
- package/lib/main/browser/tasks-main.js +205 -205
- package/lib/main/browser/terminal-main.d.ts +49 -49
- package/lib/main/browser/terminal-main.js +268 -268
- package/lib/main/browser/text-editor-main.d.ts +47 -47
- package/lib/main/browser/text-editor-main.js +374 -374
- package/lib/main/browser/text-editor-model-service.d.ts +28 -28
- package/lib/main/browser/text-editor-model-service.js +108 -108
- package/lib/main/browser/text-editors-main.d.ts +38 -38
- package/lib/main/browser/text-editors-main.js +158 -158
- package/lib/main/browser/theme-icon-override.d.ts +1 -1
- package/lib/main/browser/theme-icon-override.js +247 -247
- package/lib/main/browser/theming-main.d.ts +9 -9
- package/lib/main/browser/theming-main.js +35 -35
- package/lib/main/browser/timeline-main.d.ts +13 -13
- package/lib/main/browser/timeline-main.js +46 -46
- package/lib/main/browser/view/dnd-file-content-store.d.ts +7 -7
- package/lib/main/browser/view/dnd-file-content-store.js +51 -51
- package/lib/main/browser/view/plugin-tree-view-node-label-provider.d.ts +11 -11
- package/lib/main/browser/view/plugin-tree-view-node-label-provider.js +90 -90
- package/lib/main/browser/view/plugin-view-registry.d.ts +106 -106
- package/lib/main/browser/view/plugin-view-registry.js +836 -836
- package/lib/main/browser/view/plugin-view-widget.d.ts +50 -50
- package/lib/main/browser/view/plugin-view-widget.js +166 -166
- package/lib/main/browser/view/tree-view-decorator-service.d.ts +30 -30
- package/lib/main/browser/view/tree-view-decorator-service.js +68 -68
- package/lib/main/browser/view/tree-view-widget.d.ts +160 -160
- package/lib/main/browser/view/tree-view-widget.js +761 -761
- package/lib/main/browser/view/tree-views-main.d.ts +31 -31
- package/lib/main/browser/view/tree-views-main.js +163 -163
- package/lib/main/browser/view/view-context-key-service.d.ts +30 -30
- package/lib/main/browser/view/view-context-key-service.js +84 -84
- package/lib/main/browser/view-column-service.d.ts +23 -23
- package/lib/main/browser/view-column-service.js +129 -129
- package/lib/main/browser/webview/webview-environment.d.ts +15 -15
- package/lib/main/browser/webview/webview-environment.js +93 -93
- package/lib/main/browser/webview/webview-frontend-security-warnings.d.ts +11 -11
- package/lib/main/browser/webview/webview-frontend-security-warnings.js +73 -73
- package/lib/main/browser/webview/webview-preferences.d.ts +12 -12
- package/lib/main/browser/webview/webview-preferences.js +57 -57
- package/lib/main/browser/webview/webview-resource-cache.d.ts +17 -17
- package/lib/main/browser/webview/webview-resource-cache.js +90 -90
- package/lib/main/browser/webview/webview-theme-data-provider.d.ts +30 -30
- package/lib/main/browser/webview/webview-theme-data-provider.js +132 -132
- package/lib/main/browser/webview/webview-widget-factory.d.ts +8 -8
- package/lib/main/browser/webview/webview-widget-factory.js +38 -38
- package/lib/main/browser/webview/webview.d.ts +130 -130
- package/lib/main/browser/webview/webview.js +549 -549
- package/lib/main/browser/webview-views/webview-views-main.d.ts +30 -30
- package/lib/main/browser/webview-views/webview-views-main.js +126 -126
- package/lib/main/browser/webview-views/webview-views.d.ts +14 -14
- package/lib/main/browser/webview-views/webview-views.js +22 -22
- package/lib/main/browser/webviews-main.d.ts +39 -39
- package/lib/main/browser/webviews-main.js +231 -231
- package/lib/main/browser/window-state-main.d.ts +16 -16
- package/lib/main/browser/window-state-main.js +61 -61
- package/lib/main/browser/workspace-main.d.ts +69 -69
- package/lib/main/browser/workspace-main.js +316 -316
- package/lib/main/common/plugin-paths-protocol.d.ts +8 -8
- package/lib/main/common/plugin-paths-protocol.js +21 -21
- package/lib/main/common/plugin-theia-environment.d.ts +7 -7
- package/lib/main/common/plugin-theia-environment.js +47 -47
- package/lib/main/common/webview-protocol.d.ts +12 -12
- package/lib/main/common/webview-protocol.js +31 -31
- package/lib/main/electron-browser/plugin-ext-frontend-electron-module.d.ts +3 -3
- package/lib/main/electron-browser/plugin-ext-frontend-electron-module.js +25 -25
- package/lib/main/electron-browser/webview/electron-webview-widget-factory.d.ts +22 -22
- package/lib/main/electron-browser/webview/electron-webview-widget-factory.js +64 -64
- package/lib/main/node/handlers/plugin-theia-directory-handler.d.ts +10 -10
- package/lib/main/node/handlers/plugin-theia-directory-handler.js +113 -113
- package/lib/main/node/handlers/plugin-theia-file-handler.d.ts +9 -9
- package/lib/main/node/handlers/plugin-theia-file-handler.js +66 -66
- package/lib/main/node/paths/const.d.ts +5 -5
- package/lib/main/node/paths/const.js +24 -24
- package/lib/main/node/paths/plugin-paths-service.d.ts +23 -23
- package/lib/main/node/paths/plugin-paths-service.js +169 -169
- package/lib/main/node/plugin-cli-contribution.d.ts +21 -21
- package/lib/main/node/plugin-cli-contribution.js +84 -84
- package/lib/main/node/plugin-deployer-contribution.d.ts +8 -8
- package/lib/main/node/plugin-deployer-contribution.js +47 -47
- package/lib/main/node/plugin-deployer-directory-handler-context-impl.d.ts +7 -7
- package/lib/main/node/plugin-deployer-directory-handler-context-impl.js +44 -44
- package/lib/main/node/plugin-deployer-entry-impl.d.ts +34 -34
- package/lib/main/node/plugin-deployer-entry-impl.js +109 -109
- package/lib/main/node/plugin-deployer-file-handler-context-impl.d.ts +7 -7
- package/lib/main/node/plugin-deployer-file-handler-context-impl.js +31 -31
- package/lib/main/node/plugin-deployer-impl.d.ts +61 -61
- package/lib/main/node/plugin-deployer-impl.js +341 -341
- package/lib/main/node/plugin-deployer-proxy-entry-impl.d.ts +29 -29
- package/lib/main/node/plugin-deployer-proxy-entry-impl.js +98 -98
- package/lib/main/node/plugin-deployer-resolver-context-impl.d.ts +15 -15
- package/lib/main/node/plugin-deployer-resolver-context-impl.js +42 -42
- package/lib/main/node/plugin-ext-backend-module.d.ts +2 -2
- package/lib/main/node/plugin-ext-backend-module.js +70 -70
- package/lib/main/node/plugin-github-resolver.d.ts +21 -21
- package/lib/main/node/plugin-github-resolver.js +142 -142
- package/lib/main/node/plugin-http-resolver.d.ts +18 -18
- package/lib/main/node/plugin-http-resolver.js +91 -91
- package/lib/main/node/plugin-localization-backend-contribution.d.ts +9 -9
- package/lib/main/node/plugin-localization-backend-contribution.js +58 -58
- package/lib/main/node/plugin-server-handler.d.ts +16 -16
- package/lib/main/node/plugin-server-handler.js +74 -74
- package/lib/main/node/plugin-service.d.ts +19 -19
- package/lib/main/node/plugin-service.js +91 -91
- package/lib/main/node/plugin-theia-deployer-participant.d.ts +6 -6
- package/lib/main/node/plugin-theia-deployer-participant.js +43 -43
- package/lib/main/node/plugin-uninstallation-manager.d.ts +14 -14
- package/lib/main/node/plugin-uninstallation-manager.js +84 -84
- package/lib/main/node/plugins-key-value-storage.d.ts +15 -15
- package/lib/main/node/plugins-key-value-storage.js +128 -128
- package/lib/main/node/resolvers/local-directory-plugin-deployer-resolver.d.ts +7 -7
- package/lib/main/node/resolvers/local-directory-plugin-deployer-resolver.js +43 -43
- package/lib/main/node/resolvers/local-plugin-deployer-resolver.d.ts +8 -8
- package/lib/main/node/resolvers/local-plugin-deployer-resolver.js +59 -59
- package/lib/main/node/temp-dir-util.d.ts +1 -1
- package/lib/main/node/temp-dir-util.js +30 -30
- package/lib/main/node/webview-backend-security-warnings.d.ts +5 -5
- package/lib/main/node/webview-backend-security-warnings.js +51 -51
- package/lib/plugin/authentication-ext.d.ts +34 -34
- package/lib/plugin/authentication-ext.js +94 -94
- package/lib/plugin/clipboard-ext.d.ts +9 -9
- package/lib/plugin/clipboard-ext.js +31 -31
- package/lib/plugin/command-registry.d.ts +43 -43
- package/lib/plugin/command-registry.js +176 -176
- package/lib/plugin/comments.d.ts +89 -89
- package/lib/plugin/comments.js +368 -368
- package/lib/plugin/custom-editors.d.ts +47 -47
- package/lib/plugin/custom-editors.js +255 -255
- package/lib/plugin/debug/debug-ext.d.ts +86 -86
- package/lib/plugin/debug/debug-ext.js +391 -391
- package/lib/plugin/debug/plugin-debug-adapter-creator.d.ts +10 -10
- package/lib/plugin/debug/plugin-debug-adapter-creator.js +41 -41
- package/lib/plugin/debug/plugin-debug-adapter-session.d.ts +26 -26
- package/lib/plugin/debug/plugin-debug-adapter-session.js +96 -96
- package/lib/plugin/debug/plugin-debug-adapter-tracker.d.ts +12 -12
- package/lib/plugin/debug/plugin-debug-adapter-tracker.js +77 -77
- package/lib/plugin/decorations.d.ts +14 -14
- package/lib/plugin/decorations.js +112 -112
- package/lib/plugin/dialogs.d.ts +10 -10
- package/lib/plugin/dialogs.js +91 -91
- package/lib/plugin/document-data.d.ts +38 -38
- package/lib/plugin/document-data.js +309 -309
- package/lib/plugin/documents.d.ts +56 -56
- package/lib/plugin/documents.js +253 -253
- package/lib/plugin/editors-and-documents.d.ts +26 -26
- package/lib/plugin/editors-and-documents.js +137 -137
- package/lib/plugin/env.d.ts +42 -42
- package/lib/plugin/env.js +101 -101
- package/lib/plugin/file-system-event-service-ext-impl.d.ts +40 -40
- package/lib/plugin/file-system-event-service-ext-impl.js +203 -203
- package/lib/plugin/file-system-ext-impl.d.ts +50 -50
- package/lib/plugin/file-system-ext-impl.js +354 -354
- package/lib/plugin/known-commands.d.ts +5 -5
- package/lib/plugin/known-commands.js +386 -386
- package/lib/plugin/known-commands.spec.d.ts +1 -1
- package/lib/plugin/known-commands.spec.js +42 -42
- package/lib/plugin/label-service.d.ts +11 -11
- package/lib/plugin/label-service.js +35 -35
- package/lib/plugin/languages/call-hierarchy.d.ts +20 -20
- package/lib/plugin/languages/call-hierarchy.js +101 -101
- package/lib/plugin/languages/code-action.d.ts +24 -24
- package/lib/plugin/languages/code-action.js +137 -137
- package/lib/plugin/languages/color.d.ts +12 -12
- package/lib/plugin/languages/color.js +58 -58
- package/lib/plugin/languages/completion.d.ts +20 -20
- package/lib/plugin/languages/completion.js +161 -161
- package/lib/plugin/languages/declaration.d.ts +11 -11
- package/lib/plugin/languages/declaration.js +58 -58
- package/lib/plugin/languages/definition.d.ts +11 -11
- package/lib/plugin/languages/definition.js +58 -58
- package/lib/plugin/languages/diagnostics.d.ts +49 -49
- package/lib/plugin/languages/diagnostics.js +281 -281
- package/lib/plugin/languages/document-formatting.d.ts +10 -10
- package/lib/plugin/languages/document-formatting.js +40 -40
- package/lib/plugin/languages/document-highlight.d.ts +12 -12
- package/lib/plugin/languages/document-highlight.js +50 -50
- package/lib/plugin/languages/evaluatable-expression.d.ts +11 -11
- package/lib/plugin/languages/evaluatable-expression.js +40 -40
- package/lib/plugin/languages/folding.d.ts +10 -10
- package/lib/plugin/languages/folding.js +39 -39
- package/lib/plugin/languages/hover.d.ts +11 -11
- package/lib/plugin/languages/hover.js +48 -48
- package/lib/plugin/languages/implementation.d.ts +11 -11
- package/lib/plugin/languages/implementation.js +58 -58
- package/lib/plugin/languages/inlay-hints.d.ts +19 -19
- package/lib/plugin/languages/inlay-hints.js +127 -127
- package/lib/plugin/languages/inline-completion.d.ts +20 -20
- package/lib/plugin/languages/inline-completion.js +93 -93
- package/lib/plugin/languages/inline-values.d.ts +10 -10
- package/lib/plugin/languages/inline-values.js +44 -44
- package/lib/plugin/languages/lens.d.ts +19 -19
- package/lib/plugin/languages/lens.js +89 -89
- package/lib/plugin/languages/link-provider.d.ts +14 -14
- package/lib/plugin/languages/link-provider.js +71 -71
- package/lib/plugin/languages/linked-editing-range.d.ts +11 -11
- package/lib/plugin/languages/linked-editing-range.js +40 -40
- package/lib/plugin/languages/on-type-formatting.d.ts +11 -11
- package/lib/plugin/languages/on-type-formatting.js +41 -41
- package/lib/plugin/languages/outline.d.ts +20 -20
- package/lib/plugin/languages/outline.js +115 -115
- package/lib/plugin/languages/range-formatting.d.ts +10 -10
- package/lib/plugin/languages/range-formatting.js +41 -41
- package/lib/plugin/languages/reference.d.ts +11 -11
- package/lib/plugin/languages/reference.js +47 -47
- package/lib/plugin/languages/rename.d.ts +14 -14
- package/lib/plugin/languages/rename.js +114 -114
- package/lib/plugin/languages/selection-range.d.ts +11 -11
- package/lib/plugin/languages/selection-range.js +65 -65
- package/lib/plugin/languages/semantic-highlighting.d.ts +28 -28
- package/lib/plugin/languages/semantic-highlighting.js +175 -175
- package/lib/plugin/languages/signature.d.ts +15 -15
- package/lib/plugin/languages/signature.js +71 -71
- package/lib/plugin/languages/type-definition.d.ts +11 -11
- package/lib/plugin/languages/type-definition.js +58 -58
- package/lib/plugin/languages/type-hierarchy.d.ts +18 -18
- package/lib/plugin/languages/type-hierarchy.js +95 -95
- package/lib/plugin/languages/util.d.ts +4 -4
- package/lib/plugin/languages/util.js +27 -27
- package/lib/plugin/languages/workspace-symbol.d.ts +8 -8
- package/lib/plugin/languages/workspace-symbol.js +61 -61
- package/lib/plugin/languages-utils.d.ts +5 -5
- package/lib/plugin/languages-utils.js +52 -52
- package/lib/plugin/languages.d.ts +118 -118
- package/lib/plugin/languages.js +679 -679
- package/lib/plugin/markdown-string.d.ts +24 -24
- package/lib/plugin/markdown-string.js +124 -124
- package/lib/plugin/message-registry.d.ts +8 -8
- package/lib/plugin/message-registry.js +60 -60
- package/lib/plugin/node/debug/debug.spec.d.ts +1 -1
- package/lib/plugin/node/debug/debug.spec.js +67 -67
- package/lib/plugin/node/debug/plugin-node-debug-adapter-creator.d.ts +17 -17
- package/lib/plugin/node/debug/plugin-node-debug-adapter-creator.js +154 -154
- package/lib/plugin/node/env-node-ext.d.ts +21 -21
- package/lib/plugin/node/env-node-ext.js +63 -63
- package/lib/plugin/notification.d.ts +17 -17
- package/lib/plugin/notification.js +67 -67
- package/lib/plugin/output-channel/output-channel-item.d.ts +17 -17
- package/lib/plugin/output-channel/output-channel-item.js +51 -51
- package/lib/plugin/output-channel-registry.d.ts +8 -8
- package/lib/plugin/output-channel-registry.js +35 -35
- package/lib/plugin/path.d.ts +2 -2
- package/lib/plugin/path.js +59 -59
- package/lib/plugin/path.spec.d.ts +1 -1
- package/lib/plugin/path.spec.js +34 -34
- package/lib/plugin/plugin-context.d.ts +56 -56
- package/lib/plugin/plugin-context.js +1072 -1072
- package/lib/plugin/plugin-icon-path.d.ts +11 -11
- package/lib/plugin/plugin-icon-path.js +49 -49
- package/lib/plugin/plugin-manager.d.ts +80 -80
- package/lib/plugin/plugin-manager.js +366 -366
- package/lib/plugin/plugin-storage.d.ts +36 -36
- package/lib/plugin/plugin-storage.js +99 -99
- package/lib/plugin/preference-registry.d.ts +36 -36
- package/lib/plugin/preference-registry.js +295 -295
- package/lib/plugin/preference-registry.spec.d.ts +1 -1
- package/lib/plugin/preference-registry.spec.js +251 -251
- package/lib/plugin/prefix-sum-computer.d.ts +30 -30
- package/lib/plugin/prefix-sum-computer.js +172 -172
- package/lib/plugin/quick-open.d.ts +202 -202
- package/lib/plugin/quick-open.js +637 -637
- package/lib/plugin/scm.d.ts +53 -53
- package/lib/plugin/scm.js +713 -713
- package/lib/plugin/secrets-ext.d.ts +30 -30
- package/lib/plugin/secrets-ext.js +68 -68
- package/lib/plugin/status-bar/status-bar-item.d.ts +44 -44
- package/lib/plugin/status-bar/status-bar-item.js +122 -122
- package/lib/plugin/status-bar-message-registry.d.ts +20 -20
- package/lib/plugin/status-bar-message-registry.js +84 -84
- package/lib/plugin/stubs/tests-api.d.ts +22 -22
- package/lib/plugin/stubs/tests-api.js +66 -66
- package/lib/plugin/tabs.d.ts +22 -22
- package/lib/plugin/tabs.js +358 -358
- package/lib/plugin/tasks/task-provider.d.ts +8 -8
- package/lib/plugin/tasks/task-provider.js +56 -56
- package/lib/plugin/tasks/tasks.d.ts +45 -45
- package/lib/plugin/tasks/tasks.js +210 -210
- package/lib/plugin/terminal-ext.d.ts +101 -101
- package/lib/plugin/terminal-ext.js +422 -422
- package/lib/plugin/text-editor.d.ts +100 -100
- package/lib/plugin/text-editor.js +409 -409
- package/lib/plugin/text-editors.d.ts +37 -37
- package/lib/plugin/text-editors.js +126 -126
- package/lib/plugin/theming.d.ts +15 -15
- package/lib/plugin/theming.js +61 -61
- package/lib/plugin/timeline.d.ts +20 -20
- package/lib/plugin/timeline.js +152 -152
- package/lib/plugin/tree/tree-views.d.ts +93 -93
- package/lib/plugin/tree/tree-views.js +523 -523
- package/lib/plugin/type-converters.d.ts +131 -131
- package/lib/plugin/type-converters.js +1292 -1292
- package/lib/plugin/type-converters.spec.d.ts +1 -1
- package/lib/plugin/type-converters.spec.js +391 -391
- package/lib/plugin/types-impl.d.ts +1464 -1464
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +2956 -2953
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/types-impl.spec.d.ts +1 -1
- package/lib/plugin/types-impl.spec.js +78 -78
- package/lib/plugin/webview-views.d.ts +52 -52
- package/lib/plugin/webview-views.js +144 -144
- package/lib/plugin/webviews.d.ts +95 -95
- package/lib/plugin/webviews.js +340 -340
- package/lib/plugin/window-state.d.ts +16 -16
- package/lib/plugin/window-state.js +55 -55
- package/lib/plugin/word-helper.d.ts +21 -21
- package/lib/plugin/word-helper.js +125 -125
- package/lib/plugin/workspace.d.ts +53 -53
- package/lib/plugin/workspace.js +371 -371
- package/lib/plugin-ext-backend-electron-module.d.ts +3 -3
- package/lib/plugin-ext-backend-electron-module.js +24 -24
- package/lib/plugin-ext-backend-module.d.ts +3 -3
- package/lib/plugin-ext-backend-module.js +24 -24
- package/lib/plugin-ext-frontend-electron-module.d.ts +2 -2
- package/lib/plugin-ext-frontend-electron-module.js +19 -19
- package/lib/plugin-ext-frontend-module.d.ts +2 -2
- package/lib/plugin-ext-frontend-module.js +19 -19
- package/package.json +27 -27
- package/src/common/arrays.ts +54 -54
- 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 +37 -37
- 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 +37 -37
- package/src/common/id-generator.ts +26 -26
- package/src/common/index.ts +24 -24
- 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 +864 -864
- package/src/common/plugin-api-rpc.ts +2202 -2202
- package/src/common/plugin-ext-api-contribution.ts +82 -82
- package/src/common/plugin-identifiers.ts +84 -84
- package/src/common/plugin-protocol.ts +987 -987
- package/src/common/proxy-handler.ts +126 -126
- package/src/common/reference-map.ts +38 -38
- package/src/common/rpc-protocol.ts +272 -272
- package/src/common/semantic-tokens-dto.ts +182 -182
- package/src/common/types.ts +129 -129
- package/src/common/uint.ts +37 -37
- package/src/common/uri-components.ts +85 -85
- package/src/hosted/browser/hosted-plugin-watcher.ts +54 -54
- package/src/hosted/browser/hosted-plugin.ts +830 -830
- package/src/hosted/browser/plugin-worker.ts +52 -52
- package/src/hosted/browser/worker/debug-stub.ts +28 -28
- package/src/hosted/browser/worker/plugin-manifest-loader.ts +114 -114
- package/src/hosted/browser/worker/worker-env-ext.ts +41 -41
- package/src/hosted/browser/worker/worker-main.ts +221 -221
- package/src/hosted/node/hosted-plugin-cli-contribution.ts +75 -75
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +261 -261
- package/src/hosted/node/hosted-plugin-localization-service.ts +254 -254
- 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-ext-hosted-backend-module.ts +80 -80
- package/src/hosted/node/plugin-host-proxy.ts +80 -80
- package/src/hosted/node/plugin-host-rpc.ts +245 -245
- package/src/hosted/node/plugin-host.ts +108 -108
- package/src/hosted/node/plugin-manifest-loader.ts +31 -31
- package/src/hosted/node/plugin-reader.ts +131 -131
- package/src/hosted/node/plugin-service.ts +175 -175
- 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 +56 -56
- package/src/hosted/node/scanners/plugin-uri-factory.ts +33 -33
- package/src/hosted/node/scanners/scanner-theia.ts +938 -938
- 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 +369 -369
- package/src/main/browser/clipboard-main.ts +38 -38
- package/src/main/browser/command-registry-main.ts +110 -110
- 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 +691 -691
- package/src/main/browser/comments/comments-context-key-service.ts +68 -68
- package/src/main/browser/comments/comments-contribution.ts +264 -264
- package/src/main/browser/comments/comments-decorator.ts +110 -110
- package/src/main/browser/comments/comments-main.ts +465 -465
- package/src/main/browser/comments/comments-service.ts +205 -205
- package/src/main/browser/custom-editors/custom-editor-contribution.ts +38 -38
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +105 -105
- package/src/main/browser/custom-editors/custom-editor-service.ts +108 -108
- package/src/main/browser/custom-editors/custom-editor-widget-factory.ts +44 -44
- package/src/main/browser/custom-editors/custom-editor-widget.ts +127 -127
- package/src/main/browser/custom-editors/custom-editors-main.ts +606 -606
- package/src/main/browser/custom-editors/plugin-custom-editor-registry.ts +142 -142
- package/src/main/browser/custom-editors/undo-redo-service.ts +120 -120
- package/src/main/browser/debug/debug-main.ts +373 -373
- 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 +338 -338
- package/src/main/browser/debug/plugin-debug-session-contribution-registry.ts +76 -76
- package/src/main/browser/debug/plugin-debug-session-factory.ts +105 -105
- package/src/main/browser/decorations/decorations-main.ts +146 -146
- package/src/main/browser/dialogs/modal-notification.ts +110 -110
- 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 +289 -289
- package/src/main/browser/editors-and-documents-main.ts +394 -394
- package/src/main/browser/env-main.ts +87 -87
- package/src/main/browser/file-system-main-impl.ts +263 -263
- 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 +1387 -1387
- package/src/main/browser/main-context.ts +187 -187
- package/src/main/browser/main-file-system-event-service.ts +76 -79
- package/src/main/browser/menus/menus-contribution-handler.ts +162 -162
- package/src/main/browser/menus/plugin-menu-command-adapter.ts +264 -264
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +91 -91
- package/src/main/browser/message-registry-main.ts +56 -56
- package/src/main/browser/notification-main.ts +86 -86
- 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 +609 -609
- package/src/main/browser/plugin-ext-frontend-module.ts +249 -249
- package/src/main/browser/plugin-ext-widget.tsx +132 -132
- package/src/main/browser/plugin-frontend-contribution.ts +35 -35
- package/src/main/browser/plugin-frontend-view-contribution.ts +38 -38
- package/src/main/browser/plugin-icon-theme-service.ts +585 -585
- package/src/main/browser/plugin-shared-style.ts +133 -133
- 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 +324 -324
- package/src/main/browser/scm-main.ts +453 -453
- package/src/main/browser/secrets-main.ts +82 -82
- package/src/main/browser/selection-provider-command.ts +46 -46
- 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 +85 -85
- package/src/main/browser/style/plugin-sidebar.css +73 -73
- package/src/main/browser/style/test.svg +13 -13
- package/src/main/browser/style/tree.css +52 -52
- package/src/main/browser/style/webview.css +53 -53
- package/src/main/browser/tabs/tabs-main.ts +323 -323
- package/src/main/browser/tasks-main.ts +268 -268
- package/src/main/browser/terminal-main.ts +301 -301
- package/src/main/browser/text-editor-main.ts +463 -463
- package/src/main/browser/text-editor-model-service.ts +102 -102
- package/src/main/browser/text-editors-main.ts +206 -206
- package/src/main/browser/theme-icon-override.ts +252 -252
- package/src/main/browser/theming-main.ts +42 -42
- package/src/main/browser/timeline-main.ts +80 -80
- 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 +885 -885
- package/src/main/browser/view/plugin-view-widget.ts +173 -173
- package/src/main/browser/view/tree-view-decorator-service.ts +51 -51
- package/src/main/browser/view/tree-view-widget.tsx +859 -859
- package/src/main/browser/view/tree-views-main.ts +191 -191
- package/src/main/browser/view/view-context-key-service.ts +77 -77
- package/src/main/browser/view-column-service.ts +125 -125
- 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 +632 -632
- package/src/main/browser/webview/pre/service-worker.js +295 -295
- package/src/main/browser/webview/webview-environment.ts +83 -83
- 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-theme-data-provider.ts +124 -124
- package/src/main/browser/webview/webview-widget-factory.ts +43 -43
- package/src/main/browser/webview/webview.ts +629 -629
- package/src/main/browser/webview-views/webview-views-main.ts +142 -142
- package/src/main/browser/webview-views/webview-views.ts +38 -38
- package/src/main/browser/webviews-main.ts +269 -269
- package/src/main/browser/window-state-main.ts +76 -76
- package/src/main/browser/workspace-main.ts +383 -383
- 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 +70 -70
- package/src/main/node/handlers/plugin-theia-directory-handler.ts +105 -105
- package/src/main/node/handlers/plugin-theia-file-handler.ts +54 -54
- package/src/main/node/paths/const.ts +21 -21
- package/src/main/node/paths/plugin-paths-service.ts +170 -170
- package/src/main/node/plugin-cli-contribution.ts +85 -85
- package/src/main/node/plugin-deployer-contribution.ts +34 -34
- package/src/main/node/plugin-deployer-directory-handler-context-impl.ts +45 -45
- package/src/main/node/plugin-deployer-entry-impl.ts +130 -130
- package/src/main/node/plugin-deployer-file-handler-context-impl.ts +33 -33
- package/src/main/node/plugin-deployer-impl.ts +367 -367
- 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 +93 -93
- package/src/main/node/plugin-github-resolver.ts +148 -148
- package/src/main/node/plugin-http-resolver.ts +91 -91
- package/src/main/node/plugin-localization-backend-contribution.ts +42 -42
- package/src/main/node/plugin-server-handler.ts +69 -69
- package/src/main/node/plugin-service.ts +82 -82
- 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.ts +117 -117
- 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 +27 -27
- 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 +125 -125
- package/src/plugin/clipboard-ext.ts +37 -37
- package/src/plugin/command-registry.ts +218 -218
- package/src/plugin/comments.ts +518 -518
- package/src/plugin/custom-editors.ts +336 -336
- package/src/plugin/debug/debug-ext.ts +487 -487
- 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 +170 -170
- package/src/plugin/env.ts +134 -134
- package/src/plugin/file-system-event-service-ext-impl.ts +256 -256
- package/src/plugin/file-system-ext-impl.ts +412 -412
- package/src/plugin/known-commands.spec.ts +50 -50
- package/src/plugin/known-commands.ts +412 -412
- 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 +179 -179
- 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-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 +79 -79
- 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 +56 -56
- package/src/plugin/languages.ts +969 -969
- package/src/plugin/markdown-string.ts +115 -115
- package/src/plugin/message-registry.ts +65 -65
- package/src/plugin/node/debug/debug.spec.ts +94 -94
- package/src/plugin/node/debug/plugin-node-debug-adapter-creator.ts +167 -167
- package/src/plugin/node/env-node-ext.ts +69 -69
- package/src/plugin/notification.ts +80 -80
- package/src/plugin/output-channel/output-channel-item.ts +73 -73
- package/src/plugin/output-channel-registry.ts +39 -39
- package/src/plugin/path.spec.ts +40 -40
- package/src/plugin/path.ts +68 -68
- package/src/plugin/plugin-context.ts +1387 -1387
- package/src/plugin/plugin-icon-path.ts +50 -50
- package/src/plugin/plugin-manager.ts +446 -446
- package/src/plugin/plugin-storage.ts +120 -120
- package/src/plugin/preference-registry.spec.ts +299 -299
- package/src/plugin/preference-registry.ts +337 -337
- package/src/plugin/prefix-sum-computer.ts +218 -218
- package/src/plugin/quick-open.ts +772 -772
- package/src/plugin/scm.ts +910 -910
- package/src/plugin/secrets-ext.ts +84 -84
- package/src/plugin/status-bar/status-bar-item.ts +193 -193
- package/src/plugin/status-bar-message-registry.ts +103 -103
- package/src/plugin/stubs/tests-api.ts +96 -96
- package/src/plugin/tabs.ts +426 -426
- package/src/plugin/tasks/task-provider.ts +60 -60
- package/src/plugin/tasks/tasks.ts +247 -247
- package/src/plugin/terminal-ext.ts +494 -494
- package/src/plugin/text-editor.ts +522 -522
- package/src/plugin/text-editors.ts +150 -150
- package/src/plugin/theming.ts +73 -73
- package/src/plugin/timeline.ts +186 -186
- package/src/plugin/tree/tree-views.ts +612 -612
- package/src/plugin/type-converters.spec.ts +476 -476
- package/src/plugin/type-converters.ts +1350 -1350
- package/src/plugin/types-impl.spec.ts +85 -85
- package/src/plugin/types-impl.ts +3407 -3404
- package/src/plugin/webview-views.ts +213 -213
- package/src/plugin/webviews.ts +433 -433
- package/src/plugin/window-state.ts +68 -68
- package/src/plugin/word-helper.ts +162 -162
- package/src/plugin/workspace.ts +448 -448
- 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/src/typings/index.d.ts +25 -25
package/src/plugin/scm.ts
CHANGED
|
@@ -1,910 +1,910 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2019-2021 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 WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
/*---------------------------------------------------------------------------------------------
|
|
18
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
19
|
-
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
20
|
-
*--------------------------------------------------------------------------------------------*/
|
|
21
|
-
// code copied and modified from https://github.com/microsoft/vscode/blob/1.52.1/src/vs/workbench/api/common/extHostSCM.ts
|
|
22
|
-
|
|
23
|
-
import * as theia from '@theia/plugin';
|
|
24
|
-
import { Emitter, Event } from '@theia/core/lib/common/event';
|
|
25
|
-
import {
|
|
26
|
-
Plugin, PLUGIN_RPC_CONTEXT,
|
|
27
|
-
ScmExt,
|
|
28
|
-
ScmMain, ScmRawResource, ScmRawResourceGroup,
|
|
29
|
-
ScmRawResourceSplice, ScmRawResourceSplices,
|
|
30
|
-
SourceControlGroupFeatures
|
|
31
|
-
} from '../common';
|
|
32
|
-
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
33
|
-
import { CommandRegistryImpl } from '../plugin/command-registry';
|
|
34
|
-
import { Splice } from '../common/arrays';
|
|
35
|
-
import { UriComponents } from '../common/uri-components';
|
|
36
|
-
import { Command } from '../common/plugin-api-rpc-model';
|
|
37
|
-
import { RPCProtocol } from '../common/rpc-protocol';
|
|
38
|
-
import { URI } from './types-impl';
|
|
39
|
-
import { ScmCommandArg } from '../common/plugin-api-rpc';
|
|
40
|
-
import { sep } from '@theia/core/lib/common/paths';
|
|
41
|
-
type ProviderHandle = number;
|
|
42
|
-
type GroupHandle = number;
|
|
43
|
-
type ResourceStateHandle = number;
|
|
44
|
-
|
|
45
|
-
function getIconResource(decorations?: theia.SourceControlResourceThemableDecorations): theia.Uri | undefined {
|
|
46
|
-
if (!decorations) {
|
|
47
|
-
return undefined;
|
|
48
|
-
} else if (typeof decorations.iconPath === 'string') {
|
|
49
|
-
return URI.file(decorations.iconPath);
|
|
50
|
-
} else {
|
|
51
|
-
return decorations.iconPath;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function comparePaths(one: string, other: string, caseSensitive = false): number {
|
|
56
|
-
const oneParts = one.split(sep);
|
|
57
|
-
const otherParts = other.split(sep);
|
|
58
|
-
|
|
59
|
-
const lastOne = oneParts.length - 1;
|
|
60
|
-
const lastOther = otherParts.length - 1;
|
|
61
|
-
let endOne: boolean;
|
|
62
|
-
let endOther: boolean;
|
|
63
|
-
|
|
64
|
-
for (let i = 0; ; i++) {
|
|
65
|
-
endOne = lastOne === i;
|
|
66
|
-
endOther = lastOther === i;
|
|
67
|
-
|
|
68
|
-
if (endOne && endOther) {
|
|
69
|
-
const onePart = caseSensitive ? oneParts[i].toLocaleLowerCase() : oneParts[i];
|
|
70
|
-
const otherPart = caseSensitive ? otherParts[i].toLocaleLowerCase() : otherParts[i];
|
|
71
|
-
return onePart > otherPart ? -1 : 1;
|
|
72
|
-
} else if (endOne) {
|
|
73
|
-
return -1;
|
|
74
|
-
} else if (endOther) {
|
|
75
|
-
return 1;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (endOne) {
|
|
79
|
-
return -1;
|
|
80
|
-
} else if (endOther) {
|
|
81
|
-
return 1;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const result = comparePathComponents(oneParts[i], otherParts[i], caseSensitive);
|
|
85
|
-
|
|
86
|
-
if (result !== 0) {
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function comparePathComponents(one: string, other: string, caseSensitive = false): number {
|
|
93
|
-
if (!caseSensitive) {
|
|
94
|
-
one = one && one.toLowerCase();
|
|
95
|
-
other = other && other.toLowerCase();
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (one === other) {
|
|
99
|
-
return 0;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return one < other ? -1 : 1;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function compareResourceThemableDecorations(a: theia.SourceControlResourceThemableDecorations, b: theia.SourceControlResourceThemableDecorations): number {
|
|
106
|
-
if (!a.iconPath && !b.iconPath) {
|
|
107
|
-
return 0;
|
|
108
|
-
} else if (!a.iconPath) {
|
|
109
|
-
return -1;
|
|
110
|
-
} else if (!b.iconPath) {
|
|
111
|
-
return 1;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const aPath = typeof a.iconPath === 'string' ? a.iconPath : a.iconPath.fsPath;
|
|
115
|
-
const bPath = typeof b.iconPath === 'string' ? b.iconPath : b.iconPath.fsPath;
|
|
116
|
-
return comparePaths(aPath, bPath);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function compareResourceStatesDecorations(a: theia.SourceControlResourceDecorations, b: theia.SourceControlResourceDecorations): number {
|
|
120
|
-
let result = 0;
|
|
121
|
-
|
|
122
|
-
if (a.strikeThrough !== b.strikeThrough) {
|
|
123
|
-
return a.strikeThrough ? 1 : -1;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (a.faded !== b.faded) {
|
|
127
|
-
return a.faded ? 1 : -1;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (a.tooltip !== b.tooltip) {
|
|
131
|
-
return (a.tooltip || '').localeCompare(b.tooltip || '');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
result = compareResourceThemableDecorations(a, b);
|
|
135
|
-
|
|
136
|
-
if (result !== 0) {
|
|
137
|
-
return result;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (a.light && b.light) {
|
|
141
|
-
result = compareResourceThemableDecorations(a.light, b.light);
|
|
142
|
-
} else if (a.light) {
|
|
143
|
-
return 1;
|
|
144
|
-
} else if (b.light) {
|
|
145
|
-
return -1;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (result !== 0) {
|
|
149
|
-
return result;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (a.dark && b.dark) {
|
|
153
|
-
result = compareResourceThemableDecorations(a.dark, b.dark);
|
|
154
|
-
} else if (a.dark) {
|
|
155
|
-
return 1;
|
|
156
|
-
} else if (b.dark) {
|
|
157
|
-
return -1;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function compareCommands(a: theia.Command, b: theia.Command): number {
|
|
164
|
-
if (a.command !== b.command) {
|
|
165
|
-
return a.command! < b.command! ? -1 : 1;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (a.title !== b.title) {
|
|
169
|
-
return a.title! < b.title! ? -1 : 1;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (a.tooltip !== b.tooltip) {
|
|
173
|
-
if (a.tooltip !== undefined && b.tooltip !== undefined) {
|
|
174
|
-
return a.tooltip < b.tooltip ? -1 : 1;
|
|
175
|
-
} else if (a.tooltip !== undefined) {
|
|
176
|
-
return 1;
|
|
177
|
-
} else if (b.tooltip !== undefined) {
|
|
178
|
-
return -1;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (a.arguments === b.arguments) {
|
|
183
|
-
return 0;
|
|
184
|
-
} else if (!a.arguments) {
|
|
185
|
-
return -1;
|
|
186
|
-
} else if (!b.arguments) {
|
|
187
|
-
return 1;
|
|
188
|
-
} else if (a.arguments.length !== b.arguments.length) {
|
|
189
|
-
return a.arguments.length - b.arguments.length;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
for (let i = 0; i < a.arguments.length; i++) {
|
|
193
|
-
const aArg = a.arguments[i];
|
|
194
|
-
const bArg = b.arguments[i];
|
|
195
|
-
|
|
196
|
-
if (aArg === bArg) {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return aArg < bArg ? -1 : 1;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return 0;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function compareResourceStates(a: theia.SourceControlResourceState, b: theia.SourceControlResourceState): number {
|
|
207
|
-
let result = comparePaths(a.resourceUri.fsPath, b.resourceUri.fsPath, true);
|
|
208
|
-
|
|
209
|
-
if (result !== 0) {
|
|
210
|
-
return result;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (a.command && b.command) {
|
|
214
|
-
result = compareCommands(a.command, b.command);
|
|
215
|
-
} else if (a.command) {
|
|
216
|
-
return 1;
|
|
217
|
-
} else if (b.command) {
|
|
218
|
-
return -1;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (result !== 0) {
|
|
222
|
-
return result;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (a.decorations && b.decorations) {
|
|
226
|
-
result = compareResourceStatesDecorations(a.decorations, b.decorations);
|
|
227
|
-
} else if (a.decorations) {
|
|
228
|
-
return 1;
|
|
229
|
-
} else if (b.decorations) {
|
|
230
|
-
return -1;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return result;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
|
-
function compareArgs(a: any[], b: any[]): boolean {
|
|
238
|
-
for (let i = 0; i < a.length; i++) {
|
|
239
|
-
if (a[i] !== b[i]) {
|
|
240
|
-
return false;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
function commandEquals(a: theia.Command, b: theia.Command): boolean {
|
|
248
|
-
return a.command === b.command
|
|
249
|
-
&& a.title === b.title
|
|
250
|
-
&& a.tooltip === b.tooltip
|
|
251
|
-
&& (a.arguments && b.arguments ? compareArgs(a.arguments, b.arguments) : a.arguments === b.arguments);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function commandListEquals(a: readonly theia.Command[], b: readonly theia.Command[]): boolean {
|
|
255
|
-
return equals(a, b, commandEquals);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function equals<T>(one: ReadonlyArray<T> | undefined, other: ReadonlyArray<T> | undefined, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean {
|
|
259
|
-
if (one === other) {
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (!one || !other) {
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
if (one.length !== other.length) {
|
|
268
|
-
return false;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
for (let i = 0, len = one.length; i < len; i++) {
|
|
272
|
-
if (!itemEquals(one[i], other[i])) {
|
|
273
|
-
return false;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
interface ValidateInput {
|
|
281
|
-
(value: string, cursorPosition: number): theia.ProviderResult<theia.SourceControlInputBoxValidation | undefined | null>;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
export class ScmInputBoxImpl implements theia.SourceControlInputBox {
|
|
285
|
-
|
|
286
|
-
private _value: string = '';
|
|
287
|
-
|
|
288
|
-
get value(): string {
|
|
289
|
-
return this._value;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
set value(value: string) {
|
|
293
|
-
this.proxy.$setInputBoxValue(this.sourceControlHandle, value);
|
|
294
|
-
this.updateValue(value);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
private readonly onDidChangeEmitter = new Emitter<string>();
|
|
298
|
-
|
|
299
|
-
get onDidChange(): Event<string> {
|
|
300
|
-
return this.onDidChangeEmitter.event;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
private _placeholder: string = '';
|
|
304
|
-
|
|
305
|
-
get placeholder(): string {
|
|
306
|
-
return this._placeholder;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
set placeholder(placeholder: string) {
|
|
310
|
-
this.proxy.$setInputBoxPlaceholder(this.sourceControlHandle, placeholder);
|
|
311
|
-
this._placeholder = placeholder;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
private _visible: boolean = true;
|
|
315
|
-
|
|
316
|
-
get visible(): boolean {
|
|
317
|
-
return this._visible;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
set visible(visible: boolean) {
|
|
321
|
-
this.proxy.$setInputBoxVisible(this.sourceControlHandle, visible);
|
|
322
|
-
this._visible = visible;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
private _enabled: boolean;
|
|
326
|
-
|
|
327
|
-
get enabled(): boolean {
|
|
328
|
-
return this._enabled;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
set enabled(enabled: boolean) {
|
|
332
|
-
this.proxy.$setInputBoxEnabled(this.sourceControlHandle, enabled);
|
|
333
|
-
this._enabled = enabled;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
private _validateInput: ValidateInput | undefined;
|
|
337
|
-
|
|
338
|
-
get validateInput(): ValidateInput | undefined {
|
|
339
|
-
return this._validateInput;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
set validateInput(fn: ValidateInput | undefined) {
|
|
343
|
-
if (fn && typeof fn !== 'function') {
|
|
344
|
-
throw new Error(`[${this.plugin.model.id}]: Invalid SCM input box validation function`);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
this._validateInput = fn;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
constructor(private plugin: Plugin, private proxy: ScmMain, private sourceControlHandle: number) {
|
|
351
|
-
// noop
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
onInputBoxValueChange(value: string): void {
|
|
355
|
-
this.updateValue(value);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
private updateValue(value: string): void {
|
|
359
|
-
this._value = value;
|
|
360
|
-
this.onDidChangeEmitter.fire(value);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
class SsmResourceGroupImpl implements theia.SourceControlResourceGroup {
|
|
365
|
-
|
|
366
|
-
private static handlePool: number = 0;
|
|
367
|
-
private resourceHandlePool: number = 0;
|
|
368
|
-
private _resourceStates: theia.SourceControlResourceState[] = [];
|
|
369
|
-
|
|
370
|
-
private resourceStatesMap = new Map<ResourceStateHandle, theia.SourceControlResourceState>();
|
|
371
|
-
private resourceStatesCommandsMap = new Map<ResourceStateHandle, theia.Command>();
|
|
372
|
-
private resourceStatesDisposablesMap = new Map<ResourceStateHandle, Disposable>();
|
|
373
|
-
|
|
374
|
-
private readonly onDidUpdateResourceStatesEmitter = new Emitter<void>();
|
|
375
|
-
readonly onDidUpdateResourceStates = this.onDidUpdateResourceStatesEmitter.event;
|
|
376
|
-
|
|
377
|
-
private _disposed = false;
|
|
378
|
-
get disposed(): boolean { return this._disposed; }
|
|
379
|
-
private readonly onDidDisposeEmitter = new Emitter<void>();
|
|
380
|
-
readonly onDidDispose = this.onDidDisposeEmitter.event;
|
|
381
|
-
|
|
382
|
-
private handlesSnapshot: number[] = [];
|
|
383
|
-
private resourceSnapshot: theia.SourceControlResourceState[] = [];
|
|
384
|
-
|
|
385
|
-
get id(): string { return this._id; }
|
|
386
|
-
|
|
387
|
-
get label(): string { return this._label; }
|
|
388
|
-
set label(label: string) {
|
|
389
|
-
this._label = label;
|
|
390
|
-
this.proxy.$updateGroupLabel(this.sourceControlHandle, this.handle, label);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
private _hideWhenEmpty: boolean | undefined = undefined;
|
|
394
|
-
get hideWhenEmpty(): boolean | undefined { return this._hideWhenEmpty; }
|
|
395
|
-
set hideWhenEmpty(hideWhenEmpty: boolean | undefined) {
|
|
396
|
-
this._hideWhenEmpty = hideWhenEmpty;
|
|
397
|
-
this.proxy.$updateGroup(this.sourceControlHandle, this.handle, this.features);
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
get features(): SourceControlGroupFeatures {
|
|
401
|
-
return {
|
|
402
|
-
hideWhenEmpty: this.hideWhenEmpty
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
get resourceStates(): theia.SourceControlResourceState[] { return [...this._resourceStates]; }
|
|
407
|
-
set resourceStates(resources: theia.SourceControlResourceState[]) {
|
|
408
|
-
this._resourceStates = [...resources];
|
|
409
|
-
this.onDidUpdateResourceStatesEmitter.fire();
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
readonly handle = SsmResourceGroupImpl.handlePool++;
|
|
413
|
-
|
|
414
|
-
constructor(
|
|
415
|
-
private proxy: ScmMain,
|
|
416
|
-
private commands: CommandRegistryImpl,
|
|
417
|
-
private sourceControlHandle: number,
|
|
418
|
-
private _id: string,
|
|
419
|
-
private _label: string,
|
|
420
|
-
) { }
|
|
421
|
-
|
|
422
|
-
getResourceState(handle: number): theia.SourceControlResourceState | undefined {
|
|
423
|
-
return this.resourceStatesMap.get(handle);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
executeResourceCommand(handle: number): Promise<void> {
|
|
427
|
-
const command = this.resourceStatesCommandsMap.get(handle);
|
|
428
|
-
|
|
429
|
-
if (!command) {
|
|
430
|
-
return Promise.resolve(undefined);
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
return new Promise(() => this.commands.executeCommand(command.command!, ...(command.arguments || [])));
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
takeResourceStateSnapshot(): ScmRawResourceSplice[] {
|
|
437
|
-
const snapshot = [...this._resourceStates];
|
|
438
|
-
const diffs = sortedDiff(this.resourceSnapshot, snapshot, compareResourceStates);
|
|
439
|
-
|
|
440
|
-
const splices = diffs.map<Splice<{ rawResource: ScmRawResource, handle: number }>>(diff => {
|
|
441
|
-
const toInsert = diff.toInsert.map(r => {
|
|
442
|
-
const handle = this.resourceHandlePool++;
|
|
443
|
-
this.resourceStatesMap.set(handle, r);
|
|
444
|
-
|
|
445
|
-
const sourceUri = r.resourceUri;
|
|
446
|
-
const iconUri = getIconResource(r.decorations);
|
|
447
|
-
const lightIconUri = r.decorations && getIconResource(r.decorations.light) || iconUri;
|
|
448
|
-
const darkIconUri = r.decorations && getIconResource(r.decorations.dark) || iconUri;
|
|
449
|
-
const icons: UriComponents[] = [];
|
|
450
|
-
let command: Command | undefined;
|
|
451
|
-
|
|
452
|
-
if (r.command) {
|
|
453
|
-
if (r.command.command === 'theia.open' || r.command.command === 'theia.diff') {
|
|
454
|
-
const disposables = new DisposableCollection();
|
|
455
|
-
command = this.commands.converter.toSafeCommand(r.command, disposables);
|
|
456
|
-
this.resourceStatesDisposablesMap.set(handle, disposables);
|
|
457
|
-
} else {
|
|
458
|
-
this.resourceStatesCommandsMap.set(handle, r.command);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
if (lightIconUri) {
|
|
463
|
-
icons.push(lightIconUri);
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
if (darkIconUri && (darkIconUri.toString() !== lightIconUri?.toString())) {
|
|
467
|
-
icons.push(darkIconUri);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
const tooltip = (r.decorations && r.decorations.tooltip) || '';
|
|
471
|
-
const strikeThrough = r.decorations && !!r.decorations.strikeThrough;
|
|
472
|
-
const faded = r.decorations && !!r.decorations.faded;
|
|
473
|
-
const contextValue = r.contextValue || '';
|
|
474
|
-
|
|
475
|
-
// TODO remove the letter and colorId fields when the FileDecorationProvider is applied, see https://github.com/eclipse-theia/theia/pull/8911
|
|
476
|
-
const rawResource = {
|
|
477
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
478
|
-
handle, sourceUri, letter: (r as any).letter, colorId: (r as any).color.id, icons,
|
|
479
|
-
tooltip, strikeThrough, faded, contextValue, command
|
|
480
|
-
} as ScmRawResource;
|
|
481
|
-
|
|
482
|
-
return { rawResource, handle };
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
const { start, deleteCount } = diff;
|
|
486
|
-
return { start, deleteCount, toInsert };
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
const rawResourceSplices = splices
|
|
490
|
-
.map(({ start, deleteCount, toInsert }) => ({
|
|
491
|
-
start: start,
|
|
492
|
-
deleteCount: deleteCount,
|
|
493
|
-
rawResources: toInsert.map(i => i.rawResource)
|
|
494
|
-
} as ScmRawResourceSplice));
|
|
495
|
-
|
|
496
|
-
const reverseSplices = splices.reverse();
|
|
497
|
-
|
|
498
|
-
for (const { start, deleteCount, toInsert } of reverseSplices) {
|
|
499
|
-
const handles = toInsert.map(i => i.handle);
|
|
500
|
-
const handlesToDelete = this.handlesSnapshot.splice(start, deleteCount, ...handles);
|
|
501
|
-
|
|
502
|
-
for (const handle of handlesToDelete) {
|
|
503
|
-
this.resourceStatesMap.delete(handle);
|
|
504
|
-
this.resourceStatesCommandsMap.delete(handle);
|
|
505
|
-
this.resourceStatesDisposablesMap.get(handle)?.dispose();
|
|
506
|
-
this.resourceStatesDisposablesMap.delete(handle);
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
this.resourceSnapshot = snapshot;
|
|
511
|
-
return rawResourceSplices;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
dispose(): void {
|
|
515
|
-
this._disposed = true;
|
|
516
|
-
this.onDidDisposeEmitter.fire();
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
class SourceControlImpl implements theia.SourceControl {
|
|
521
|
-
|
|
522
|
-
private static handlePool: number = 0;
|
|
523
|
-
private groups: Map<GroupHandle, SsmResourceGroupImpl> = new Map<GroupHandle, SsmResourceGroupImpl>();
|
|
524
|
-
|
|
525
|
-
get id(): string {
|
|
526
|
-
return this._id;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
get label(): string {
|
|
530
|
-
return this._label;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
get rootUri(): theia.Uri | undefined {
|
|
534
|
-
return this._rootUri;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
private _inputBox: ScmInputBoxImpl;
|
|
538
|
-
get inputBox(): ScmInputBoxImpl { return this._inputBox; }
|
|
539
|
-
|
|
540
|
-
private _count: number | undefined = undefined;
|
|
541
|
-
|
|
542
|
-
get count(): number | undefined {
|
|
543
|
-
return this._count;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
set count(count: number | undefined) {
|
|
547
|
-
if (this._count === count) {
|
|
548
|
-
return;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
this._count = count;
|
|
552
|
-
this.proxy.$updateSourceControl(this.handle, { count });
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
private _quickDiffProvider: theia.QuickDiffProvider | undefined = undefined;
|
|
556
|
-
|
|
557
|
-
get quickDiffProvider(): theia.QuickDiffProvider | undefined {
|
|
558
|
-
return this._quickDiffProvider;
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
set quickDiffProvider(quickDiffProvider: theia.QuickDiffProvider | undefined) {
|
|
562
|
-
this._quickDiffProvider = quickDiffProvider;
|
|
563
|
-
this.proxy.$updateSourceControl(this.handle, { hasQuickDiffProvider: !!quickDiffProvider });
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
private _commitTemplate: string | undefined = undefined;
|
|
567
|
-
|
|
568
|
-
get commitTemplate(): string | undefined {
|
|
569
|
-
return this._commitTemplate;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
set commitTemplate(commitTemplate: string | undefined) {
|
|
573
|
-
if (commitTemplate === this._commitTemplate) {
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
this._commitTemplate = commitTemplate;
|
|
578
|
-
this.proxy.$updateSourceControl(this.handle, { commitTemplate });
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
private acceptInputDisposables = new DisposableCollection();
|
|
582
|
-
private _acceptInputCommand: theia.Command | undefined = undefined;
|
|
583
|
-
|
|
584
|
-
get acceptInputCommand(): theia.Command | undefined {
|
|
585
|
-
return this._acceptInputCommand;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
set acceptInputCommand(acceptInputCommand: theia.Command | undefined) {
|
|
589
|
-
this.acceptInputDisposables = new DisposableCollection();
|
|
590
|
-
|
|
591
|
-
this._acceptInputCommand = acceptInputCommand;
|
|
592
|
-
|
|
593
|
-
const internal = this.commands.converter.toSafeCommand(acceptInputCommand, this.acceptInputDisposables);
|
|
594
|
-
this.proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal });
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
private _statusBarDisposables = new DisposableCollection();
|
|
598
|
-
private _statusBarCommands: theia.Command[] | undefined = undefined;
|
|
599
|
-
|
|
600
|
-
get statusBarCommands(): theia.Command[] | undefined {
|
|
601
|
-
return this._statusBarCommands;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
set statusBarCommands(statusBarCommands: theia.Command[] | undefined) {
|
|
605
|
-
if (this._statusBarCommands && statusBarCommands && commandListEquals(this._statusBarCommands, statusBarCommands)) {
|
|
606
|
-
return;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
this._statusBarDisposables = new DisposableCollection();
|
|
610
|
-
|
|
611
|
-
this._statusBarCommands = statusBarCommands;
|
|
612
|
-
|
|
613
|
-
const internal = (statusBarCommands || []).map(c => this.commands.converter.toSafeCommand(c, this._statusBarDisposables)) as Command[];
|
|
614
|
-
this.proxy.$updateSourceControl(this.handle, { statusBarCommands: internal });
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
private _selected: boolean = false;
|
|
618
|
-
|
|
619
|
-
get selected(): boolean {
|
|
620
|
-
return this._selected;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
private readonly onDidChangeSelectionEmitter = new Emitter<boolean>();
|
|
624
|
-
readonly onDidChangeSelection = this.onDidChangeSelectionEmitter.event;
|
|
625
|
-
|
|
626
|
-
private handle: number = SourceControlImpl.handlePool++;
|
|
627
|
-
|
|
628
|
-
constructor(
|
|
629
|
-
plugin: Plugin,
|
|
630
|
-
private proxy: ScmMain,
|
|
631
|
-
private commands: CommandRegistryImpl,
|
|
632
|
-
private _id: string,
|
|
633
|
-
private _label: string,
|
|
634
|
-
private _rootUri?: theia.Uri
|
|
635
|
-
) {
|
|
636
|
-
this._inputBox = new ScmInputBoxImpl(plugin, this.proxy, this.handle);
|
|
637
|
-
this.proxy.$registerSourceControl(this.handle, _id, _label, _rootUri);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
private createdResourceGroups = new Map<SsmResourceGroupImpl, Disposable>();
|
|
641
|
-
private updatedResourceGroups = new Set<SsmResourceGroupImpl>();
|
|
642
|
-
|
|
643
|
-
createResourceGroup(id: string, label: string): SsmResourceGroupImpl {
|
|
644
|
-
const group = new SsmResourceGroupImpl(this.proxy, this.commands, this.handle, id, label);
|
|
645
|
-
const disposable = group.onDidDispose(() => this.createdResourceGroups.delete(group));
|
|
646
|
-
this.createdResourceGroups.set(group, disposable);
|
|
647
|
-
this.eventuallyAddResourceGroups();
|
|
648
|
-
return group;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
eventuallyAddResourceGroups(): void {
|
|
652
|
-
const groups: ScmRawResourceGroup[] = [];
|
|
653
|
-
const splices: ScmRawResourceSplices[] = [];
|
|
654
|
-
|
|
655
|
-
for (const [group, disposable] of this.createdResourceGroups) {
|
|
656
|
-
disposable.dispose();
|
|
657
|
-
|
|
658
|
-
const updateListener = group.onDidUpdateResourceStates(() => {
|
|
659
|
-
this.updatedResourceGroups.add(group);
|
|
660
|
-
this.eventuallyUpdateResourceStates();
|
|
661
|
-
});
|
|
662
|
-
|
|
663
|
-
group.onDidDispose(() => {
|
|
664
|
-
this.updatedResourceGroups.delete(group);
|
|
665
|
-
updateListener.dispose();
|
|
666
|
-
this.groups.delete(group.handle);
|
|
667
|
-
this.proxy.$unregisterGroup(this.handle, group.handle);
|
|
668
|
-
});
|
|
669
|
-
|
|
670
|
-
const { handle, id, label, features } = group;
|
|
671
|
-
groups.push({ handle, id, label, features });
|
|
672
|
-
|
|
673
|
-
const snapshot = group.takeResourceStateSnapshot();
|
|
674
|
-
|
|
675
|
-
if (snapshot.length > 0) {
|
|
676
|
-
splices.push({ handle: group.handle, splices: snapshot });
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
this.groups.set(group.handle, group);
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
this.proxy.$registerGroups(this.handle, groups, splices);
|
|
683
|
-
this.createdResourceGroups.clear();
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
eventuallyUpdateResourceStates(): void {
|
|
687
|
-
const splices: ScmRawResourceSplices[] = [];
|
|
688
|
-
|
|
689
|
-
this.updatedResourceGroups.forEach(group => {
|
|
690
|
-
const snapshot = group.takeResourceStateSnapshot();
|
|
691
|
-
|
|
692
|
-
if (snapshot.length === 0) {
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
splices.push({ handle: group.handle, splices: snapshot });
|
|
697
|
-
});
|
|
698
|
-
|
|
699
|
-
if (splices.length > 0) {
|
|
700
|
-
this.proxy.$spliceResourceStates(this.handle, splices);
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
this.updatedResourceGroups.clear();
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
getResourceGroup(handle: GroupHandle): SsmResourceGroupImpl | undefined {
|
|
707
|
-
return this.groups.get(handle);
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
setSelectionState(selected: boolean): void {
|
|
711
|
-
this._selected = selected;
|
|
712
|
-
this.onDidChangeSelectionEmitter.fire(selected);
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
dispose(): void {
|
|
716
|
-
this.acceptInputDisposables.dispose();
|
|
717
|
-
this._statusBarDisposables.dispose();
|
|
718
|
-
|
|
719
|
-
this.groups.forEach(group => group.dispose());
|
|
720
|
-
this.proxy.$unregisterSourceControl(this.handle);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
export class ScmExtImpl implements ScmExt {
|
|
725
|
-
|
|
726
|
-
private static handlePool: number = 0;
|
|
727
|
-
|
|
728
|
-
private proxy: ScmMain;
|
|
729
|
-
private sourceControls: Map<ProviderHandle, SourceControlImpl> = new Map<ProviderHandle, SourceControlImpl>();
|
|
730
|
-
private sourceControlsByExtension: Map<string, SourceControlImpl[]> = new Map<string, SourceControlImpl[]>();
|
|
731
|
-
|
|
732
|
-
private readonly onDidChangeActiveProviderEmitter = new Emitter<theia.SourceControl>();
|
|
733
|
-
get onDidChangeActiveProvider(): Event<theia.SourceControl> { return this.onDidChangeActiveProviderEmitter.event; }
|
|
734
|
-
|
|
735
|
-
private selectedSourceControlHandle: number | undefined;
|
|
736
|
-
|
|
737
|
-
constructor(rpc: RPCProtocol, private commands: CommandRegistryImpl) {
|
|
738
|
-
this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.SCM_MAIN);
|
|
739
|
-
|
|
740
|
-
commands.registerArgumentProcessor({
|
|
741
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
742
|
-
processArgument: (arg: any) => {
|
|
743
|
-
if (!ScmCommandArg.is(arg)) {
|
|
744
|
-
return arg;
|
|
745
|
-
}
|
|
746
|
-
const sourceControl = this.sourceControls.get(arg.sourceControlHandle);
|
|
747
|
-
if (!sourceControl) {
|
|
748
|
-
return undefined;
|
|
749
|
-
}
|
|
750
|
-
if (typeof arg.resourceGroupHandle !== 'number') {
|
|
751
|
-
return sourceControl;
|
|
752
|
-
}
|
|
753
|
-
const resourceGroup = sourceControl.getResourceGroup(arg.resourceGroupHandle);
|
|
754
|
-
if (typeof arg.resourceStateHandle !== 'number') {
|
|
755
|
-
return resourceGroup;
|
|
756
|
-
}
|
|
757
|
-
return resourceGroup && resourceGroup.getResourceState(arg.resourceStateHandle);
|
|
758
|
-
}
|
|
759
|
-
});
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
createSourceControl(extension: Plugin, id: string, label: string, rootUri: theia.Uri | undefined): theia.SourceControl {
|
|
763
|
-
const handle = ScmExtImpl.handlePool++;
|
|
764
|
-
const sourceControl = new SourceControlImpl(extension, this.proxy, this.commands, id, label, rootUri);
|
|
765
|
-
this.sourceControls.set(handle, sourceControl);
|
|
766
|
-
|
|
767
|
-
const sourceControls = this.sourceControlsByExtension.get(extension.model.id) || [];
|
|
768
|
-
sourceControls.push(sourceControl);
|
|
769
|
-
this.sourceControlsByExtension.set(extension.model.id, sourceControls);
|
|
770
|
-
|
|
771
|
-
return sourceControl;
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
getLastInputBox(extension: Plugin): ScmInputBoxImpl | undefined {
|
|
775
|
-
const sourceControls = this.sourceControlsByExtension.get(extension.model.id);
|
|
776
|
-
const sourceControl = sourceControls && sourceControls[sourceControls.length - 1];
|
|
777
|
-
return sourceControl && sourceControl.inputBox;
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
$provideOriginalResource(sourceControlHandle: number, uriComponents: string, token: theia.CancellationToken): Promise<UriComponents | undefined> {
|
|
781
|
-
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
782
|
-
|
|
783
|
-
if (!sourceControl || !sourceControl.quickDiffProvider || !sourceControl.quickDiffProvider.provideOriginalResource) {
|
|
784
|
-
return Promise.resolve(undefined);
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
return new Promise<UriComponents | undefined>(() => sourceControl.quickDiffProvider!.provideOriginalResource!(URI.file(uriComponents), token))
|
|
788
|
-
.then<UriComponents | undefined>(r => r || undefined);
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
$onInputBoxValueChange(sourceControlHandle: number, value: string): Promise<void> {
|
|
792
|
-
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
793
|
-
|
|
794
|
-
if (!sourceControl) {
|
|
795
|
-
return Promise.resolve(undefined);
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
sourceControl.inputBox.onInputBoxValueChange(value);
|
|
799
|
-
return Promise.resolve(undefined);
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
$executeResourceCommand(sourceControlHandle: number, groupHandle: number, handle: number): Promise<void> {
|
|
803
|
-
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
804
|
-
|
|
805
|
-
if (!sourceControl) {
|
|
806
|
-
return Promise.resolve(undefined);
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
const group = sourceControl.getResourceGroup(groupHandle);
|
|
810
|
-
|
|
811
|
-
if (!group) {
|
|
812
|
-
return Promise.resolve(undefined);
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
return group.executeResourceCommand(handle);
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
async $validateInput(sourceControlHandle: number, value: string, cursorPosition: number): Promise<[string, number] | undefined> {
|
|
819
|
-
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
820
|
-
|
|
821
|
-
if (!sourceControl) {
|
|
822
|
-
return Promise.resolve(undefined);
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
if (!sourceControl.inputBox.validateInput) {
|
|
826
|
-
return Promise.resolve(undefined);
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
const result = await sourceControl.inputBox.validateInput!(value, cursorPosition);
|
|
830
|
-
if (!result) {
|
|
831
|
-
return Promise.resolve(undefined);
|
|
832
|
-
}
|
|
833
|
-
return [result.message, result.type];
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
$setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise<void> {
|
|
837
|
-
if (selectedSourceControlHandle !== undefined) {
|
|
838
|
-
this.sourceControls.get(selectedSourceControlHandle)?.setSelectionState(true);
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
if (this.selectedSourceControlHandle !== undefined) {
|
|
842
|
-
this.sourceControls.get(this.selectedSourceControlHandle)?.setSelectionState(false);
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
this.selectedSourceControlHandle = selectedSourceControlHandle;
|
|
846
|
-
return Promise.resolve(undefined);
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
/**
|
|
851
|
-
* Diffs two *sorted* arrays and computes the splices which apply the diff.
|
|
852
|
-
*/
|
|
853
|
-
function sortedDiff(before: ReadonlyArray<theia.SourceControlResourceState>,
|
|
854
|
-
after: ReadonlyArray<theia.SourceControlResourceState>,
|
|
855
|
-
compare: (a: theia.SourceControlResourceState,
|
|
856
|
-
b: theia.SourceControlResourceState) => number): Splice<theia.SourceControlResourceState>[] {
|
|
857
|
-
const result: MutableSplice<theia.SourceControlResourceState>[] = [];
|
|
858
|
-
|
|
859
|
-
function pushSplice(start: number, deleteCount: number, toInsert: theia.SourceControlResourceState[]): void {
|
|
860
|
-
if (deleteCount === 0 && toInsert.length === 0) {
|
|
861
|
-
return;
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
const latest = result[result.length - 1];
|
|
865
|
-
|
|
866
|
-
if (latest && latest.start + latest.deleteCount === start) {
|
|
867
|
-
latest.deleteCount += deleteCount;
|
|
868
|
-
latest.toInsert.push(...toInsert);
|
|
869
|
-
} else {
|
|
870
|
-
result.push({ start, deleteCount, toInsert });
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
let beforeIdx = 0;
|
|
875
|
-
let afterIdx = 0;
|
|
876
|
-
|
|
877
|
-
while (true) {
|
|
878
|
-
if (beforeIdx === before.length) {
|
|
879
|
-
pushSplice(beforeIdx, 0, after.slice(afterIdx));
|
|
880
|
-
break;
|
|
881
|
-
}
|
|
882
|
-
if (afterIdx === after.length) {
|
|
883
|
-
pushSplice(beforeIdx, before.length - beforeIdx, []);
|
|
884
|
-
break;
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
const beforeElement = before[beforeIdx];
|
|
888
|
-
const afterElement = after[afterIdx];
|
|
889
|
-
const n = compare(beforeElement, afterElement);
|
|
890
|
-
if (n === 0) {
|
|
891
|
-
// equal
|
|
892
|
-
beforeIdx += 1;
|
|
893
|
-
afterIdx += 1;
|
|
894
|
-
} else if (n < 0) {
|
|
895
|
-
// beforeElement is smaller -> before element removed
|
|
896
|
-
pushSplice(beforeIdx, 1, []);
|
|
897
|
-
beforeIdx += 1;
|
|
898
|
-
} else if (n > 0) {
|
|
899
|
-
// beforeElement is greater -> after element added
|
|
900
|
-
pushSplice(beforeIdx, 0, [afterElement]);
|
|
901
|
-
afterIdx += 1;
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
return result;
|
|
906
|
-
}
|
|
907
|
-
|
|
908
|
-
interface MutableSplice<T> extends Splice<T> {
|
|
909
|
-
deleteCount: number;
|
|
910
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2019-2021 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 WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
/*---------------------------------------------------------------------------------------------
|
|
18
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
19
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
20
|
+
*--------------------------------------------------------------------------------------------*/
|
|
21
|
+
// code copied and modified from https://github.com/microsoft/vscode/blob/1.52.1/src/vs/workbench/api/common/extHostSCM.ts
|
|
22
|
+
|
|
23
|
+
import * as theia from '@theia/plugin';
|
|
24
|
+
import { Emitter, Event } from '@theia/core/lib/common/event';
|
|
25
|
+
import {
|
|
26
|
+
Plugin, PLUGIN_RPC_CONTEXT,
|
|
27
|
+
ScmExt,
|
|
28
|
+
ScmMain, ScmRawResource, ScmRawResourceGroup,
|
|
29
|
+
ScmRawResourceSplice, ScmRawResourceSplices,
|
|
30
|
+
SourceControlGroupFeatures
|
|
31
|
+
} from '../common';
|
|
32
|
+
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
33
|
+
import { CommandRegistryImpl } from '../plugin/command-registry';
|
|
34
|
+
import { Splice } from '../common/arrays';
|
|
35
|
+
import { UriComponents } from '../common/uri-components';
|
|
36
|
+
import { Command } from '../common/plugin-api-rpc-model';
|
|
37
|
+
import { RPCProtocol } from '../common/rpc-protocol';
|
|
38
|
+
import { URI } from './types-impl';
|
|
39
|
+
import { ScmCommandArg } from '../common/plugin-api-rpc';
|
|
40
|
+
import { sep } from '@theia/core/lib/common/paths';
|
|
41
|
+
type ProviderHandle = number;
|
|
42
|
+
type GroupHandle = number;
|
|
43
|
+
type ResourceStateHandle = number;
|
|
44
|
+
|
|
45
|
+
function getIconResource(decorations?: theia.SourceControlResourceThemableDecorations): theia.Uri | undefined {
|
|
46
|
+
if (!decorations) {
|
|
47
|
+
return undefined;
|
|
48
|
+
} else if (typeof decorations.iconPath === 'string') {
|
|
49
|
+
return URI.file(decorations.iconPath);
|
|
50
|
+
} else {
|
|
51
|
+
return decorations.iconPath;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function comparePaths(one: string, other: string, caseSensitive = false): number {
|
|
56
|
+
const oneParts = one.split(sep);
|
|
57
|
+
const otherParts = other.split(sep);
|
|
58
|
+
|
|
59
|
+
const lastOne = oneParts.length - 1;
|
|
60
|
+
const lastOther = otherParts.length - 1;
|
|
61
|
+
let endOne: boolean;
|
|
62
|
+
let endOther: boolean;
|
|
63
|
+
|
|
64
|
+
for (let i = 0; ; i++) {
|
|
65
|
+
endOne = lastOne === i;
|
|
66
|
+
endOther = lastOther === i;
|
|
67
|
+
|
|
68
|
+
if (endOne && endOther) {
|
|
69
|
+
const onePart = caseSensitive ? oneParts[i].toLocaleLowerCase() : oneParts[i];
|
|
70
|
+
const otherPart = caseSensitive ? otherParts[i].toLocaleLowerCase() : otherParts[i];
|
|
71
|
+
return onePart > otherPart ? -1 : 1;
|
|
72
|
+
} else if (endOne) {
|
|
73
|
+
return -1;
|
|
74
|
+
} else if (endOther) {
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (endOne) {
|
|
79
|
+
return -1;
|
|
80
|
+
} else if (endOther) {
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const result = comparePathComponents(oneParts[i], otherParts[i], caseSensitive);
|
|
85
|
+
|
|
86
|
+
if (result !== 0) {
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function comparePathComponents(one: string, other: string, caseSensitive = false): number {
|
|
93
|
+
if (!caseSensitive) {
|
|
94
|
+
one = one && one.toLowerCase();
|
|
95
|
+
other = other && other.toLowerCase();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (one === other) {
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return one < other ? -1 : 1;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function compareResourceThemableDecorations(a: theia.SourceControlResourceThemableDecorations, b: theia.SourceControlResourceThemableDecorations): number {
|
|
106
|
+
if (!a.iconPath && !b.iconPath) {
|
|
107
|
+
return 0;
|
|
108
|
+
} else if (!a.iconPath) {
|
|
109
|
+
return -1;
|
|
110
|
+
} else if (!b.iconPath) {
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const aPath = typeof a.iconPath === 'string' ? a.iconPath : a.iconPath.fsPath;
|
|
115
|
+
const bPath = typeof b.iconPath === 'string' ? b.iconPath : b.iconPath.fsPath;
|
|
116
|
+
return comparePaths(aPath, bPath);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function compareResourceStatesDecorations(a: theia.SourceControlResourceDecorations, b: theia.SourceControlResourceDecorations): number {
|
|
120
|
+
let result = 0;
|
|
121
|
+
|
|
122
|
+
if (a.strikeThrough !== b.strikeThrough) {
|
|
123
|
+
return a.strikeThrough ? 1 : -1;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (a.faded !== b.faded) {
|
|
127
|
+
return a.faded ? 1 : -1;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (a.tooltip !== b.tooltip) {
|
|
131
|
+
return (a.tooltip || '').localeCompare(b.tooltip || '');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
result = compareResourceThemableDecorations(a, b);
|
|
135
|
+
|
|
136
|
+
if (result !== 0) {
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (a.light && b.light) {
|
|
141
|
+
result = compareResourceThemableDecorations(a.light, b.light);
|
|
142
|
+
} else if (a.light) {
|
|
143
|
+
return 1;
|
|
144
|
+
} else if (b.light) {
|
|
145
|
+
return -1;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (result !== 0) {
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (a.dark && b.dark) {
|
|
153
|
+
result = compareResourceThemableDecorations(a.dark, b.dark);
|
|
154
|
+
} else if (a.dark) {
|
|
155
|
+
return 1;
|
|
156
|
+
} else if (b.dark) {
|
|
157
|
+
return -1;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function compareCommands(a: theia.Command, b: theia.Command): number {
|
|
164
|
+
if (a.command !== b.command) {
|
|
165
|
+
return a.command! < b.command! ? -1 : 1;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (a.title !== b.title) {
|
|
169
|
+
return a.title! < b.title! ? -1 : 1;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (a.tooltip !== b.tooltip) {
|
|
173
|
+
if (a.tooltip !== undefined && b.tooltip !== undefined) {
|
|
174
|
+
return a.tooltip < b.tooltip ? -1 : 1;
|
|
175
|
+
} else if (a.tooltip !== undefined) {
|
|
176
|
+
return 1;
|
|
177
|
+
} else if (b.tooltip !== undefined) {
|
|
178
|
+
return -1;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (a.arguments === b.arguments) {
|
|
183
|
+
return 0;
|
|
184
|
+
} else if (!a.arguments) {
|
|
185
|
+
return -1;
|
|
186
|
+
} else if (!b.arguments) {
|
|
187
|
+
return 1;
|
|
188
|
+
} else if (a.arguments.length !== b.arguments.length) {
|
|
189
|
+
return a.arguments.length - b.arguments.length;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
for (let i = 0; i < a.arguments.length; i++) {
|
|
193
|
+
const aArg = a.arguments[i];
|
|
194
|
+
const bArg = b.arguments[i];
|
|
195
|
+
|
|
196
|
+
if (aArg === bArg) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return aArg < bArg ? -1 : 1;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function compareResourceStates(a: theia.SourceControlResourceState, b: theia.SourceControlResourceState): number {
|
|
207
|
+
let result = comparePaths(a.resourceUri.fsPath, b.resourceUri.fsPath, true);
|
|
208
|
+
|
|
209
|
+
if (result !== 0) {
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (a.command && b.command) {
|
|
214
|
+
result = compareCommands(a.command, b.command);
|
|
215
|
+
} else if (a.command) {
|
|
216
|
+
return 1;
|
|
217
|
+
} else if (b.command) {
|
|
218
|
+
return -1;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (result !== 0) {
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (a.decorations && b.decorations) {
|
|
226
|
+
result = compareResourceStatesDecorations(a.decorations, b.decorations);
|
|
227
|
+
} else if (a.decorations) {
|
|
228
|
+
return 1;
|
|
229
|
+
} else if (b.decorations) {
|
|
230
|
+
return -1;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
|
+
function compareArgs(a: any[], b: any[]): boolean {
|
|
238
|
+
for (let i = 0; i < a.length; i++) {
|
|
239
|
+
if (a[i] !== b[i]) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function commandEquals(a: theia.Command, b: theia.Command): boolean {
|
|
248
|
+
return a.command === b.command
|
|
249
|
+
&& a.title === b.title
|
|
250
|
+
&& a.tooltip === b.tooltip
|
|
251
|
+
&& (a.arguments && b.arguments ? compareArgs(a.arguments, b.arguments) : a.arguments === b.arguments);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function commandListEquals(a: readonly theia.Command[], b: readonly theia.Command[]): boolean {
|
|
255
|
+
return equals(a, b, commandEquals);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function equals<T>(one: ReadonlyArray<T> | undefined, other: ReadonlyArray<T> | undefined, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean {
|
|
259
|
+
if (one === other) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (!one || !other) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (one.length !== other.length) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
for (let i = 0, len = one.length; i < len; i++) {
|
|
272
|
+
if (!itemEquals(one[i], other[i])) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
interface ValidateInput {
|
|
281
|
+
(value: string, cursorPosition: number): theia.ProviderResult<theia.SourceControlInputBoxValidation | undefined | null>;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export class ScmInputBoxImpl implements theia.SourceControlInputBox {
|
|
285
|
+
|
|
286
|
+
private _value: string = '';
|
|
287
|
+
|
|
288
|
+
get value(): string {
|
|
289
|
+
return this._value;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
set value(value: string) {
|
|
293
|
+
this.proxy.$setInputBoxValue(this.sourceControlHandle, value);
|
|
294
|
+
this.updateValue(value);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
private readonly onDidChangeEmitter = new Emitter<string>();
|
|
298
|
+
|
|
299
|
+
get onDidChange(): Event<string> {
|
|
300
|
+
return this.onDidChangeEmitter.event;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private _placeholder: string = '';
|
|
304
|
+
|
|
305
|
+
get placeholder(): string {
|
|
306
|
+
return this._placeholder;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
set placeholder(placeholder: string) {
|
|
310
|
+
this.proxy.$setInputBoxPlaceholder(this.sourceControlHandle, placeholder);
|
|
311
|
+
this._placeholder = placeholder;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
private _visible: boolean = true;
|
|
315
|
+
|
|
316
|
+
get visible(): boolean {
|
|
317
|
+
return this._visible;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
set visible(visible: boolean) {
|
|
321
|
+
this.proxy.$setInputBoxVisible(this.sourceControlHandle, visible);
|
|
322
|
+
this._visible = visible;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
private _enabled: boolean;
|
|
326
|
+
|
|
327
|
+
get enabled(): boolean {
|
|
328
|
+
return this._enabled;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
set enabled(enabled: boolean) {
|
|
332
|
+
this.proxy.$setInputBoxEnabled(this.sourceControlHandle, enabled);
|
|
333
|
+
this._enabled = enabled;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private _validateInput: ValidateInput | undefined;
|
|
337
|
+
|
|
338
|
+
get validateInput(): ValidateInput | undefined {
|
|
339
|
+
return this._validateInput;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
set validateInput(fn: ValidateInput | undefined) {
|
|
343
|
+
if (fn && typeof fn !== 'function') {
|
|
344
|
+
throw new Error(`[${this.plugin.model.id}]: Invalid SCM input box validation function`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
this._validateInput = fn;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
constructor(private plugin: Plugin, private proxy: ScmMain, private sourceControlHandle: number) {
|
|
351
|
+
// noop
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
onInputBoxValueChange(value: string): void {
|
|
355
|
+
this.updateValue(value);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
private updateValue(value: string): void {
|
|
359
|
+
this._value = value;
|
|
360
|
+
this.onDidChangeEmitter.fire(value);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
class SsmResourceGroupImpl implements theia.SourceControlResourceGroup {
|
|
365
|
+
|
|
366
|
+
private static handlePool: number = 0;
|
|
367
|
+
private resourceHandlePool: number = 0;
|
|
368
|
+
private _resourceStates: theia.SourceControlResourceState[] = [];
|
|
369
|
+
|
|
370
|
+
private resourceStatesMap = new Map<ResourceStateHandle, theia.SourceControlResourceState>();
|
|
371
|
+
private resourceStatesCommandsMap = new Map<ResourceStateHandle, theia.Command>();
|
|
372
|
+
private resourceStatesDisposablesMap = new Map<ResourceStateHandle, Disposable>();
|
|
373
|
+
|
|
374
|
+
private readonly onDidUpdateResourceStatesEmitter = new Emitter<void>();
|
|
375
|
+
readonly onDidUpdateResourceStates = this.onDidUpdateResourceStatesEmitter.event;
|
|
376
|
+
|
|
377
|
+
private _disposed = false;
|
|
378
|
+
get disposed(): boolean { return this._disposed; }
|
|
379
|
+
private readonly onDidDisposeEmitter = new Emitter<void>();
|
|
380
|
+
readonly onDidDispose = this.onDidDisposeEmitter.event;
|
|
381
|
+
|
|
382
|
+
private handlesSnapshot: number[] = [];
|
|
383
|
+
private resourceSnapshot: theia.SourceControlResourceState[] = [];
|
|
384
|
+
|
|
385
|
+
get id(): string { return this._id; }
|
|
386
|
+
|
|
387
|
+
get label(): string { return this._label; }
|
|
388
|
+
set label(label: string) {
|
|
389
|
+
this._label = label;
|
|
390
|
+
this.proxy.$updateGroupLabel(this.sourceControlHandle, this.handle, label);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
private _hideWhenEmpty: boolean | undefined = undefined;
|
|
394
|
+
get hideWhenEmpty(): boolean | undefined { return this._hideWhenEmpty; }
|
|
395
|
+
set hideWhenEmpty(hideWhenEmpty: boolean | undefined) {
|
|
396
|
+
this._hideWhenEmpty = hideWhenEmpty;
|
|
397
|
+
this.proxy.$updateGroup(this.sourceControlHandle, this.handle, this.features);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
get features(): SourceControlGroupFeatures {
|
|
401
|
+
return {
|
|
402
|
+
hideWhenEmpty: this.hideWhenEmpty
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
get resourceStates(): theia.SourceControlResourceState[] { return [...this._resourceStates]; }
|
|
407
|
+
set resourceStates(resources: theia.SourceControlResourceState[]) {
|
|
408
|
+
this._resourceStates = [...resources];
|
|
409
|
+
this.onDidUpdateResourceStatesEmitter.fire();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
readonly handle = SsmResourceGroupImpl.handlePool++;
|
|
413
|
+
|
|
414
|
+
constructor(
|
|
415
|
+
private proxy: ScmMain,
|
|
416
|
+
private commands: CommandRegistryImpl,
|
|
417
|
+
private sourceControlHandle: number,
|
|
418
|
+
private _id: string,
|
|
419
|
+
private _label: string,
|
|
420
|
+
) { }
|
|
421
|
+
|
|
422
|
+
getResourceState(handle: number): theia.SourceControlResourceState | undefined {
|
|
423
|
+
return this.resourceStatesMap.get(handle);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
executeResourceCommand(handle: number): Promise<void> {
|
|
427
|
+
const command = this.resourceStatesCommandsMap.get(handle);
|
|
428
|
+
|
|
429
|
+
if (!command) {
|
|
430
|
+
return Promise.resolve(undefined);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return new Promise(() => this.commands.executeCommand(command.command!, ...(command.arguments || [])));
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
takeResourceStateSnapshot(): ScmRawResourceSplice[] {
|
|
437
|
+
const snapshot = [...this._resourceStates];
|
|
438
|
+
const diffs = sortedDiff(this.resourceSnapshot, snapshot, compareResourceStates);
|
|
439
|
+
|
|
440
|
+
const splices = diffs.map<Splice<{ rawResource: ScmRawResource, handle: number }>>(diff => {
|
|
441
|
+
const toInsert = diff.toInsert.map(r => {
|
|
442
|
+
const handle = this.resourceHandlePool++;
|
|
443
|
+
this.resourceStatesMap.set(handle, r);
|
|
444
|
+
|
|
445
|
+
const sourceUri = r.resourceUri;
|
|
446
|
+
const iconUri = getIconResource(r.decorations);
|
|
447
|
+
const lightIconUri = r.decorations && getIconResource(r.decorations.light) || iconUri;
|
|
448
|
+
const darkIconUri = r.decorations && getIconResource(r.decorations.dark) || iconUri;
|
|
449
|
+
const icons: UriComponents[] = [];
|
|
450
|
+
let command: Command | undefined;
|
|
451
|
+
|
|
452
|
+
if (r.command) {
|
|
453
|
+
if (r.command.command === 'theia.open' || r.command.command === 'theia.diff') {
|
|
454
|
+
const disposables = new DisposableCollection();
|
|
455
|
+
command = this.commands.converter.toSafeCommand(r.command, disposables);
|
|
456
|
+
this.resourceStatesDisposablesMap.set(handle, disposables);
|
|
457
|
+
} else {
|
|
458
|
+
this.resourceStatesCommandsMap.set(handle, r.command);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
if (lightIconUri) {
|
|
463
|
+
icons.push(lightIconUri);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
if (darkIconUri && (darkIconUri.toString() !== lightIconUri?.toString())) {
|
|
467
|
+
icons.push(darkIconUri);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
const tooltip = (r.decorations && r.decorations.tooltip) || '';
|
|
471
|
+
const strikeThrough = r.decorations && !!r.decorations.strikeThrough;
|
|
472
|
+
const faded = r.decorations && !!r.decorations.faded;
|
|
473
|
+
const contextValue = r.contextValue || '';
|
|
474
|
+
|
|
475
|
+
// TODO remove the letter and colorId fields when the FileDecorationProvider is applied, see https://github.com/eclipse-theia/theia/pull/8911
|
|
476
|
+
const rawResource = {
|
|
477
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
478
|
+
handle, sourceUri, letter: (r as any).letter, colorId: (r as any).color.id, icons,
|
|
479
|
+
tooltip, strikeThrough, faded, contextValue, command
|
|
480
|
+
} as ScmRawResource;
|
|
481
|
+
|
|
482
|
+
return { rawResource, handle };
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
const { start, deleteCount } = diff;
|
|
486
|
+
return { start, deleteCount, toInsert };
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
const rawResourceSplices = splices
|
|
490
|
+
.map(({ start, deleteCount, toInsert }) => ({
|
|
491
|
+
start: start,
|
|
492
|
+
deleteCount: deleteCount,
|
|
493
|
+
rawResources: toInsert.map(i => i.rawResource)
|
|
494
|
+
} as ScmRawResourceSplice));
|
|
495
|
+
|
|
496
|
+
const reverseSplices = splices.reverse();
|
|
497
|
+
|
|
498
|
+
for (const { start, deleteCount, toInsert } of reverseSplices) {
|
|
499
|
+
const handles = toInsert.map(i => i.handle);
|
|
500
|
+
const handlesToDelete = this.handlesSnapshot.splice(start, deleteCount, ...handles);
|
|
501
|
+
|
|
502
|
+
for (const handle of handlesToDelete) {
|
|
503
|
+
this.resourceStatesMap.delete(handle);
|
|
504
|
+
this.resourceStatesCommandsMap.delete(handle);
|
|
505
|
+
this.resourceStatesDisposablesMap.get(handle)?.dispose();
|
|
506
|
+
this.resourceStatesDisposablesMap.delete(handle);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
this.resourceSnapshot = snapshot;
|
|
511
|
+
return rawResourceSplices;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
dispose(): void {
|
|
515
|
+
this._disposed = true;
|
|
516
|
+
this.onDidDisposeEmitter.fire();
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
class SourceControlImpl implements theia.SourceControl {
|
|
521
|
+
|
|
522
|
+
private static handlePool: number = 0;
|
|
523
|
+
private groups: Map<GroupHandle, SsmResourceGroupImpl> = new Map<GroupHandle, SsmResourceGroupImpl>();
|
|
524
|
+
|
|
525
|
+
get id(): string {
|
|
526
|
+
return this._id;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
get label(): string {
|
|
530
|
+
return this._label;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
get rootUri(): theia.Uri | undefined {
|
|
534
|
+
return this._rootUri;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
private _inputBox: ScmInputBoxImpl;
|
|
538
|
+
get inputBox(): ScmInputBoxImpl { return this._inputBox; }
|
|
539
|
+
|
|
540
|
+
private _count: number | undefined = undefined;
|
|
541
|
+
|
|
542
|
+
get count(): number | undefined {
|
|
543
|
+
return this._count;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
set count(count: number | undefined) {
|
|
547
|
+
if (this._count === count) {
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
this._count = count;
|
|
552
|
+
this.proxy.$updateSourceControl(this.handle, { count });
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
private _quickDiffProvider: theia.QuickDiffProvider | undefined = undefined;
|
|
556
|
+
|
|
557
|
+
get quickDiffProvider(): theia.QuickDiffProvider | undefined {
|
|
558
|
+
return this._quickDiffProvider;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
set quickDiffProvider(quickDiffProvider: theia.QuickDiffProvider | undefined) {
|
|
562
|
+
this._quickDiffProvider = quickDiffProvider;
|
|
563
|
+
this.proxy.$updateSourceControl(this.handle, { hasQuickDiffProvider: !!quickDiffProvider });
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
private _commitTemplate: string | undefined = undefined;
|
|
567
|
+
|
|
568
|
+
get commitTemplate(): string | undefined {
|
|
569
|
+
return this._commitTemplate;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
set commitTemplate(commitTemplate: string | undefined) {
|
|
573
|
+
if (commitTemplate === this._commitTemplate) {
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
this._commitTemplate = commitTemplate;
|
|
578
|
+
this.proxy.$updateSourceControl(this.handle, { commitTemplate });
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
private acceptInputDisposables = new DisposableCollection();
|
|
582
|
+
private _acceptInputCommand: theia.Command | undefined = undefined;
|
|
583
|
+
|
|
584
|
+
get acceptInputCommand(): theia.Command | undefined {
|
|
585
|
+
return this._acceptInputCommand;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
set acceptInputCommand(acceptInputCommand: theia.Command | undefined) {
|
|
589
|
+
this.acceptInputDisposables = new DisposableCollection();
|
|
590
|
+
|
|
591
|
+
this._acceptInputCommand = acceptInputCommand;
|
|
592
|
+
|
|
593
|
+
const internal = this.commands.converter.toSafeCommand(acceptInputCommand, this.acceptInputDisposables);
|
|
594
|
+
this.proxy.$updateSourceControl(this.handle, { acceptInputCommand: internal });
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
private _statusBarDisposables = new DisposableCollection();
|
|
598
|
+
private _statusBarCommands: theia.Command[] | undefined = undefined;
|
|
599
|
+
|
|
600
|
+
get statusBarCommands(): theia.Command[] | undefined {
|
|
601
|
+
return this._statusBarCommands;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
set statusBarCommands(statusBarCommands: theia.Command[] | undefined) {
|
|
605
|
+
if (this._statusBarCommands && statusBarCommands && commandListEquals(this._statusBarCommands, statusBarCommands)) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
this._statusBarDisposables = new DisposableCollection();
|
|
610
|
+
|
|
611
|
+
this._statusBarCommands = statusBarCommands;
|
|
612
|
+
|
|
613
|
+
const internal = (statusBarCommands || []).map(c => this.commands.converter.toSafeCommand(c, this._statusBarDisposables)) as Command[];
|
|
614
|
+
this.proxy.$updateSourceControl(this.handle, { statusBarCommands: internal });
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
private _selected: boolean = false;
|
|
618
|
+
|
|
619
|
+
get selected(): boolean {
|
|
620
|
+
return this._selected;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
private readonly onDidChangeSelectionEmitter = new Emitter<boolean>();
|
|
624
|
+
readonly onDidChangeSelection = this.onDidChangeSelectionEmitter.event;
|
|
625
|
+
|
|
626
|
+
private handle: number = SourceControlImpl.handlePool++;
|
|
627
|
+
|
|
628
|
+
constructor(
|
|
629
|
+
plugin: Plugin,
|
|
630
|
+
private proxy: ScmMain,
|
|
631
|
+
private commands: CommandRegistryImpl,
|
|
632
|
+
private _id: string,
|
|
633
|
+
private _label: string,
|
|
634
|
+
private _rootUri?: theia.Uri
|
|
635
|
+
) {
|
|
636
|
+
this._inputBox = new ScmInputBoxImpl(plugin, this.proxy, this.handle);
|
|
637
|
+
this.proxy.$registerSourceControl(this.handle, _id, _label, _rootUri);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
private createdResourceGroups = new Map<SsmResourceGroupImpl, Disposable>();
|
|
641
|
+
private updatedResourceGroups = new Set<SsmResourceGroupImpl>();
|
|
642
|
+
|
|
643
|
+
createResourceGroup(id: string, label: string): SsmResourceGroupImpl {
|
|
644
|
+
const group = new SsmResourceGroupImpl(this.proxy, this.commands, this.handle, id, label);
|
|
645
|
+
const disposable = group.onDidDispose(() => this.createdResourceGroups.delete(group));
|
|
646
|
+
this.createdResourceGroups.set(group, disposable);
|
|
647
|
+
this.eventuallyAddResourceGroups();
|
|
648
|
+
return group;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
eventuallyAddResourceGroups(): void {
|
|
652
|
+
const groups: ScmRawResourceGroup[] = [];
|
|
653
|
+
const splices: ScmRawResourceSplices[] = [];
|
|
654
|
+
|
|
655
|
+
for (const [group, disposable] of this.createdResourceGroups) {
|
|
656
|
+
disposable.dispose();
|
|
657
|
+
|
|
658
|
+
const updateListener = group.onDidUpdateResourceStates(() => {
|
|
659
|
+
this.updatedResourceGroups.add(group);
|
|
660
|
+
this.eventuallyUpdateResourceStates();
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
group.onDidDispose(() => {
|
|
664
|
+
this.updatedResourceGroups.delete(group);
|
|
665
|
+
updateListener.dispose();
|
|
666
|
+
this.groups.delete(group.handle);
|
|
667
|
+
this.proxy.$unregisterGroup(this.handle, group.handle);
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
const { handle, id, label, features } = group;
|
|
671
|
+
groups.push({ handle, id, label, features });
|
|
672
|
+
|
|
673
|
+
const snapshot = group.takeResourceStateSnapshot();
|
|
674
|
+
|
|
675
|
+
if (snapshot.length > 0) {
|
|
676
|
+
splices.push({ handle: group.handle, splices: snapshot });
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
this.groups.set(group.handle, group);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
this.proxy.$registerGroups(this.handle, groups, splices);
|
|
683
|
+
this.createdResourceGroups.clear();
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
eventuallyUpdateResourceStates(): void {
|
|
687
|
+
const splices: ScmRawResourceSplices[] = [];
|
|
688
|
+
|
|
689
|
+
this.updatedResourceGroups.forEach(group => {
|
|
690
|
+
const snapshot = group.takeResourceStateSnapshot();
|
|
691
|
+
|
|
692
|
+
if (snapshot.length === 0) {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
splices.push({ handle: group.handle, splices: snapshot });
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
if (splices.length > 0) {
|
|
700
|
+
this.proxy.$spliceResourceStates(this.handle, splices);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
this.updatedResourceGroups.clear();
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
getResourceGroup(handle: GroupHandle): SsmResourceGroupImpl | undefined {
|
|
707
|
+
return this.groups.get(handle);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
setSelectionState(selected: boolean): void {
|
|
711
|
+
this._selected = selected;
|
|
712
|
+
this.onDidChangeSelectionEmitter.fire(selected);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
dispose(): void {
|
|
716
|
+
this.acceptInputDisposables.dispose();
|
|
717
|
+
this._statusBarDisposables.dispose();
|
|
718
|
+
|
|
719
|
+
this.groups.forEach(group => group.dispose());
|
|
720
|
+
this.proxy.$unregisterSourceControl(this.handle);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
export class ScmExtImpl implements ScmExt {
|
|
725
|
+
|
|
726
|
+
private static handlePool: number = 0;
|
|
727
|
+
|
|
728
|
+
private proxy: ScmMain;
|
|
729
|
+
private sourceControls: Map<ProviderHandle, SourceControlImpl> = new Map<ProviderHandle, SourceControlImpl>();
|
|
730
|
+
private sourceControlsByExtension: Map<string, SourceControlImpl[]> = new Map<string, SourceControlImpl[]>();
|
|
731
|
+
|
|
732
|
+
private readonly onDidChangeActiveProviderEmitter = new Emitter<theia.SourceControl>();
|
|
733
|
+
get onDidChangeActiveProvider(): Event<theia.SourceControl> { return this.onDidChangeActiveProviderEmitter.event; }
|
|
734
|
+
|
|
735
|
+
private selectedSourceControlHandle: number | undefined;
|
|
736
|
+
|
|
737
|
+
constructor(rpc: RPCProtocol, private commands: CommandRegistryImpl) {
|
|
738
|
+
this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.SCM_MAIN);
|
|
739
|
+
|
|
740
|
+
commands.registerArgumentProcessor({
|
|
741
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
742
|
+
processArgument: (arg: any) => {
|
|
743
|
+
if (!ScmCommandArg.is(arg)) {
|
|
744
|
+
return arg;
|
|
745
|
+
}
|
|
746
|
+
const sourceControl = this.sourceControls.get(arg.sourceControlHandle);
|
|
747
|
+
if (!sourceControl) {
|
|
748
|
+
return undefined;
|
|
749
|
+
}
|
|
750
|
+
if (typeof arg.resourceGroupHandle !== 'number') {
|
|
751
|
+
return sourceControl;
|
|
752
|
+
}
|
|
753
|
+
const resourceGroup = sourceControl.getResourceGroup(arg.resourceGroupHandle);
|
|
754
|
+
if (typeof arg.resourceStateHandle !== 'number') {
|
|
755
|
+
return resourceGroup;
|
|
756
|
+
}
|
|
757
|
+
return resourceGroup && resourceGroup.getResourceState(arg.resourceStateHandle);
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
createSourceControl(extension: Plugin, id: string, label: string, rootUri: theia.Uri | undefined): theia.SourceControl {
|
|
763
|
+
const handle = ScmExtImpl.handlePool++;
|
|
764
|
+
const sourceControl = new SourceControlImpl(extension, this.proxy, this.commands, id, label, rootUri);
|
|
765
|
+
this.sourceControls.set(handle, sourceControl);
|
|
766
|
+
|
|
767
|
+
const sourceControls = this.sourceControlsByExtension.get(extension.model.id) || [];
|
|
768
|
+
sourceControls.push(sourceControl);
|
|
769
|
+
this.sourceControlsByExtension.set(extension.model.id, sourceControls);
|
|
770
|
+
|
|
771
|
+
return sourceControl;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
getLastInputBox(extension: Plugin): ScmInputBoxImpl | undefined {
|
|
775
|
+
const sourceControls = this.sourceControlsByExtension.get(extension.model.id);
|
|
776
|
+
const sourceControl = sourceControls && sourceControls[sourceControls.length - 1];
|
|
777
|
+
return sourceControl && sourceControl.inputBox;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
$provideOriginalResource(sourceControlHandle: number, uriComponents: string, token: theia.CancellationToken): Promise<UriComponents | undefined> {
|
|
781
|
+
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
782
|
+
|
|
783
|
+
if (!sourceControl || !sourceControl.quickDiffProvider || !sourceControl.quickDiffProvider.provideOriginalResource) {
|
|
784
|
+
return Promise.resolve(undefined);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return new Promise<UriComponents | undefined>(() => sourceControl.quickDiffProvider!.provideOriginalResource!(URI.file(uriComponents), token))
|
|
788
|
+
.then<UriComponents | undefined>(r => r || undefined);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
$onInputBoxValueChange(sourceControlHandle: number, value: string): Promise<void> {
|
|
792
|
+
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
793
|
+
|
|
794
|
+
if (!sourceControl) {
|
|
795
|
+
return Promise.resolve(undefined);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
sourceControl.inputBox.onInputBoxValueChange(value);
|
|
799
|
+
return Promise.resolve(undefined);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
$executeResourceCommand(sourceControlHandle: number, groupHandle: number, handle: number): Promise<void> {
|
|
803
|
+
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
804
|
+
|
|
805
|
+
if (!sourceControl) {
|
|
806
|
+
return Promise.resolve(undefined);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
const group = sourceControl.getResourceGroup(groupHandle);
|
|
810
|
+
|
|
811
|
+
if (!group) {
|
|
812
|
+
return Promise.resolve(undefined);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
return group.executeResourceCommand(handle);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
async $validateInput(sourceControlHandle: number, value: string, cursorPosition: number): Promise<[string, number] | undefined> {
|
|
819
|
+
const sourceControl = this.sourceControls.get(sourceControlHandle);
|
|
820
|
+
|
|
821
|
+
if (!sourceControl) {
|
|
822
|
+
return Promise.resolve(undefined);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
if (!sourceControl.inputBox.validateInput) {
|
|
826
|
+
return Promise.resolve(undefined);
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
const result = await sourceControl.inputBox.validateInput!(value, cursorPosition);
|
|
830
|
+
if (!result) {
|
|
831
|
+
return Promise.resolve(undefined);
|
|
832
|
+
}
|
|
833
|
+
return [result.message, result.type];
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
$setSelectedSourceControl(selectedSourceControlHandle: number | undefined): Promise<void> {
|
|
837
|
+
if (selectedSourceControlHandle !== undefined) {
|
|
838
|
+
this.sourceControls.get(selectedSourceControlHandle)?.setSelectionState(true);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
if (this.selectedSourceControlHandle !== undefined) {
|
|
842
|
+
this.sourceControls.get(this.selectedSourceControlHandle)?.setSelectionState(false);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
this.selectedSourceControlHandle = selectedSourceControlHandle;
|
|
846
|
+
return Promise.resolve(undefined);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
/**
|
|
851
|
+
* Diffs two *sorted* arrays and computes the splices which apply the diff.
|
|
852
|
+
*/
|
|
853
|
+
function sortedDiff(before: ReadonlyArray<theia.SourceControlResourceState>,
|
|
854
|
+
after: ReadonlyArray<theia.SourceControlResourceState>,
|
|
855
|
+
compare: (a: theia.SourceControlResourceState,
|
|
856
|
+
b: theia.SourceControlResourceState) => number): Splice<theia.SourceControlResourceState>[] {
|
|
857
|
+
const result: MutableSplice<theia.SourceControlResourceState>[] = [];
|
|
858
|
+
|
|
859
|
+
function pushSplice(start: number, deleteCount: number, toInsert: theia.SourceControlResourceState[]): void {
|
|
860
|
+
if (deleteCount === 0 && toInsert.length === 0) {
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
const latest = result[result.length - 1];
|
|
865
|
+
|
|
866
|
+
if (latest && latest.start + latest.deleteCount === start) {
|
|
867
|
+
latest.deleteCount += deleteCount;
|
|
868
|
+
latest.toInsert.push(...toInsert);
|
|
869
|
+
} else {
|
|
870
|
+
result.push({ start, deleteCount, toInsert });
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
let beforeIdx = 0;
|
|
875
|
+
let afterIdx = 0;
|
|
876
|
+
|
|
877
|
+
while (true) {
|
|
878
|
+
if (beforeIdx === before.length) {
|
|
879
|
+
pushSplice(beforeIdx, 0, after.slice(afterIdx));
|
|
880
|
+
break;
|
|
881
|
+
}
|
|
882
|
+
if (afterIdx === after.length) {
|
|
883
|
+
pushSplice(beforeIdx, before.length - beforeIdx, []);
|
|
884
|
+
break;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
const beforeElement = before[beforeIdx];
|
|
888
|
+
const afterElement = after[afterIdx];
|
|
889
|
+
const n = compare(beforeElement, afterElement);
|
|
890
|
+
if (n === 0) {
|
|
891
|
+
// equal
|
|
892
|
+
beforeIdx += 1;
|
|
893
|
+
afterIdx += 1;
|
|
894
|
+
} else if (n < 0) {
|
|
895
|
+
// beforeElement is smaller -> before element removed
|
|
896
|
+
pushSplice(beforeIdx, 1, []);
|
|
897
|
+
beforeIdx += 1;
|
|
898
|
+
} else if (n > 0) {
|
|
899
|
+
// beforeElement is greater -> after element added
|
|
900
|
+
pushSplice(beforeIdx, 0, [afterElement]);
|
|
901
|
+
afterIdx += 1;
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
return result;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
interface MutableSplice<T> extends Splice<T> {
|
|
909
|
+
deleteCount: number;
|
|
910
|
+
}
|