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; } } }