mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 19:44:25 +01:00
88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
'use strict';
|
|
|
|
import * as paths from 'path';
|
|
import {EventEmitter} from 'events';
|
|
import {Uri, workspace} from 'vscode';
|
|
|
|
export interface LaunchTarget {
|
|
label: string;
|
|
description: string;
|
|
directory: Uri;
|
|
resource: Uri;
|
|
target: Uri;
|
|
}
|
|
|
|
|
|
export default function getLaunchTargets(): Thenable<LaunchTarget[]> {
|
|
|
|
if (!workspace.rootPath) {
|
|
return Promise.resolve([]);
|
|
}
|
|
|
|
return workspace.findFiles('{**/*.sln,**/*.csproj,**/project.json}', '{**/node_modules/**,**/.git/**,**/bower_components/**}', 100).then(resources => {
|
|
return select(resources, Uri.file(workspace.rootPath));
|
|
});
|
|
}
|
|
|
|
function select(resources: Uri[], root: Uri): LaunchTarget[] {
|
|
|
|
if (!Array.isArray(resources)) {
|
|
return [];
|
|
}
|
|
|
|
var targets: LaunchTarget[] = [],
|
|
hasCsProjFiles = false,
|
|
hasProjectJson = false,
|
|
hasProjectJsonAtRoot = false;
|
|
|
|
hasCsProjFiles = resources
|
|
.some(resource => /\.csproj$/.test(resource.fsPath));
|
|
|
|
resources.forEach(resource => {
|
|
|
|
// sln files
|
|
if (hasCsProjFiles && /\.sln$/.test(resource.fsPath)) {
|
|
targets.push({
|
|
label: paths.basename(resource.fsPath),
|
|
description: workspace.asRelativePath(paths.dirname(resource.fsPath)),
|
|
resource,
|
|
target: resource,
|
|
directory: Uri.file(paths.dirname(resource.fsPath))
|
|
});
|
|
}
|
|
|
|
// project.json files
|
|
if (/project.json$/.test(resource.fsPath)) {
|
|
|
|
var dirname = paths.dirname(resource.fsPath);
|
|
hasProjectJson = true;
|
|
hasProjectJsonAtRoot = hasProjectJsonAtRoot || dirname === root.fsPath;
|
|
|
|
targets.push({
|
|
label: paths.basename(resource.fsPath),
|
|
description: workspace.asRelativePath(paths.dirname(resource.fsPath)),
|
|
resource,
|
|
target: Uri.file(dirname),
|
|
directory: Uri.file(dirname)
|
|
});
|
|
}
|
|
});
|
|
|
|
if (hasProjectJson && !hasProjectJsonAtRoot) {
|
|
targets.push({
|
|
label: paths.basename(root.fsPath),
|
|
description: '',
|
|
resource: root,
|
|
target: root,
|
|
directory: root
|
|
});
|
|
}
|
|
|
|
return targets.sort((a, b) => a.directory.fsPath.localeCompare(b.directory.fsPath));
|
|
}
|
|
|