forked from microsoft/vscode
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Contribute to html language server with a custom language.
Fixes microsoft#146730 Signed-off-by: azerr <[email protected]>
- Loading branch information
1 parent
3c3c149
commit 0c36bb1
Showing
4 changed files
with
155 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
116 changes: 116 additions & 0 deletions
116
extensions/html-language-features/client/src/htmlLanguageContribution.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/*--------------------------------------------------------------------------------------------- | ||
* Copyright (c) Microsoft Corporation. All rights reserved. | ||
* Licensed under the MIT License. See License.txt in the project root for license information. | ||
*--------------------------------------------------------------------------------------------*/ | ||
|
||
import * as vscode from 'vscode'; | ||
import { DocumentSelector } from 'vscode-languageclient'; | ||
import { isDeepStrictEqual } from 'util'; | ||
|
||
const RELOAD_WINDOW = 'workbench.action.reloadWindow'; | ||
|
||
let existingExtensions: HtmlLanguageContribution[]; | ||
|
||
/** | ||
* Html language contribution. | ||
*/ | ||
export interface HtmlLanguageContribution { | ||
languageId: string; | ||
autoInsert: false; | ||
} | ||
|
||
/** | ||
* Returns all Html language contributions from package.json | ||
* | ||
* @param extensions array of extensions to search contributions from | ||
*/ | ||
export function collectHtmlLanguageContributions(extensions: readonly vscode.Extension<any>[]): HtmlLanguageContribution[] { | ||
const result: HtmlLanguageContribution[] = []; | ||
if (extensions && extensions.length) { | ||
for (const extension of extensions) { | ||
const htmlLanguages = extension.packageJSON?.contributes?.['html-languages']; | ||
if (Array.isArray(htmlLanguages)) { | ||
htmlLanguages.forEach(htmlLanguage => { | ||
const htmlLanguageContribution = createHtmlLanguageContribution(htmlLanguage); | ||
if (htmlLanguageContribution) { | ||
result.push(htmlLanguageContribution); | ||
} | ||
}); | ||
} | ||
} | ||
} | ||
// Make a copy of extensions: | ||
existingExtensions = result.slice(); | ||
return result; | ||
} | ||
|
||
export function handleExtensionChange(extensions: readonly vscode.Extension<any>[]): void { | ||
if (!existingExtensions) { | ||
return; | ||
} | ||
const oldExtensions = new Set(existingExtensions.slice()); | ||
const newExtensions = collectHtmlLanguageContributions(extensions); | ||
let hasChanged = (oldExtensions.size !== newExtensions.length); | ||
if (!hasChanged) { | ||
for (const newExtension of newExtensions) { | ||
let found = false; | ||
for (const oldExtension of oldExtensions) { | ||
if (isDeepStrictEqual(oldExtension, newExtension)) { | ||
found = true; | ||
break; | ||
} | ||
} | ||
if (found) { | ||
continue; | ||
} else { | ||
hasChanged = true; | ||
break; | ||
} | ||
} | ||
} | ||
|
||
if (hasChanged) { | ||
const msg = `Extensions to the Html Language Server changed, reloading ${vscode.env.appName} is required for the changes to take effect.`; | ||
const action = 'Reload'; | ||
vscode.window.showWarningMessage(msg, action).then((selection) => { | ||
if (action === selection) { | ||
vscode.commands.executeCommand(RELOAD_WINDOW); | ||
} | ||
}); | ||
} | ||
} | ||
|
||
/** | ||
* Returns the document selector. | ||
* | ||
* The returned document selector contains the html document selectors | ||
* and all document selectors contained in `htmlContributions`. | ||
* | ||
* @param htmlContributions Html language server contributions from other VS Code extensions | ||
*/ | ||
export function getDocumentSelector(htmlContributions: HtmlLanguageContribution[]): DocumentSelector { | ||
let documentSelector: DocumentSelector = [ | ||
'html' | ||
]; | ||
htmlContributions.forEach((contribution: HtmlLanguageContribution) => { | ||
documentSelector = documentSelector.concat(contribution.languageId); | ||
}); | ||
return documentSelector; | ||
} | ||
|
||
export function getSupportedLanguagesAutoInsert(htmlContributions: HtmlLanguageContribution[]): { [id: string]: boolean } { | ||
const supportedLanguages: { [id: string]: boolean } = { html: true }; | ||
htmlContributions.forEach((contribution: HtmlLanguageContribution) => { | ||
supportedLanguages[contribution.languageId] = contribution.autoInsert; | ||
}); | ||
return supportedLanguages; | ||
} | ||
|
||
function createHtmlLanguageContribution(section: any): HtmlLanguageContribution | undefined { | ||
const languageId: string | undefined = section.languageId; | ||
if (!languageId) { | ||
return; | ||
} | ||
const autoInsert = section.autoInsert === true ? true : false; | ||
return { languageId, autoInsert } as HtmlLanguageContribution; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters