@inst/vscode-bin-darwin
Version:
BINARY ONLY - VSCode binary deployment for macOS
395 lines (394 loc) • 19.5 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
;
Object.defineProperty(exports, "__esModule", { value: true });
var languageModelCache_1 = require("../languageModelCache");
var vscode_languageserver_types_1 = require("vscode-languageserver-types");
var strings_1 = require("../utils/strings");
var ts = require("typescript");
var path_1 = require("path");
var FILE_NAME = 'vscode://javascript/1'; // the same 'file' is used for all contents
var JQUERY_D_TS = path_1.join(__dirname, '../../lib/jquery.d.ts');
var JS_WORD_REGEX = /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g;
function getJavascriptMode(documentRegions) {
var jsDocuments = languageModelCache_1.getLanguageModelCache(10, 60, function (document) { return documentRegions.get(document).getEmbeddedDocument('javascript'); });
var compilerOptions = { allowNonTsExtensions: true, allowJs: true, lib: ['lib.es6.d.ts'], target: ts.ScriptTarget.Latest, moduleResolution: ts.ModuleResolutionKind.Classic };
var currentTextDocument;
var scriptFileVersion = 0;
function updateCurrentTextDocument(doc) {
if (!currentTextDocument || doc.uri !== currentTextDocument.uri || doc.version !== currentTextDocument.version) {
currentTextDocument = jsDocuments.get(doc);
scriptFileVersion++;
}
}
var host = {
getCompilationSettings: function () { return compilerOptions; },
getScriptFileNames: function () { return [FILE_NAME, JQUERY_D_TS]; },
getScriptKind: function () { return ts.ScriptKind.JS; },
getScriptVersion: function (fileName) {
if (fileName === FILE_NAME) {
return String(scriptFileVersion);
}
return '1'; // default lib an jquery.d.ts are static
},
getScriptSnapshot: function (fileName) {
var text = '';
if (strings_1.startsWith(fileName, 'vscode:')) {
if (fileName === FILE_NAME) {
text = currentTextDocument.getText();
}
}
else {
text = ts.sys.readFile(fileName) || '';
}
return {
getText: function (start, end) { return text.substring(start, end); },
getLength: function () { return text.length; },
getChangeRange: function () { return void 0; }
};
},
getCurrentDirectory: function () { return ''; },
getDefaultLibFileName: function (options) { return ts.getDefaultLibFilePath(options); }
};
var jsLanguageService = ts.createLanguageService(host);
var globalSettings = {};
return {
getId: function () {
return 'javascript';
},
configure: function (options) {
globalSettings = options;
},
doValidation: function (document) {
updateCurrentTextDocument(document);
var syntaxDiagnostics = jsLanguageService.getSyntacticDiagnostics(FILE_NAME);
var semanticDiagnostics = jsLanguageService.getSemanticDiagnostics(FILE_NAME);
return syntaxDiagnostics.concat(semanticDiagnostics).map(function (diag) {
return {
range: convertRange(currentTextDocument, diag),
severity: vscode_languageserver_types_1.DiagnosticSeverity.Error,
message: ts.flattenDiagnosticMessageText(diag.messageText, '\n')
};
});
},
doComplete: function (document, position) {
updateCurrentTextDocument(document);
var offset = currentTextDocument.offsetAt(position);
var completions = jsLanguageService.getCompletionsAtPosition(FILE_NAME, offset);
if (!completions) {
return { isIncomplete: false, items: [] };
}
var replaceRange = convertRange(currentTextDocument, strings_1.getWordAtText(currentTextDocument.getText(), offset, JS_WORD_REGEX));
return {
isIncomplete: false,
items: completions.entries.map(function (entry) {
return {
uri: document.uri,
position: position,
label: entry.name,
sortText: entry.sortText,
kind: convertKind(entry.kind),
textEdit: vscode_languageserver_types_1.TextEdit.replace(replaceRange, entry.name),
data: {
languageId: 'javascript',
uri: document.uri,
offset: offset
}
};
})
};
},
doResolve: function (document, item) {
updateCurrentTextDocument(document);
var details = jsLanguageService.getCompletionEntryDetails(FILE_NAME, item.data.offset, item.label);
if (details) {
item.detail = ts.displayPartsToString(details.displayParts);
item.documentation = ts.displayPartsToString(details.documentation);
delete item.data;
}
return item;
},
doHover: function (document, position) {
updateCurrentTextDocument(document);
var info = jsLanguageService.getQuickInfoAtPosition(FILE_NAME, currentTextDocument.offsetAt(position));
if (info) {
var contents = ts.displayPartsToString(info.displayParts);
return {
range: convertRange(currentTextDocument, info.textSpan),
contents: vscode_languageserver_types_1.MarkedString.fromPlainText(contents)
};
}
return null;
},
doSignatureHelp: function (document, position) {
updateCurrentTextDocument(document);
var signHelp = jsLanguageService.getSignatureHelpItems(FILE_NAME, currentTextDocument.offsetAt(position));
if (signHelp) {
var ret_1 = {
activeSignature: signHelp.selectedItemIndex,
activeParameter: signHelp.argumentIndex,
signatures: []
};
signHelp.items.forEach(function (item) {
var signature = {
label: '',
documentation: null,
parameters: []
};
signature.label += ts.displayPartsToString(item.prefixDisplayParts);
item.parameters.forEach(function (p, i, a) {
var label = ts.displayPartsToString(p.displayParts);
var parameter = {
label: label,
documentation: ts.displayPartsToString(p.documentation)
};
signature.label += label;
signature.parameters.push(parameter);
if (i < a.length - 1) {
signature.label += ts.displayPartsToString(item.separatorDisplayParts);
}
});
signature.label += ts.displayPartsToString(item.suffixDisplayParts);
ret_1.signatures.push(signature);
});
return ret_1;
}
;
return null;
},
findDocumentHighlight: function (document, position) {
updateCurrentTextDocument(document);
var occurrences = jsLanguageService.getOccurrencesAtPosition(FILE_NAME, currentTextDocument.offsetAt(position));
if (occurrences) {
return occurrences.map(function (entry) {
return {
range: convertRange(currentTextDocument, entry.textSpan),
kind: (entry.isWriteAccess ? vscode_languageserver_types_1.DocumentHighlightKind.Write : vscode_languageserver_types_1.DocumentHighlightKind.Text)
};
});
}
;
return null;
},
findDocumentSymbols: function (document) {
updateCurrentTextDocument(document);
var items = jsLanguageService.getNavigationBarItems(FILE_NAME);
if (items) {
var result_1 = [];
var existing_1 = {};
var collectSymbols_1 = function (item, containerLabel) {
var sig = item.text + item.kind + item.spans[0].start;
if (item.kind !== 'script' && !existing_1[sig]) {
var symbol = {
name: item.text,
kind: convertSymbolKind(item.kind),
location: {
uri: document.uri,
range: convertRange(currentTextDocument, item.spans[0])
},
containerName: containerLabel
};
existing_1[sig] = true;
result_1.push(symbol);
containerLabel = item.text;
}
if (item.childItems && item.childItems.length > 0) {
for (var _i = 0, _a = item.childItems; _i < _a.length; _i++) {
var child = _a[_i];
collectSymbols_1(child, containerLabel);
}
}
};
items.forEach(function (item) { return collectSymbols_1(item); });
return result_1;
}
return null;
},
findDefinition: function (document, position) {
updateCurrentTextDocument(document);
var definition = jsLanguageService.getDefinitionAtPosition(FILE_NAME, currentTextDocument.offsetAt(position));
if (definition) {
return definition.filter(function (d) { return d.fileName === FILE_NAME; }).map(function (d) {
return {
uri: document.uri,
range: convertRange(currentTextDocument, d.textSpan)
};
});
}
return null;
},
findReferences: function (document, position) {
updateCurrentTextDocument(document);
var references = jsLanguageService.getReferencesAtPosition(FILE_NAME, currentTextDocument.offsetAt(position));
if (references) {
return references.filter(function (d) { return d.fileName === FILE_NAME; }).map(function (d) {
return {
uri: document.uri,
range: convertRange(currentTextDocument, d.textSpan)
};
});
}
return null;
},
format: function (document, range, formatParams, settings) {
if (settings === void 0) { settings = globalSettings; }
currentTextDocument = documentRegions.get(document).getEmbeddedDocument('javascript', true);
scriptFileVersion++;
var formatterSettings = settings && settings.javascript && settings.javascript.format;
var initialIndentLevel = computeInitialIndent(document, range, formatParams);
var formatSettings = convertOptions(formatParams, formatterSettings, initialIndentLevel + 1);
var start = currentTextDocument.offsetAt(range.start);
var end = currentTextDocument.offsetAt(range.end);
var lastLineRange = null;
if (range.end.character === 0 || strings_1.isWhitespaceOnly(currentTextDocument.getText().substr(end - range.end.character, range.end.character))) {
end -= range.end.character;
lastLineRange = vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(range.end.line, 0), range.end);
}
var edits = jsLanguageService.getFormattingEditsForRange(FILE_NAME, start, end, formatSettings);
if (edits) {
var result = [];
for (var _i = 0, edits_1 = edits; _i < edits_1.length; _i++) {
var edit = edits_1[_i];
if (edit.span.start >= start && edit.span.start + edit.span.length <= end) {
result.push({
range: convertRange(currentTextDocument, edit.span),
newText: edit.newText
});
}
}
if (lastLineRange) {
result.push({
range: lastLineRange,
newText: generateIndent(initialIndentLevel, formatParams)
});
}
return result;
}
return null;
},
onDocumentRemoved: function (document) {
jsDocuments.onDocumentRemoved(document);
},
dispose: function () {
jsLanguageService.dispose();
jsDocuments.dispose();
}
};
}
exports.getJavascriptMode = getJavascriptMode;
;
function convertRange(document, span) {
var startPosition = document.positionAt(span.start);
var endPosition = document.positionAt(span.start + span.length);
return vscode_languageserver_types_1.Range.create(startPosition, endPosition);
}
function convertKind(kind) {
switch (kind) {
case 'primitive type':
case 'keyword':
return vscode_languageserver_types_1.CompletionItemKind.Keyword;
case 'var':
case 'local var':
return vscode_languageserver_types_1.CompletionItemKind.Variable;
case 'property':
case 'getter':
case 'setter':
return vscode_languageserver_types_1.CompletionItemKind.Field;
case 'function':
case 'method':
case 'construct':
case 'call':
case 'index':
return vscode_languageserver_types_1.CompletionItemKind.Function;
case 'enum':
return vscode_languageserver_types_1.CompletionItemKind.Enum;
case 'module':
return vscode_languageserver_types_1.CompletionItemKind.Module;
case 'class':
return vscode_languageserver_types_1.CompletionItemKind.Class;
case 'interface':
return vscode_languageserver_types_1.CompletionItemKind.Interface;
case 'warning':
return vscode_languageserver_types_1.CompletionItemKind.File;
}
return vscode_languageserver_types_1.CompletionItemKind.Property;
}
function convertSymbolKind(kind) {
switch (kind) {
case 'var':
case 'local var':
case 'const':
return vscode_languageserver_types_1.SymbolKind.Variable;
case 'function':
case 'local function':
return vscode_languageserver_types_1.SymbolKind.Function;
case 'enum':
return vscode_languageserver_types_1.SymbolKind.Enum;
case 'module':
return vscode_languageserver_types_1.SymbolKind.Module;
case 'class':
return vscode_languageserver_types_1.SymbolKind.Class;
case 'interface':
return vscode_languageserver_types_1.SymbolKind.Interface;
case 'method':
return vscode_languageserver_types_1.SymbolKind.Method;
case 'property':
case 'getter':
case 'setter':
return vscode_languageserver_types_1.SymbolKind.Property;
}
return vscode_languageserver_types_1.SymbolKind.Variable;
}
function convertOptions(options, formatSettings, initialIndentLevel) {
return {
ConvertTabsToSpaces: options.insertSpaces,
TabSize: options.tabSize,
IndentSize: options.tabSize,
IndentStyle: ts.IndentStyle.Smart,
NewLineCharacter: '\n',
BaseIndentSize: options.tabSize * initialIndentLevel,
InsertSpaceAfterCommaDelimiter: Boolean(!formatSettings || formatSettings.insertSpaceAfterCommaDelimiter),
InsertSpaceAfterSemicolonInForStatements: Boolean(!formatSettings || formatSettings.insertSpaceAfterSemicolonInForStatements),
InsertSpaceBeforeAndAfterBinaryOperators: Boolean(!formatSettings || formatSettings.insertSpaceBeforeAndAfterBinaryOperators),
InsertSpaceAfterKeywordsInControlFlowStatements: Boolean(!formatSettings || formatSettings.insertSpaceAfterKeywordsInControlFlowStatements),
InsertSpaceAfterFunctionKeywordForAnonymousFunctions: Boolean(!formatSettings || formatSettings.insertSpaceAfterFunctionKeywordForAnonymousFunctions),
InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis),
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets),
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces),
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces),
PlaceOpenBraceOnNewLineForControlBlocks: Boolean(formatSettings && formatSettings.placeOpenBraceOnNewLineForFunctions),
PlaceOpenBraceOnNewLineForFunctions: Boolean(formatSettings && formatSettings.placeOpenBraceOnNewLineForControlBlocks)
};
}
function computeInitialIndent(document, range, options) {
var lineStart = document.offsetAt(vscode_languageserver_types_1.Position.create(range.start.line, 0));
var content = document.getText();
var i = lineStart;
var nChars = 0;
var tabSize = options.tabSize || 4;
while (i < content.length) {
var ch = content.charAt(i);
if (ch === ' ') {
nChars++;
}
else if (ch === '\t') {
nChars += tabSize;
}
else {
break;
}
i++;
}
return Math.floor(nChars / tabSize);
}
function generateIndent(level, options) {
if (options.insertSpaces) {
return strings_1.repeat(' ', level * options.tabSize);
}
else {
return strings_1.repeat('\t', level);
}
}
//# sourceMappingURL=https://ticino.blob.core.windows.net/sourcemaps/b813d12980308015bcd2b3a2f6efa5c810c33ba5/extensions/html/server/out/modes/javascriptMode.js.map