From 9e47281d9111433a61190fffe9ea17cf655ce283 Mon Sep 17 00:00:00 2001
From: Josh Johnson <josh.johnson@leafyacre.com>
Date: Sat, 28 Apr 2018 21:15:20 -0400
Subject: [PATCH] Support LiveShare

Implements the changes from #154.

Co-Authored-By: Jonathan Carter <joncart@microsoft.com>
---
 src/common/create-document-selector.ts |  8 ++++++++
 src/constants.ts                       |  6 ++++++
 src/extension.ts                       | 14 ++++++++++----
 3 files changed, 24 insertions(+), 4 deletions(-)
 create mode 100644 src/common/create-document-selector.ts

diff --git a/src/common/create-document-selector.ts b/src/common/create-document-selector.ts
new file mode 100644
index 0000000..69d3ba6
--- /dev/null
+++ b/src/common/create-document-selector.ts
@@ -0,0 +1,8 @@
+import { DocumentFilter } from "vscode";
+
+export function createDocumentSelector(language: string): DocumentFilter[] {
+    return [
+        { language, scheme: "file" },
+        { language, scheme: "untitled" },
+    ];
+}
diff --git a/src/constants.ts b/src/constants.ts
index fd53f46..c3af374 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -30,6 +30,7 @@ export namespace diagnosticCollections {
 
 export namespace languageIds {
     export const xml = "xml";
+    export const xsd = "xsd";
     export const xquery = "xquery";
 }
 
@@ -45,6 +46,11 @@ export namespace stateKeys {
     export const xPathQueryLast = "xPathQueryLast";
 }
 
+export namespace uriSchemes {
+    export const file = "file";
+    export const untitled = "untitled";
+}
+
 export namespace views {
     export const xmlTreeView = "xmlTreeView";
 }
diff --git a/src/extension.ts b/src/extension.ts
index 8fcd255..24a6885 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -1,6 +1,7 @@
 import { languages, window, workspace, commands } from "vscode";
 import { ExtensionContext, Memento, TextEditor, TextEditorSelectionChangeEvent, WorkspaceConfiguration } from "vscode";
 
+import { createDocumentSelector } from "./common/create-document-selector";
 import { XQueryCompletionItemProvider } from "./completion/xquery-completion-item-provider";
 import { formatAsXml } from "./formatting/commands/formatAsXml";
 import { minifyXml } from "./formatting/commands/minifyXml";
@@ -21,9 +22,12 @@ export function activate(context: ExtensionContext) {
 
     const config = workspace.getConfiguration(constants.extensionPrefix);
 
+    const xmlXsdDocSelector = [...createDocumentSelector(constants.languageIds.xml), ...createDocumentSelector(constants.languageIds.xsd)];
+    const xqueryDocSelector = createDocumentSelector(constants.languageIds.xquery);
+
     /* Completion Features */
     context.subscriptions.push(
-        languages.registerCompletionItemProvider(constants.languageIds.xquery, new XQueryCompletionItemProvider(), ":", "$")
+        languages.registerCompletionItemProvider(xqueryDocSelector, new XQueryCompletionItemProvider(), ":", "$")
     );
 
     /* Formatting Features */
@@ -32,8 +36,8 @@ export function activate(context: ExtensionContext) {
     context.subscriptions.push(
         commands.registerTextEditorCommand(constants.commands.formatAsXml, formatAsXml),
         commands.registerTextEditorCommand(constants.commands.minifyXml, minifyXml),
-        languages.registerDocumentFormattingEditProvider(constants.languageIds.xml, xmlFormattingEditProvider),
-        languages.registerDocumentRangeFormattingEditProvider(constants.languageIds.xml, xmlFormattingEditProvider)
+        languages.registerDocumentFormattingEditProvider(xmlXsdDocSelector, xmlFormattingEditProvider),
+        languages.registerDocumentRangeFormattingEditProvider(xmlXsdDocSelector, xmlFormattingEditProvider)
     );
 
     /* Linting Features */
@@ -64,7 +68,9 @@ export function deactivate() {
 
 
 function _handleContextChange(editor: TextEditor): void {
-    if (!editor || !editor.document) {
+    const supportedSchemes = [constants.uriSchemes.file, constants.uriSchemes.untitled];
+
+    if (!editor || !editor.document || supportedSchemes.indexOf(editor.document.uri.scheme) === -1) {
         return;
     }