From 3c6e0954d11f8f067e6366edfef5b6ad461934e9 Mon Sep 17 00:00:00 2001 From: Yuqi Zhou Date: Wed, 3 Jul 2024 17:14:01 +0800 Subject: [PATCH] refactor: more refactor: more refactor: more refactor: more --- packages/fx-core/src/common/constants.ts | 1 + packages/fx-core/src/common/featureFlags.ts | 4 + .../driver/teamsApp/validateAppPackage.ts | 4 - packages/vscode-extension/src/extension.ts | 3 +- .../vscode-extension/src/globalVariables.ts | 8 +- packages/vscode-extension/src/qm/vsc_ui.ts | 76 +++-------------- .../test/mocks/vscode-mock.ts | 8 +- .../vscode-extension/test/qm/vsc_ui.test.ts | 83 +++++++++++++++++++ 8 files changed, 112 insertions(+), 75 deletions(-) diff --git a/packages/fx-core/src/common/constants.ts b/packages/fx-core/src/common/constants.ts index 6374f16ab7..111b49a10a 100644 --- a/packages/fx-core/src/common/constants.ts +++ b/packages/fx-core/src/common/constants.ts @@ -52,6 +52,7 @@ export class FeatureFlagName { static readonly NewGenerator = "TEAMSFX_NEW_GENERATOR"; static readonly SMEOAuth = "SME_OAUTH"; static readonly CustomizeGpt = "TEAMSFX_DECLARATIVE_COPILOT"; + static readonly ShowDiagnostics = "TEAMSFX_SHOW_DIAGNOSTICS"; } export function getAllowedAppMaps(): Record { diff --git a/packages/fx-core/src/common/featureFlags.ts b/packages/fx-core/src/common/featureFlags.ts index 07fb0dde6f..6c526a8895 100644 --- a/packages/fx-core/src/common/featureFlags.ts +++ b/packages/fx-core/src/common/featureFlags.ts @@ -94,6 +94,10 @@ export class FeatureFlags { }; static readonly SMEOAuth = { name: FeatureFlagName.SMEOAuth, defaultValue: "false" }; static readonly CustomizeGpt = { name: FeatureFlagName.CustomizeGpt, defaultValue: "false" }; + static readonly ShowDiagnostics = { + name: FeatureFlagName.ShowDiagnostics, + defaultValue: "false", + }; } export class FeatureFlagManager { diff --git a/packages/fx-core/src/component/driver/teamsApp/validateAppPackage.ts b/packages/fx-core/src/component/driver/teamsApp/validateAppPackage.ts index d4cbaa8cee..adc551ccd7 100644 --- a/packages/fx-core/src/component/driver/teamsApp/validateAppPackage.ts +++ b/packages/fx-core/src/component/driver/teamsApp/validateAppPackage.ts @@ -14,7 +14,6 @@ import { Platform, Result, TeamsAppManifest, - UserInteraction, err, ok, } from "@microsoft/teamsfx-api"; @@ -303,9 +302,6 @@ export class ValidateAppPackageDriver implements StepDriver { "driver.teamsApp.validate.result.display", summaryStr.join(", ") ); - if (context.platform === Platform.VSCode && errors.length > 0) { - context.ui?.showDiagnosticInfo!([]); - } if (args.showMessage) { // For non-lifecycle commands, just show the message if (validationResult.errors.length > 0) { diff --git a/packages/vscode-extension/src/extension.ts b/packages/vscode-extension/src/extension.ts index fdce31cd8f..3e0a86adb1 100644 --- a/packages/vscode-extension/src/extension.ts +++ b/packages/vscode-extension/src/extension.ts @@ -177,7 +177,7 @@ import { handleOfficeFeedback, officeChatRequestHandler, } from "./officeChat/handlers"; -import { VsCodeUI, initVSCodeUI } from "./qm/vsc_ui"; +import { initVSCodeUI } from "./qm/vsc_ui"; import { ExtTelemetry } from "./telemetry/extTelemetry"; import { TelemetryEvent, TelemetryTriggerFrom } from "./telemetry/extTelemetryEvents"; import accountTreeViewProviderInstance from "./treeview/account/accountTreeViewProvider"; @@ -207,7 +207,6 @@ export async function activate(context: vscode.ExtensionContext) { initVSCodeUI(context); initializeGlobalVariables(context); - loadLocalizedStrings(); const uriHandler = new UriHandler(); diff --git a/packages/vscode-extension/src/globalVariables.ts b/packages/vscode-extension/src/globalVariables.ts index b6661bfde2..4a2e9cda23 100644 --- a/packages/vscode-extension/src/globalVariables.ts +++ b/packages/vscode-extension/src/globalVariables.ts @@ -56,10 +56,6 @@ export function initializeGlobalVariables(ctx: vscode.ExtensionContext): void { } else { isSPFxProject = fs.existsSync(path.join(workspaceUri?.fsPath ?? "./", "SPFx")); } - - if (!diagnosticCollection) { - diagnosticCollection = vscode.languages.createDiagnosticCollection("teamstoolkit"); - } } export function checkIsSPFx(directory: string): boolean { @@ -92,3 +88,7 @@ export function setTools(toolsInstance: Tools) { export function setCore(coreInstance: FxCore) { core = coreInstance; } + +export function setDiagnosticCollection(collection: vscode.DiagnosticCollection) { + diagnosticCollection = collection; +} diff --git a/packages/vscode-extension/src/qm/vsc_ui.ts b/packages/vscode-extension/src/qm/vsc_ui.ts index 87804ea710..7ad962b456 100644 --- a/packages/vscode-extension/src/qm/vsc_ui.ts +++ b/packages/vscode-extension/src/qm/vsc_ui.ts @@ -4,7 +4,6 @@ import { commands, Diagnostic, - DiagnosticSeverity, ExtensionContext, extensions, Uri, @@ -38,8 +37,9 @@ import { TelemetryEvent, TelemetryProperty, } from "../telemetry/extTelemetryEvents"; -import { diagnosticCollection, workspaceUri } from "../globalVariables"; -import path = require("path"); +import { diagnosticCollection, setDiagnosticCollection } from "../globalVariables"; +import { featureFlagManager } from "@microsoft/teamsfx-core"; +import { FeatureFlags } from "@microsoft/teamsfx-core"; export class TTKLocalizer implements Localizer { loadingOptionsPlaceholder(): string { @@ -151,7 +151,15 @@ export class VsCodeUI extends VSCodeUI { } showDiagnosticInfo(diagnostics: IDiagnosticInfo[]): void { - diagnosticCollection.clear(); + if (!featureFlagManager.getBooleanValue(FeatureFlags.ShowDiagnostics)) { + return; + } + if (!diagnosticCollection) { + const collection = languages.createDiagnosticCollection("teamstoolkit"); + setDiagnosticCollection(collection); + } else { + diagnosticCollection.clear(); + } const diagnosticMap: Map = new Map(); for (const diagnostic of diagnostics) { let diagnosticsOfFile = diagnosticMap.get(diagnostic.filePath); @@ -179,66 +187,6 @@ export class VsCodeUI extends VSCodeUI { diagnosticMap.forEach((diags, filePath) => { diagnosticCollection.set(Uri.file(filePath), diags); }); - - // diagnosticCollection.clear(); - // const errors = [ - // { - // id: "958d86ff-864b-474d-bea4-d8068b8c8cad", - // title: "ShortNameContainsPreprodWording", - // content: "Short name doesn't contain beta environment keywords", - // helpUrl: - // "https://docs.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#name", - // filePath: "manifest.json", - // shortCodeNumber: 4000, - // validationCategory: "Name", - // }, - // ]; - - // const collection2 = languages.createDiagnosticCollection("teamstoolkit2"); - - // const diagnosticMap: Map = new Map(); - // errors.forEach((error) => { - // const canonicalFile = "manifest.json"; - // const regex = new RegExp(error.validationCategory); - - // // const text = document.getText(); - - // // const line = document.lineAt(document.positionAt(matches.index).line); - // // const indexOf = line.text.indexOf(match); - // // const position = new Position(line.lineNumber, indexOf); - // const range = new Range(new Position(6, 2), new Position(6, 6)); - - // let diagnostics = diagnosticMap.get(canonicalFile); - // if (!diagnostics) { - // diagnostics = []; - // } - - // //const message = `[✏️Edit env file](${commandUri.toString()})`; - // const diag = new Diagnostic( - // range, - // "Short name doesn't contain beta environment keywords", - // DiagnosticSeverity.Warning - // ); - // diag.code = { - // value: "NameField", - // target: Uri.parse( - // "https://docs.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema#name" - // ), - // }; - // diag.source = "TTK"; - - // diagnostics.push(diag); - // diagnosticMap.set(canonicalFile, diagnostics); - - // const fileUri = Uri.file( - // path.join(workspaceUri?.fsPath?.toString() ?? "", "appPackage", "manifest.json") - // ); - // console.log(fileUri); - // diagnosticMap.forEach((diags, file) => { - // diagnosticCollection.set(fileUri, diags); - // collection2.set(fileUri, diags); - // }); - // }); } } diff --git a/packages/vscode-extension/test/mocks/vscode-mock.ts b/packages/vscode-extension/test/mocks/vscode-mock.ts index 5017443605..186f118790 100644 --- a/packages/vscode-extension/test/mocks/vscode-mock.ts +++ b/packages/vscode-extension/test/mocks/vscode-mock.ts @@ -27,7 +27,7 @@ class MockClipboard { } export function initialize() { - generateMock("languages"); + //generateMock("languages"); generateMock("debug"); generateMock("scm"); generateNotebookMocks(); @@ -195,6 +195,12 @@ mockedVSCode.extensions = { all: [], }; +(mockedVSCode as any).languages = { + createDiagnosticCollection: () => {}, + registerCodeLensProvider: () => {}, + registerHoverProvider: () => {}, +}; + // Setup commands APIs mockedVSCode.commands = { executeCommand: () => { diff --git a/packages/vscode-extension/test/qm/vsc_ui.test.ts b/packages/vscode-extension/test/qm/vsc_ui.test.ts index 1c7d6fb647..aaa92b7c0a 100644 --- a/packages/vscode-extension/test/qm/vsc_ui.test.ts +++ b/packages/vscode-extension/test/qm/vsc_ui.test.ts @@ -7,8 +7,10 @@ import * as sinon from "sinon"; import { stubInterface } from "ts-sinon"; import { commands, + DiagnosticCollection, Disposable, ExtensionContext, + languages, QuickInputButton, QuickPick, Terminal, @@ -30,6 +32,8 @@ import { FxQuickPickItem, sleep, UserCancelError } from "@microsoft/vscode-ui"; import { VsCodeUI } from "../../src/qm/vsc_ui"; import { ExtTelemetry } from "../../src/telemetry/extTelemetry"; import { VsCodeLogProvider } from "../../src/commonlib/log"; +import { featureFlagManager } from "@microsoft/teamsfx-core"; +import * as globalVariables from "../../src/globalVariables"; describe("UI Unit Tests", async () => { afterEach(() => { @@ -939,4 +943,83 @@ describe("UI Unit Tests", async () => { } }); }); + + describe("showDiagnosticInfo", () => { + const sandbox = sinon.createSandbox(); + let collection: DiagnosticCollection | undefined; + + afterEach(() => { + sandbox.restore(); + globalVariables.setDiagnosticCollection(undefined as unknown as DiagnosticCollection); + }); + + it("do nothing if feature flag is disabled", () => { + sandbox.stub(featureFlagManager, "getBooleanValue").returns(false); + const ui = new VsCodeUI({}); + ui.showDiagnosticInfo([]); + }); + + it("show diagnostics first time if feature flag is enabled", () => { + const records: [string, { message: string }][] = []; + sandbox.stub(featureFlagManager, "getBooleanValue").returns(true); + collection = { + set: (filePath: string, diag: { message: string }) => { + records.push([filePath, diag]); + }, + } as unknown as DiagnosticCollection; + + sandbox.stub(languages, "createDiagnosticCollection").returns(collection as any); + const ui = new VsCodeUI({}); + + ui.showDiagnosticInfo([ + { + startIndex: 0, + startLine: 1, + endIndex: 10, + endLine: 10, + severity: 2, + filePath: "test", + message: "error", + }, + ]); + + expect(globalVariables.diagnosticCollection).not.undefined; + expect(records.length).equals(1); + }); + + it("show diagnostics not first time if feature flag is enabled", () => { + const records: [string, { message: string }][] = []; + sandbox.stub(featureFlagManager, "getBooleanValue").returns(true); + collection = { + clear: () => { + return; + }, + set: (filePath: string, diag: { message: string }) => { + records.push([filePath, diag]); + }, + } as unknown as DiagnosticCollection; + + sandbox.stub(languages, "createDiagnosticCollection").returns(collection as any); + const ui = new VsCodeUI({}); + + ui.showDiagnosticInfo([ + { + startIndex: 0, + startLine: 1, + endIndex: 10, + endLine: 10, + severity: 2, + filePath: "test", + message: "error", + code: { + value: "test", + link: "https://test.com", + }, + }, + ]); + + expect(globalVariables.diagnosticCollection).not.undefined; + expect(records.length).equals(1); + }); + }); });