private static async Task AddNonSubmissionDependentProjectsAsync(IAssemblySymbol sourceAssembly, Solution solution, Project sourceProject, HashSet <DependentProject> dependentProjects, CancellationToken cancellationToken) { var isSubmission = sourceProject != null && sourceProject.IsSubmission; if (isSubmission) { return; } var internalsVisibleToMap = CreateInternalsVisibleToMap(sourceAssembly); var sourceAssemblySymbolKey = sourceAssembly.GetSymbolKey(); // TODO(cyrusn): What about error tolerance situations. Do we maybe want to search // transitive dependencies as well? Even if the code wouldn't compile, they may be // things we want to find. foreach (var projectId in solution.ProjectIds) { var project = solution.GetProject(projectId); cancellationToken.ThrowIfCancellationRequested(); if (project.SupportsCompilation && HasReferenceTo(sourceAssembly, sourceProject, project, cancellationToken)) { var hasInternalsAccess = await HasInternalsAccessAsync( sourceAssembly, internalsVisibleToMap, sourceAssemblySymbolKey, project, cancellationToken).ConfigureAwait(false); dependentProjects.Add(new DependentProject(project.Id, hasInternalsAccess)); } } }
private static async Task AddNonSubmissionDependentProjectsAsync(IAssemblySymbol sourceAssembly, Solution solution, Project sourceProject, HashSet <DependentProject> dependentProjects, CancellationToken cancellationToken) { var isSubmission = sourceProject != null && sourceProject.IsSubmission; if (isSubmission) { return; } var internalsVisibleToMap = CreateInternalsVisibleToMap(sourceAssembly); SymbolKey?sourceAssemblySymbolKey = null; // TODO(cyrusn): What about error tolerance situations. Do we maybe want to search // transitive dependencies as well? Even if the code wouldn't compile, they may be // things we want to find. foreach (var projectId in solution.ProjectIds) { var project = solution.GetProject(projectId); cancellationToken.ThrowIfCancellationRequested(); if (HasReferenceTo(sourceAssembly, sourceProject, project, cancellationToken)) { bool hasInternalsAccess = false; if (internalsVisibleToMap.Value.Contains(project.AssemblyName)) { var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var targetAssembly = compilation.Assembly; if (sourceAssembly.Language != targetAssembly.Language) { sourceAssemblySymbolKey = sourceAssemblySymbolKey ?? sourceAssembly.GetSymbolKey(); var sourceAssemblyInTargetCompilation = sourceAssemblySymbolKey.Value.Resolve(compilation, cancellationToken: cancellationToken).Symbol as IAssemblySymbol; if (sourceAssemblyInTargetCompilation != null) { hasInternalsAccess = targetAssembly.IsSameAssemblyOrHasFriendAccessTo(sourceAssemblyInTargetCompilation); } } else { hasInternalsAccess = targetAssembly.IsSameAssemblyOrHasFriendAccessTo(sourceAssembly); } } dependentProjects.Add(new DependentProject(project.Id, hasInternalsAccess)); } } }
private static async Task AddNonSubmissionDependentProjectsAsync(IAssemblySymbol sourceAssembly, Solution solution, Project sourceProject, HashSet<DependentProject> dependentProjects, CancellationToken cancellationToken) { var isSubmission = sourceProject != null && sourceProject.IsSubmission; if (isSubmission) { return; } var internalsVisibleToMap = CreateInternalsVisibleToMap(sourceAssembly); SymbolKey sourceAssemblySymbolKey = null; // TODO(cyrusn): What about error tolerance situations. Do we maybe want to search // transitive dependencies as well? Even if the code wouldn't compile, they may be // things we want to find. foreach (var projectId in solution.ProjectIds) { var project = solution.GetProject(projectId); cancellationToken.ThrowIfCancellationRequested(); if (HasReferenceTo(sourceAssembly, sourceProject, project, cancellationToken)) { bool hasInternalsAccess = false; if (internalsVisibleToMap.Value.Contains(project.AssemblyName)) { var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false); var targetAssembly = compilation.Assembly; if (sourceAssembly.Language != targetAssembly.Language) { sourceAssemblySymbolKey = sourceAssemblySymbolKey ?? sourceAssembly.GetSymbolKey(); var sourceAssemblyInTargetCompilation = sourceAssemblySymbolKey.Resolve(compilation, cancellationToken: cancellationToken).Symbol as IAssemblySymbol; if (sourceAssemblyInTargetCompilation != null) { hasInternalsAccess = targetAssembly.IsSameAssemblyOrHasFriendAccessTo(sourceAssemblyInTargetCompilation); } } else { hasInternalsAccess = targetAssembly.IsSameAssemblyOrHasFriendAccessTo(sourceAssembly); } } dependentProjects.Add(new DependentProject(project.Id, hasInternalsAccess)); } } }