From 53e01de1a6b38257e71add2ca5f5d691616b5370 Mon Sep 17 00:00:00 2001 From: Josh Johnson Date: Sat, 30 Jun 2018 09:59:12 -0400 Subject: [PATCH] wip: Add Document Context --- package-lock.json | 13 ++++-- package.json | 1 + src/common/document-context.ts | 73 ++++++++++++++++++++++++++++++++++ src/common/index.ts | 1 + src/extension.ts | 5 ++- tslint.json | 5 --- 6 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/common/document-context.ts diff --git a/package-lock.json b/package-lock.json index d971c4d..50bb317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "xml", - "version": "2.0.0-preview.2", + "version": "2.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2733,6 +2733,14 @@ "glob": "7.1.2" } }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "requires": { + "tslib": "1.9.0" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -3046,8 +3054,7 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", diff --git a/package.json b/package.json index b560753..e33219f 100644 --- a/package.json +++ b/package.json @@ -253,6 +253,7 @@ "vscode": "^1.1.16" }, "dependencies": { + "rxjs": "^6.2.1", "xmldom": "^0.1.27", "xpath": "0.0.27", "xqlint": "^0.4.1" diff --git a/src/common/document-context.ts b/src/common/document-context.ts new file mode 100644 index 0000000..0e3941f --- /dev/null +++ b/src/common/document-context.ts @@ -0,0 +1,73 @@ +import { BehaviorSubject, Observable, merge } from "rxjs"; +import { ExtensionContext, TextDocument, Uri, workspace } from "vscode"; + +export class DocumentContext { + + private static _contexts = new Array(); + + private _data = new Map(); + private _dataChangesSubject = new BehaviorSubject(this); + private _documentChangesSubject = new BehaviorSubject(this); + + constructor(private _document: TextDocument) { } + + static allDocumentChanges(): Observable { + return merge(...this._contexts.map(x => x.documentChanges)); + } + + get dataChanges(): Observable { + return this._dataChangesSubject.asObservable(); + } + + get documentChanges(): Observable { + return this._documentChangesSubject.asObservable(); + } + + get document(): TextDocument { + return this._document; + } + + static configure(context: ExtensionContext): void { + context.subscriptions.push( + workspace.onDidChangeTextDocument(e => { + const uri = e.document.uri; + let docContext = this.get(uri); + + if (!docContext) { + docContext = new DocumentContext(e.document); + } + + else { + docContext._document = e.document; + } + + docContext._documentChangesSubject.next(docContext); + }), + + workspace.onDidCloseTextDocument(e => { + const docContext = this.get(e.uri); + + if (docContext) { + this._contexts.splice(this._contexts.indexOf(docContext), 1); + } + }) + ); + } + + static get(uri: Uri): DocumentContext | undefined { + return this._contexts.find(x => x.document.uri.toString() === uri.toString()); + } + + getContextData(key: string): T { + return this._data.get(key); + } + + setContextData(key: string, value: any, suppressChangeEvent?: boolean): void { + this._data.set(key, value); + + if (!suppressChangeEvent) { + this._dataChangesSubject.next(this); + } + } + +} diff --git a/src/common/index.ts b/src/common/index.ts index f581696..1a57afa 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,5 +1,6 @@ export * from "./configuration"; export * from "./create-document-selector"; +export * from "./document-context"; export * from "./extension-state"; export * from "./native-commands"; export * from "./xml-traverser"; diff --git a/src/extension.ts b/src/extension.ts index ee975af..b922b1d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,7 +3,7 @@ import { TextEditor, TextEditorSelectionChangeEvent, TextEditorSelectionChangeKind } from "vscode"; -import { createDocumentSelector, ExtensionState, Configuration } from "./common"; +import { createDocumentSelector, DocumentContext, ExtensionState, Configuration } from "./common"; import { XQueryCompletionItemProvider } from "./completion"; import { XmlFormatterFactory, XmlFormattingEditProvider } from "./formatting"; import { formatAsXml, minifyXml } from "./formatting/commands"; @@ -16,6 +16,9 @@ import * as constants from "./constants"; export function activate(context: ExtensionContext) { ExtensionState.configure(context); + DocumentContext.configure(context); + + /* Document Change Handlers */ const xmlXsdDocSelector = [...createDocumentSelector(constants.languageIds.xml), ...createDocumentSelector(constants.languageIds.xsd)]; const xqueryDocSelector = createDocumentSelector(constants.languageIds.xquery); diff --git a/tslint.json b/tslint.json index 38f64fa..e4fec13 100644 --- a/tslint.json +++ b/tslint.json @@ -13,11 +13,6 @@ }, "eofline": true, "forin": true, - "import-blacklist": [ - true, - "rxjs", - "rxjs/Rx" - ], "import-spacing": true, "indent": [ true,