File: LanguageServer\Handler\DebugConfiguration\WorkspaceDebugConfigurationHandler.cs
Web Access
Project: src\src\LanguageServer\Microsoft.CodeAnalysis.LanguageServer\Microsoft.CodeAnalysis.LanguageServer.csproj (Microsoft.CodeAnalysis.LanguageServer)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Composition;
using Microsoft.CodeAnalysis.Host.Mef;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.LanguageServer.Handler.DebugConfiguration;
 
[ExportCSharpVisualBasicStatelessLspService(typeof(WorkspaceDebugConfigurationHandler)), Shared]
[Method(MethodName)]
internal class WorkspaceDebugConfigurationHandler : ILspServiceRequestHandler<WorkspaceDebugConfigurationParams, ProjectDebugConfiguration[]>
{
    private const string MethodName = "workspace/debugConfiguration";
 
    private readonly ProjectTargetFrameworkManager _targetFrameworkManager;
 
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public WorkspaceDebugConfigurationHandler(ProjectTargetFrameworkManager targetFrameworkManager)
    {
        _targetFrameworkManager = targetFrameworkManager;
    }
 
    public bool MutatesSolutionState => false;
 
    public bool RequiresLSPSolution => true;
 
    public Task<ProjectDebugConfiguration[]> HandleRequestAsync(WorkspaceDebugConfigurationParams request, RequestContext context, CancellationToken cancellationToken)
    {
        Contract.ThrowIfNull(context.Solution, nameof(context.Solution));
 
        var projects = context.Solution.Projects
            .Where(p => p.FilePath != null && p.OutputFilePath != null)
            .Where(p => IsProjectInWorkspace(request.WorkspacePath, p))
            .Select(GetProjectDebugConfiguration).ToArray();
        return Task.FromResult(projects);
    }
 
    private static bool IsProjectInWorkspace(Uri workspacePath, Project project)
    {
        return PathUtilities.IsSameDirectoryOrChildOf(project.FilePath!, workspacePath.LocalPath);
    }
 
    private ProjectDebugConfiguration GetProjectDebugConfiguration(Project project)
    {
        var isExe = project.CompilationOptions?.OutputKind is OutputKind.ConsoleApplication or OutputKind.WindowsApplication;
        var targetsDotnetCore = _targetFrameworkManager.IsDotnetCoreProject(project.Id);
        return new ProjectDebugConfiguration(project.FilePath!, project.OutputFilePath!, GetProjectName(project), targetsDotnetCore, isExe, project.Solution.FilePath);
    }
 
    private static string GetProjectName(Project project)
    {
        var (_, flavor) = project.State.NameAndFlavor;
        if (string.IsNullOrEmpty(flavor))
        {
            return project.Name;
        }
        else
        {
            var projectPath = project.FilePath!;
            var projectFileName = Path.GetFileName(projectPath);
            return $"{projectFileName} ({flavor}) - {projectPath}";
        }
    }
}