public async Task <IWorkspaceProjectContext> CreateProjectContextAsync(ConfiguredProject project) { Requires.NotNull(project, nameof(project)); ProjectContextInitData data = await GetProjectContextInitDataAsync(project); if (data.IsInvalid()) { return(null); } object hostObject = _project.Services.HostObject; IWorkspaceProjectContext context = await CreateProjectContextHandlingFaultAsync(data, hostObject); if (context == null) { return(null); } // Wrap to enforce UI-thread context = new ForegroundWorkspaceProjectContext(_threadingService, context); _activeWorkspaceProjectContextTracker.RegisterContext(context, data.WorkspaceProjectContextId); return(context); }
private async Task <ProjectContextInitData> GetProjectContextInitDataAsync(ConfiguredProject project) { Guid projectGuid = await _projectGuidService.GetProjectGuidAsync(); IProjectRuleSnapshot snapshot = await GetLatestSnapshotAsync(project); return(ProjectContextInitData.GetProjectContextInitData(snapshot, projectGuid, project.ProjectConfiguration)); }
public static ProjectContextInitData GetProjectContextInitData(IProjectRuleSnapshot snapshot, Guid projectGuid, ProjectConfiguration configuration) { var data = new ProjectContextInitData(); snapshot.Properties.TryGetValue(ConfigurationGeneral.LanguageServiceNameProperty, out data.LanguageName); snapshot.Properties.TryGetValue(ConfigurationGeneral.TargetPathProperty, out data.BinOutputPath); snapshot.Properties.TryGetValue(ConfigurationGeneral.MSBuildProjectFullPathProperty, out data.ProjectFilePath); data.ProjectGuid = projectGuid; data.WorkspaceProjectContextId = GetWorkspaceProjectContextId(data.ProjectFilePath, projectGuid, configuration); return(data); }
public async Task <IWorkspaceProjectContextAccessor?> CreateProjectContextAsync(ConfiguredProject project) { Requires.NotNull(project, nameof(project)); ProjectContextInitData data = await GetProjectContextInitDataAsync(project); if (data.IsInvalid()) { return(null); } object?hostObject = _project.Services.HostObject; IWorkspaceProjectContext?context = await CreateProjectContextHandlingFaultAsync(data, hostObject); if (context == null) { return(null); } return(new WorkspaceProjectContextAccessor(data.WorkspaceProjectContextId, context)); }
private async Task <IWorkspaceProjectContext?> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object?hostObject) { try { // Call into Roslyn to init language service for this project IWorkspaceProjectContext context = await _workspaceProjectContextFactory.Value.CreateProjectContextAsync( data.LanguageName, data.WorkspaceProjectContextId, data.ProjectFilePath, data.ProjectGuid, hostObject, data.BinOutputPath, data.AssemblyName, CancellationToken.None); context.LastDesignTimeBuildSucceeded = false; // By default, turn off diagnostics until the first design time build succeeds for this project. return(context); } catch (Exception ex) { await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality); } return(null); }
private async Task <IWorkspaceProjectContext> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object hostObject) { // TODO: https://github.com/dotnet/project-system/issues/353. await _threadingService.SwitchToUIThread(); try { // Call into Roslyn to init language service for this project IWorkspaceProjectContext context = _workspaceProjectContextFactory.Value.CreateProjectContext( data.LanguageName, data.WorkspaceProjectContextId, data.ProjectFilePath, data.ProjectGuid, hostObject, data.BinOutputPath); context.LastDesignTimeBuildSucceeded = false; // By default, turn off diagnostics until the first design time build succeeds for this project. return(context); } catch (Exception ex) { await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality); } return(null); }
private async Task <IWorkspaceProjectContext?> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object?hostObject) { try { // Call into Roslyn to init language service for this project IWorkspaceProjectContext context = await _workspaceProjectContextFactory.Value.CreateProjectContextAsync( data.LanguageName, data.WorkspaceProjectContextId, data.ProjectFilePath, data.ProjectGuid, hostObject, data.BinOutputPath, data.AssemblyName, CancellationToken.None); context.StartBatch(); try { // Update additional properties within a batch to avoid thread pool starvation. // https://github.com/dotnet/project-system/issues/8027 context.LastDesignTimeBuildSucceeded = false; // By default, turn off diagnostics until the first design time build succeeds for this project. // Pass along any early approximation we have of the command line options #pragma warning disable CS0618 // This was obsoleted in favor of the one that takes an array, but here just the string is easier; we'll un-Obsolete this API context.SetOptions(data.CommandLineArgsForDesignTimeEvaluation); #pragma warning restore CS0618 // Type or member is obsolete } finally { await context.EndBatchAsync(); } return(context); } catch (Exception ex) { await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality); } return(null); }