This commit is contained in:
2024-01-02 22:32:24 +05:30
parent 0a2a6c4db6
commit fc7e3b431f
8 changed files with 178 additions and 192 deletions

View File

@@ -4,9 +4,9 @@ import { bfVisitor } from './generated/bfVisitor';
import { DiagnosticSeverity } from 'vscode-languageclient';
import { getTree } from './BranFlakesParseRunner';
import { RuleNode } from 'antlr4ts/tree/RuleNode';
import InputStrategy from './input/InputStrategy';
import type InputStrategy from './input/InputStrategy';
export default class BranFlakesExecutorVisitor
export class BranFlakesExecutorVisitor
extends AbstractParseTreeVisitor<Promise<void>>
implements bfVisitor<Promise<void>>
{

View File

@@ -0,0 +1,4 @@
export interface BranFlakesCommand {
getCommandName(): string;
getCommandHandler(): (...args: any) => Promise<any>;
}

View File

@@ -1,5 +0,0 @@
export interface Command{
getCommandName():string;
getCommandHandler():(...args:any)=>Promise<any>;
}

View File

@@ -1,7 +1,6 @@
import { window } from 'vscode';
import { Command as BranFlakesCommand } from './Command';
import type { BranFlakesCommand } from './BranFlakesCommand';
import { VSCodePromptInputStrategy } from '../input/VSCodePromptInputStrategy';
import BranFlakesExecutorVisitor from '../BranFlakesExecutorVisitor';
export class CompileBranFlakesCommand implements BranFlakesCommand {
getCommandName() {
@@ -14,6 +13,10 @@ export class CompileBranFlakesCommand implements BranFlakesCommand {
const inputStrategy = new VSCodePromptInputStrategy(
window.showInputBox
);
const { BranFlakesExecutorVisitor } = await import(
'../BranFlakesExecutorVisitor'
);
const output = await BranFlakesExecutorVisitor.run(
text,
fn,

View File

@@ -4,14 +4,15 @@
* ------------------------------------------------------------------------------------------ */
import * as path from 'path';
import { ExtensionContext, commands, window } from 'vscode';
import { commands } from 'vscode';
import type { ExtensionContext } from 'vscode';
import {
LanguageClient,
LanguageClientOptions,
ServerOptions,
TransportKind,
} from 'vscode-languageclient';
import { CompileBranFlakesCommand } from './command/CompileCommand';
import { CompileBranFlakesCommand } from './command/CompileBranFlakesCommand';
let client: LanguageClient;

View File

@@ -1,5 +1,5 @@
import { CancellationToken, InputBoxOptions } from 'vscode';
import InputStrategy from './InputStrategy';
import type { CancellationToken, InputBoxOptions } from 'vscode';
import type InputStrategy from './InputStrategy';
export class VSCodePromptInputStrategy implements InputStrategy {
private inputQueue: string = '';

View File

@@ -5,9 +5,9 @@
"author": "Atreya Bain",
"license": "MIT",
"publisher": "atreyabain",
"version": "0.2.0",
"version": "0.2.1",
"icon": "assets/128.png",
"categories": [],
"categories": ["Programming Languages","Linters"],
"keywords": [
"multi-root ready",
"brainfuck",

View File

@@ -15,19 +15,14 @@ import {
TextDocumentPositionParams,
TextDocumentSyncKind,
InitializeResult,
Position,
} from 'vscode-languageserver';
import { TextDocument } from 'vscode-languageserver-textdocument';
// Create a connection for the server. The connection uses Node's IPC as a transport.
// Also include all preview / proposed LSP features.
let connection = createConnection(ProposedFeatures.all);
// Create a simple text document manager. The text document manager
// supports full document sync only
let documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument);
@@ -113,7 +108,9 @@ connection.onDidChangeConfiguration(change => {
}
// Revalidate all open text documents
documents.all().forEach(validateTextDocument);
Promise.all(documents.all().map(validateTextDocument)).catch(e => {
connection.console.log('Failed to validate text documents');
});
});
function getDocumentSettings(resource: string): Thenable<ExampleSettings> {
@@ -139,7 +136,6 @@ documents.onDidClose(e => {
// The content of a text document has changed. This event is emitted
// when the text document first opened or when its content has changed.
documents.onDidChangeContent(change => {
//change.contentChanges;
validateTextDocument(change.document);
});
@@ -149,20 +145,25 @@ documents.onDidSave(change => {
});
const validateBrackets = (text: string) => {
let count = 0, lp: number[] = [],issues:number[]=[];
let count = 0,
lp: number[] = [],
issues: number[] = [];
const textsplit = text.split('');
textsplit.forEach((x, i) => {
if (x === '[' || x === ']') {
if (x === '[') {lp.push(i);}
if (x === ']') {if(lp.length===0) {issues.push(i);}lp.pop();}
if (x === '[') {
lp.push(i);
}
if (x === ']') {
if (lp.length === 0) {
issues.push(i);
}
lp.pop();
}
}
});
return [...lp,...issues];
return [...lp, ...issues];
};
async function validateTextDocument(textDocument: TextDocument): Promise<void> {
@@ -175,34 +176,17 @@ async function validateTextDocument(textDocument: TextDocument): Promise<void> {
let diagnostics: Diagnostic[] = [];
const issues = validateBrackets(text);
diagnostics.push(...issues.map<Diagnostic>(e => ({
diagnostics.push(
...issues.map<Diagnostic>(e => ({
message: 'Brackets unmatched',
range:{
range: {
start: textDocument.positionAt(e),
end: textDocument.positionAt(e+1),
end: textDocument.positionAt(e + 1),
},
severity:DiagnosticSeverity.Error,
code:'[ and ]',
})));
// diagnostics.push({
// message: 'Brackets not matched',
// range: {
// start: { line: 0, character: 0 },
// end: { line: 0, character: 0 },
// },
// });
// diagnostics.push(<Diagnostic>{
// severity: DiagnosticSeverity.Information,
// range: {
// start: textDocument.positionAt(0),
// end: textDocument.positionAt(1),
// },
// // message:`HI:(${text})(${result.hasErrors()},${result.hasWarnings()})`,
// message: `Parsing Failed`,
// source: 'test',
// });
severity: DiagnosticSeverity.Error,
code: '[ and ]',
}))
);
// Send the computed diagnostics to VSCode.
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });
@@ -250,7 +234,6 @@ connection.onCompletion(
}
);
// Make the text document manager listen on the connection
// for open, change and close text document events
documents.listen(connection);