aboutsummaryrefslogtreecommitdiffstats
path: root/qt-cpp
diff options
context:
space:
mode:
authorBen Cho <ben.cho@qt.io>2024-10-08 17:00:02 +0200
committerBen Cho <ben.cho@qt.io>2024-10-15 08:10:36 +0000
commitc343e7b0887e8a01a0b592783ea610bc47b2d9b5 (patch)
tree10e750713f59ac0fc2818c3ced10fd93300487b5 /qt-cpp
parent5bd0887140fc1f26ece9826a79214ac3846f25c7 (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.ts8
-rw-r--r--qt-cpp/src/project.ts83
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();
- }
}