in src/goTest/resolve.ts [344:412]
private async getPackage(uri: Uri): Promise<TestItem | undefined> {
let item: TestItem;
const nested = getGoConfig(uri).get('testExplorer.packageDisplayMode') === 'nested';
const modDirPath = await getModFolderPath(uri, true);
const wsfolder = workspace.getWorkspaceFolder(uri);
if (modDirPath || nested) {
// If the package is in a module, add it as a child of the module
let parent: TestItem | undefined = undefined;
if (modDirPath) {
const modDir = Uri.file(modDirPath); // TODO support non-file schemes
parent = await this.getModule(modDir);
} else if (nested && wsfolder !== undefined) {
parent = await this.getWorkspace(wsfolder);
} else {
return;
}
if (uri.path === parent.uri?.path) {
return parent;
}
if (nested) {
const bits = parent.uri ? path.relative(parent.uri.fsPath, uri.fsPath).split(path.sep) : [];
while (bits.length > 1) {
if (!parent.uri?.path) continue;
const dir = bits.shift();
if (!dir) continue;
const dirUri = uri.with({
path: Uri.file(path.join(parent.uri.fsPath, dir)).path,
query: '',
fragment: ''
});
parent = this.getOrCreateItem(parent, dir, dirUri, 'package');
}
}
const label =
parent.uri && uri.path.startsWith(parent.uri.path)
? uri.path.substring(parent.uri.path.length + 1)
: uri.path;
item = this.getOrCreateItem(parent, label, uri, 'package');
} else if (wsfolder) {
// If the package is in a workspace folder, add it as a child of the workspace
const workspace = await this.getWorkspace(wsfolder);
const existing = this.getItem(workspace, uri, 'package');
if (existing) {
return existing;
}
const label = uri.path.startsWith(wsfolder.uri.path)
? uri.path.substring(wsfolder.uri.path.length + 1)
: uri.path;
item = this.getOrCreateItem(workspace, label, uri, 'package');
} else {
// Otherwise, add it directly to the root
const existing = this.getItem(undefined, uri, 'package');
if (existing) {
return existing;
}
const srcPath = path.join(getCurrentGoPath(uri), 'src');
const label = uri.path.startsWith(srcPath) ? uri.path.substring(srcPath.length + 1) : uri.path;
item = this.getOrCreateItem(undefined, label, uri, 'package');
}
item.canResolveChildren = true;
return item;
}