private async Task <ResolvedReferences> ResolveReferencesAsync(ProjectId id, ProjectFileInfo projectFileInfo, CommandLineArguments commandLineArgs, CancellationToken cancellationToken) { // First, gather all of the metadata references from the command-line arguments. var resolvedMetadataReferences = commandLineArgs.ResolveMetadataReferences( new WorkspaceMetadataFileReferenceResolver( metadataService: GetWorkspaceService <IMetadataService>(), pathResolver: new RelativePathResolver(commandLineArgs.ReferencePaths, commandLineArgs.BaseDirectory))); var builder = new ResolvedReferencesBuilder(resolvedMetadataReferences); var projectDirectory = Path.GetDirectoryName(projectFileInfo.FilePath); // Next, iterate through all project references in the file and create project references. foreach (var projectFileReference in projectFileInfo.ProjectReferences) { var aliases = projectFileReference.Aliases; if (_pathResolver.TryGetAbsoluteProjectPath(projectFileReference.Path, baseDirectory: projectDirectory, _discoveredProjectOptions.OnPathFailure, out var projectReferencePath)) { // The easiest case is to add a reference to a project we already know about. if (TryAddReferenceToKnownProject(id, projectReferencePath, aliases, builder)) { continue; } // If we don't know how to load a project (that is, it's not a language we support), we can still // attempt to verify that its output exists on disk and is included in our set of metadata references. // If it is, we'll just leave it in place. if (!IsProjectLoadable(projectReferencePath) && await VerifyUnloadableProjectOutputExistsAsync(projectReferencePath, builder, cancellationToken).ConfigureAwait(false)) { continue; } // If metadata is preferred, see if the project reference's output exists on disk and is included // in our metadata references. If it is, don't create a project reference; we'll just use the metadata. if (_preferMetadataForReferencesOfDiscoveredProjects && await VerifyProjectOutputExistsAsync(projectReferencePath, builder, cancellationToken).ConfigureAwait(false)) { continue; } // Finally, we'll try to load and reference the project. if (await TryLoadAndAddReferenceAsync(id, projectReferencePath, aliases, builder, cancellationToken).ConfigureAwait(false)) { continue; } } // We weren't able to handle this project reference, so add it without further processing. var unknownProjectId = _projectMap.GetOrCreateProjectId(projectFileReference.Path); var newProjectReference = CreateProjectReference(from: id, to: unknownProjectId, aliases); builder.AddProjectReference(newProjectReference); } return(builder.ToResolvedReferences()); }
private static ResolvedReferences ResolveReferencesAsync(ProjectId id, ProjectFileInfo projectFileInfo, CommandLineArguments commandLineArgs) { // First, gather all of the metadata references from the command-line arguments. var resolvedMetadataReferences = commandLineArgs.ResolveMetadataReferences( new WorkspaceMetadataFileReferenceResolver( metadataService: _metadataService, pathResolver: new RelativePathResolver(commandLineArgs.ReferencePaths, commandLineArgs.BaseDirectory))); var builder = new ResolvedReferencesBuilder(resolvedMetadataReferences); var projectDirectory = Path.GetDirectoryName(projectFileInfo.FilePath); return(builder.ToResolvedReferences()); }