示例#1
0
        internal SourceAttributeData(
            SyntaxReference?applicationNode,
            NamedTypeSymbol?attributeClass,
            MethodSymbol?attributeConstructor,
            ImmutableArray <TypedConstant> constructorArguments,
            ImmutableArray <int> constructorArgumentsSourceIndices,
            ImmutableArray <KeyValuePair <string, TypedConstant> > namedArguments,
            bool hasErrors,
            bool isConditionallyOmitted)
        {
            Debug.Assert(!isConditionallyOmitted || attributeClass is object && attributeClass.IsConditional);
            Debug.Assert(!constructorArguments.IsDefault);
            Debug.Assert(!namedArguments.IsDefault);
            Debug.Assert(constructorArgumentsSourceIndices.IsDefault ||
                         constructorArgumentsSourceIndices.Any() && constructorArgumentsSourceIndices.Length == constructorArguments.Length);
            Debug.Assert(attributeConstructor is object || hasErrors);

            _attributeClass       = attributeClass;
            _attributeConstructor = attributeConstructor;
            _constructorArguments = constructorArguments;
            _constructorArgumentsSourceIndices = constructorArgumentsSourceIndices;
            _namedArguments         = namedArguments;
            _isConditionallyOmitted = isConditionallyOmitted;
            _hasErrors       = hasErrors;
            _applicationNode = applicationNode;
        }
示例#2
0
        public static Diagnostic CreateDiagnostic(
            this AttributeData attributeData,
            DiagnosticDescriptor descriptor,
            params object[] args)
        {
            SyntaxReference?syntaxReference = attributeData.ApplicationSyntaxReference;
            Location        location        = syntaxReference is not null
                ? syntaxReference.SyntaxTree.GetLocation(syntaxReference.Span)
                : Location.None;

            return(location.CreateDiagnostic(descriptor, args));
        }
示例#3
0
        public override void Initialize(AnalysisContext context)
        {
            context.EnableConcurrentExecution();
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

            context.RegisterCompilationStartAction(context =>
            {
                if (!context.Compilation.TryGetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemRuntimeCompilerServicesModuleInitializerAttribute, out var moduleInitializerAttribute))
                {
                    return;
                }

                // Only validate libraries (which will still produce some false positives, but that is acceptable)
                if (context.Compilation.Options.OutputKind != OutputKind.DynamicallyLinkedLibrary)
                {
                    return;
                }

                context.RegisterSymbolAction(context =>
                {
                    if (context.Symbol is IMethodSymbol method)
                    {
                        // Eliminate methods that would fail the CS8814, CS8815, and CS8816 checks
                        // for what can have [ModuleInitializer] applied
                        if (method.GetResultantVisibility() == SymbolVisibility.Private ||
                            method.Parameters.Length > 0 ||
                            method.IsGenericMethod ||
                            method.ContainingType.IsGenericType ||
                            !method.IsStatic ||
                            !method.ReturnsVoid)
                        {
                            return;
                        }

                        AttributeData?initializerAttribute = context.Symbol.GetAttributes(moduleInitializerAttribute).FirstOrDefault();
                        SyntaxReference?attributeReference = initializerAttribute?.ApplicationSyntaxReference;

                        if (attributeReference is not null)
                        {
                            context.ReportDiagnostic(attributeReference.GetSyntax(context.CancellationToken).CreateDiagnostic(Rule));
                        }
                    }
                },
                                             SymbolKind.Method);
            });
        }
示例#4
0
        internal static CSharpSyntaxNode GetNonNullSyntaxNode(this Symbol?symbol)
        {
            if (symbol is object)
            {
                SyntaxReference?reference = symbol.DeclaringSyntaxReferences.FirstOrDefault();

                if (reference == null && symbol.IsImplicitlyDeclared)
                {
                    Symbol?containingSymbol = symbol.ContainingSymbol;
                    if ((object?)containingSymbol != null)
                    {
                        reference = containingSymbol.DeclaringSyntaxReferences.FirstOrDefault();
                    }
                }

                if (reference != null)
                {
                    return((CSharpSyntaxNode)reference.GetSyntax());
                }
            }

            return((CSharpSyntaxNode)CSharpSyntaxTree.Dummy.GetRoot());
        }
 public static Location GetLocation(this SyntaxReference? @this)
 {
     return(@this?.SyntaxTree.GetLocation(@this.Span) ?? Location.None);
 }
示例#6
0
    public static void Report(GeneratorExecutionContext context, DiagnosticDescriptor desc, SyntaxReference?syntax, bool throwException, params object[] args)
    {
        context.ReportDiagnostic(Diagnostic.Create(desc, syntax == null ? Location.None : Location.Create(syntax.SyntaxTree, syntax.Span), args));
        var message = String.Format(desc.MessageFormat.ToString(), args);

        System.Console.WriteLine(message);
        if (throwException)
        {
            throw new Exception(message);
        }
    }
示例#7
0
 internal ImportedXmlNamespace(string xmlNamespace, SyntaxReference?declaringSyntaxReference)
 {
     XmlNamespace             = xmlNamespace;
     DeclaringSyntaxReference = declaringSyntaxReference;
 }
示例#8
0
 public static void Report(GeneratorExecutionContext context, DiagnosticDescriptor desc, SyntaxReference?syntax, params object[] args)
 {
     System.Console.WriteLine(String.Format(desc.MessageFormat.ToString(), args));
     context.ReportDiagnostic(Diagnostic.Create(desc, syntax == null ? Location.None : Location.Create(syntax.SyntaxTree, syntax.Span), args));
 }
示例#9
0
 internal ImportedNamespaceOrType(INamespaceOrTypeSymbol namespaceOrType, SyntaxReference?declaringSyntaxReference)
 {
     NamespaceOrType          = namespaceOrType;
     DeclaringSyntaxReference = declaringSyntaxReference;
 }
 public AliasAndExternAliasDirective(AliasSymbol alias, ExternAliasDirectiveSyntax?externAliasDirective, bool skipInLookup)
 {
     this.Alias = alias;
     this.ExternAliasDirectiveReference = externAliasDirective?.GetReference();
     this.SkipInLookup = skipInLookup;
 }
 internal bool TryGetSyntaxReference([NotNullWhen(true)] out SyntaxReference?syntaxReference)
 {
     return(this.Symbol.DeclaringSyntaxReferences.TrySingle(out syntaxReference));
 }
示例#12
0
 public AliasAndUsingDirective(AliasSymbol alias, UsingDirectiveSyntax?usingDirective)
 {
     this.Alias = alias;
     this.UsingDirectiveReference = usingDirective?.GetReference();
 }
 public NamespaceOrTypeAndUsingDirective(NamespaceOrTypeSymbol namespaceOrType, UsingDirectiveSyntax?usingDirective, ImmutableArray <AssemblySymbol> dependencies)
 {
     this.NamespaceOrType         = namespaceOrType;
     this.UsingDirectiveReference = usingDirective?.GetReference();
     this.Dependencies            = dependencies.NullToEmpty();
 }