Skip to content

Commit

Permalink
(perf) cap full file semantic tokens (#774)
Browse files Browse the repository at this point in the history
#772
Cap the full file semantic token request to 50000. If the text length of the svelte2tsx generated code is bigger than that, return null and let the client request for ranged semantic tokens, that is what's visible on the screen.
  • Loading branch information
jasonlyu123 committed Jan 25, 2021
1 parent ffe74f6 commit 8eda468
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 17 deletions.
12 changes: 4 additions & 8 deletions packages/language-server/src/plugins/PluginHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -408,14 +408,10 @@ export class PluginHost implements LSProvider, OnWatchFileChanges {
throw new Error('Cannot call methods on an unopened document');
}

return (
(await this.execute<SemanticTokens>(
'getSemanticTokens',
[document, range],
ExecuteMode.FirstNonNull
)) ?? {
data: []
}
return await this.execute<SemanticTokens>(
'getSemanticTokens',
[document, range],
ExecuteMode.FirstNonNull
);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/language-server/src/plugins/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ export interface SelectionRangeProvider {
}

export interface SemanticTokensProvider {
getSemanticTokens(textDocument: Document, range?: Range): Resolvable<SemanticTokens>;
getSemanticTokens(textDocument: Document, range?: Range): Resolvable<SemanticTokens | null>;
}

export interface OnWatchFileChangesPara {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ export class TypeScriptPlugin
return this.signatureHelpProvider.getSignatureHelp(document, position, context);
}

async getSemanticTokens(textDocument: Document, range?: Range): Promise<SemanticTokens> {
async getSemanticTokens(textDocument: Document, range?: Range): Promise<SemanticTokens | null> {
if (!this.featureEnabled('semanticTokens')) {
return {
data: []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,20 @@ import { SnapshotFragment } from '../DocumentSnapshot';
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
import { convertToTextSpan } from '../utils';

const CONTENT_LENGTH_LIMIT = 50000;

export class SemanticTokensProviderImpl implements SemanticTokensProvider {
constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {}

async getSemanticTokens(textDocument: Document, range?: Range): Promise<SemanticTokens> {
async getSemanticTokens(textDocument: Document, range?: Range): Promise<SemanticTokens | null> {
const { lang, tsDoc } = this.lsAndTsDocResolver.getLSAndTSDoc(textDocument);
const fragment = await tsDoc.getFragment();

// for better performance, don't do full-file semantic tokens when the file is too big
if (!range && fragment.text.length > CONTENT_LENGTH_LIMIT) {
return null;
}

const textSpan = range
? convertToTextSpan(range, fragment)
: {
Expand Down
10 changes: 7 additions & 3 deletions packages/language-server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import {
TextDocumentIdentifier,
TextDocumentPositionParams,
TextDocumentSyncKind,
WorkspaceEdit
WorkspaceEdit,
SemanticTokensRequest,
SemanticTokensRangeRequest
} from 'vscode-languageserver';
import { IPCMessageReader, IPCMessageWriter, createConnection } from 'vscode-languageserver/node';
import { DiagnosticsManager } from './lib/DiagnosticsManager';
Expand Down Expand Up @@ -304,8 +306,10 @@ export function startServer(options?: LSOptions) {
updateAllDiagnostics();
});

connection.languages.semanticTokens.on((evt) => pluginHost.getSemanticTokens(evt.textDocument));
connection.languages.semanticTokens.onRange((evt) =>
connection.onRequest(SemanticTokensRequest.type, (evt) =>
pluginHost.getSemanticTokens(evt.textDocument)
);
connection.onRequest(SemanticTokensRangeRequest.type, (evt) =>
pluginHost.getSemanticTokens(evt.textDocument, evt.range)
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,22 @@ describe('SemanticTokensProvider', () => {
it('provides semantic token', async () => {
const { provider, document } = setup();

const { data } = await provider.getSemanticTokens(document);
const { data } = (await provider.getSemanticTokens(document)) ?? {
data: []
};

assertResult(data, getExpected(/* isFull */ true));
});

it('provides partial semantic token', async () => {
const { provider, document } = setup();

const { data } = await provider.getSemanticTokens(
const { data } = (await provider.getSemanticTokens(
document,
Range.create(Position.create(0, 0), Position.create(9, 0))
);
)) ?? {
data: []
};

assertResult(data, getExpected(/* isFull */ false));
});
Expand Down

0 comments on commit 8eda468

Please sign in to comment.