@@ -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