@usethesource/rascal-vscode-dsl-lsp-server 0.6.0

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 (51) hide show
  1. package/LICENSE.txt +24 -0
  2. package/README.md +9 -0
  3. package/assets/jars/.gitignore +1 -0
  4. package/assets/jars/rascal-lsp.jar +0 -0
  5. package/assets/jars/rascal.jar +0 -0
  6. package/lib/RascalExtension.d.ts +23 -0
  7. package/lib/RascalExtension.js +147 -0
  8. package/lib/RascalExtension.js.map +1 -0
  9. package/lib/RascalTerminalLinkProvider.d.ts +22 -0
  10. package/lib/RascalTerminalLinkProvider.js +142 -0
  11. package/lib/RascalTerminalLinkProvider.js.map +1 -0
  12. package/lib/auto-jvm/JavaLookup.d.ts +2 -0
  13. package/lib/auto-jvm/JavaLookup.js +181 -0
  14. package/lib/auto-jvm/JavaLookup.js.map +1 -0
  15. package/lib/auto-jvm/downloaders.d.ts +18 -0
  16. package/lib/auto-jvm/downloaders.js +332 -0
  17. package/lib/auto-jvm/downloaders.js.map +1 -0
  18. package/lib/extension.d.ts +7 -0
  19. package/lib/extension.js +43 -0
  20. package/lib/extension.js.map +1 -0
  21. package/lib/fs/RascalFileSystemProviders.d.ts +34 -0
  22. package/lib/fs/RascalFileSystemProviders.js +69 -0
  23. package/lib/fs/RascalFileSystemProviders.js.map +1 -0
  24. package/lib/fs/VSCodeURIResolver.d.ts +71 -0
  25. package/lib/fs/VSCodeURIResolver.js +383 -0
  26. package/lib/fs/VSCodeURIResolver.js.map +1 -0
  27. package/lib/lsp/ParameterizedLanguageServer.d.ts +26 -0
  28. package/lib/lsp/ParameterizedLanguageServer.js +135 -0
  29. package/lib/lsp/ParameterizedLanguageServer.js.map +1 -0
  30. package/lib/lsp/RascalLSPConnection.d.ts +13 -0
  31. package/lib/lsp/RascalLSPConnection.js +187 -0
  32. package/lib/lsp/RascalLSPConnection.js.map +1 -0
  33. package/lib/lsp/RascalLanguageServer.d.ts +9 -0
  34. package/lib/lsp/RascalLanguageServer.js +32 -0
  35. package/lib/lsp/RascalLanguageServer.js.map +1 -0
  36. package/lib/lsp/library.d.ts +2 -0
  37. package/lib/lsp/library.js +35 -0
  38. package/lib/lsp/library.js.map +1 -0
  39. package/lib/test/normal-suite/JavaDownload.test.d.ts +1 -0
  40. package/lib/test/normal-suite/JavaDownload.test.js +105 -0
  41. package/lib/test/normal-suite/JavaDownload.test.js.map +1 -0
  42. package/lib/test/runVSCodeTests.d.ts +1 -0
  43. package/lib/test/runVSCodeTests.js +48 -0
  44. package/lib/test/runVSCodeTests.js.map +1 -0
  45. package/lib/test/vscode-suite/extension.test.d.ts +1 -0
  46. package/lib/test/vscode-suite/extension.test.js +44 -0
  47. package/lib/test/vscode-suite/extension.test.js.map +1 -0
  48. package/lib/test/vscode-suite/index.d.ts +1 -0
  49. package/lib/test/vscode-suite/index.js +66 -0
  50. package/lib/test/vscode-suite/index.js.map +1 -0
  51. package/package.json +61 -0
package/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2018-2021, NWO-I CWI and Swat.engineering
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
+ POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # Rascal Metaprogramming Language - VSCode DSL LSP Server
2
+
3
+ This package enables writing your own VS Code extension while using
4
+ [Rascal's VS Code LSP abstraction](https://github.com/usethesource/rascal-language-servers).
5
+
6
+
7
+ See [`examples/` subdirectory for how to use this package](https://github.com/usethesource/rascal-language-servers/tree/main/examples). The entry point of this library is the [`ParameterizedLanguageServer`](https://github.com/usethesource/rascal-language-servers/blob/main/rascal-vscode-extension/src/lsp/ParameterizedLanguageServer.ts) class from the [Rascal VS Code extension](https://marketplace.visualstudio.com/items?itemName=usethesource.rascalmpl).
8
+
9
+ The release notes can be found in the [Github Repo](https://github.com/usethesource/rascal-language-servers/tree/main/rascal-vscode-extension#release-notes).
@@ -0,0 +1 @@
1
+ *.jar
Binary file
Binary file
@@ -0,0 +1,23 @@
1
+ import * as vscode from 'vscode';
2
+ import { LanguageParameter } from './lsp/ParameterizedLanguageServer';
3
+ export declare class RascalExtension implements vscode.Disposable {
4
+ private readonly context;
5
+ private readonly jarRootPath;
6
+ private readonly isDeploy;
7
+ private readonly vfsServer;
8
+ private readonly dsls;
9
+ private readonly rascal;
10
+ constructor(context: vscode.ExtensionContext, jarRootPath: string, isDeploy?: boolean);
11
+ dispose(): void;
12
+ externalLanguageRegistry(): {
13
+ registerLanguage: (lang: LanguageParameter) => Promise<void>;
14
+ unregisterLanguage: (lang: LanguageParameter) => Promise<void>;
15
+ getRascalExtensionDeploymode: () => boolean;
16
+ };
17
+ private registerTerminalCommand;
18
+ private registerMainRun;
19
+ private registerImportModule;
20
+ private startTerminal;
21
+ private buildShellArgs;
22
+ private buildTerminalJVMPath;
23
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RascalExtension = void 0;
4
+ /*
5
+ * Copyright (c) 2018-2021, NWO-I CWI and Swat.engineering
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ *
14
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ * this list of conditions and the following disclaimer in the documentation
16
+ * and/or other materials provided with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
+ * POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ const os = require("os");
31
+ const path = require("path");
32
+ const vscode = require("vscode");
33
+ const JavaLookup_1 = require("./auto-jvm/JavaLookup");
34
+ const RascalLanguageServer_1 = require("./lsp/RascalLanguageServer");
35
+ const ParameterizedLanguageServer_1 = require("./lsp/ParameterizedLanguageServer");
36
+ const RascalTerminalLinkProvider_1 = require("./RascalTerminalLinkProvider");
37
+ const VSCodeURIResolver_1 = require("./fs/VSCodeURIResolver");
38
+ class RascalExtension {
39
+ constructor(context, jarRootPath, isDeploy = true) {
40
+ this.context = context;
41
+ this.jarRootPath = jarRootPath;
42
+ this.isDeploy = isDeploy;
43
+ this.vfsServer = new VSCodeURIResolver_1.VSCodeUriResolverServer(!isDeploy);
44
+ this.dsls = new ParameterizedLanguageServer_1.ParameterizedLanguageServer(context, this.vfsServer, jarRootPath, isDeploy);
45
+ this.rascal = new RascalLanguageServer_1.RascalLanguageServer(context, this.vfsServer, jarRootPath, this.dsls, isDeploy);
46
+ this.registerTerminalCommand();
47
+ this.registerMainRun();
48
+ this.registerImportModule();
49
+ vscode.window.registerTerminalLinkProvider(new RascalTerminalLinkProvider_1.RascalTerminalLinkProvider(this.rascal.rascalClient));
50
+ }
51
+ dispose() {
52
+ this.vfsServer.dispose();
53
+ this.dsls.dispose();
54
+ this.rascal.dispose();
55
+ }
56
+ externalLanguageRegistry() {
57
+ return {
58
+ registerLanguage: (lang) => this.dsls.registerLanguage(lang),
59
+ unregisterLanguage: (lang) => this.dsls.unregisterLanguage(lang),
60
+ getRascalExtensionDeploymode: () => this.isDeploy,
61
+ };
62
+ }
63
+ registerTerminalCommand() {
64
+ this.context.subscriptions.push(vscode.commands.registerCommand("rascalmpl.createTerminal", () => {
65
+ this.startTerminal(vscode.window.activeTextEditor?.document.uri);
66
+ }));
67
+ }
68
+ registerMainRun() {
69
+ this.context.subscriptions.push(vscode.commands.registerTextEditorCommand("rascalmpl.runMain", (text, _edit, moduleName) => {
70
+ if (!text.document.uri || !moduleName) {
71
+ return;
72
+ }
73
+ this.startTerminal(text.document.uri, "--loadModule", moduleName, "--runModule");
74
+ }));
75
+ }
76
+ registerImportModule() {
77
+ this.context.subscriptions.push(vscode.commands.registerTextEditorCommand("rascalmpl.importModule", (text, _edit, moduleName) => {
78
+ if (!text.document.uri || !moduleName) {
79
+ return;
80
+ }
81
+ this.startTerminal(text.document.uri, "--loadModule", moduleName);
82
+ }));
83
+ }
84
+ startTerminal(uri, ...extraArgs) {
85
+ return vscode.window.withProgress({
86
+ location: vscode.ProgressLocation.Notification,
87
+ cancellable: false,
88
+ title: "Rascal terminal"
89
+ }, async (progress) => {
90
+ progress.report({ message: "Starting rascal-lsp" });
91
+ const rascal = await this.rascal.rascalClient;
92
+ console.log(`Starting Rascal REPL: on ${uri} and with args: ${extraArgs}`);
93
+ if (uri && !uri.path.endsWith(".rsc")) {
94
+ // do not try to figure out a rascal project path when the focus is not a rascal file
95
+ uri = undefined;
96
+ }
97
+ progress.report({ increment: 25, message: "Requesting IDE configuration" });
98
+ const serverConfig = await rascal.sendRequest("rascal/supplyIDEServicesConfiguration");
99
+ progress.report({ increment: 25, message: "Calculating project class path" });
100
+ const compilationPath = await rascal.sendRequest("rascal/supplyProjectCompilationClasspath", { uri: uri?.toString() });
101
+ progress.report({ increment: 25, message: "Creating terminal" });
102
+ const terminal = vscode.window.createTerminal({
103
+ cwd: path.dirname(uri?.fsPath || ""),
104
+ shellPath: await (0, JavaLookup_1.getJavaExecutable)(),
105
+ shellArgs: this.buildShellArgs(compilationPath, serverConfig, ...extraArgs),
106
+ name: 'Rascal Terminal',
107
+ });
108
+ terminal.show(false);
109
+ progress.report({ increment: 25, message: "Finished creating terminal" });
110
+ });
111
+ }
112
+ buildShellArgs(classPath, ide, ...extraArgs) {
113
+ const shellArgs = [
114
+ calculateRascalREPLMemory(),
115
+ '-cp',
116
+ this.buildTerminalJVMPath() + (classPath.length > 0 ? (path.delimiter + classPath.join(path.delimiter)) : ''),
117
+ ];
118
+ if (!this.isDeploy) {
119
+ // for development mode we always start the terminal with debuging ready to go
120
+ shellArgs.push('-Xdebug', '-Xrunjdwp:transport=dt_socket,address=9001,server=y,suspend=n');
121
+ }
122
+ shellArgs.push();
123
+ shellArgs.push('-Drascal.fallbackResolver=org.rascalmpl.vscode.lsp.uri.FallbackResolver', 'org.rascalmpl.vscode.lsp.terminal.LSPTerminalREPL', '--ideServicesPort', '' + ide.port, '--vfsPort', '' + this.vfsServer.port);
124
+ return shellArgs.concat(extraArgs || []);
125
+ }
126
+ buildTerminalJVMPath() {
127
+ const jars = ['rascal-lsp.jar', 'rascal.jar'];
128
+ return jars.map(j => path.join(this.jarRootPath, j)).join(path.delimiter);
129
+ }
130
+ }
131
+ exports.RascalExtension = RascalExtension;
132
+ function gb(amount) {
133
+ return amount * (1024 * 1024 * 1024);
134
+ }
135
+ function calculateRascalREPLMemory() {
136
+ if (os.totalmem() >= gb(32)) {
137
+ return "-Xmx9000M";
138
+ }
139
+ if (os.totalmem() >= gb(16)) {
140
+ return "-Xmx4800M";
141
+ }
142
+ if (os.totalmem() >= gb(8)) {
143
+ return "-Xmx2400M";
144
+ }
145
+ return "-Xmx800M";
146
+ }
147
+ //# sourceMappingURL=RascalExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RascalExtension.js","sourceRoot":"","sources":["../src/RascalExtension.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,yBAAyB;AACzB,6BAA6B;AAC7B,iCAAiC;AAGjC,sDAA0D;AAC1D,qEAAkE;AAClE,mFAAmG;AACnG,6EAA0E;AAC1E,8DAAiE;AAEjE,MAAa,eAAe;IAMxB,YAA6B,OAAgC,EAAmB,WAAmB,EAAmB,WAAW,IAAI;QAAxG,YAAO,GAAP,OAAO,CAAyB;QAAmB,gBAAW,GAAX,WAAW,CAAQ;QAAmB,aAAQ,GAAR,QAAQ,CAAO;QACjI,IAAI,CAAC,SAAS,GAAG,IAAI,2CAAuB,CAAC,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,IAAI,GAAG,IAAI,yDAA2B,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,GAAG,IAAI,2CAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAElG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,IAAI,uDAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,OAAO;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,wBAAwB;QACpB,OAAO;YACH,gBAAgB,EAAE,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC9E,kBAAkB,EAAE,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAClF,4BAA4B,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ;SACpD,CAAC;IACN,CAAC;IAEO,uBAAuB;QAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAC3B,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAC7D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrE,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAEO,eAAe;QACnB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAC3B,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACvF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;gBACnC,OAAO;aACV;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QACrF,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAGO,oBAAoB;QACxB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAC3B,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC5F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;gBACnC,OAAO;aACV;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACtE,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,GAA2B,EAAE,GAAG,SAAmB;QACrE,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY;YAC9C,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,iBAAiB;SAC3B,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClB,QAAQ,CAAC,MAAM,CAAC,EAAC,OAAO,EAAE,qBAAqB,EAAC,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,mBAAmB,SAAS,EAAE,CAAC,CAAC;YAC3E,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBACnC,qFAAqF;gBACrF,GAAG,GAAG,SAAS,CAAC;aACnB;YACD,QAAQ,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAC,CAAC,CAAC;YAC1E,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,WAAW,CAA2B,uCAAuC,CAAC,CAAC;YACjH,QAAQ,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAC,CAAC,CAAC;YAC5E,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,WAAW,CAAW,0CAA0C,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjI,QAAQ,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAC,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC1C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;gBACpC,SAAS,EAAE,MAAM,IAAA,8BAAiB,GAAE;gBACpC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;gBAC3E,IAAI,EAAE,iBAAiB;aAC1B,CAAC,CAAC;YAEH,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,QAAQ,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,cAAc,CAAC,SAAmB,EAAE,GAA6B,EAAE,GAAG,SAAmB;QAC7F,MAAM,SAAS,GAAG;YACV,yBAAyB,EAAE;YACzB,KAAK;YACL,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACtH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,8EAA8E;YAC9E,SAAS,CAAC,IAAI,CACV,SAAS,EACP,+DAA+D,CACpE,CAAC;SACL;QACD,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,CAAC,IAAI,CACV,yEAAyE,EACvE,mDAAmD,EACnD,mBAAmB,EACnB,EAAE,GAAG,GAAG,CAAC,IAAI,EACb,WAAW,EACX,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC7B,CAAC;QACF,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACO,oBAAoB;QACxB,MAAM,IAAI,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;CAEJ;AA3HD,0CA2HC;AAQD,SAAS,EAAE,CAAC,MAAe;IACvB,OAAO,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,yBAAyB;IAC9B,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;QACzB,OAAO,WAAW,CAAC;KACtB;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE;QACzB,OAAO,WAAW,CAAC;KAEtB;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;QACxB,OAAO,WAAW,CAAC;KACtB;IACD,OAAO,UAAU,CAAC;AACtB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { CancellationToken, ProviderResult, TerminalLink, TerminalLinkContext, TerminalLinkProvider } from 'vscode';
2
+ import { LanguageClient } from 'vscode-languageclient/node';
3
+ interface ExtendedLink extends TerminalLink {
4
+ loc: SourceLocation;
5
+ }
6
+ interface SourceLocation {
7
+ uri: string;
8
+ offsetLength?: [number, number];
9
+ beginLineColumn?: [number, number];
10
+ endLineColumn?: [number, number];
11
+ }
12
+ /**
13
+ * We only detect Source Locations, as normal markdown links are already detected correctly by vscode
14
+ */
15
+ export declare class RascalTerminalLinkProvider implements TerminalLinkProvider<ExtendedLink> {
16
+ private readonly client;
17
+ constructor(client: Promise<LanguageClient>);
18
+ linkDetector(): RegExp;
19
+ provideTerminalLinks(context: TerminalLinkContext, token: CancellationToken): ProviderResult<ExtendedLink[]>;
20
+ handleTerminalLink(link: ExtendedLink): Promise<void>;
21
+ }
22
+ export {};
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RascalTerminalLinkProvider = void 0;
4
+ /*
5
+ * Copyright (c) 2018-2021, NWO-I CWI and Swat.engineering
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ *
14
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ * this list of conditions and the following disclaimer in the documentation
16
+ * and/or other materials provided with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
+ * POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ const vscode = require("vscode");
31
+ /**
32
+ * We only detect Source Locations, as normal markdown links are already detected correctly by vscode
33
+ */
34
+ class RascalTerminalLinkProvider {
35
+ constructor(client) {
36
+ this.client = client;
37
+ }
38
+ linkDetector() {
39
+ // sadly java script regex store state, so we have to create a new one everytime
40
+ return new RegExp("\\|[^\\t-\\n\\r\\s\\|:]+://[^\\t-\\n\\r\\s\\|]*\\|" // |location|
41
+ + "(\\([^\\)]*\\))?" // (optional offset)
42
+ , "g");
43
+ }
44
+ provideTerminalLinks(context, token) {
45
+ if (!context.terminal.name.includes("Rascal")) {
46
+ return null;
47
+ }
48
+ const matcher = this.linkDetector();
49
+ let match;
50
+ let result = [];
51
+ while ((match = matcher.exec(context.line)) !== null && !token.isCancellationRequested) {
52
+ result.push(buildLink(match));
53
+ }
54
+ return result.length === 0 ? null : result;
55
+ }
56
+ async handleTerminalLink(link) {
57
+ const sloc = link.loc;
58
+ if (sloc.uri.startsWith("http")) {
59
+ return vscode.commands.executeCommand("vscode.open", sloc.uri);
60
+ }
61
+ const rsloc = await (await this.client).sendRequest("rascal/filesystem/resolveLocation", sloc);
62
+ const td = await vscode.workspace.openTextDocument(vscode.Uri.parse(rsloc.uri));
63
+ const te = await vscode.window.showTextDocument(td);
64
+ const targetRange = translateRange(rsloc, td);
65
+ if (targetRange) {
66
+ te.revealRange(targetRange);
67
+ te.selection = new vscode.Selection(targetRange.start.line, targetRange.start.character, targetRange.end.line, targetRange.end.character);
68
+ }
69
+ }
70
+ }
71
+ exports.RascalTerminalLinkProvider = RascalTerminalLinkProvider;
72
+ function translateRange(sloc, td) {
73
+ if (sloc.beginLineColumn && sloc.endLineColumn) {
74
+ const beginLine = sloc.beginLineColumn[0] - 1;
75
+ const endLine = sloc.endLineColumn[0] - 1;
76
+ return new vscode.Range(beginLine, fixedColumn(td, beginLine, sloc.beginLineColumn[1]), endLine, fixedColumn(td, endLine, sloc.endLineColumn[1]));
77
+ }
78
+ else if (sloc.offsetLength) {
79
+ const rangePositions = fixedOffsetLengthPositions(td, sloc.offsetLength[0], sloc.offsetLength[1]);
80
+ return new vscode.Range(td.positionAt(rangePositions[0]), td.positionAt(rangePositions[1]));
81
+ }
82
+ return undefined;
83
+ }
84
+ function buildLink(match) {
85
+ const linkMatch = match[0];
86
+ const linkOffset = match.index + 1;
87
+ const linkLength = linkMatch.indexOf('|', 2);
88
+ const sloc = { uri: linkMatch.substring(1, linkLength) };
89
+ const numbers = linkMatch.substring(linkLength).match(/\d+/g);
90
+ if (numbers && numbers.length >= 2) {
91
+ sloc.offsetLength = [Number(numbers[0]), Number(numbers[1])];
92
+ if (numbers.length === 6) {
93
+ // we have a full loc
94
+ sloc.beginLineColumn = [Number(numbers[2]), Number(numbers[3])];
95
+ sloc.endLineColumn = [Number(numbers[4]), Number(numbers[5])];
96
+ }
97
+ }
98
+ return {
99
+ startIndex: linkOffset - 1,
100
+ length: linkMatch.length,
101
+ loc: sloc
102
+ };
103
+ }
104
+ // from https://github.com/microsoft/vscode/blob/main/src/vs/base/common/strings.ts
105
+ function isHighSurrogate(charCode) {
106
+ return (0xD800 <= charCode && charCode <= 0xDBFF);
107
+ }
108
+ // from https://github.com/microsoft/vscode/blob/main/src/vs/base/common/strings.ts
109
+ function isLowSurrogate(charCode) {
110
+ return (0xDC00 <= charCode && charCode <= 0xDFFF);
111
+ }
112
+ /**
113
+ * locate surrogate pairs on the current line, and if present, offset rascal columns by the surrogate pairs before it
114
+ */
115
+ function fixedColumn(td, line, originalColumn) {
116
+ const fullLine = td.lineAt(line).text;
117
+ let result = originalColumn;
118
+ for (let i = 0; i < fullLine.length && i < result; i++) {
119
+ const c = fullLine.charCodeAt(i);
120
+ if (isHighSurrogate(c) && (i + 1) < fullLine.length && isLowSurrogate(fullLine.charCodeAt(i + 1))) {
121
+ i++;
122
+ result++;
123
+ }
124
+ }
125
+ return result;
126
+ }
127
+ function fixedOffsetLengthPositions(td, offset, length) {
128
+ const fullText = td.getText();
129
+ let endOffset = offset + length;
130
+ for (let i = 0; i < fullText.length && i < endOffset; i++) {
131
+ const c = fullText.charCodeAt(i);
132
+ if (isHighSurrogate(c) && (i + 1) < fullText.length && isLowSurrogate(fullText.charCodeAt(i + 1))) {
133
+ if (i <= offset) {
134
+ offset++;
135
+ }
136
+ endOffset++;
137
+ i++;
138
+ }
139
+ }
140
+ return [offset, endOffset];
141
+ }
142
+ //# sourceMappingURL=RascalTerminalLinkProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RascalTerminalLinkProvider.js","sourceRoot":"","sources":["../src/RascalTerminalLinkProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getJavaExecutable(): Promise<string>;
2
+ export declare function askUserForJVM(): Promise<string>;
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.askUserForJVM = exports.getJavaExecutable = void 0;
4
+ /*
5
+ * Copyright (c) 2018-2021, NWO-I CWI and Swat.engineering
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ *
14
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ * this list of conditions and the following disclaimer in the documentation
16
+ * and/or other materials provided with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
+ * POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ const vscode = require("vscode");
31
+ const path = require("path");
32
+ const os = require("os");
33
+ const cp = require("child_process");
34
+ const downloaders_1 = require("./downloaders");
35
+ const fs_1 = require("fs");
36
+ const util_1 = require("util");
37
+ const currentJVMEngineMin = 11;
38
+ const currentJVMEngineMax = 11;
39
+ const mainJVMPath = path.join(os.homedir(), ".jvm", `jdk${currentJVMEngineMax}`);
40
+ let lookupCompleted;
41
+ const pexec = (0, util_1.promisify)(cp.exec);
42
+ async function getJavaExecutable() {
43
+ if (lookupCompleted) {
44
+ console.log("Returning: " + lookupCompleted);
45
+ return lookupCompleted;
46
+ }
47
+ for (const possibleCandidate of getJavaCandidates()) {
48
+ try {
49
+ // we check the availability of javac, since we need a JDK instead of a JRE
50
+ const versionRun = await pexec(`"${makeJavac(possibleCandidate)}" -version`);
51
+ const versionsFound = /javac (?:1\.)?([0-9]+)\./.exec(versionRun.stdout);
52
+ if (versionsFound && versionsFound.length > 0) {
53
+ if (Number(versionsFound[1]) >= currentJVMEngineMin && Number(versionsFound[1]) <= currentJVMEngineMax) {
54
+ lookupCompleted = Promise.resolve(possibleCandidate);
55
+ return possibleCandidate;
56
+ }
57
+ }
58
+ }
59
+ catch (e) {
60
+ // ignore exceptions, most likely the candidate wasn't in the path
61
+ }
62
+ }
63
+ // okay, so we don't have a working java interpreter, so we ask the user
64
+ lookupCompleted = askUserForJVM();
65
+ lookupCompleted.then(good => { }, e => {
66
+ console.log("Automatic download failed: ", e);
67
+ lookupCompleted = undefined;
68
+ });
69
+ return lookupCompleted;
70
+ }
71
+ exports.getJavaExecutable = getJavaExecutable;
72
+ function makeJavac(javaPath) {
73
+ if (javaPath.endsWith(".exe")) {
74
+ return javaPath.replace(/java.exe$/, "javac.exe");
75
+ }
76
+ return javaPath + "c";
77
+ }
78
+ function getJavaCandidates() {
79
+ let result = [];
80
+ const { JAVA_HOME } = process.env;
81
+ const name = os.platform() === 'win32' ? 'java.exe' : 'java';
82
+ if (JAVA_HOME) {
83
+ result.push(path.join(JAVA_HOME, "bin", name));
84
+ }
85
+ else {
86
+ result.push(name);
87
+ }
88
+ if ((0, fs_1.existsSync)(mainJVMPath)) {
89
+ for (const ent of (0, fs_1.readdirSync)(mainJVMPath, {})) {
90
+ let possiblePath = "";
91
+ switch (os.platform()) {
92
+ case 'win32':
93
+ possiblePath = path.join(mainJVMPath, String(ent), "bin", "java.exe");
94
+ break;
95
+ case 'linux':
96
+ possiblePath = path.join(mainJVMPath, String(ent), "bin", "java");
97
+ break;
98
+ case 'darwin':
99
+ possiblePath = path.join(mainJVMPath, String(ent), "Contents", "Home", "bin", "java");
100
+ break;
101
+ }
102
+ if ((0, fs_1.existsSync)(makeJavac(possiblePath))) {
103
+ result.push(possiblePath);
104
+ }
105
+ }
106
+ }
107
+ return result;
108
+ }
109
+ async function askUserForJVM() {
110
+ const selfInstall = "Install myself & restart vscode";
111
+ const extensionInstall = `Automatically download Java ${currentJVMEngineMax} `;
112
+ const configurePath = "Configure JDK path";
113
+ const opt = await vscode.window.showErrorMessage(`Rascal (or a DSL that uses Rascal) requires a Java ${currentJVMEngineMax} runtime. Shall we download it, or will you set it up yourself?`, { modal: true }, selfInstall, extensionInstall, configurePath);
114
+ if (opt === extensionInstall) {
115
+ return startAutoInstall();
116
+ }
117
+ if (opt === configurePath) {
118
+ return openSettings();
119
+ }
120
+ throw Error("User setup required for jdk " + currentJVMEngineMin);
121
+ }
122
+ exports.askUserForJVM = askUserForJVM;
123
+ async function startAutoInstall() {
124
+ const acceptGPL2CE = "Accept GPL+CE";
125
+ const reviewLicense = "Review GPL+CE";
126
+ const readAboutLicense = "Read about GPL+CE";
127
+ const opt = await vscode.window.showInformationMessage("Downloading a Java runtime means you accept the \"GPL2 + Classpath Exception\" license. Note: this holds for the runtime engine, not for your own code.", { modal: true }, acceptGPL2CE, reviewLicense, readAboutLicense);
128
+ if (opt === acceptGPL2CE) {
129
+ return downloadJDK();
130
+ }
131
+ if (opt === reviewLicense || opt === readAboutLicense) {
132
+ let url;
133
+ if (opt === reviewLicense) {
134
+ url = "https://openjdk.java.net/legal/gplv2+ce.html";
135
+ }
136
+ else {
137
+ url = "https://softwareengineering.stackexchange.com/questions/119436/what-does-gpl-with-classpath-exception-mean-in-practice";
138
+ }
139
+ await vscode.env.openExternal(vscode.Uri.parse(url));
140
+ return startAutoInstall();
141
+ }
142
+ throw new Error("User setup required for jdk 11");
143
+ }
144
+ async function openSettings() {
145
+ await vscode.commands.executeCommand('workbench.action.openSettings', '@ext:rascalmpl');
146
+ throw Error("User setup required for jdk " + currentJVMEngineMin);
147
+ }
148
+ async function downloadJDK() {
149
+ const temurin = "Eclipse Temurin";
150
+ const msJava = "Microsoft Build of OpenJDK";
151
+ const amazon = "Amazon Corretto";
152
+ let options = [];
153
+ if ((0, downloaders_1.temurinSupported)(currentJVMEngineMax)) {
154
+ options.push(temurin);
155
+ }
156
+ if ((0, downloaders_1.microsoftSupported)(currentJVMEngineMax)) {
157
+ options.push(msJava);
158
+ }
159
+ if ((0, downloaders_1.correttoSupported)(currentJVMEngineMax)) {
160
+ options.push(amazon);
161
+ }
162
+ const choice = await vscode.window.showInformationMessage("Select which OpenJDK provider you prefer", { modal: true }, ...options);
163
+ const result = await vscode.window.withProgress({
164
+ location: vscode.ProgressLocation.Notification,
165
+ title: `Downloading ${choice} JDK:`,
166
+ cancellable: false
167
+ }, async (progress, cancelled) => {
168
+ function actualProgress(percIncrement, message) {
169
+ progress.report({ message: message, increment: percIncrement });
170
+ }
171
+ switch (choice) {
172
+ case temurin: return (0, downloaders_1.downloadTemurin)(mainJVMPath, currentJVMEngineMax, actualProgress);
173
+ case msJava: return (0, downloaders_1.downloadMicrosoftJDK)(mainJVMPath, currentJVMEngineMax, actualProgress);
174
+ case amazon: return (0, downloaders_1.downloadCorretto)(mainJVMPath, currentJVMEngineMax, actualProgress);
175
+ default: throw new Error("User setup required");
176
+ }
177
+ });
178
+ vscode.window.showInformationMessage(`Finished downloading ${choice} JDK, rascal will now start`);
179
+ return result;
180
+ }
181
+ //# sourceMappingURL=JavaLookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JavaLookup.js","sourceRoot":"","sources":["../../src/auto-jvm/JavaLookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ declare type ProgressFunc = (percIncrement: number, message: string) => void;
2
+ export declare type TemurinArchitectures = "arm" | "aarch64" | "x64";
3
+ export declare type TemurinPlatforms = "mac" | "linux" | "windows";
4
+ export declare type CorrettoArchitectures = TemurinArchitectures;
5
+ export declare type CorrettoPlatforms = "macos" | "linux" | "windows";
6
+ export declare type MSArchitectures = "x64" | "aarch64";
7
+ export declare type MSPlatforms = "macOS" | "linux" | "windows";
8
+ export declare function temurinSupported(jdkVersion: number): boolean;
9
+ export declare function correttoSupported(jdkVersion: number): boolean;
10
+ export declare function microsoftSupported(jdkVersion: number): boolean;
11
+ export declare function downloadTemurin(mainJVMPath: string, jdkVersion: number, progress: ProgressFunc): Promise<string>;
12
+ export declare function downloadCorretto(mainJVMPath: string, jdkVersion: number, progress: ProgressFunc): Promise<string>;
13
+ export declare function downloadMicrosoftJDK(mainJVMPath: string, jdkVersion: number, progress: ProgressFunc): Promise<string>;
14
+ export declare function identifyLatestTemurinLTSRelease(version: number): Promise<string>;
15
+ export declare function fetchAndUnpackMicrosoftJDK(arch: MSArchitectures, platform: MSPlatforms, jdkVersion: number, mainJVMPath: string, progress: ProgressFunc): Promise<string>;
16
+ export declare function fetchAndUnpackCorretto(arch: CorrettoArchitectures, platform: CorrettoPlatforms, jdkVersion: number, mainJVMPath: string, progress: ProgressFunc): Promise<string>;
17
+ export declare function fetchAndUnpackTemurin(arch: TemurinArchitectures, platform: TemurinPlatforms, jdk11Release: string, mainJVMPath: string, progress: ProgressFunc): Promise<string>;
18
+ export {};