Add XQuery Linting Feature

This commit is contained in:
Josh Johnson 2018-02-13 23:25:07 -05:00
parent 2c6a5ceaa0
commit ace85c8841
4 changed files with 434 additions and 61 deletions

View file

@ -1,10 +1,11 @@
import { languages, workspace } from "vscode";
import { ExtensionContext, WorkspaceConfiguration } from "vscode";
import { languages, window, workspace } from "vscode";
import { ExtensionContext, TextEditor, TextEditorSelectionChangeEvent, WorkspaceConfiguration } from "vscode";
import { XmlFormatter } from "./formatting/xml-formatter";
import { XmlFormattingEditProvider } from "./formatting/xml-formatting-edit-provider";
import { ClassicXmlFormatter } from "./formatting/formatters/classic-xml-formatter";
import { V2XmlFormatter } from "./formatting/formatters/v2-xml-formatter";
import { XQueryLinter } from "./linting/xquery-linter";
import * as constants from "./constants";
@ -26,8 +27,35 @@ export function activate(context: ExtensionContext) {
languages.registerDocumentFormattingEditProvider("xml", xmlFormattingEditProvider),
languages.registerDocumentRangeFormattingEditProvider("xml", xmlFormattingEditProvider)
);
/* Linting Features */
context.subscriptions.push(
window.onDidChangeActiveTextEditor(_handleChangeActiveTextEditor),
window.onDidChangeTextEditorSelection(_handleChangeTextEditorSelection)
);
}
export function deactivate() {
// do nothing
}
function _handleContextChange(editor: TextEditor): void {
if (!editor || !editor.document) {
return;
}
switch (editor.document.languageId) {
case "xquery":
languages.createDiagnosticCollection("XQueryDiagnostics").set(editor.document.uri, new XQueryLinter().lint(editor.document.getText()));
break;
}
}
function _handleChangeActiveTextEditor(editor: TextEditor): void {
_handleContextChange(editor);
}
function _handleChangeTextEditorSelection(e: TextEditorSelectionChangeEvent): void {
_handleContextChange(e.textEditor);
}

View file

@ -0,0 +1,23 @@
import { Diagnostic, DiagnosticSeverity, Position, Range } from "vscode";
const XQLint = require("xqlint").XQLint;
export class XQueryLinter {
static SEVERITY_WARNING: number = 1;
static SEVERITY_ERROR: number = 2;
lint(text: string): Diagnostic[] {
const linter = new XQLint(text);
const diagnostics = new Array<Diagnostic>();
linter.getErrors().forEach((error: any) => {
diagnostics.push(new Diagnostic(new Range(new Position(error.pos.sl, error.pos.sc), new Position(error.pos.el, error.pos.ec)), error.message, DiagnosticSeverity.Error));
});
linter.getWarnings().forEach((warning: any) => {
diagnostics.push(new Diagnostic(new Range(new Position(warning.pos.sl, warning.pos.sc), new Position(warning.pos.el, warning.pos.ec)), warning.message, DiagnosticSeverity.Warning));
});
return diagnostics;
}
}