Initial project references changes (#11648)

* first changes for showing project references

* add tests

* fix interface and formatting

* add try so that project still gets loaded even if dependency project loading fails

* use instanceof

* add circular reference error
This commit is contained in:
Kim Santiago
2020-08-13 16:08:32 -07:00
committed by GitHub
parent d68433ec22
commit f3a48da3fa
9 changed files with 217 additions and 23 deletions

View File

@@ -16,7 +16,7 @@ import * as vscode from 'vscode';
import * as azdata from 'azdata';
import { promises as fs } from 'fs';
import { PublishDatabaseDialog } from '../dialogs/publishDatabaseDialog';
import { Project, DatabaseReferenceLocation, SystemDatabase, TargetPlatform, ProjectEntry, reservedProjectFolders } from '../models/project';
import { Project, DatabaseReferenceLocation, SystemDatabase, TargetPlatform, ProjectEntry, reservedProjectFolders, SqlProjectReferenceProjectEntry } from '../models/project';
import { SqlDatabaseProjectTreeViewProvider } from './databaseProjectTreeViewProvider';
import { FolderNode, FileNode } from '../models/tree/fileFolderTreeItem';
import { IPublishSettings, IGenerateScriptSettings } from '../models/IPublishSettings';
@@ -47,11 +47,15 @@ export class ProjectsController {
this.projectTreeViewProvider.load(this.projects);
}
public async openProject(projectFile: vscode.Uri, focusProject: boolean = true): Promise<Project> {
public async openProject(projectFile: vscode.Uri, focusProject: boolean = true, isReferencedProject: boolean = false): Promise<Project> {
for (const proj of this.projects) {
if (proj.projectFilePath === projectFile.fsPath) {
vscode.window.showInformationMessage(constants.projectAlreadyOpened(projectFile.fsPath));
return proj;
if (!isReferencedProject) {
vscode.window.showInformationMessage(constants.projectAlreadyOpened(projectFile.fsPath));
return proj;
} else {
throw new Error(constants.projectAlreadyOpened(projectFile.fsPath));
}
}
}
@@ -62,6 +66,17 @@ export class ProjectsController {
newProject = await Project.openProject(projectFile.fsPath);
this.projects.push(newProject);
// open any reference projects (don't need to worry about circular dependencies because those aren't allowed)
const referencedProjects = newProject.databaseReferences.filter(r => r instanceof SqlProjectReferenceProjectEntry);
for (const proj of referencedProjects) {
const projUri = vscode.Uri.file(path.join(newProject.projectFolderPath, proj.fsUri.fsPath));
try {
await this.openProject(projUri, false, true);
} catch (e) {
vscode.window.showErrorMessage(e.message === constants.projectAlreadyOpened(projUri.fsPath) ? constants.circularProjectReference(newProject.projectFileName, proj.databaseName) : e.message);
}
}
// Update for round tripping as needed
await this.updateProjectForRoundTrip(newProject);