2 Commits
0.0.3 ... main

Author SHA1 Message Date
Ruben
457bf6bec5 fix errors 2025-09-22 18:57:24 +02:00
Ruben
a6187fa2b7 update 2025-09-22 18:16:29 +02:00
6 changed files with 74 additions and 26 deletions

View File

@@ -46,10 +46,11 @@ function readPackageName(text) { return text.match(/^\s*package\s+([\w\.]+)\s*;/
function fqcnFromDocument(doc) { const pkg = readPackageName(doc.getText()); const simple = path.basename(doc.fileName).replace(/\.java$/i, ""); return pkg ? `${pkg}.${simple}` : simple; } function fqcnFromDocument(doc) { const pkg = readPackageName(doc.getText()); const simple = path.basename(doc.fileName).replace(/\.java$/i, ""); return pkg ? `${pkg}.${simple}` : simple; }
function execInTerminal(cmd, cwd, name = "Java Class Runner") { const t = vscode.window.terminals.find(tt => tt.name === name) || vscode.window.createTerminal({ name }); t.show(true); if (cwd) function execInTerminal(cmd, cwd, name = "Java Class Runner") { const t = vscode.window.terminals.find(tt => tt.name === name) || vscode.window.createTerminal({ name }); t.show(true); if (cwd)
t.sendText(`cd "${cwd}"`); t.sendText(cmd); } t.sendText(`cd "${cwd}"`); t.sendText(cmd); }
function ensureDir(dir) { if (!fs.existsSync(dir)) async function ensureDir(p) {
fs.mkdirSync(dir, { recursive: true }); } await fs.promises.mkdir(p, { recursive: true });
async function compileJava(javaFile, outDir, classpath, ctxpath) { }
ensureDir(outDir); async function compileJava(javaFile, outDir, classpath, ctxpath, wd) {
await ensureDir(outDir);
if (javaFile.includes(".java")) { if (javaFile.includes(".java")) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const args = [javaFile, "-cp", classpath, "-d", outDir]; const args = [javaFile, "-cp", classpath, "-d", outDir];
@@ -59,12 +60,29 @@ async function compileJava(javaFile, outDir, classpath, ctxpath) {
proc.on("close", code => code === 0 ? resolve() : reject(new Error(`javac exit code ${code}\n${stderr}`))); proc.on("close", code => code === 0 ? resolve() : reject(new Error(`javac exit code ${code}\n${stderr}`)));
}); });
} }
vscode.window.showInformationMessage("Compiling with Java-TX");
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const args = ["-jar", ctxpath + "/JavaTXcompiler-0.1-jar-with-dependencies.jar", javaFile, "-cp", classpath, "-d", outDir]; const stripOuterQuotes = (s) => s ? s.replace(/^\s*["']|["']\s*$/g, "") : s;
const proc = cp.spawn("java", args, { shell: process.platform === "win32" }); const jar = path.join(stripOuterQuotes(ctxpath), "JavaTXcompiler-0.1-jar-with-dependencies.jar");
let stderr = ""; const args = [
proc.stderr.on("data", d => stderr += d.toString()); "-jar",
proc.on("close", code => code === 0 ? resolve() : reject(new Error(`javac exit code ${code}\n${stderr}`))); stripOuterQuotes(jar),
stripOuterQuotes(javaFile), // <- KEINE Quotes in den Strings!
"-cp",
stripOuterQuotes(classpath),
"-d",
stripOuterQuotes(outDir),
];
// Diagnose: hier siehst du sofort, ob noch Quotes drin sind
console.log("spawn args:", args.map(a => JSON.stringify(a)).join(" "));
const proc = cp.spawn("java", args, {
cwd: stripOuterQuotes(wd),
env: { ...process.env },
shell: false,
});
proc.stdout.on("data", d => console.log(`[java stdout] ${d}`));
proc.stderr.on("data", d => console.error(`[java stderr] ${d}`));
proc.on("close", code => code === 0 ? resolve() : reject(new Error(`javac exit code ${code}}`)));
}); });
} }
function activate(ctx) { function activate(ctx) {
@@ -99,7 +117,7 @@ function activate(ctx) {
return; return;
} }
try { try {
await compileJava(ed.document.fileName, outDir, `"${cpFolders.join(";")}"`, ctx.extensionPath); await compileJava(ed.document.fileName, outDir, `"${cpFolders.join(path.delimiter)}"`, ctx.extensionPath, wd);
} }
catch (err) { catch (err) {
vscode.window.showErrorMessage(`Kompilierung fehlgeschlagen: ${err?.message || String(err)}`); vscode.window.showErrorMessage(`Kompilierung fehlgeschlagen: ${err?.message || String(err)}`);
@@ -127,7 +145,8 @@ function activate(ctx) {
vscode.window.showErrorMessage("Keine .class-Datei im Ausgabeverzeichnis gefunden."); vscode.window.showErrorMessage("Keine .class-Datei im Ausgabeverzeichnis gefunden.");
return; return;
} }
const cmd = `java -cp "${cpFolders.join(";")}" ${mainClass}`.trim(); const cmd = `java -cp "${cpFolders.join(path.delimiter)}" ${mainClass}`.trim();
vscode.window.showInformationMessage(cmd);
execInTerminal(cmd, wd); execInTerminal(cmd, wd);
})); }));
} }

File diff suppressed because one or more lines are too long

8
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "java-class-runner", "name": "java-tx-main-runner",
"version": "1.0.2", "version": "0.0.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "java-class-runner", "name": "java-tx-main-runner",
"version": "1.0.2", "version": "0.0.4",
"devDependencies": { "devDependencies": {
"@types/node": "^20.11.0", "@types/node": "^20.11.0",
"@types/vscode": "^1.85.0", "@types/vscode": "^1.85.0",

View File

@@ -3,7 +3,7 @@
"name": "java-tx-main-runner", "name": "java-tx-main-runner",
"displayName": "Java-TX Main Runner", "displayName": "Java-TX Main Runner",
"description": "Führt Java und Java-TX Main-Methoden aus und nutzt den /out Ordner als Classpath. Fügt einen 'Run' CodeLens über main(...) hinzu.", "description": "Führt Java und Java-TX Main-Methoden aus und nutzt den /out Ordner als Classpath. Fügt einen 'Run' CodeLens über main(...) hinzu.",
"version": "0.0.2", "version": "0.0.4",
"engines": { "engines": {
"vscode": "^1.85.0" "vscode": "^1.85.0"
}, },

View File

@@ -10,10 +10,13 @@ function getWorkspaceFolderUri(docUri?: vscode.Uri): vscode.Uri | undefined { re
function readPackageName(text: string): string | undefined { return text.match(/^\s*package\s+([\w\.]+)\s*;/m)?.[1]; } function readPackageName(text: string): string | undefined { return text.match(/^\s*package\s+([\w\.]+)\s*;/m)?.[1]; }
function fqcnFromDocument(doc: vscode.TextDocument): string | undefined { const pkg = readPackageName(doc.getText()); const simple = path.basename(doc.fileName).replace(/\.java$/i,""); return pkg ? `${pkg}.${simple}` : simple; } function fqcnFromDocument(doc: vscode.TextDocument): string | undefined { const pkg = readPackageName(doc.getText()); const simple = path.basename(doc.fileName).replace(/\.java$/i,""); return pkg ? `${pkg}.${simple}` : simple; }
function execInTerminal(cmd: string, cwd?: string, name="Java Class Runner") { const t = vscode.window.terminals.find(tt=>tt.name===name) || vscode.window.createTerminal({name}); t.show(true); if (cwd) t.sendText(`cd "${cwd}"`); t.sendText(cmd); } function execInTerminal(cmd: string, cwd?: string, name="Java Class Runner") { const t = vscode.window.terminals.find(tt=>tt.name===name) || vscode.window.createTerminal({name}); t.show(true); if (cwd) t.sendText(`cd "${cwd}"`); t.sendText(cmd); }
function ensureDir(dir: string) { if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); } async function ensureDir(p: string) {
await fs.promises.mkdir(p, { recursive: true });
}
async function compileJava(javaFile: string, outDir: string, classpath: string, ctxpath : string): Promise<void> {
ensureDir(outDir); async function compileJava(javaFile: string, outDir: string, classpath: string, ctxpath : string, wd: string): Promise<void> {
await ensureDir(outDir);
if(javaFile.includes(".java")){ if(javaFile.includes(".java")){
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const args = [javaFile, "-cp", classpath, "-d", outDir]; const args = [javaFile, "-cp", classpath, "-d", outDir];
@@ -23,11 +26,36 @@ async function compileJava(javaFile: string, outDir: string, classpath: string,
}); });
} }
vscode.window.showInformationMessage("Compiling with Java-TX")
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const args = ["-jar", ctxpath + "/JavaTXcompiler-0.1-jar-with-dependencies.jar", javaFile, "-cp", classpath, "-d", outDir];
const proc = cp.spawn("java", args, { shell: process.platform==="win32" }); const stripOuterQuotes = (s: string) =>
let stderr=""; proc.stderr.on("data", d=>stderr+=d.toString()); s ? s.replace(/^\s*["']|["']\s*$/g, "") : s;
proc.on("close", code=> code===0 ? resolve() : reject(new Error(`javac exit code ${code}\n${stderr}`)));
const jar = path.join(stripOuterQuotes(ctxpath), "JavaTXcompiler-0.1-jar-with-dependencies.jar");
const args = [
"-jar",
stripOuterQuotes(jar),
stripOuterQuotes(javaFile), // <- KEINE Quotes in den Strings!
"-cp",
stripOuterQuotes(classpath),
"-d",
stripOuterQuotes(outDir),
];
// Diagnose: hier siehst du sofort, ob noch Quotes drin sind
console.log("spawn args:", args.map(a => JSON.stringify(a)).join(" "));
const proc = cp.spawn("java", args, {
cwd: stripOuterQuotes(wd),
env: { ...process.env },
shell: false,
});
proc.stdout.on("data", d => console.log(`[java stdout] ${d}`));
proc.stderr.on("data", d => console.error(`[java stderr] ${d}`));
proc.on("close", code=> code===0 ? resolve() : reject(new Error(`javac exit code ${code}}`)));
}); });
} }
@@ -70,7 +98,7 @@ export function activate(ctx: vscode.ExtensionContext) {
if (!fqcn) { vscode.window.showErrorMessage("Konnte FQCN nicht bestimmen."); return; } if (!fqcn) { vscode.window.showErrorMessage("Konnte FQCN nicht bestimmen."); return; }
try { try {
await compileJava(ed.document.fileName, outDir, `"${cpFolders.join(";")}"`, ctx.extensionPath); } await compileJava(ed.document.fileName, outDir, `"${cpFolders.join(path.delimiter)}"`, ctx.extensionPath, wd); }
catch (err:any) { catch (err:any) {
vscode.window.showErrorMessage(`Kompilierung fehlgeschlagen: ${err?.message || String(err)}`); vscode.window.showErrorMessage(`Kompilierung fehlgeschlagen: ${err?.message || String(err)}`);
@@ -96,7 +124,8 @@ export function activate(ctx: vscode.ExtensionContext) {
vscode.window.showErrorMessage("Keine .class-Datei im Ausgabeverzeichnis gefunden."); vscode.window.showErrorMessage("Keine .class-Datei im Ausgabeverzeichnis gefunden.");
return; return;
} }
const cmd = `java -cp "${cpFolders.join(";")}" ${mainClass}`.trim(); const cmd = `java -cp "${cpFolders.join(path.delimiter)}" ${mainClass}`.trim();
vscode.window.showInformationMessage(cmd)
execInTerminal(cmd, wd); execInTerminal(cmd, wd);
})); }));
} }