Skip to content

Commit ee80333

Browse files
committed
Update based on code review
* Extract method `QualifyUsingDirective`
1 parent e657fd1 commit ee80333

1 file changed

Lines changed: 87 additions & 72 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/OrderingRules/UsingCodeFixProvider.cs

Lines changed: 87 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -561,78 +561,7 @@ private List<UsingDirectiveSyntax> GenerateUsings(List<UsingDirectiveSyntax> usi
561561

562562
if (qualifyNames)
563563
{
564-
currentUsing = currentUsing.ReplaceNodes(
565-
new[] { currentUsing.Name },
566-
(originalNode, rewrittenNode) =>
567-
{
568-
switch (originalNode.Kind())
569-
{
570-
case SyntaxKind.QualifiedName:
571-
case SyntaxKind.IdentifierName:
572-
case SyntaxKind.GenericName:
573-
if (originalNode.Parent.IsKind(SyntaxKind.UsingDirective)
574-
|| originalNode.Parent.IsKind(SyntaxKind.TypeArgumentList))
575-
{
576-
var symbol = this.semanticModel.GetSymbolInfo(originalNode, cancellationToken: CancellationToken.None).Symbol;
577-
if (symbol == null)
578-
{
579-
return rewrittenNode;
580-
}
581-
582-
if (symbol is INamespaceSymbol)
583-
{
584-
// TODO: Preserve inner trivia
585-
string fullName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
586-
NameSyntax replacement = SyntaxFactory.ParseName(fullName);
587-
if (!originalNode.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>().Any())
588-
{
589-
replacement = replacement.ReplaceNodes(
590-
replacement.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>(),
591-
(originalNode2, rewrittenNode2) => rewrittenNode2.Name);
592-
}
593-
594-
return replacement.WithTriviaFrom(rewrittenNode);
595-
}
596-
else if (symbol is INamedTypeSymbol)
597-
{
598-
// TODO: Preserve inner trivia
599-
// TODO: simplify after qualification
600-
string fullName;
601-
if (SpecialTypeHelper.IsPredefinedType(((INamedTypeSymbol)symbol).OriginalDefinition.SpecialType))
602-
{
603-
fullName = "global::System." + symbol.Name;
604-
}
605-
else
606-
{
607-
fullName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
608-
}
609-
610-
NameSyntax replacement = SyntaxFactory.ParseName(fullName);
611-
if (!originalNode.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>().Any())
612-
{
613-
replacement = replacement.ReplaceNodes(
614-
replacement.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>(),
615-
(originalNode2, rewrittenNode2) => rewrittenNode2.Name);
616-
}
617-
618-
return replacement.WithTriviaFrom(rewrittenNode);
619-
}
620-
else
621-
{
622-
return rewrittenNode;
623-
}
624-
}
625-
else
626-
{
627-
return rewrittenNode;
628-
}
629-
630-
case SyntaxKind.AliasQualifiedName:
631-
case SyntaxKind.PredefinedType:
632-
default:
633-
return rewrittenNode;
634-
}
635-
});
564+
currentUsing = this.QualifyUsingDirective(currentUsing);
636565
}
637566

638567
triviaToMove.AddRange(currentUsing.GetLeadingTrivia().Where(tr => tr.IsDirective || tr.IsKind(SyntaxKind.DisabledTextTrivia)));
@@ -720,6 +649,92 @@ private List<UsingDirectiveSyntax> GenerateUsings(List<UsingDirectiveSyntax> usi
720649
return result;
721650
}
722651

652+
private UsingDirectiveSyntax QualifyUsingDirective(UsingDirectiveSyntax usingDirective)
653+
{
654+
NameSyntax originalName = usingDirective.Name;
655+
NameSyntax rewrittenName;
656+
switch (originalName.Kind())
657+
{
658+
case SyntaxKind.QualifiedName:
659+
case SyntaxKind.IdentifierName:
660+
case SyntaxKind.GenericName:
661+
if (originalName.Parent.IsKind(SyntaxKind.UsingDirective)
662+
|| originalName.Parent.IsKind(SyntaxKind.TypeArgumentList))
663+
{
664+
var symbol = this.semanticModel.GetSymbolInfo(originalName, cancellationToken: CancellationToken.None).Symbol;
665+
if (symbol == null)
666+
{
667+
rewrittenName = originalName;
668+
break;
669+
}
670+
671+
if (symbol is INamespaceSymbol)
672+
{
673+
// TODO: Preserve inner trivia
674+
string fullName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
675+
NameSyntax replacement = SyntaxFactory.ParseName(fullName);
676+
if (!originalName.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>().Any())
677+
{
678+
replacement = replacement.ReplaceNodes(
679+
replacement.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>(),
680+
(originalNode2, rewrittenNode2) => rewrittenNode2.Name);
681+
}
682+
683+
rewrittenName = replacement.WithTriviaFrom(originalName);
684+
break;
685+
}
686+
else if (symbol is INamedTypeSymbol)
687+
{
688+
// TODO: Preserve inner trivia
689+
// TODO: simplify after qualification
690+
string fullName;
691+
if (SpecialTypeHelper.IsPredefinedType(((INamedTypeSymbol)symbol).OriginalDefinition.SpecialType))
692+
{
693+
fullName = "global::System." + symbol.Name;
694+
}
695+
else
696+
{
697+
fullName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
698+
}
699+
700+
NameSyntax replacement = SyntaxFactory.ParseName(fullName);
701+
if (!originalName.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>().Any())
702+
{
703+
replacement = replacement.ReplaceNodes(
704+
replacement.DescendantNodesAndSelf().OfType<AliasQualifiedNameSyntax>(),
705+
(originalNode2, rewrittenNode2) => rewrittenNode2.Name);
706+
}
707+
708+
rewrittenName = replacement.WithTriviaFrom(originalName);
709+
break;
710+
}
711+
else
712+
{
713+
rewrittenName = originalName;
714+
break;
715+
}
716+
}
717+
else
718+
{
719+
rewrittenName = originalName;
720+
break;
721+
}
722+
723+
case SyntaxKind.AliasQualifiedName:
724+
case SyntaxKind.PredefinedType:
725+
default:
726+
rewrittenName = originalName;
727+
break;
728+
}
729+
730+
if (rewrittenName == originalName)
731+
{
732+
return usingDirective;
733+
}
734+
735+
return usingDirective.ReplaceNode(originalName, rewrittenName);
736+
}
737+
723738
private int CompareUsings(UsingDirectiveSyntax left, UsingDirectiveSyntax right)
724739
{
725740
if ((left.Alias != null) && (right.Alias != null))

0 commit comments

Comments
 (0)