Exemple #1
0
    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);
        }
    }
Exemple #2
0
        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;
 }
Exemple #4
0
        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
            });
        }