diff options
| author | Ben Cho <ben.cho@qt.io> | 2024-10-08 17:00:02 +0200 |
|---|---|---|
| committer | Ben Cho <ben.cho@qt.io> | 2024-10-15 08:10:36 +0000 |
| commit | c343e7b0887e8a01a0b592783ea610bc47b2d9b5 (patch) | |
| tree | 10e750713f59ac0fc2818c3ced10fd93300487b5 /qt-cpp | |
| parent | 5bd0887140fc1f26ece9826a79214ac3846f25c7 (diff) | |
Improve consistency, remove duplication on project and project manager
The `ProjectManager` classes in qt-core, qt-cpp are now derived from
the `ProjectManager` template class in qt-lib.
Rename `ProjectBase` to `Project` for simplcity and consistency.
Change-Id: I66492028f43eb8822e2be5cde87de8a97c214381
Reviewed-by: Orkun Tokdemir <orkun.tokdemir@qt.io>
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
Diffstat (limited to 'qt-cpp')
| -rw-r--r-- | qt-cpp/src/extension.ts | 8 | ||||
| -rw-r--r-- | qt-cpp/src/project.ts | 83 |
2 files changed, 30 insertions, 61 deletions
diff --git a/qt-cpp/src/extension.ts b/qt-cpp/src/extension.ts index b06ef7b..175b145 100644 --- a/qt-cpp/src/extension.ts +++ b/qt-cpp/src/extension.ts @@ -25,13 +25,13 @@ import { registerbuildDirectoryName, registerlaunchTargetFilenameWithoutExtension } from '@cmd/launch-variables'; -import { CppProject, ProjectManager } from '@/project'; +import { createCppProject, CppProjectManager } from '@/project'; import { KitManager } from '@/kit-manager'; import { wasmStartTaskProvider, WASMStartTaskProvider } from '@task/wasm-start'; import { EXTENSION_ID } from '@/constants'; export let kitManager: KitManager; -export let projectManager: ProjectManager; +export let projectManager: CppProjectManager; export let coreAPI: CoreAPI | undefined; let taskProvider: vscode.Disposable | undefined; @@ -43,12 +43,12 @@ export async function activate(context: vscode.ExtensionContext) { initLogger(EXTENSION_ID); kitManager = new KitManager(context); - projectManager = new ProjectManager(context); + projectManager = new CppProjectManager(context); coreAPI = await getCoreApi(); if (vscode.workspace.workspaceFolders !== undefined) { for (const folder of vscode.workspace.workspaceFolders) { - const project = await CppProject.createProject(folder, context); + const project = await createCppProject(folder, context); projectManager.addProject(project); kitManager.addProject(project); } diff --git a/qt-cpp/src/project.ts b/qt-cpp/src/project.ts index 80e2e26..18ff4c2 100644 --- a/qt-cpp/src/project.ts +++ b/qt-cpp/src/project.ts @@ -7,16 +7,29 @@ import * as cmakeAPi from 'vscode-cmake-tools'; import { WorkspaceStateManager } from '@/state'; import { coreAPI, kitManager } from '@/extension'; import { createLogger, QtWorkspaceConfigMessage } from 'qt-lib'; -import { ProjectBase } from 'qt-lib'; +import { Project, ProjectManager } from 'qt-lib'; import { getSelectedQtInstallationPath } from '@cmd/register-qt-path'; const logger = createLogger('project'); +export async function createCppProject( + folder: vscode.WorkspaceFolder, + context: vscode.ExtensionContext +) { + logger.info('Creating project:"' + folder.uri.fsPath + '"'); + const api = await cmakeAPi.getCMakeToolsApi(cmakeAPi.Version.latest); + let cmakeProject: cmakeAPi.Project | undefined; + if (api) { + cmakeProject = await api.getProject(folder.uri); + } + return Promise.resolve(new CppProject(folder, context, cmakeProject)); +} + // Project class represents a workspace folder in the extension. -export class CppProject implements ProjectBase { +export class CppProject implements Project { private readonly _stateManager: WorkspaceStateManager; private readonly _cmakeProject: cmakeAPi.Project | undefined; - private constructor( + constructor( private readonly _folder: vscode.WorkspaceFolder, readonly _context: vscode.ExtensionContext, cmakeProject: cmakeAPi.Project | undefined @@ -46,18 +59,6 @@ export class CppProject implements ProjectBase { } } - static async createProject( - folder: vscode.WorkspaceFolder, - context: vscode.ExtensionContext - ) { - logger.info('Creating project:"' + folder.uri.fsPath + '"'); - const api = await cmakeAPi.getCMakeToolsApi(cmakeAPi.Version.latest); - let cmakeProject: cmakeAPi.Project | undefined; - if (api) { - cmakeProject = await api.getProject(folder.uri); - } - return new CppProject(folder, context, cmakeProject); - } public getStateManager() { return this._stateManager; } @@ -70,51 +71,19 @@ export class CppProject implements ProjectBase { } } -export class ProjectManager { - projects = new Set<CppProject>(); +export class CppProjectManager extends ProjectManager<CppProject> { constructor(readonly context: vscode.ExtensionContext) { + super(context, createCppProject); + this.watchProjects(context); - } - public addProject(project: CppProject) { - logger.info('Adding project:', project.folder.uri.fsPath); - this.projects.add(project); - } - public getProjects() { - return this.projects; - } - public getProject(folder: vscode.WorkspaceFolder) { - return Array.from(this.projects).find( - (project) => project.folder === folder - ); - } - private watchProjects(context: vscode.ExtensionContext) { - vscode.workspace.onDidChangeWorkspaceFolders(async (event) => { - for (const folder of event.removed) { - const project = this.getProject(folder); - if (!project) { - continue; - } - project.dispose(); - this.projects.delete(project); - kitManager.removeProject(project); - } - for (const folder of event.added) { - const project = await CppProject.createProject(folder, context); - this.projects.add(project); - kitManager.addProject(project); - } + + this.onProjectAdded((project: CppProject) => { + logger.info('Adding project:', project.folder.uri.fsPath); + kitManager.addProject(project); }); - } - public findProjectContainingFile(uri: vscode.Uri) { - return Array.from(this.projects).find((project) => { - const ret = uri.toString().startsWith(project.folder.uri.toString()); - return ret; + + this.onProjectRemoved((project: CppProject) => { + kitManager.removeProject(project); }); } - dispose() { - for (const project of this.projects) { - project.dispose(); - } - this.projects.clear(); - } } |
