@theia/plugin-ext 1.53.0-next.5 → 1.53.0-next.55

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