Skip to content

Commit 2da34cd

Browse files
committed
Fetch and set semantic tokens in the viewport
1 parent 67fbbe4 commit 2da34cd

9 files changed

Lines changed: 360 additions & 281 deletions

File tree

src/vs/editor/common/model.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,17 @@ export interface ITextModel {
827827
/**
828828
* @internal
829829
*/
830-
setSemanticTokens(tokens: MultilineTokens2[] | null): void;
830+
setSemanticTokens(tokens: MultilineTokens2[] | null, isComplete: boolean): void;
831+
832+
/**
833+
* @internal
834+
*/
835+
setPartialSemanticTokens(tokens: MultilineTokens2[] | null): void;
836+
837+
/**
838+
* @internal
839+
*/
840+
hasSemanticTokens(): boolean;
831841

832842
/**
833843
* Flush all tokenization state.

src/vs/editor/common/model/textModel.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,8 +1793,8 @@ export class TextModel extends Disposable implements model.ITextModel {
17931793
}
17941794
}
17951795

1796-
public setSemanticTokens(tokens: MultilineTokens2[] | null): void {
1797-
this._tokens2.set(tokens);
1796+
public setSemanticTokens(tokens: MultilineTokens2[] | null, isComplete: boolean): void {
1797+
this._tokens2.set(tokens, isComplete);
17981798

17991799
this._emitModelTokensChangedEvent({
18001800
tokenizationSupportChanged: false,
@@ -1803,6 +1803,17 @@ export class TextModel extends Disposable implements model.ITextModel {
18031803
});
18041804
}
18051805

1806+
public hasSemanticTokens(): boolean {
1807+
return this._tokens2.isComplete();
1808+
}
1809+
1810+
public setPartialSemanticTokens(tokens: MultilineTokens2[]): void {
1811+
if (this.hasSemanticTokens()) {
1812+
return;
1813+
}
1814+
this.setSemanticTokens(tokens, false);
1815+
}
1816+
18061817
public tokenizeViewport(startLineNumber: number, endLineNumber: number): void {
18071818
startLineNumber = Math.max(1, startLineNumber);
18081819
endLineNumber = Math.min(this._buffer.getLineCount(), endLineNumber);

src/vs/editor/common/model/tokensStore.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,17 +737,25 @@ function toUint32Array(arr: Uint32Array | ArrayBuffer): Uint32Array {
737737
export class TokensStore2 {
738738

739739
private _pieces: MultilineTokens2[];
740+
private _isComplete: boolean;
740741

741742
constructor() {
742743
this._pieces = [];
744+
this._isComplete = false;
743745
}
744746

745747
public flush(): void {
746748
this._pieces = [];
749+
this._isComplete = false;
747750
}
748751

749-
public set(pieces: MultilineTokens2[] | null) {
752+
public set(pieces: MultilineTokens2[] | null, isComplete: boolean) {
750753
this._pieces = pieces || [];
754+
this._isComplete = isComplete;
755+
}
756+
757+
public isComplete(): boolean {
758+
return this._isComplete;
751759
}
752760

753761
public addSemanticTokens(lineNumber: number, aTokens: LineTokens): LineTokens {

src/vs/editor/common/services/modelService.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ import { URI } from 'vs/base/common/uri';
88
import { ITextBufferFactory, ITextModel, ITextModelCreationOptions } from 'vs/editor/common/model';
99
import { ILanguageSelection } from 'vs/editor/common/services/modeService';
1010
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
11+
import { DocumentSemanticTokensProvider, DocumentRangeSemanticTokensProvider } from 'vs/editor/common/modes';
12+
import { SemanticTokensProviderStyling } from 'vs/editor/common/services/semanticTokensProviderStyling';
1113

1214
export const IModelService = createDecorator<IModelService>('modelService');
1315

16+
export type DocumentTokensProvider = DocumentSemanticTokensProvider | DocumentRangeSemanticTokensProvider;
17+
1418
export interface IModelService {
1519
_serviceBrand: undefined;
1620

@@ -28,6 +32,8 @@ export interface IModelService {
2832

2933
getModel(resource: URI): ITextModel | null;
3034

35+
getSemanticTokensProviderStyling(provider: DocumentTokensProvider): SemanticTokensProviderStyling;
36+
3137
onModelAdded: Event<ITextModel>;
3238

3339
onModelRemoved: Event<ITextModel>;

0 commit comments

Comments
 (0)