diff --git a/vscode/microsoft-kiota/src/extension.ts b/vscode/microsoft-kiota/src/extension.ts index c813838454..88427ff8b3 100644 --- a/vscode/microsoft-kiota/src/extension.ts +++ b/vscode/microsoft-kiota/src/extension.ts @@ -26,7 +26,7 @@ import { getLanguageInformation, getLanguageInformationForDescription } from "./ import { DependenciesViewProvider } from "./dependenciesViewProvider"; import { updateClients } from "./updateClients"; import { ExtensionSettings, getExtensionSettings } from "./extensionSettings"; -import { KiotaWorkspace } from "./workspaceTreeProvider"; +import { loadTreeView } from "./workspaceTreeProvider"; import { generatePlugin } from "./generatePlugin"; import { CodeLensProvider } from "./codelensProvider"; import { CLIENT, CLIENTS, KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE, PLUGIN, PLUGINS, dependenciesInfo, extensionId, statusBarCommandId, treeViewFocusCommand, treeViewId } from "./constants"; @@ -56,7 +56,7 @@ export async function activate( context.extensionUri ); const reporter = new TelemetryReporter(context.extension.packageJSON.telemetryInstrumentationKey); - new KiotaWorkspace(context); + await loadTreeView(context); let codeLensProvider = new CodeLensProvider(); context.subscriptions.push( vscode.window.registerUriHandler({ diff --git a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts index a5ded234e1..2b2238f32e 100644 --- a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts +++ b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts @@ -3,12 +3,16 @@ import * as path from 'path'; import * as fs from 'fs'; import { KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE } from './constants'; -const workspaceJsonPath = path.join(vscode.workspace.workspaceFolders?.map(folder => folder.uri.fsPath).join('') || '', KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE); +export function getWorkspaceJsonPath(): string { + return path.join(vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0 ? + vscode.workspace.workspaceFolders[0].uri.fsPath : + process.env.HOME ?? process.env.USERPROFILE ?? process.cwd(), + KIOTA_DIRECTORY, + KIOTA_WORKSPACE_FILE); +}; export class WorkspaceTreeProvider implements vscode.TreeDataProvider { - - constructor(private context: vscode.ExtensionContext) { - void this.ensureKiotaDirectory(); + constructor(public isWSPresent: boolean) { } async getChildren(element?: vscode.TreeItem): Promise { if (!element) { @@ -19,36 +23,39 @@ export class WorkspaceTreeProvider implements vscode.TreeDataProvider { - const kiotaDir = path.dirname(workspaceJsonPath); - try { - await fs.promises.access(kiotaDir); - return true; - } catch (error) { - return false; - } - } } -export class KiotaWorkspace { - constructor(context: vscode.ExtensionContext) { - const treeDataProvider = new WorkspaceTreeProvider(context); - context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); - vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', async (resource) => await this.openResource(resource)); +async function openResource(resource: vscode.Uri): Promise { + const workspaceJsonPath = getWorkspaceJsonPath(); + try{ + await vscode.window.showTextDocument(resource); + } catch (error) { + const dirPath = path.dirname(workspaceJsonPath); + await fs.promises.mkdir(dirPath, { recursive: true }); + await fs.promises.writeFile(workspaceJsonPath, Buffer.from('{}')); + await vscode.window.showTextDocument(resource); } - private async openResource(resource: vscode.Uri): Promise { - try{ - await vscode.window.showTextDocument(resource); - } catch (error) { - await fs.promises.writeFile(workspaceJsonPath, Buffer.from('{}')); - await vscode.window.showTextDocument(resource); - } - +} +async function isKiotaWorkspaceFilePresent(): Promise { + const workspaceFileDir = path.resolve(getWorkspaceJsonPath()); + try { + await fs.promises.access(workspaceFileDir); + } catch (error) { + return false; } -} \ No newline at end of file + return true; +} + +export async function loadTreeView(context: vscode.ExtensionContext): Promise { + const treeDataProvider = new WorkspaceTreeProvider(await isKiotaWorkspaceFilePresent()); + context.subscriptions.push(vscode.workspace.onDidChangeWorkspaceFolders(async () => { + treeDataProvider.isWSPresent = await isKiotaWorkspaceFilePresent(); + })); + context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); + context.subscriptions.push(vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', openResource)); +}