예제 #1
0
        private static void CheckUsingDeclaration(SyntaxNodeAnalysisContext context, UsingDirectiveSyntax usingDirective)
        {
            if (!usingDirective.Parent.IsKind(SyntaxKind.NamespaceDeclaration))
            {
                // Usings outside of a namespace are always qualified.
                return;
            }

            if (!usingDirective.StaticKeyword.IsKind(SyntaxKind.None))
            {
                // using static types is not considered.
                return;
            }

            if (usingDirective.HasNamespaceAliasQualifier())
            {
                // global qualified namespaces are OK.
                return;
            }

            var symbol = context.SemanticModel.GetSymbolInfo(usingDirective.Name, context.CancellationToken).Symbol;

            if (symbol == null)
            {
                // if there is no symbol, do not proceed.
                return;
            }

            if (symbol is INamedTypeSymbol typeSymbol &&
                typeSymbol.IsTupleType())
            {
                symbol = typeSymbol.TupleUnderlyingType();
            }

            string symbolString = symbol.ToQualifiedString(usingDirective.Name);

            string usingString = UsingDirectiveSyntaxToCanonicalString(usingDirective);

            if ((symbolString != usingString) && !usingDirective.StartsWithAlias(context.SemanticModel, context.CancellationToken))
            {
                switch (symbol.Kind)
                {
                case SymbolKind.Namespace:
                    context.ReportDiagnostic(Diagnostic.Create(DescriptorNamespace, usingDirective.GetLocation(), symbolString));
                    break;

                case SymbolKind.NamedType:
                    var containingNamespace = ((NamespaceDeclarationSyntax)usingDirective.Parent).Name.ToString();
                    if (containingNamespace != symbol.ContainingNamespace.ToString())
                    {
                        context.ReportDiagnostic(Diagnostic.Create(DescriptorType, usingDirective.GetLocation(), symbolString));
                    }

                    break;
                }
            }
        }