aboutsummaryrefslogtreecommitdiffstats
path: root/atk16-syntax/extension.js
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2024-02-21 12:07:07 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2024-02-21 12:07:07 +0200
commit927c018f12e73c254cec32c0f60e1c01b9fc0319 (patch)
tree21fbb975e3567cb0d9ab3fb34519c50325571d6c /atk16-syntax/extension.js
parenta0b4a1a6107e4dc905b21858d8ac76c47293cfb4 (diff)
Refactor names
Diffstat (limited to 'atk16-syntax/extension.js')
-rw-r--r--atk16-syntax/extension.js196
1 files changed, 0 insertions, 196 deletions
diff --git a/atk16-syntax/extension.js b/atk16-syntax/extension.js
deleted file mode 100644
index 26b4d9d..0000000
--- a/atk16-syntax/extension.js
+++ /dev/null
@@ -1,196 +0,0 @@
-const vscode = require('vscode');
-const path = require('path');
-
-class ATK16HoverProvider {
- async provideHover(document, position, token) {
- const range = document.getWordRangeAtPosition(position, /[\w-/.]+/);
- const labelText = document.getText(range);
- const subroutineDefinition = await findSubroutineInDocument(document, labelText);
- if (subroutineDefinition) {
- const hoverText = new vscode.MarkdownString(subroutineDefinition);
- hoverText.isTrusted = true;
- return new vscode.Hover(hoverText);
- }
-
- // Search for labels in included files
- for (let i = 0; i < document.lineCount; i++) {
- const line = document.lineAt(i);
- const includeMatch = line.text.match(/@include\s+(\S+)/);
- if (includeMatch) {
- const includedFilePath = path.join(
- path.dirname(document.fileName),
- `${includeMatch[1]}.atk16`
- );
-
- if (await vscode.workspace.fs.stat(vscode.Uri.file(includedFilePath))) {
- const includedDocument = await vscode.workspace.openTextDocument(
- includedFilePath
- );
- const subroutineDefinition = await findSubroutineInDocument(includedDocument, labelText);
- if (subroutineDefinition) {
- const hoverText = new vscode.MarkdownString(subroutineDefinition);
- hoverText.isTrusted = true;
- return new vscode.Hover(hoverText);
- }
- }
- }
- }
-
- return null;
- }
-}
-
-class ATK16DefinitionProvider {
- async provideDefinition(document, position, token) {
- const range = document.getWordRangeAtPosition(position, /[\w-/.]+/);
- const text = document.getText(range);
-
- const line = document.lineAt(position);
- const includeMatch = line.text.match(/@include\s+(\S+)/);
- const useMatch = line.text.match(/@use\s+(\S+):/);
-
- if (includeMatch && includeMatch[1] === text) {
- const includedFilePath = path.join(
- path.dirname(document.fileName),
- `${includeMatch[1]}.atk16`
- );
-
- try {
- await vscode.workspace.fs.stat(vscode.Uri.file(includedFilePath));
- return new vscode.Location(
- vscode.Uri.file(includedFilePath),
- new vscode.Position(0, 0)
- );
- } catch (err) {
- vscode.window.showErrorMessage(
- `ATK16: File not found: ${includedFilePath}`
- );
- }
- } else if (useMatch && useMatch[1] === text) {
- const includedFilePath = path.join(
- path.dirname(document.fileName),
- `${useMatch[1]}.py`
- );
-
- try {
- await vscode.workspace.fs.stat(vscode.Uri.file(includedFilePath));
- return new vscode.Location(
- vscode.Uri.file(includedFilePath),
- new vscode.Position(0, 0)
- );
- } catch (err) {
- vscode.window.showErrorMessage(
- `ATK16: File not found: ${includedFilePath}`
- );
- }
- } else {
- const labelText = document.getText(range);
- let definitionLocation = await findDefinitionInDocument(document, labelText);
- if (definitionLocation) {
- return definitionLocation;
- }
-
- // Search for labels in included files
- for (let i = 0; i < document.lineCount; i++) {
- const line = document.lineAt(i);
- const includeMatch = line.text.match(/@include\s+(\S+)/);
- if (includeMatch) {
- const includedFilePath = path.join(
- path.dirname(document.fileName),
- `${includeMatch[1]}.atk16`
- );
-
- if (await vscode.workspace.fs.stat(vscode.Uri.file(includedFilePath))) {
- const includedDocument = await vscode.workspace.openTextDocument(
- includedFilePath
- );
- definitionLocation = await findDefinitionInDocument(includedDocument, labelText);
- if (definitionLocation) {
- return definitionLocation;
- }
- }
- }
- }
- }
-
- return null;
- }
-}
-
-async function findDefinitionInDocument(document, labelText) {
- for (let i = 0; i < document.lineCount; i++) {
- const line = document.lineAt(i);
- if (line.text.includes(`@label ${labelText}`) || line.text.includes(`@let ${labelText}`)) {
- return new vscode.Location(document.uri, line.range.start);
- }
- }
- return null;
-}
-
-async function findSubroutineInDocument(document, labelText) {
- let name = null;
- const params = [];
- const returns = [];
- let extra = "";
- for (let i = 0; i < document.lineCount; i++) {
- const line = document.lineAt(i);
- if (line.text.includes(`@label ${labelText}`)) {
- for (let j = i + 1; j < document.lineCount; j++) {
- const docLine = document.lineAt(j);
- const docCommentMatch = docLine.text.match(/;;;\s+(.*)/);
- if (docCommentMatch) {
- const lineText = docCommentMatch[1];
- const parts = lineText.trim().split(/\s+/g);
- if (lineText.startsWith('subroutine')) {
- name = parts[parts.length - 1].trim();
- } else if (lineText.startsWith('param')) {
- const [_kw, reg, ...desc] = parts;
- params.push([reg.trim(), desc.filter(a => a).join(" ")])
- } else if (lineText.startsWith('return')) {
- const [_kw, reg, ...desc] = parts;
- returns.push([reg.trim(), desc.filter(a => a).join(" ")])
- } else {
- extra += `${lineText}\n`;
- }
- } else {
- break;
- }
- }
- }
- }
-
- if (name === null) return null;
-
- let definition = `### ${name}\n_Subroutine_\n\n`;
- definition += extra;
- if (params.length > 0) {
- definition += "\n\n|Reg|Parameter|\n";
- definition += "|:---|:---|\n";
- }
- for (const [reg, desc] of params) {
- definition += `|${reg}|${desc}|\n`;
- }
-
- if (returns.length > 0) {
- definition += "\n|Reg|Return|\n";
- definition += "|:---|:---|\n";
- }
- for (const [reg, desc] of returns) {
- definition += `|${reg}|${desc}|\n`;
- }
- return definition;
-}
-
-function activate(context) {
- context.subscriptions.push(
- vscode.languages.registerDefinitionProvider('atk16', new ATK16DefinitionProvider()),
- vscode.languages.registerHoverProvider('atk16', new ATK16HoverProvider())
- );
-}
-
-function deactivate() {}
-
-module.exports = {
- activate,
- deactivate,
-}; \ No newline at end of file