internal static bool ExposesInternalsTo(this IAssemblySymbol self, IAssemblySymbol other) { if (self.Equals(other, SymbolEqualityComparer.Default)) { return(true); } else { var internalsVisibleToAttribute = typeof(InternalsVisibleToAttribute); var internalsVisibleTo = self.GetAttributes().SingleOrDefault( _ => _.AttributeClass is not null && _.AttributeClass.Name == internalsVisibleToAttribute.Name && _.AttributeClass.ContainingNamespace.ToDisplayString() == internalsVisibleToAttribute.Namespace && _.AttributeClass.ContainingAssembly.Name == internalsVisibleToAttribute.Assembly.GetName().Name); if (internalsVisibleTo is not null) { if ((string)internalsVisibleTo.ConstructorArguments[0].Value ! == other.Name) { return(true); } } return(false); } }
public void AnalyzeExpression(SyntaxNodeAnalysisContext context) { SyntaxNode node = context.Node; ISymbol symbol = node.GetDeclaredOrReferencedSymbol(context.SemanticModel); if (symbol == null) { return; } if (!IsInternalOrFriendAccessibility(symbol.DeclaredAccessibility)) { return; } IAssemblySymbol referencedAssembly = symbol.ContainingAssembly; IAssemblySymbol callingAssembly = context.ContainingSymbol.ContainingAssembly; if (referencedAssembly.Equals(callingAssembly)) { return; } IEnumerable <string> attributeNames = symbol.GetAttributes().Select(attribute => attribute.AttributeClass.Name); if (attributeNames.Contains("VisibleInternalAttribute", StringComparer.Ordinal)) { return; } context.ReportDiagnostic(Diagnostic.Create(Rule, node.GetLocation(), symbol.GetFullName())); }
public override void VisitAssembly(IAssemblySymbol symbol) { allowInternal = symbol.Equals(context.Compilation.Assembly, SymbolEqualityComparer.Default); foreach (var member in symbol.GlobalNamespace.GetMembers()) { member.Accept(this); } allowInternal = false; }
public static bool IsSameAssemblyOrHasFriendAccessTo(this IAssemblySymbol assembly, IAssemblySymbol toAssembly) { var areEquals = assembly.Equals(toAssembly); if (areEquals == false && toAssembly == null) { return(false); } return (areEquals || (assembly.IsInteractive && toAssembly.IsInteractive) || toAssembly.GivesAccessTo(assembly)); }
private CodeFileToken MapToken(ISymbol definedSymbol, SymbolDisplayPart symbolDisplayPart) { CodeFileTokenKind kind; switch (symbolDisplayPart.Kind) { case SymbolDisplayPartKind.TypeParameterName: case SymbolDisplayPartKind.AliasName: case SymbolDisplayPartKind.AssemblyName: case SymbolDisplayPartKind.ClassName: case SymbolDisplayPartKind.DelegateName: case SymbolDisplayPartKind.EnumName: case SymbolDisplayPartKind.ErrorTypeName: case SymbolDisplayPartKind.InterfaceName: case SymbolDisplayPartKind.StructName: kind = CodeFileTokenKind.TypeName; break; case SymbolDisplayPartKind.Keyword: kind = CodeFileTokenKind.Keyword; break; case SymbolDisplayPartKind.LineBreak: kind = CodeFileTokenKind.Newline; break; case SymbolDisplayPartKind.StringLiteral: kind = CodeFileTokenKind.StringLiteral; break; case SymbolDisplayPartKind.Punctuation: kind = CodeFileTokenKind.Punctuation; break; case SymbolDisplayPartKind.Space: kind = CodeFileTokenKind.Whitespace; break; case SymbolDisplayPartKind.PropertyName: case SymbolDisplayPartKind.EventName: case SymbolDisplayPartKind.FieldName: case SymbolDisplayPartKind.MethodName: case SymbolDisplayPartKind.Operator: case SymbolDisplayPartKind.EnumMemberName: case SymbolDisplayPartKind.ExtensionMethodName: case SymbolDisplayPartKind.ConstantName: kind = CodeFileTokenKind.MemberName; break; default: kind = CodeFileTokenKind.Text; break; } string navigateToId = null; var symbol = symbolDisplayPart.Symbol; if (symbol is INamedTypeSymbol && (definedSymbol == null || !definedSymbol.Equals(symbol)) && _assembly.Equals(symbol.ContainingAssembly)) { navigateToId = symbol.GetId(); } return(new CodeFileToken() { DefinitionId = definedSymbol?.Equals(symbol) == true?definedSymbol.GetId() : null, NavigateToId = navigateToId, Value = symbolDisplayPart.ToString(), Kind = kind }); }