From d31fcc852af40ac550b71b0f6586ed05ca9cbf8c Mon Sep 17 00:00:00 2001 From: Mauricio Verano Merino Date: Wed, 19 Apr 2023 10:41:41 +0200 Subject: [PATCH] Adding support for Rascal Project creation PR-redo This reverts commit 4084b9e590ce5310193f25ccc88facfe5d13a87a. --- rascal-vscode-extension/package-lock.json | 14 +- rascal-vscode-extension/package.json | 7 +- .../src/RascalExtension.ts | 136 ++++++++++++++++++ 3 files changed, 149 insertions(+), 8 deletions(-) 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