提交 bfe5b4c9 编写于 作者: J Johannes Rieken

make sure outline requests are cancelled when changing providers, #69147

上级 fbf2f8ac
......@@ -264,7 +264,11 @@ export class OutlineModel extends TreeElement {
});
}
static _create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
private static _create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
let chainedToken = new CancellationTokenSource();
let listener = DocumentSymbolProviderRegistry.onDidChange(() => chainedToken.cancel());
token.onCancellationRequested(() => chainedToken.cancel());
let result = new OutlineModel(textModel);
let promises = DocumentSymbolProviderRegistry.ordered(textModel).map((provider, index) => {
......@@ -272,7 +276,7 @@ export class OutlineModel extends TreeElement {
let id = TreeElement.findId(`provider_${index}`, result);
let group = new OutlineGroup(id, result, provider, index);
return Promise.resolve(provider.provideDocumentSymbols(result.textModel, token)).then(result => {
return Promise.resolve(provider.provideDocumentSymbols(result.textModel, chainedToken.token)).then(result => {
for (const info of result || []) {
OutlineModel._makeOutlineElement(info, group);
}
......@@ -289,7 +293,9 @@ export class OutlineModel extends TreeElement {
});
});
return Promise.all(promises).then(() => result._compact());
return Promise.all(promises)
.then(() => result._compact())
.finally(() => listener.dispose());
}
private static _makeOutlineElement(info: DocumentSymbol, container: OutlineGroup | OutlineElement): void {
......
......@@ -46,7 +46,7 @@ suite('OutlineModel', function () {
let isCancelled = false;
let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
provideDocumentSymbols(d, token) {
provideDocumentSymbols(_d, token) {
return new Promise(resolve => {
token.onCancellationRequested(_ => {
isCancelled = true;
......@@ -183,4 +183,28 @@ suite('OutlineModel', function () {
assert.equal(model.children['g2']!.children['c2'].children['c2.2'].marker!.count, 1);
});
test('"Cannot read property \'adapter\' of undefined" #69147', async function () {
let model = TextModel.createFromString('foo', undefined, undefined, URI.file('/fome/path.foo'));
let reg1 = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
provideDocumentSymbols(_model, token) {
assert.equal(token.isCancellationRequested, true);
return [];
}
});
let reg2 = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
provideDocumentSymbols(_model, token) {
assert.equal(token.isCancellationRequested, false);
reg1.dispose();
assert.equal(token.isCancellationRequested, true);
return [];
}
});
await OutlineModel.create(model, CancellationToken.None);
reg1.dispose();
reg2.dispose();
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册