Skip to content

Commit 5b5b1d0

Browse files
committed
Improve TS Language Server Worker
- Add Emmet mode - Fix too many .d.ts files at the same time
1 parent 264f323 commit 5b5b1d0

File tree

19 files changed

+9187
-568
lines changed

19 files changed

+9187
-568
lines changed

Gulpfile.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,24 @@ gulp.task('old-browserfs', () =>
4242
.pipe(gulp.dest('www/static/browserfs'))
4343
);
4444

45+
gulp.task('old-vscode', () =>
46+
gulp
47+
.src('standalone-packages/vscode-editor/release/min/vs/**/*')
48+
.pipe(gulp.dest('public/vscode2/vs'))
49+
);
50+
4551
gulp.task('statics', () =>
4652
gulp.src('packages/app/public/**/*').pipe(gulp.dest('www'))
4753
);
4854

49-
gulp.task('default', ['app', 'homepage', 'statics', 'monaco', 'old-browserfs']);
55+
gulp.task('default', [
56+
'app',
57+
'homepage',
58+
'statics',
59+
'monaco',
60+
'old-browserfs',
61+
['old-vscode'],
62+
]);
5063

5164
gulp.task('clean-vscode', rimraf('standalone-packages/monaco-editor-core'));
5265

packages/app/config/webpack.common.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ module.exports = {
444444
[
445445
{
446446
from: '../../standalone-packages/vscode-editor/release/min/vs',
447-
to: 'public/vscode2/vs',
447+
to: 'public/vscode3/vs',
448448
force: true,
449449
},
450450
{

packages/app/src/app/index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@
6666
}
6767
</script>
6868

69-
<link data-name="/public/vscode2/vs/editor/editor.main"
69+
<link data-name="/public/vscode3/vs/editor/editor.main"
7070
rel="preload"
7171
as="style"
72-
href="/public/vscode2/vs/editor/editor.main.css">
72+
href="/public/vscode3/vs/editor/editor.main.css">
7373
</link>
74-
<link rel="preload" as="script" href="/public/vscode2/vs/editor/editor.main.js"></link>
74+
<link rel="preload" as="script" href="/public/vscode3/vs/editor/editor.main.js"></link>
7575
</head>
7676
<body style="margin: 0; padding: 0;">
7777
<!-- Google Tag Manager (noscript) -->

packages/app/src/app/vscode/metadata.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const METADATA = {
22
CORE: {
33
paths: {
4-
src: process.env.VSCODE ? '/vscode/out/vs' : '/public/vscode2/vs',
4+
src: process.env.VSCODE ? '/vscode/out/vs' : '/public/vscode3/vs',
55
'npm/dev': 'node_modules/monaco-editor-core/dev/vs',
66
'npm/min': 'node_modules/monaco-editor-core/min/vs',
77
built: '/vscode/out-monaco-editor-core/min/vs',
@@ -17,10 +17,10 @@ const METADATA = {
1717
thirdPartyNotices: 'node_modules/monaco-typescript/ThirdPartyNotices.txt',
1818
paths: {
1919
src: process.env.VSCODE
20-
? '/monaco-typescript/release/dev'
21-
: '/public/vscode2/vs/language/typescript',
20+
? '/monaco-typescript/release/min'
21+
: '/public/vscode3/vs/language/typescript',
2222
'npm/dev': '../monaco-typescript/release/dev',
23-
'npm/min': '/public/vscode2/vs/language/typescript',
23+
'npm/min': '/public/vscode3/vs/language/typescript',
2424
esm: '../monaco-typescript/release/esm',
2525
},
2626
},
@@ -31,9 +31,9 @@ const METADATA = {
3131
paths: {
3232
src: process.env.VSCODE
3333
? '/vscode-editor/node_modules/monaco-css/release/dev'
34-
: '/public/vscode2/vs/language/css',
34+
: '/public/vscode3/vs/language/css',
3535
'npm/dev': 'node_modules/monaco-css/release/dev',
36-
'npm/min': '/public/vscode2/vs/language/css',
36+
'npm/min': '/public/vscode3/vs/language/css',
3737
esm: 'node_modules/monaco-css/release/esm',
3838
},
3939
},
@@ -44,9 +44,9 @@ const METADATA = {
4444
paths: {
4545
src: process.env.VSCODE
4646
? '/vscode-editor/node_modules/monaco-json/release/dev'
47-
: '/public/vscode2/vs/language/json',
47+
: '/public/vscode3/vs/language/json',
4848
'npm/dev': 'node_modules/monaco-json/release/dev',
49-
'npm/min': '/public/vscode2/vs/language/json',
49+
'npm/min': '/public/vscode3/vs/language/json',
5050
esm: 'node_modules/monaco-json/release/esm',
5151
},
5252
},
@@ -58,9 +58,9 @@ const METADATA = {
5858
paths: {
5959
src: process.env.VSCODE
6060
? '/vscode-editor/node_modules/monaco-html/release/dev'
61-
: '/public/vscode2/vs/language/html',
61+
: '/public/vscode3/vs/language/html',
6262
'npm/dev': 'node_modules/monaco-html/release/dev',
63-
'npm/min': '/public/vscode2/vs/language/html',
63+
'npm/min': '/public/vscode3/vs/language/html',
6464
esm: 'node_modules/monaco-html/release/esm',
6565
},
6666
},
@@ -72,9 +72,9 @@ const METADATA = {
7272
paths: {
7373
src: process.env.VSCODE
7474
? '/monaco-languages/release/dev'
75-
: '/public/vscode2/vs/basic-languages',
75+
: '/public/vscode3/vs/basic-languages',
7676
'npm/dev': '../monaco-languages/release/dev',
77-
'npm/min': '/public/vscode2/vs/basic-languages',
77+
'npm/min': '/public/vscode3/vs/basic-languages',
7878
esm: 'node_modules/monaco-languages/release/esm',
7979
},
8080
},

standalone-packages/monaco-typescript/package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
"version": "3.2.0",
44
"description": "TypeScript and JavaScript language support for Monaco Editor",
55
"scripts": {
6-
"compile-amd": "mcopy ./src/lib/typescriptServices-amd.js ./release/dev/lib/typescriptServices.js && tsc -p ./src/tsconfig.json",
6+
"compile-amd": "mcopy ./src/lib/typescriptServices-amd.js ./release/dev/lib/typescriptServices.js && cp -R ./src/lib/emmet/ ./release/dev/lib/emmet/ && tsc -p ./src/tsconfig.json",
77
"compile-esm": "mcopy ./src/lib/typescriptServices.js ./release/esm/lib/typescriptServices.js && tsc -p ./src/tsconfig.esm.json",
8-
"compile": "mrmdir ./release && npm run compile-amd && npm run compile-esm",
8+
"compile": "rm -rf ./release && npm run compile-amd && npm run compile-esm",
99
"watch": "tsc -p ./src --watch",
1010
"prepublish": "npm run compile && node ./scripts/bundle && mcopy ./src/monaco.d.ts ./release/monaco.d.ts",
1111
"import-typescript": "node ./scripts/importTypescript"
@@ -26,5 +26,8 @@
2626
"requirejs": "^2.3.5",
2727
"typescript": "3.0.1",
2828
"uglify-js": "^3.4.7"
29+
},
30+
"dependencies": {
31+
"vscode-languageserver-types": "^3.13.0"
2932
}
3033
}

standalone-packages/monaco-typescript/scripts/bundle.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const helpers = require('monaco-plugin-helpers');
1111

1212
const REPO_ROOT = path.resolve(__dirname, '..');
1313

14+
1415
const sha1 = helpers.getGitVersion(REPO_ROOT);
1516
const semver = require('../package.json').version;
1617
const headerVersion = semver + '(' + sha1 + ')';
@@ -30,16 +31,23 @@ bundleOne('tsMode');
3031
bundleOne('tsWorker');
3132

3233
function bundleOne(moduleId, exclude) {
34+
3335
requirejs.optimize({
3436
baseUrl: 'release/dev/',
3537
name: 'vs/language/typescript/' + moduleId,
3638
out: 'release/min/' + moduleId + '.js',
3739
exclude: exclude,
3840
paths: {
39-
'vs/language/typescript': REPO_ROOT + '/release/dev'
40-
},
41+
'vs/language/typescript': REPO_ROOT + '/release/dev',
42+
},
43+
packages: [{
44+
name: 'vscode-languageserver-types',
45+
location: path.join(__dirname, '../node_modules/vscode-languageserver-types/lib/umd'),
46+
main: 'main'
47+
}],
4148
optimize: 'none'
4249
}, function(buildResponse) {
50+
console.log(buildResponse)
4351
const filePath = path.join(REPO_ROOT, 'release/min/' + moduleId + '.js');
4452
const fileContents = fs.readFileSync(filePath).toString();
4553
console.log();

standalone-packages/monaco-typescript/src/fetchDependencyTypings.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ const getRequireStatements = (title: string, code: string) => {
241241
}
242242
});
243243

244-
return requires;
244+
// Early exit with too many imports, takes too much CPU
245+
return requires.length > 400 ? [] : requires;
245246
};
246247

247248
const tempTransformFiles = files => {

standalone-packages/monaco-typescript/src/languageFeatures.ts

Lines changed: 89 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import { LanguageServiceDefaultsImpl } from './monaco.contribution';
88
import * as ts from './lib/typescriptServices';
99
import { TypeScriptWorker } from './tsWorker';
1010

11+
import * as emmet from './lib/emmet/emmetHelper';
12+
import * as ls from './lib/emmet/expand/languageserver-types';
13+
1114
import Uri = monaco.Uri;
1215
import Position = monaco.Position;
1316
import Range = monaco.Range;
@@ -25,6 +28,44 @@ enum IndentStyle {
2528
Smart = 2,
2629
}
2730

31+
export enum Priority {
32+
Emmet,
33+
Platform
34+
}
35+
36+
function toCompletionItemKind(kind: number): monaco.languages.CompletionItemKind {
37+
let mItemKind = monaco.languages.CompletionItemKind;
38+
39+
switch (kind) {
40+
case ls.CompletionItemKind.Text: return mItemKind.Text;
41+
case ls.CompletionItemKind.Method: return mItemKind.Method;
42+
case ls.CompletionItemKind.Function: return mItemKind.Function;
43+
case ls.CompletionItemKind.Constructor: return mItemKind.Constructor;
44+
case ls.CompletionItemKind.Field: return mItemKind.Field;
45+
case ls.CompletionItemKind.Variable: return mItemKind.Variable;
46+
case ls.CompletionItemKind.Class: return mItemKind.Class;
47+
case ls.CompletionItemKind.Interface: return mItemKind.Interface;
48+
case ls.CompletionItemKind.Module: return mItemKind.Module;
49+
case ls.CompletionItemKind.Property: return mItemKind.Property;
50+
case ls.CompletionItemKind.Unit: return mItemKind.Unit;
51+
case ls.CompletionItemKind.Value: return mItemKind.Value;
52+
case ls.CompletionItemKind.Enum: return mItemKind.Enum;
53+
case ls.CompletionItemKind.Keyword: return mItemKind.Keyword;
54+
case ls.CompletionItemKind.Snippet: return mItemKind.Snippet;
55+
case ls.CompletionItemKind.Color: return mItemKind.Color;
56+
case ls.CompletionItemKind.File: return mItemKind.File;
57+
case ls.CompletionItemKind.Reference: return mItemKind.Reference;
58+
}
59+
return mItemKind.Property;
60+
}
61+
62+
function toRange(range: ls.Range): Range {
63+
if (!range) {
64+
return void 0;
65+
}
66+
return new Range(range.start.line + 1, range.start.character + 1, range.end.line + 1, range.end.character + 1);
67+
}
68+
2869
function flattenDiagnosticMessageText(
2970
messageText: string | ts.DiagnosticMessageChain,
3071
newLine: '\n'
@@ -233,17 +274,19 @@ interface MyCompletionItem extends monaco.languages.CompletionItem {
233274
position: Position;
234275
}
235276

277+
const emmetTriggerCharacters = ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
278+
236279
export class SuggestAdapter extends Adapter
237280
implements monaco.languages.CompletionItemProvider {
238281
public get triggerCharacters(): string[] {
239-
return ['.'];
282+
return [...emmetTriggerCharacters, '.'];
240283
}
241284

242285
provideCompletionItems(
243286
model: monaco.editor.IReadOnlyModel,
244287
position: Position,
245288
token: CancellationToken
246-
): Thenable<monaco.languages.CompletionItem[]> {
289+
): Thenable<monaco.languages.CompletionList> {
247290
const wordInfo = model.getWordUntilPosition(position);
248291
const resource = model.uri;
249292
const offset = this._positionToOffset(resource, position);
@@ -258,17 +301,53 @@ export class SuggestAdapter extends Adapter
258301
if (!info) {
259302
return;
260303
}
261-
let suggestions: MyCompletionItem[] = info.entries.map(entry => {
262-
return {
263-
uri: resource,
264-
position: position,
265-
label: entry.name,
304+
305+
const emmetItems = info.emmetCompletions ? info.emmetCompletions.items.map(i => {
306+
const entry = {
307+
...i,
308+
sortText: Priority.Emmet + i.label
309+
};
310+
311+
let item : MyCompletionItem = {
312+
label: entry.label,
313+
insertText: entry.insertText,
266314
sortText: entry.sortText,
267-
kind: SuggestAdapter.convertKind(entry.kind),
315+
filterText: entry.filterText,
316+
documentation: entry.documentation,
317+
detail: entry.detail,
318+
uri: resource,
319+
position,
320+
kind: toCompletionItemKind(entry.kind),
268321
};
269-
});
322+
if (entry.textEdit) {
323+
item.range = toRange(entry.textEdit.range);
324+
item.insertText = entry.textEdit.newText;
325+
}
326+
if (entry.insertTextFormat === ls.InsertTextFormat.Snippet) {
327+
item.insertText = { value: <string> item.insertText };
328+
}
329+
return item;
330+
}) : [];
331+
332+
let suggestions: MyCompletionItem[];
333+
if (info.languageCompletions) {
334+
suggestions = info.languageCompletions.entries.map(entry => {
335+
return {
336+
uri: resource,
337+
position: position,
338+
label: entry.name,
339+
sortText: entry.sortText,
340+
kind: SuggestAdapter.convertKind(entry.kind),
341+
};
342+
});
343+
} else {
344+
suggestions = []
345+
}
270346

271-
return suggestions;
347+
return {
348+
isIncomplete: emmetItems.length !== 0,
349+
items: emmetItems.concat(suggestions)
350+
};
272351
})
273352
);
274353
}

0 commit comments

Comments
 (0)