未验证 提交 a0d62edb 编写于 作者: A Alex Dima

💄

上级 31662e1e
...@@ -14,7 +14,7 @@ import { assertType } from 'vs/base/common/types'; ...@@ -14,7 +14,7 @@ import { assertType } from 'vs/base/common/types';
import { VSBuffer } from 'vs/base/common/buffer'; import { VSBuffer } from 'vs/base/common/buffer';
import { encodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto'; import { encodeSemanticTokensDto } from 'vs/editor/common/services/semanticTokensDto';
import { Range } from 'vs/editor/common/core/range'; import { Range } from 'vs/editor/common/core/range';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter } from 'vs/base/common/event';
import { DisposableStore } from 'vs/base/common/lifecycle'; import { DisposableStore } from 'vs/base/common/lifecycle';
export function isSemanticTokens(v: SemanticTokens | SemanticTokensEdits): v is SemanticTokens { export function isSemanticTokens(v: SemanticTokens | SemanticTokensEdits): v is SemanticTokens {
...@@ -43,10 +43,16 @@ export function getDocumentSemanticTokens(model: ITextModel, lastResultId: strin ...@@ -43,10 +43,16 @@ export function getDocumentSemanticTokens(model: ITextModel, lastResultId: strin
} }
class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensProvider { class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensProvider {
private disposables = new DisposableStore();
private didChangeEmitter = new Emitter<void>(); private readonly disposables = new DisposableStore();
private readonly didChangeEmitter = this.disposables.add(new Emitter<void>());
public readonly onDidChange = this.didChangeEmitter.event;
private lastUsedProvider: DocumentSemanticTokensProvider | undefined = undefined; private lastUsedProvider: DocumentSemanticTokensProvider | undefined = undefined;
private static providerToLastResult = new WeakMap<DocumentSemanticTokensProvider, string>(); private static providerToLastResult = new WeakMap<DocumentSemanticTokensProvider, string>();
constructor(model: ITextModel, private readonly providerGroup: DocumentSemanticTokensProvider[]) { constructor(model: ITextModel, private readonly providerGroup: DocumentSemanticTokensProvider[]) {
// Lifetime of this provider is tied to the text model // Lifetime of this provider is tied to the text model
model.onWillDispose(() => this.disposables.clear()); model.onWillDispose(() => this.disposables.clear());
...@@ -58,6 +64,7 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP ...@@ -58,6 +64,7 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP
} }
}); });
} }
public async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise<SemanticTokens | SemanticTokensEdits | null | undefined> { public async provideDocumentSemanticTokens(model: ITextModel, lastResultId: string | null, token: CancellationToken): Promise<SemanticTokens | SemanticTokensEdits | null | undefined> {
// Get tokens from the group all at the same time. Return the first // Get tokens from the group all at the same time. Return the first
// that actually returned tokens // that actually returned tokens
...@@ -87,12 +94,11 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP ...@@ -87,12 +94,11 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP
this.lastUsedProvider = this.providerGroup[hasTokensIndex]; this.lastUsedProvider = this.providerGroup[hasTokensIndex];
return list[hasTokensIndex]; return list[hasTokensIndex];
} }
public get onDidChange(): Event<void> {
return this.didChangeEmitter.event;
}
public getLegend(): SemanticTokensLegend { public getLegend(): SemanticTokensLegend {
return this.lastUsedProvider?.getLegend() || this.providerGroup[0].getLegend(); return this.lastUsedProvider?.getLegend() || this.providerGroup[0].getLegend();
} }
public releaseDocumentSemanticTokens(resultId: string | undefined): void { public releaseDocumentSemanticTokens(resultId: string | undefined): void {
this.providerGroup.forEach(p => { this.providerGroup.forEach(p => {
// If this result is for this provider, release it // If this result is for this provider, release it
...@@ -110,8 +116,13 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP ...@@ -110,8 +116,13 @@ class CompositeDocumentSemanticTokensProvider implements DocumentSemanticTokensP
} }
class CompositeDocumentRangeSemanticTokensProvider implements DocumentRangeSemanticTokensProvider { class CompositeDocumentRangeSemanticTokensProvider implements DocumentRangeSemanticTokensProvider {
private lastUsedProvider: DocumentRangeSemanticTokensProvider | undefined = undefined; private lastUsedProvider: DocumentRangeSemanticTokensProvider | undefined = undefined;
constructor(private readonly providerGroup: DocumentRangeSemanticTokensProvider[]) { }
constructor(
private readonly providerGroup: DocumentRangeSemanticTokensProvider[]
) { }
public async provideDocumentRangeSemanticTokens(model: ITextModel, range: Range, token: CancellationToken): Promise<SemanticTokens | null | undefined> { public async provideDocumentRangeSemanticTokens(model: ITextModel, range: Range, token: CancellationToken): Promise<SemanticTokens | null | undefined> {
// Get tokens from the group all at the same time. Return the first // Get tokens from the group all at the same time. Return the first
// that actually returned tokens // that actually returned tokens
...@@ -130,6 +141,7 @@ class CompositeDocumentRangeSemanticTokensProvider implements DocumentRangeSeman ...@@ -130,6 +141,7 @@ class CompositeDocumentRangeSemanticTokensProvider implements DocumentRangeSeman
this.lastUsedProvider = this.providerGroup[hasTokensIndex]; this.lastUsedProvider = this.providerGroup[hasTokensIndex];
return list[hasTokensIndex]; return list[hasTokensIndex];
} }
getLegend(): SemanticTokensLegend { getLegend(): SemanticTokensLegend {
return this.lastUsedProvider?.getLegend() || this.providerGroup[0].getLegend(); return this.lastUsedProvider?.getLegend() || this.providerGroup[0].getLegend();
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册