Compare commits

..

No commits in common. "trunk" and "0.1.1" have entirely different histories.
trunk ... 0.1.1

9 changed files with 153 additions and 250 deletions

View file

@ -1,13 +0,0 @@
# ---> VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix

View file

@ -4,11 +4,8 @@ syntax highlighting for hblang in vscode
# Usage guide: # Usage guide:
1. `cargo +nightly install hblang --git https://git.ablecorp.us/ableos/holey-bytes` 1. run `cargo install hblang --git https://git.ablecorp.us/ableos/holey-bytes`
> remember to keep this updated 2. add `$HOME/.cargo/bin` (or wherever you installed hblang) to `$PATH`
2. > in bash, `export PATH=$PATH:$HOME/.cargo/bin`<br>
- add `$HOME/.cargo/bin` (or wherever you installed hblang) to `$PATH` > in other shells, there may be other ways
> in bash, `export PATH=$PATH:$HOME/.cargo/bin`<br>
> in other shells, there may be other ways
- alternatively, add the path you installed hblang to the extension settings
3. log out and log back in (or something, idk) 3. log out and log back in (or something, idk)

View file

@ -68,8 +68,8 @@
], ],
"folding": { "folding": {
"markers": { "markers": {
"start": "{\n", "start": "^\\s*//\\s*#region\\b",
"end": "}" "end": "^\\s*//\\s*#endregion\\b"
} }
}, },
"indentationRules": { "indentationRules": {

2
package-lock.json generated
View file

@ -16,7 +16,7 @@
"typescript": "^4.0.0", "typescript": "^4.0.0",
"vscode": "^1.1.37", "vscode": "^1.1.37",
"webpack": "^5.0.0", "webpack": "^5.0.0",
"webpack-cli": "^4.10.0" "webpack-cli": "^4.0.0"
}, },
"engines": { "engines": {
"vscode": "^1.75.0" "vscode": "^1.75.0"

View file

@ -6,15 +6,14 @@
"publisher": "koniifer", "publisher": "koniifer",
"displayName": "hblang", "displayName": "hblang",
"description": "Syntax highlighter and formatter for holey-bytes lang", "description": "Syntax highlighter and formatter for holey-bytes lang",
"version": "0.2.3", "version": "0.1.0",
"engines": { "engines": {
"vscode": "^1.75.0" "vscode": "^1.75.0"
}, },
"main": "./out/main.js", "main": "./out/main.js",
"categories": [ "categories": [
"Programming Languages", "Programming Languages",
"Formatters", "Formatters"
"Linters"
], ],
"activationEvents": [ "activationEvents": [
"onCommand:extension.formatDocument" "onCommand:extension.formatDocument"
@ -48,18 +47,7 @@
} }
} }
} }
], ]
"configuration": {
"title": "hblang",
"properties": {
"hblang.compilerPath": {
"type": "string",
"default": "PATH",
"description": "Set the optional path for the hbc compiler. If set to 'PATH', it will rely on the system to provide hbc.",
"scope": "machine-overridable"
}
}
}
}, },
"scripts": { "scripts": {
"vscode:prepublish": "webpack", "vscode:prepublish": "webpack",
@ -75,6 +63,6 @@
"typescript": "^4.0.0", "typescript": "^4.0.0",
"vscode": "^1.1.37", "vscode": "^1.1.37",
"webpack": "^5.0.0", "webpack": "^5.0.0",
"webpack-cli": "^4.10.0" "webpack-cli": "^4.0.0"
} }
} }

View file

@ -1,120 +1,66 @@
import * as vscode from "vscode"; import * as vscode from 'vscode';
import { execFile } from "child_process"; import { spawn } from 'child_process';
import * as fs from "fs"; import * as fs from 'fs';
import * as path from "path"; import * as os from 'os';
import * as path from 'path';
const DEFAULT_EXECUTABLE = "hbc";
let diagnosticCollection: vscode.DiagnosticCollection;
function getExecutablePath(): string {
const config = vscode.workspace.getConfiguration("hblang");
return config.get<string>("compilerPath") === "PATH"
? DEFAULT_EXECUTABLE
: config.get<string>("compilerPath")!;
}
async function runCommand(filePath: string, args: string[]): Promise<string> {
return new Promise((resolve, reject) => {
execFile(getExecutablePath(), args, (error, stdout, stderr) => {
if (error && error.code === "ENOENT") {
vscode.window.showErrorMessage(
"hblang compiler not found. Ensure 'hbc' is installed and available in PATH."
);
return reject(new Error(`Compiler not found: ${stderr || stdout}`));
}
return error
? reject(new Error(stderr || `Exit code: ${error.code}`))
: resolve(stdout);
});
});
}
async function provideDocumentFormattingEdits(
document: vscode.TextDocument
): Promise<vscode.TextEdit[]> {
const tempFilePath = path.join(
path.dirname(document.uri.fsPath),
`temp_${path.basename(document.uri.fsPath)}`
);
await fs.promises.writeFile(tempFilePath, document.getText());
try {
const stdout = await runCommand(tempFilePath, [
"--fmt-stdout",
tempFilePath,
]);
const fullRange = new vscode.Range(
document.positionAt(0),
document.positionAt(document.getText().length)
);
diagnosticCollection.delete(document.uri);
return [vscode.TextEdit.replace(fullRange, stdout)];
} catch (error) {
return [];
} finally {
fs.promises.unlink(tempFilePath).catch(console.error);
}
}
async function lintDocument(document: vscode.TextDocument) {
try {
const stderr = await runCommand(document.uri.fsPath, [document.uri.fsPath]);
diagnosticCollection.set(document.uri, parseLintingErrors(stderr));
} catch (error) {
if (error instanceof Error) {
diagnosticCollection.set(document.uri, parseLintingErrors(error.message));
} else {
vscode.window.showErrorMessage("Error linting hblang document.");
}
}
}
function parseLintingErrors(stderr: string): vscode.Diagnostic[] {
return stderr
.split("\n")
.filter((line) => line && !line.includes("missing main function"))
.map((lineText) => {
const match = lineText.match(/^([^:]+):(\d+):(\d+):\s*(.+)$/);
if (!match) return null;
const [, , lineStr, columnStr, message] = match;
const lineNum = parseInt(lineStr, 10) - 1;
const columnNum = parseInt(columnStr, 10) - 1;
return new vscode.Diagnostic(
new vscode.Range(
lineNum,
columnNum,
lineNum,
columnNum + message.length
),
message,
vscode.DiagnosticSeverity.Error
);
})
.filter(Boolean) as vscode.Diagnostic[];
}
export function activate(context: vscode.ExtensionContext) { export function activate(context: vscode.ExtensionContext) {
diagnosticCollection = vscode.languages.createDiagnosticCollection("hblang"); // Register a document formatting edit provider for the language
context.subscriptions.push(diagnosticCollection); context.subscriptions.push(
vscode.languages.registerDocumentFormattingEditProvider('hblang', {
async provideDocumentFormattingEdits(document: vscode.TextDocument): Promise<vscode.TextEdit[]> {
vscode.workspace.onDidSaveTextDocument(async (document) => { try {
if (document.languageId === "hblang") { const formattedText = await formatDocument(document.fileName);
await lintDocument(document);
if (diagnosticCollection.get(document.uri)?.length === 0) { const edit = new vscode.TextEdit(
vscode.commands.executeCommand( new vscode.Range(0, 0, document.lineCount, 0),
"editor.action.formatDocument", formattedText
document );
);
}
}
});
vscode.languages.registerDocumentFormattingEditProvider("hblang", { return [edit];
provideDocumentFormattingEdits, } catch (error: unknown) {
}); if (error instanceof Error) {
vscode.window.showErrorMessage(`Formatting failed: ${error.message}`);
} else {
vscode.window.showErrorMessage(`Formatting failed: ${String(error)}`);
}
return []; // Return an empty array if formatting fails
}
}
})
);
}
export function deactivate() { }
async function formatDocument(path: string): Promise<string> {
return new Promise((resolve, reject) => {
const child = spawn('hbc', ['--fmt-stdout', path], { shell: true });
let formattedText = '';
// Capture the output
child.stdout.on('data', (data) => {
formattedText += data.toString();
});
// Handle errors
child.stderr.on('data', (data) => {
reject(new Error(data.toString()));
});
// Handle process exit
child.on('exit', (code) => {
if (code === 0) {
resolve(formattedText);
} else {
reject(new Error(`Formatter exited with code ${code}`));
}
});
});
} }

View file

@ -18,29 +18,29 @@
{ {
"include": "#string" "include": "#string"
}, },
{
"include": "#struct"
},
{ {
"include": "#keyword" "include": "#keyword"
}, },
{
"include": "#number"
},
{
"include": "#punctuation"
},
{ {
"include": "#function" "include": "#function"
}, },
{ {
"include": "#operator" "include": "#number"
},
{
"include": "#struct"
},
{
"include": "#type"
}, },
{ {
"include": "#variable" "include": "#variable"
}, },
{ {
"include": "#type" "include": "#operator"
},
{
"include": "#punctuation"
}, },
{ {
"include": "#array" "include": "#array"
@ -51,31 +51,19 @@
"patterns": [ "patterns": [
{ {
"name": "variable.parameter.hblang", "name": "variable.parameter.hblang",
"match": "\\b\\w+\\s*:\\s*(?:\\^)?[\\w\\$]+\\b" "match": "\\b\\w+\\b"
} }
] ]
}, },
"number": { "number": {
"patterns": [ "patterns": [
{ {
"name": "constant.numeric.float.hblang", "name": "constant.numeric.hblang",
"match": "\\b\\d+\\.\\d+\\b" "match": "\\b\\d+(\\.\\d+)?\\b"
}, },
{ {
"name": "constant.numeric.hex.hblang", "name": "constant.numeric.hex.hblang",
"match": "0x[0-9A-Fa-f]+" "match": "0x[0-9A-Fa-f]+"
},
{
"name": "constant.numeric.binary.hblang",
"match": "0b[0-1]+"
},
{
"name": "constant.numeric.octal.hblang",
"match": "0o[0-7]+"
},
{
"name": "constant.numeric.decimal.hblang",
"match": "\\b\\d+\\b"
} }
] ]
}, },
@ -99,10 +87,20 @@
"name": "string.quoted.double.hblang", "name": "string.quoted.double.hblang",
"begin": "\"", "begin": "\"",
"end": "\"", "end": "\"",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.hblang"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.hblang"
}
},
"patterns": [ "patterns": [
{ {
"name": "constant.character.escape.hblang", "name": "constant.character.escape.hblang",
"match": "\\\\(?:[\"'\\\\bfnrt]|[{\\[]\\w+[}\\]]|[a-zA-Z])" "match": "\\\\[\"'\\\\bfnrt]|\\\\(\\{[^}]+\\}|\\[[^]]+\\]|[a-zA-Z])"
}, },
{ {
"name": "invalid.illegal.escaped.hblang", "name": "invalid.illegal.escaped.hblang",
@ -116,7 +114,7 @@
"patterns": [ "patterns": [
{ {
"name": "keyword.control.hblang", "name": "keyword.control.hblang",
"match": "\\b(fn|loop|break|if|else|return|packed|continue|true|false|struct|idk|die|null)\\b" "match": "\\b(loop|break|if|else|return|packed|continue|true|false|struct|idk)\\b"
} }
] ]
}, },
@ -124,86 +122,60 @@
"patterns": [ "patterns": [
{ {
"name": "storage.type.hblang", "name": "storage.type.hblang",
"match": "\\b(f(32|64))|(uint|int|(u|i)(8|16|32)|void|bool|type|never)\\b" "match": "\\b(uint|int|(u|i)(8|16|32)|void|bool|type|never|([A-Z]\\w+))\\b"
} }
] ]
}, },
"variable": { "variable": {
"patterns": [ "patterns": [
{ {
"name": "variable.declaration.hblang", "name": "variable.parameter.hblang",
"match": "\\b\\w+\\b(?=\\s*:=)" "match": "\\b\\w+\\s*:=\\b"
}, },
{ {
"name": "variable.assignment.hblang", "name": "variable.parameter.hblang",
"match": "\\b\\w+\\b(?=\\s*=(?!=))" "match": "\\b\\w+\\s*=\\b"
}, },
{ {
"name": "variable.member.hblang", "name": "variable.parameter.hblang",
"match": "(?<=\\.)\\w+\\b" "match": "(?<=\\w+\\.)(\\w+)\\b"
} }
] ]
}, },
"operator": { "operator": {
"patterns": [ "patterns": [
{
"name": "keyword.operator.assignment.hblang",
"match": ":="
},
{
"name": "keyword.operator.assignment.hblang",
"match": "=(?!=)"
},
{ {
"name": "keyword.operator.hblang", "name": "keyword.operator.hblang",
"match": "(\\$|\\?|@|<<=|>>=|>=|<=|\\^=|\\+=|-=|\\*=|\\/=|%=|\\|=|&=|\\^|\\*|&|<<|>>|\\+|\\-|\\/|%|\\||!|==|!=|<|>)" "match": "(@|:=|<<=|>>=|>=|<=|^=|\\+=|-=|\\*=|\\/=|%=|\\|=|&=|\\^|\\*|&|&&|\\|\\||<<|>>|\\+|\\-|\\/|%|\\||!|==|!=|<|>|=)"
}
]
},
"struct": {
"patterns": [
{
"name": "entity.name.type.struct.hblang",
"match": "\\b[A-Z]\\w+\\b"
}
]
},
"punctuation": {
"patterns": [
{
"name": "punctuation.terminator.statement.hblang",
"match": ";|\\.|,|(?<!:):(?!=)"
} }
] ]
}, },
"function": { "function": {
"patterns": [ "patterns": [
{ {
"name": "meta.function.declaration.hblang", "name": "entity.name.function.hblang",
"begin": "(\\b\\w+\\b)\\s*(:=)\\s*(fn)\\s*\\(", "begin": "(?<!\\w)fn\\s*\\(",
"end": "\\)", "end": "\\)",
"beginCaptures": { "captures": {
"1": { "0": {
"name": "entity.name.function.hblang" "name": "keyword.hblang"
},
"2": {
"name": "keyword.operator.assignment.hblang"
},
"3": {
"name": "keyword.control.hblang"
} }
}, },
"patterns": [ "patterns": [
{ {
"include": "#all" "include": "#all"
},
{
"name": "variable.parameter.hblang",
"match": "\\b\\w+\\b(\\s*,\\s*\\b\\w+\\b)*"
} }
] ]
}, },
{ {
"name": "meta.function.call.hblang", "name": "entity.name.function.hblang",
"begin": "@?\\w+\\s*\\(", "begin": "(?:@)?\\b\\w+\\s*\\(",
"end": "\\)", "end": "\\)",
"beginCaptures": { "captures": {
"0": { "0": {
"name": "entity.name.function.hblang" "name": "entity.name.function.hblang"
} }
@ -211,24 +183,39 @@
"patterns": [ "patterns": [
{ {
"include": "#all" "include": "#all"
} },
]
}
]
},
"array": {
"patterns": [
{
"name": "meta.array.initialization.hblang",
"begin": "\\.\\(",
"end": "\\)",
"patterns": [
{ {
"include": "#all" "name": "variable.parameter.hblang",
"match": "\\b\\w+\\b(\\s*,\\s*\\b\\w+\\b)*"
} }
] ]
} }
] ]
} }
},
"struct": {
"patterns": [
{
"name": "entity.name.type.struct.hblang",
"match": "\\b[A-Z]\\w+\\b"
}
]
},
"array": {
"patterns": [
{
"name": "storage.type.array.hblang",
"begin": "\\.\\(",
"end": "\\)"
}
]
},
"punctuation": {
"patterns": [
{
"name": "punctuation.terminator.statement.hblang",
"match": ";|\\.|,|:"
}
]
} }
} }

View file

@ -1,3 +0,0 @@
main := fn(): void {
undefined_identifier
}

View file

@ -6,19 +6,20 @@ module.exports = {
output: { output: {
path: path.resolve(__dirname, 'out'), path: path.resolve(__dirname, 'out'),
filename: 'main.js', filename: 'main.js',
libraryTarget: 'commonjs2' libraryTarget: 'commonjs2' // This is correct for VS Code extensions
}, },
resolve: { resolve: {
extensions: ['.ts', '.js'], extensions: ['.ts', '.js'],
fallback: { fallback: {
"child_process": false, // For Node.js core modules not available in browser context, you set them to false
"fs": false, "child_process": false, // Not used in browser context
"os": require.resolve("os-browserify/browser"), "fs": false, // Not used in browser context
"path": require.resolve("path-browserify"), "os": require.resolve("os-browserify/browser"), // Polyfill for os
"path": require.resolve("path-browserify"), // Polyfill for path
}, },
}, },
externals: { externals: {
vscode: 'commonjs vscode' vscode: 'commonjs vscode' // Externalize the vscode module
}, },
module: { module: {
rules: [ rules: [
@ -29,5 +30,5 @@ module.exports = {
} }
] ]
}, },
target: 'node' target: 'node' // Specify the target environment as Node.js
}; };