async Task <ImmutableArray <MonoDevelopMetadataReference> > CreateMetadataReferences(MonoDevelop.Projects.Project proj, CancellationToken token) { // create some default references for unsupported project types. if (!(proj is MonoDevelop.Projects.DotNetProject netProject)) { return(CreateDefaultMetadataReferences()); } var data = new AddMetadataReferencesData { Result = new List <MonoDevelopMetadataReference> (), Project = netProject, Visited = new HashSet <string> (FilePath.PathComparer), ConfigurationSelector = IdeApp.Workspace?.ActiveConfiguration ?? MonoDevelop.Projects.ConfigurationSelector.Default, Token = token, }; if (!await AddMetadataAssemblyReferences(data)) { return(ImmutableArray <MonoDevelopMetadataReference> .Empty); } if (!AddMetadataProjectReferences(data)) { return(ImmutableArray <MonoDevelopMetadataReference> .Empty); } return(data.Result.ToImmutableArray()); }
async Task <bool> AddMetadataAssemblyReferences(AddMetadataReferencesData data) { try { var referencedAssemblies = await data.Project.GetReferencedAssemblies(data.ConfigurationSelector, false).ConfigureAwait(false); foreach (var file in referencedAssemblies) { if (data.Token.IsCancellationRequested) { return(false); } if (!data.Visited.Add(file.FilePath)) { continue; } var aliases = file.EnumerateAliases().ToImmutableArray(); var metadataReference = manager.GetOrCreateMetadataReference(file.FilePath, new MetadataReferenceProperties(aliases: aliases)); if (metadataReference != null) { data.Result.Add(metadataReference); } } return(true); } catch (Exception e) { LoggingService.LogError("Error while getting referenced assemblies", e); // TODO: Check whether this should return false, I retained compat for now. return(true); } }
bool AddMetadataProjectReferences(AddMetadataReferencesData data) { try { var referencedProjects = data.Project.GetReferencedItems(data.ConfigurationSelector); foreach (var pr in referencedProjects) { if (data.Token.IsCancellationRequested) { return(false); } if (!(pr is MonoDevelop.Projects.DotNetProject referencedProject) || !TypeSystemService.IsOutputTrackedProject(referencedProject)) { continue; } var fileName = referencedProject.GetOutputFileName(data.ConfigurationSelector); if (!data.Visited.Add(fileName)) { continue; } var metadataReference = manager.GetOrCreateMetadataReference(fileName, MetadataReferenceProperties.Assembly); if (metadataReference != null) { data.Result.Add(metadataReference); } } } catch (Exception e) { LoggingService.LogError("Error while getting referenced assemblies", e); // TODO: Check whether this should return false, I retained compat for now. return(true); } return(true); }