diff --git a/rascal-vscode-extension/package-lock.json b/rascal-vscode-extension/package-lock.json
index 8781dcc04..474c8c8dd 100644
--- a/rascal-vscode-extension/package-lock.json
+++ b/rascal-vscode-extension/package-lock.json
@@ -17,7 +17,7 @@
"devDependencies": {
"@types/glob": "^7.2.0",
"@types/mocha": "^9.1.1",
- "@types/node": "^16.x",
+ "@types/node": "^16.18.23",
"@types/node-fetch": "^2.5.12",
"@types/tar": "^6.1.1",
"@types/temp": "^0.9.1",
@@ -273,9 +273,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "16.11.56",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz",
- "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==",
+ "version": "16.18.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz",
+ "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==",
"dev": true
},
"node_modules/@types/node-fetch": {
@@ -5434,9 +5434,9 @@
"dev": true
},
"@types/node": {
- "version": "16.11.56",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz",
- "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==",
+ "version": "16.18.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz",
+ "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==",
"dev": true
},
"@types/node-fetch": {
diff --git a/rascal-vscode-extension/package.json b/rascal-vscode-extension/package.json
index e13aa2236..3c259491b 100644
--- a/rascal-vscode-extension/package.json
+++ b/rascal-vscode-extension/package.json
@@ -30,6 +30,7 @@
],
"activationEvents": [
"onCommand:rascalmpl.createTerminal",
+ "onCommand:rascalmpl.createProject",
"onLanguage:rascalmpl"
],
"main": "./dist/extension.js",
@@ -46,6 +47,10 @@
{
"command": "rascalmpl.importMain",
"title": "Start Rascal Terminal and Import this module"
+ },
+ {
+ "command": "rascalmpl.createProject",
+ "title": "Create new Rascal project"
}
],
"languages": [
@@ -112,7 +117,7 @@
"devDependencies": {
"@types/glob": "^7.2.0",
"@types/mocha": "^9.1.1",
- "@types/node": "^16.x",
+ "@types/node": "^16.18.23",
"@types/node-fetch": "^2.5.12",
"@types/tar": "^6.1.1",
"@types/temp": "^0.9.1",
diff --git a/rascal-vscode-extension/src/RascalExtension.ts b/rascal-vscode-extension/src/RascalExtension.ts
index 85f4af351..720af3534 100644
--- a/rascal-vscode-extension/src/RascalExtension.ts
+++ b/rascal-vscode-extension/src/RascalExtension.ts
@@ -28,6 +28,8 @@ import * as os from 'os';
import * as path from 'path';
import * as vscode from 'vscode';
+import { writeFileSync } from 'fs';
+
import { integer } from 'vscode-languageclient/node';
import { getJavaExecutable } from './auto-jvm/JavaLookup';
import { RascalLanguageServer } from './lsp/RascalLanguageServer';
@@ -35,6 +37,9 @@ import { LanguageParameter, ParameterizedLanguageServer } from './lsp/Parameteri
import { RascalTerminalLinkProvider } from './RascalTerminalLinkProvider';
import { VSCodeUriResolverServer } from './fs/VSCodeURIResolver';
+const vsfs = vscode.workspace.fs;
+const URI = vscode.Uri;
+
export class RascalExtension implements vscode.Disposable {
private readonly vfsServer: VSCodeUriResolverServer;
private readonly dsls:ParameterizedLanguageServer;
@@ -50,6 +55,7 @@ export class RascalExtension implements vscode.Disposable {
this.registerTerminalCommand();
this.registerMainRun();
this.registerImportModule();
+ this.createProject();
vscode.window.registerTerminalLinkProvider(new RascalTerminalLinkProvider(this.rascal.rascalClient));
}
@@ -87,6 +93,34 @@ export class RascalExtension implements vscode.Disposable {
);
}
+ private createProject() {
+ this.context.subscriptions.push(
+ vscode.commands.registerCommand("rascalmpl.createProject",
+ async () => {
+ try {
+ const filePath = await vscode.window.showOpenDialog({
+ canSelectFiles: false,
+ canSelectFolders: true,
+ canSelectMany: false,
+ title: "New Rascal project",
+ });
+
+ if (filePath) {
+ const dest = filePath[0].path;
+ const destUri = URI.file(dest);
+ const projectName = dest.split("/").at(-1) as string;
+
+ newRascalProject(dest, projectName);
+
+ // Open a workspace window
+ await vscode.commands.executeCommand("vscode.openFolder", destUri, true);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ })
+ );
+ }
private registerImportModule() {
this.context.subscriptions.push(
@@ -183,3 +217,105 @@ function calculateRascalREPLMemory() {
}
return "-Xmx800M";
}
+
+async function newRascalProject(dest: string, name: string) {
+
+ const baseDest = URI.file(dest);
+ vsfs.createDirectory(baseDest);
+
+ const metaPath = URI.joinPath(baseDest, "META-INF");
+ await vsfs.createDirectory(metaPath);
+
+ const srcPath = URI.joinPath(baseDest, "src/main/rascal/");
+ await vsfs.createDirectory(srcPath);
+
+ const rascalMFPath = URI.joinPath(metaPath, "RASCAL.MF");
+ writeFileSync(rascalMFPath.fsPath, rascalMF(name));
+
+ const pomPath = URI.joinPath(baseDest, "pom.xml");
+ writeFileSync(pomPath.fsPath, pomXML(name));
+
+ const mainPath = URI.joinPath(srcPath, "Main.rsc");
+ writeFileSync(mainPath.fsPath, emptyModule);
+
+}
+
+function rascalMF(name: string): string {
+ return "Manifest-Version: 0.0.1\n" +
+ `Project-Name: ${name}\n` +
+ "Source: src/main/rascal\n" +
+ "Require-Libraries: \n"
+ ;
+}
+
+function pomXML(name: string, group="org.rascalmpl", version="0.1.0-SNAPSHOT"): string {
+ return `
+
+ 4.0.0
+
+ ${group}
+ ${name}
+ ${version}
+
+
+ UTF-8
+
+
+
+
+ usethesource
+ https://releases.usethesource.io/maven/
+
+
+
+
+
+ usethesource
+ https://releases.usethesource.io/maven/
+
+
+
+
+
+ org.rascalmpl
+ rascal
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ -parameters
+ 11
+
+
+
+ org.rascalmpl
+ rascal-maven-plugin
+ 0.8.2
+
+ true
+ \${project.build.outputDirectory}
+
+ $\{project.basedir}/src/main/rascal
+
+
+
+
+
+
+ `;
+}
+
+const emptyModule = "module Main\n" +
+ "import IO;\n\n"+
+ "int main(int testArgument=0) {\n" +
+ ` println("argument: ");\n` +
+ " return testArgument;\n"+
+ "}";
\ No newline at end of file