Do not load typescriptServices.js on the UI thread anymore

This commit is contained in:
Alex Dima 2018-08-08 16:53:26 +02:00
parent 95c8a531a2
commit d1e907a30c
4 changed files with 89 additions and 40 deletions

View file

@ -26,9 +26,8 @@ const BUNDLED_FILE_HEADER = [
].join('\n');
bundleOne('monaco.contribution');
bundleOne('lib/typescriptServices');
bundleOne('tsMode', ['vs/language/typescript/lib/typescriptServices']);
bundleOne('tsWorker', ['vs/language/typescript/lib/typescriptServices']);
bundleOne('tsMode');
bundleOne('tsWorker');
function bundleOne(moduleId, exclude) {
requirejs.optimize({

View file

@ -16,6 +16,45 @@ import Promise = monaco.Promise;
import CancellationToken = monaco.CancellationToken;
import IDisposable = monaco.IDisposable;
//#region utils copied from typescript to prevent loading the entire typescriptServices ---
enum IndentStyle {
None = 0,
Block = 1,
Smart = 2
}
function flattenDiagnosticMessageText(messageText: string | ts.DiagnosticMessageChain, newLine: '\n'): string {
if (typeof messageText === "string") {
return messageText;
} else {
let diagnosticChain = messageText;
let result = "";
let indent = 0;
while (diagnosticChain) {
if (indent) {
result += newLine;
for (let i = 0; i < indent; i++) {
result += " ";
}
}
result += diagnosticChain.messageText;
indent++;
diagnosticChain = diagnosticChain.next;
}
return result;
}
}
function displayPartsToString(displayParts: ts.SymbolDisplayPart[]): string {
if (displayParts) {
return displayParts.map((displayPart) => displayPart.text).join("");
}
return "";
}
//#endregion
export abstract class Adapter {
constructor(protected _worker: (first: Uri, ...more: Uri[]) => Promise<TypeScriptWorker>) {
@ -153,7 +192,7 @@ export class DiagnostcsAdapter extends Adapter {
startColumn,
endLineNumber,
endColumn,
message: ts.flattenDiagnosticMessageText(diag.messageText, '\n')
message: flattenDiagnosticMessageText(diag.messageText, '\n')
};
}
}
@ -215,8 +254,8 @@ export class SuggestAdapter extends Adapter implements monaco.languages.Completi
position: position,
label: details.name,
kind: SuggestAdapter.convertKind(details.kind),
detail: ts.displayPartsToString(details.displayParts),
documentation: ts.displayPartsToString(details.documentation)
detail: displayPartsToString(details.displayParts),
documentation: displayPartsToString(details.documentation)
};
}));
}
@ -281,20 +320,20 @@ export class SignatureHelpAdapter extends Adapter implements monaco.languages.Si
parameters: []
};
signature.label += ts.displayPartsToString(item.prefixDisplayParts);
signature.label += displayPartsToString(item.prefixDisplayParts);
item.parameters.forEach((p, i, a) => {
let label = ts.displayPartsToString(p.displayParts);
let label = displayPartsToString(p.displayParts);
let parameter: monaco.languages.ParameterInformation = {
label: label,
documentation: ts.displayPartsToString(p.documentation)
documentation: displayPartsToString(p.documentation)
};
signature.label += label;
signature.parameters.push(parameter);
if (i < a.length - 1) {
signature.label += ts.displayPartsToString(item.separatorDisplayParts);
signature.label += displayPartsToString(item.separatorDisplayParts);
}
});
signature.label += ts.displayPartsToString(item.suffixDisplayParts);
signature.label += displayPartsToString(item.suffixDisplayParts);
ret.signatures.push(signature);
});
@ -317,7 +356,7 @@ export class QuickInfoAdapter extends Adapter implements monaco.languages.HoverP
if (!info) {
return;
}
let documentation = ts.displayPartsToString(info.documentation);
let documentation = displayPartsToString(info.documentation);
let tags = info.tags ? info.tags.map(tag => {
const label = `*@${tag.name}*`;
if (!tag.text) {
@ -326,7 +365,7 @@ export class QuickInfoAdapter extends Adapter implements monaco.languages.HoverP
return label + (tag.text.match(/\r\n|\n/g) ? ' \n' + tag.text : ` - ${tag.text}`);
})
.join(' \n\n') : '';
let contents = ts.displayPartsToString(info.displayParts);
let contents = displayPartsToString(info.displayParts);
return {
range: this._textSpanToRange(resource, info.textSpan),
contents: [{
@ -512,7 +551,7 @@ export abstract class FormatHelper extends Adapter {
ConvertTabsToSpaces: options.insertSpaces,
TabSize: options.tabSize,
IndentSize: options.tabSize,
IndentStyle: ts.IndentStyle.Smart,
IndentStyle: IndentStyle.Smart,
NewLineCharacter: '\n',
InsertSpaceAfterCommaDelimiter: true,
InsertSpaceAfterSemicolonInForStatements: true,

View file

@ -100,7 +100,7 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.typescript.
}
}
// --- BEGIN enums copied from typescript to prevent loading the entire typescriptServices ---
//#region enums copied from typescript to prevent loading the entire typescriptServices ---
enum ModuleKind {
None = 0,
@ -109,26 +109,17 @@ enum ModuleKind {
UMD = 3,
System = 4,
ES2015 = 5,
ESNext = 6
}
enum JsxEmit {
None = 0,
Preserve = 1,
React = 2,
ReactNative = 3
}
enum NewLineKind {
CarriageReturnLineFeed = 0,
LineFeed = 1,
}
interface LineAndCharacter {
line: number;
character: number;
}
enum ScriptKind {
Unknown = 0,
JS = 1,
JSX = 2,
TS = 3,
TSX = 4,
LineFeed = 1
}
enum ScriptTarget {
ES3 = 0,
@ -136,18 +127,16 @@ enum ScriptTarget {
ES2015 = 2,
ES2016 = 3,
ES2017 = 4,
ESNext = 5,
Latest = 5,
}
enum LanguageVariant {
Standard = 0,
JSX = 1,
ES2018 = 5,
ESNext = 6,
JSON = 100,
Latest = 6
}
enum ModuleResolutionKind {
Classic = 1,
NodeJs = 2,
NodeJs = 2
}
// --- END enums copied from typescript to prevent loading the entire typescriptServices ---
//#endregion
const typescriptDefaults = new LanguageServiceDefaultsImpl(
{ allowNonTsExtensions: true, target: ScriptTarget.Latest },

32
src/monaco.d.ts vendored
View file

@ -8,15 +8,17 @@ declare module monaco.languages.typescript {
UMD = 3,
System = 4,
ES2015 = 5,
ESNext = 6
}
enum JsxEmit {
None = 0,
Preserve = 1,
React = 2,
ReactNative = 3
}
enum NewLineKind {
CarriageReturnLineFeed = 0,
LineFeed = 1,
LineFeed = 1
}
enum ScriptTarget {
@ -25,16 +27,22 @@ declare module monaco.languages.typescript {
ES2015 = 2,
ES2016 = 3,
ES2017 = 4,
ESNext = 5,
Latest = 5,
ES2018 = 5,
ESNext = 6,
JSON = 100,
Latest = 6
}
export enum ModuleResolutionKind {
Classic = 1,
NodeJs = 2,
NodeJs = 2
}
type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[];
interface MapLike<T> {
[index: string]: T;
}
type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike<string[]> | null | undefined;
interface CompilerOptions {
allowJs?: boolean;
allowSyntheticDefaultImports?: boolean;
@ -43,9 +51,13 @@ declare module monaco.languages.typescript {
alwaysStrict?: boolean;
baseUrl?: string;
charset?: string;
checkJs?: boolean;
declaration?: boolean;
declarationMap?: boolean;
emitDeclarationOnly?: boolean;
declarationDir?: string;
disableSizeLimit?: boolean;
downlevelIteration?: boolean;
emitBOM?: boolean;
emitDecoratorMetadata?: boolean;
experimentalDecorators?: boolean;
@ -55,6 +67,7 @@ declare module monaco.languages.typescript {
inlineSources?: boolean;
isolatedModules?: boolean;
jsx?: JsxEmit;
keyofStringsOnly?: boolean;
lib?: string[];
locale?: string;
mapRoot?: string;
@ -70,6 +83,7 @@ declare module monaco.languages.typescript {
noImplicitAny?: boolean;
noImplicitReturns?: boolean;
noImplicitThis?: boolean;
noStrictGenericChecks?: boolean;
noUnusedLocals?: boolean;
noUnusedParameters?: boolean;
noImplicitUseStrict?: boolean;
@ -78,10 +92,13 @@ declare module monaco.languages.typescript {
out?: string;
outDir?: string;
outFile?: string;
paths?: MapLike<string[]>;
preserveConstEnums?: boolean;
preserveSymlinks?: boolean;
project?: string;
reactNamespace?: string;
jsxFactory?: string;
composite?: boolean;
removeComments?: boolean;
rootDir?: string;
rootDirs?: string[];
@ -89,14 +106,19 @@ declare module monaco.languages.typescript {
skipDefaultLibCheck?: boolean;
sourceMap?: boolean;
sourceRoot?: string;
strict?: boolean;
strictFunctionTypes?: boolean;
strictNullChecks?: boolean;
strictPropertyInitialization?: boolean;
suppressExcessPropertyErrors?: boolean;
suppressImplicitAnyIndexErrors?: boolean;
target?: ScriptTarget;
traceResolution?: boolean;
resolveJsonModule?: boolean;
types?: string[];
/** Paths used to compute primary types search locations */
typeRoots?: string[];
esModuleInterop?: boolean;
[option: string]: CompilerOptionsValue | undefined;
}