72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
// Developed using the VSC language extension tutorial
|
|
// https://code.visualstudio.com/api/language-extensions/overview
|
|
|
|
const vscode = require('vscode');
|
|
const { execSync } = require('child_process');
|
|
const { parse } = require('path');
|
|
|
|
function activate(context) {
|
|
console.log('IntelliWACC is now active!');
|
|
|
|
let diagnosticCollection = vscode.languages.createDiagnosticCollection('wacc');
|
|
context.subscriptions.push(diagnosticCollection);
|
|
|
|
vscode.workspace.onDidSaveTextDocument((document) => {
|
|
if (document.languageId !== 'wacc') return;
|
|
|
|
let diagnostics = [];
|
|
let errors = generateErrors(document.getText(), document.fileName);
|
|
errors.forEach(error => {
|
|
console.log(error);
|
|
let range = new vscode.Range(error.line - 1 , error.column - 1, error.line - 1, error.column + error.size);
|
|
let diagnostic = new vscode.Diagnostic(range, error.errorMessage, vscode.DiagnosticSeverity.Error);
|
|
diagnostics.push(diagnostic);
|
|
});
|
|
|
|
diagnosticCollection.set(document.uri, diagnostics);
|
|
});
|
|
}
|
|
|
|
function deactivate() {
|
|
console.log('IntelliWACC is deactivating...');
|
|
}
|
|
|
|
function generateErrors(code, filePath) {
|
|
try {
|
|
console.log("generating errors")
|
|
const fs = require('fs');
|
|
const tmpFilePath = parse(filePath).dir + '/.temp_wacc_file.wacc';
|
|
fs.writeFileSync(tmpFilePath, code);
|
|
|
|
let output;
|
|
try {
|
|
const waccExePath = `${__dirname}/wacc-compiler`;
|
|
output = execSync(`${waccExePath} ${tmpFilePath}`, { encoding: 'utf8', shell: true, stdio: 'pipe'});
|
|
} catch (err) {
|
|
console.log("Error running compiler");
|
|
output = err.stdout;
|
|
console.log(output);
|
|
}
|
|
let errors = [];
|
|
errorRegex = /\(line ([\d]+), column ([\d]+)\):\n([^>]+)([^\^]+)([\^]+)\n([^\n]+)([^\(]*)/g
|
|
while((match = errorRegex.exec(output)) !== null) {
|
|
console.log(match[5]);
|
|
errors.push({
|
|
line: parseInt(match[1], 10),
|
|
column: parseInt(match[2], 10),
|
|
errorMessage: match[3].trim(),
|
|
size: match[5].length - 1
|
|
});
|
|
}
|
|
return errors;
|
|
} catch (err) {
|
|
console.error('Error running compiler:', err);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
activate,
|
|
deactivate
|
|
};
|