Skip to content

Commit fc4fc00

Browse files
authored
Follow up issues for Language Status Bar (#10437)
* Fix file parsing ending not being displayed during pause * Fix logic * Remove redundant line * Condense unpaused parser text * Introduced parser indexing phase to UI * Use lookupString() for parse status logic * Update UI check logic * Remove log * Fix logic * Seperate initializing from indexing in UI * Change parser initalized text * Remove extra new line * Remove missed code * Add uiOverride parameter to telemetry
1 parent 4b9ca43 commit fc4fc00

File tree

3 files changed

+73
-18
lines changed

3 files changed

+73
-18
lines changed

Extension/src/LanguageServer/client.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,8 @@ export interface ReferencesCancellationState {
623623
}
624624

625625
class ClientModel {
626+
public isInitializingWorkspace: DataBinding<boolean>;
627+
public isIndexingWorkspace: DataBinding<boolean>;
626628
public isParsingWorkspace: DataBinding<boolean>;
627629
public isParsingWorkspacePausable: DataBinding<boolean>;
628630
public isParsingWorkspacePaused: DataBinding<boolean>;
@@ -637,6 +639,8 @@ class ClientModel {
637639
public activeConfigName: DataBinding<string>;
638640

639641
constructor() {
642+
this.isInitializingWorkspace = new DataBinding<boolean>(false);
643+
this.isIndexingWorkspace = new DataBinding<boolean>(false);
640644
this.isParsingWorkspace = new DataBinding<boolean>(false);
641645
this.isParsingWorkspacePausable = new DataBinding<boolean>(false);
642646
this.isParsingWorkspacePaused = new DataBinding<boolean>(false);
@@ -652,6 +656,8 @@ class ClientModel {
652656
}
653657

654658
public activate(): void {
659+
this.isInitializingWorkspace.activate();
660+
this.isIndexingWorkspace.activate();
655661
this.isParsingWorkspace.activate();
656662
this.isParsingWorkspacePausable.activate();
657663
this.isParsingWorkspacePaused.activate();
@@ -667,6 +673,8 @@ class ClientModel {
667673
}
668674

669675
public deactivate(): void {
676+
this.isInitializingWorkspace.deactivate();
677+
this.isIndexingWorkspace.deactivate();
670678
this.isParsingWorkspace.deactivate();
671679
this.isParsingWorkspacePausable.deactivate();
672680
this.isParsingWorkspacePaused.deactivate();
@@ -682,6 +690,8 @@ class ClientModel {
682690
}
683691

684692
public dispose(): void {
693+
this.isInitializingWorkspace.dispose();
694+
this.isIndexingWorkspace.dispose();
685695
this.isParsingWorkspace.dispose();
686696
this.isParsingWorkspacePausable.dispose();
687697
this.isParsingWorkspacePaused.dispose();
@@ -698,6 +708,8 @@ class ClientModel {
698708
}
699709

700710
export interface Client {
711+
InitializingWorkspaceChanged: vscode.Event<boolean>;
712+
IndexingWorkspaceChanged: vscode.Event<boolean>;
701713
ParsingWorkspaceChanged: vscode.Event<boolean>;
702714
ParsingWorkspacePausableChanged: vscode.Event<boolean>;
703715
ParsingWorkspacePausedChanged: vscode.Event<boolean>;
@@ -822,6 +834,8 @@ export class DefaultClient implements Client {
822834
// The "model" that is displayed via the UI (status bar).
823835
private model: ClientModel = new ClientModel();
824836

837+
public get InitializingWorkspaceChanged(): vscode.Event<boolean> { return this.model.isInitializingWorkspace.ValueChanged; }
838+
public get IndexingWorkspaceChanged(): vscode.Event<boolean> { return this.model.isIndexingWorkspace.ValueChanged; }
825839
public get ParsingWorkspaceChanged(): vscode.Event<boolean> { return this.model.isParsingWorkspace.ValueChanged; }
826840
public get ParsingWorkspacePausableChanged(): vscode.Event<boolean> { return this.model.isParsingWorkspacePausable.ValueChanged; }
827841
public get ParsingWorkspacePausedChanged(): vscode.Event<boolean> { return this.model.isParsingWorkspacePaused.ValueChanged; }
@@ -857,7 +871,7 @@ export class DefaultClient implements Client {
857871
return this.trackedDocuments;
858872
}
859873
public get IsTagParsing(): boolean {
860-
return this.model.isParsingWorkspace.Value || this.model.isParsingFiles.Value;
874+
return this.model.isParsingWorkspace.Value || this.model.isParsingFiles.Value || this.model.isInitializingWorkspace.Value || this.model.isIndexingWorkspace.Value;
861875
}
862876
public get ReferencesCommandMode(): refs.ReferencesCommandMode {
863877
return this.model.referencesCommandMode.Value;
@@ -2268,9 +2282,24 @@ export class DefaultClient implements Client {
22682282
// nothing to do
22692283
} else if (message.endsWith("Parsing")) {
22702284
this.model.isParsingWorkspace.Value = true;
2285+
this.model.isInitializingWorkspace.Value = false;
2286+
this.model.isIndexingWorkspace.Value = false;
22712287
this.model.isParsingWorkspacePausable.Value = false;
22722288
const status: IntelliSenseStatus = { status: Status.TagParsingBegun };
22732289
testHook.updateStatus(status);
2290+
} else if (message.endsWith("Initializing")) {
2291+
if (ui.isNewUI) {
2292+
this.model.isInitializingWorkspace.Value = true;
2293+
} else {
2294+
this.model.isParsingWorkspace.Value = true;
2295+
}
2296+
} else if (message.endsWith("Indexing")) {
2297+
if (ui.isNewUI) {
2298+
this.model.isIndexingWorkspace.Value = true;
2299+
this.model.isInitializingWorkspace.Value = false;
2300+
} else {
2301+
this.model.isParsingWorkspace.Value = true;
2302+
}
22742303
} else if (message.endsWith("files")) {
22752304
this.model.isParsingFiles.Value = true;
22762305
} else if (message.endsWith("IntelliSense")) {
@@ -3421,6 +3450,8 @@ class NullClient implements Client {
34213450
private stringEvent = new vscode.EventEmitter<string>();
34223451
private referencesCommandModeEvent = new vscode.EventEmitter<refs.ReferencesCommandMode>();
34233452

3453+
public get InitializingWorkspaceChanged(): vscode.Event<boolean> { return this.booleanEvent.event; }
3454+
public get IndexingWorkspaceChanged(): vscode.Event<boolean> { return this.booleanEvent.event; }
34243455
public get ParsingWorkspaceChanged(): vscode.Event<boolean> { return this.booleanEvent.event; }
34253456
public get ParsingWorkspacePausableChanged(): vscode.Event<boolean> { return this.booleanEvent.event; }
34263457
public get ParsingWorkspacePausedChanged(): vscode.Event<boolean> { return this.booleanEvent.event; }

Extension/src/LanguageServer/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,10 @@ export function registerCommands(enabled: boolean): void {
488488
}
489489

490490
async function logForUIExperiment(command: string): Promise<void> {
491+
const settings: CppSettings = new CppSettings((vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) ? vscode.workspace.workspaceFolders[0]?.uri : undefined);
491492
const isNewUI: string = ui.isNewUI.toString();
492-
telemetry.logLanguageServerEvent(`experiment${command}`, { newUI: isNewUI });
493+
const isOverridden: string = (settings.experimentalFeatures ?? false).toString();
494+
telemetry.logLanguageServerEvent(`experiment${command}`, { newUI: isNewUI, uiOverride: isOverridden });
493495
}
494496

495497
function onDisabledCommand(): void {

Extension/src/LanguageServer/ui_new.ts

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ export class NewUI implements UI {
6868
private codeAnalysisTotal: number = 0;
6969
private readonly workspaceParsingRunningText: string = localize("running.tagparser.text", "Parsing Workspace");
7070
private readonly workspaceParsingPausedText: string = localize("paused.tagparser.text", "Parsing Workspace: Paused");
71-
private readonly workspaceParseingDoneText: string = localize("complete.tagparser.text", "Parsing Complete");
71+
private readonly workspaceParsingDoneText: string = localize("complete.tagparser.text", "Parsing Complete");
72+
private readonly workspaceParsingInitializing: string = localize("initializing.tagparser.text", "Initializing Workspace");
73+
private readonly workspaceParsingIndexing: string = localize("indexing.tagparser.text", "Indexing Workspace");
7274
private workspaceParsingStatus: string = "";
7375
private workspaceParsingProgress: string = "";
7476
private readonly workspaceRescanText = localize("rescan.tagparse.text", "Rescan Workspace");
@@ -109,7 +111,7 @@ export class NewUI implements UI {
109111

110112
this.browseEngineStatusBarItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Mid}.tagparser`, documentSelector);
111113
this.browseEngineStatusBarItem.name = localize("cpptools.status.tagparser", "C/C++ Tag Parser Status");
112-
this.browseEngineStatusBarItem.detail = localize("indexing.files.tooltip", "Indexing Workspace");
114+
this.browseEngineStatusBarItem.detail = localize("cpptools.detail.tagparser", "Initializing...");
113115
this.browseEngineStatusBarItem.text = "$(database)";
114116
this.browseEngineStatusBarItem.command = {
115117
command: "C_Cpp.RescanWorkspaceUI_Telemetry",
@@ -143,27 +145,37 @@ export class NewUI implements UI {
143145
}
144146
}
145147

148+
private setIsInitializingWorkspace(val: boolean): void {
149+
if (val) {
150+
this.browseEngineStatusBarItem.text = "$(database)";
151+
this.browseEngineStatusBarItem.detail = this.workspaceParsingInitializing;
152+
}
153+
}
154+
private setIsIndexingWorkspace(val: boolean): void {
155+
if (val) {
156+
this.browseEngineStatusBarItem.text = "$(database)";
157+
this.browseEngineStatusBarItem.detail = this.workspaceParsingIndexing;
158+
}
159+
}
160+
146161
private dbTimeout?: NodeJS.Timeout;
147162
private setIsParsingWorkspace(val: boolean): void {
148163
this.isParsingWorkspace = val;
149164
const showIcon: boolean = val || this.isParsingFiles;
150-
const twoStatus: boolean = val && this.isParsingFiles;
151165

152166
// Leave this outside for more realtime respone
153167
this.browseEngineStatusBarItem.busy = showIcon;
154168

155169
if (showIcon) {
156170
this.browseEngineStatusBarItem.text = "$(database)";
157-
this.browseEngineStatusBarItem.detail = (this.isParsingFiles ? this.parsingFilesTooltip : "")
158-
+ (twoStatus ? " | " : "")
159-
+ (val ? this.workspaceParsingStatus : "");
171+
this.browseEngineStatusBarItem.detail = this.tagParseText();
160172

161173
if (this.dbTimeout) {
162174
clearTimeout(this.dbTimeout);
163175
}
164176
} else {
165177
this.dbTimeout = setTimeout(() => {
166-
this.browseEngineStatusBarItem.text = this.workspaceParseingDoneText;
178+
this.browseEngineStatusBarItem.text = this.workspaceParsingDoneText;
167179
this.browseEngineStatusBarItem.detail = "";
168180
this.browseEngineStatusBarItem.command = {
169181
command: "C_Cpp.RescanWorkspaceUI_Telemetry",
@@ -173,6 +185,17 @@ export class NewUI implements UI {
173185
}
174186
}
175187

188+
private tagParseText(): string {
189+
if (this.isParsingWorkspacePaused) {
190+
const twoStatus: boolean = this.isParsingFiles && this.isParsingWorkspace;
191+
return (this.isParsingFiles ? this.parsingFilesTooltip : "")
192+
+ (twoStatus ? " | " : "")
193+
+ (this.isParsingWorkspace ? this.workspaceParsingStatus : "");
194+
} else {
195+
return this.isParsingWorkspace ? this.workspaceParsingStatus : this.parsingFilesTooltip;
196+
}
197+
}
198+
176199
private setIsParsingWorkspacePausable(val: boolean): void {
177200
if (val && this.isParsingWorkspace) {
178201
this.browseEngineStatusBarItem.command = {
@@ -187,7 +210,7 @@ export class NewUI implements UI {
187210
this.browseEngineStatusBarItem.busy = !val || this.isParsingFiles;
188211
this.browseEngineStatusBarItem.text = "$(database)";
189212
this.workspaceParsingStatus = val ? this.workspaceParsingPausedText : this.workspaceParsingRunningText;
190-
this.browseEngineStatusBarItem.detail = (this.isParsingFiles ? `${this.parsingFilesTooltip} | ` : "") + this.workspaceParsingStatus;
213+
this.browseEngineStatusBarItem.detail = this.tagParseText();
191214
this.browseEngineStatusBarItem.command = val ? {
192215
command: "C_Cpp.ResumeParsingUI_Telemetry",
193216
title: localize("tagparser.resume.text", "Resume")
@@ -210,24 +233,21 @@ export class NewUI implements UI {
210233
private setIsParsingFiles(val: boolean): void {
211234

212235
this.isParsingFiles = val;
213-
const showIcon: boolean = val || (!this.isParsingWorkspacePaused && this.isParsingWorkspace);
214-
const twoStatus: boolean = val && this.isParsingWorkspace;
236+
const showIcon: boolean = val || this.isParsingWorkspace;
215237

216238
// Leave this outside for more realtime respone
217-
this.browseEngineStatusBarItem.busy = showIcon;
239+
this.browseEngineStatusBarItem.busy = val || (!this.isParsingWorkspacePaused && this.isParsingWorkspace);
218240

219241
if (showIcon) {
220242
this.browseEngineStatusBarItem.text = "$(database)";
221-
this.browseEngineStatusBarItem.detail = (val ? this.parsingFilesTooltip : "")
222-
+ (twoStatus ? " | " : "")
223-
+ (this.isParsingWorkspace ? this.workspaceParsingStatus : "");
243+
this.browseEngineStatusBarItem.detail = this.tagParseText();
224244

225245
if (this.dbTimeout) {
226246
clearTimeout(this.dbTimeout);
227247
}
228-
} else if (!this.isParsingWorkspace && !val) {
248+
} else {
229249
this.dbTimeout = setTimeout(() => {
230-
this.browseEngineStatusBarItem.text = this.workspaceParseingDoneText;
250+
this.browseEngineStatusBarItem.text = this.workspaceParsingDoneText;
231251
this.browseEngineStatusBarItem.detail = "";
232252
this.browseEngineStatusBarItem.command = {
233253
command: "C_Cpp.RescanWorkspaceUI_Telemetry",
@@ -376,6 +396,8 @@ export class NewUI implements UI {
376396
}
377397

378398
public bind(client: Client): void {
399+
client.InitializingWorkspaceChanged(value => { this.setIsInitializingWorkspace(value); });
400+
client.IndexingWorkspaceChanged(value => { this.setIsIndexingWorkspace(value); });
379401
client.ParsingWorkspaceChanged(value => { this.setIsParsingWorkspace(value); });
380402
client.ParsingWorkspacePausableChanged(value => { this.setIsParsingWorkspacePausable(value); });
381403
client.ParsingWorkspacePausedChanged(value => { this.setIsParsingWorkspacePaused(value); });

0 commit comments

Comments
 (0)