Skip to content

Commit 67bccd3

Browse files
authored
disable dynamic debounce values when running out of source or when developing an extension (microsoft#184159)
re microsoft#144541
1 parent 7ea5b91 commit 67bccd3

File tree

7 files changed

+78
-13
lines changed

7 files changed

+78
-13
lines changed

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

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { LRUCache } from 'vs/base/common/map';
88
import { clamp, MovingAverage, SlidingWindowAverage } from 'vs/base/common/numbers';
99
import { LanguageFeatureRegistry } from 'vs/editor/common/languageFeatureRegistry';
1010
import { ITextModel } from 'vs/editor/common/model';
11+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1112
import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions';
1213
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
1314
import { ILogService } from 'vs/platform/log/common/log';
@@ -42,6 +43,21 @@ namespace IdentityHash {
4243
}
4344
}
4445

46+
class NullDebounceInformation implements IFeatureDebounceInformation {
47+
48+
constructor(private readonly _default: number) { }
49+
50+
get(_model: ITextModel): number {
51+
return this._default;
52+
}
53+
update(_model: ITextModel, _value: number): number {
54+
return this._default;
55+
}
56+
default(): number {
57+
return this._default;
58+
}
59+
}
60+
4561
class FeatureDebounceInformation implements IFeatureDebounceInformation {
4662

4763
private readonly _cache = new LRUCache<string, SlidingWindowAverage>(50, 0.7);
@@ -100,10 +116,15 @@ export class LanguageFeatureDebounceService implements ILanguageFeatureDebounceS
100116

101117
declare _serviceBrand: undefined;
102118

103-
private readonly _data = new Map<string, FeatureDebounceInformation>();
119+
private readonly _data = new Map<string, IFeatureDebounceInformation>();
120+
private readonly _isDev: boolean;
104121

105-
constructor(@ILogService private readonly _logService: ILogService) {
122+
constructor(
123+
@ILogService private readonly _logService: ILogService,
124+
@IEnvironmentService envService: IEnvironmentService,
125+
) {
106126

127+
this._isDev = envService.isExtensionDevelopment || !envService.isBuilt;
107128
}
108129

109130
for(feature: LanguageFeatureRegistry<object>, name: string, config?: { min?: number; max?: number; key?: string }): IFeatureDebounceInformation {
@@ -113,14 +134,19 @@ export class LanguageFeatureDebounceService implements ILanguageFeatureDebounceS
113134
const key = `${IdentityHash.of(feature)},${min}${extra ? ',' + extra : ''}`;
114135
let info = this._data.get(key);
115136
if (!info) {
116-
info = new FeatureDebounceInformation(
117-
this._logService,
118-
name,
119-
feature,
120-
(this._overallAverage() | 0) || (min * 1.5), // default is overall default or derived from min-value
121-
min,
122-
max
123-
);
137+
if (!this._isDev) {
138+
this._logService.debug(`[DEBOUNCE: ${name}] is disabled in developed mode`);
139+
info = new NullDebounceInformation(min * 1.5);
140+
} else {
141+
info = new FeatureDebounceInformation(
142+
this._logService,
143+
name,
144+
feature,
145+
(this._overallAverage() | 0) || (min * 1.5), // default is overall default or derived from min-value
146+
min,
147+
max
148+
);
149+
}
124150
this._data.set(key, info);
125151
}
126152
return info;

src/vs/editor/contrib/documentSymbols/test/browser/outlineModel.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { createModelServices, createTextModel } from 'vs/editor/test/common/test
1616
import { NullLogService } from 'vs/platform/log/common/log';
1717
import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers';
1818
import { OutlineElement, OutlineGroup, OutlineModel, OutlineModelService } from '../../browser/outlineModel';
19+
import { mock } from 'vs/base/test/common/mock';
20+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1921

2022
suite('OutlineModel', function () {
2123

@@ -30,7 +32,11 @@ suite('OutlineModel', function () {
3032

3133
const insta = createModelServices(disposables);
3234
const modelService = insta.get(IModelService);
33-
const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService()), modelService);
35+
const envService = new class extends mock<IEnvironmentService>() {
36+
override isBuilt: boolean = true;
37+
override isExtensionDevelopment: boolean = false;
38+
};
39+
const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService(), envService), modelService);
3440

3541
const model = createTextModel('foo', undefined, undefined, URI.file('/fome/path.foo'));
3642
let count = 0;
@@ -61,7 +67,11 @@ suite('OutlineModel', function () {
6167

6268
const insta = createModelServices(disposables);
6369
const modelService = insta.get(IModelService);
64-
const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService()), modelService);
70+
const envService = new class extends mock<IEnvironmentService>() {
71+
override isBuilt: boolean = true;
72+
override isExtensionDevelopment: boolean = false;
73+
};
74+
const service = new OutlineModelService(languageFeaturesService, new LanguageFeatureDebounceService(new NullLogService(), envService), modelService);
6575
const model = createTextModel('foo', undefined, undefined, URI.file('/fome/path.foo'));
6676
let isCancelled = false;
6777

src/vs/editor/contrib/semanticTokens/test/browser/documentSemanticTokens.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeatu
3131
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
3232
import { SemanticTokensStylingService } from 'vs/editor/common/services/semanticTokensStylingService';
3333
import { DocumentSemanticTokensFeature } from 'vs/editor/contrib/semanticTokens/browser/documentSemanticTokens';
34+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
35+
import { mock } from 'vs/base/test/common/mock';
3436

3537
suite('ModelSemanticColoring', () => {
3638

@@ -54,7 +56,11 @@ suite('ModelSemanticColoring', () => {
5456
languageService,
5557
new TestLanguageConfigurationService(),
5658
));
57-
disposables.add(new DocumentSemanticTokensFeature(semanticTokensStylingService, modelService, themeService, configService, new LanguageFeatureDebounceService(logService), languageFeaturesService));
59+
const envService = new class extends mock<IEnvironmentService>() {
60+
override isBuilt: boolean = true;
61+
override isExtensionDevelopment: boolean = false;
62+
};
63+
disposables.add(new DocumentSemanticTokensFeature(semanticTokensStylingService, modelService, themeService, configService, new LanguageFeatureDebounceService(logService, envService), languageFeaturesService));
5864
});
5965

6066
teardown(() => {

src/vs/editor/contrib/stickyScroll/test/browser/stickyScroll.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from
2020
import { TestLanguageConfigurationService } from 'vs/editor/test/common/modes/testLanguageConfigurationService';
2121
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
2222
import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler';
23+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
2324

2425
suite('Sticky Scroll Tests', () => {
2526

@@ -28,6 +29,10 @@ suite('Sticky Scroll Tests', () => {
2829
[ILogService, new NullLogService()],
2930
[IContextMenuService, new class extends mock<IContextMenuService>() { }],
3031
[ILanguageConfigurationService, new TestLanguageConfigurationService()],
32+
[IEnvironmentService, new class extends mock<IEnvironmentService>() {
33+
override isBuilt: boolean = true;
34+
override isExtensionDevelopment: boolean = false;
35+
}],
3136
[ILanguageFeatureDebounceService, new SyncDescriptor(LanguageFeatureDebounceService)],
3237
);
3338

src/vs/editor/test/browser/testCodeEditor.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
7+
import { mock } from 'vs/base/test/common/mock';
78
import { EditorConfiguration, IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration';
89
import { IActiveCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser';
910
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
@@ -39,6 +40,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/
3940
import { IContextKeyService, IContextKeyServiceTarget } from 'vs/platform/contextkey/common/contextkey';
4041
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
4142
import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogService';
43+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
4244
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
4345
import { BrandedService, IInstantiationService, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
4446
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
@@ -191,6 +193,11 @@ export function createCodeEditorServices(disposables: DisposableStore, services:
191193
define(IContextKeyService, MockContextKeyService);
192194
define(ICommandService, TestCommandService);
193195
define(ITelemetryService, NullTelemetryServiceShape);
196+
define(IEnvironmentService, class extends mock<IEnvironmentService>() {
197+
declare readonly _serviceBrand: undefined;
198+
override isBuilt: boolean = true;
199+
override isExtensionDevelopment: boolean = false;
200+
});
194201
define(ILanguageFeatureDebounceService, LanguageFeatureDebounceService);
195202
define(ILanguageFeaturesService, LanguageFeaturesService);
196203

src/vs/editor/test/common/testTextModel.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'
3232
import { ILanguageFeatureDebounceService, LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce';
3333
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
3434
import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService';
35+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
36+
import { mock } from 'vs/base/test/common/mock';
3537

3638
class TestTextModel extends TextModel {
3739
public registerDisposable(disposable: IDisposable): void {
@@ -96,6 +98,10 @@ export function createModelServices(disposables: DisposableStore, services: Serv
9698
[ITextResourcePropertiesService, TestTextResourcePropertiesService],
9799
[IThemeService, TestThemeService],
98100
[ILogService, NullLogService],
101+
[IEnvironmentService, new class extends mock<IEnvironmentService>() {
102+
override isBuilt: boolean = true;
103+
override isExtensionDevelopment: boolean = false;
104+
}],
99105
[ILanguageFeatureDebounceService, LanguageFeatureDebounceService],
100106
[ILanguageFeaturesService, LanguageFeaturesService],
101107
[IModelService, ModelService],

src/vs/workbench/api/test/browser/extHostApiCommands.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'
6161
import { IExtHostTelemetry } from 'vs/workbench/api/common/extHostTelemetry';
6262
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
6363
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
64+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
6465

6566
function assertRejects(fn: () => Promise<any>, message: string = 'Expected rejection') {
6667
return fn().then(() => assert.ok(false, message), _err => assert.ok(true));
@@ -124,6 +125,10 @@ suite('ExtHostLanguageFeatureCommands', function () {
124125
return Promise.resolve(insta.invokeFunction(handler, ...args));
125126
}
126127
}));
128+
services.set(IEnvironmentService, new class extends mock<IEnvironmentService>() {
129+
override isBuilt: boolean = true;
130+
override isExtensionDevelopment: boolean = false;
131+
});
127132
services.set(IMarkerService, new MarkerService());
128133
services.set(ILogService, new SyncDescriptor(NullLogService));
129134
services.set(ILanguageFeatureDebounceService, new SyncDescriptor(LanguageFeatureDebounceService));

0 commit comments

Comments
 (0)