public static PackageDeclarationSyntax AddUsingDirectives(
            this PackageDeclarationSyntax namespaceDeclaration,
            IList <UsingDirectiveSyntax> usingDirectives,
            bool placeSystemNamespaceFirst,
            params SyntaxAnnotation[] annotations)
        {
            if (!usingDirectives.Any())
            {
                return(namespaceDeclaration);
            }

            var specialCaseSystem = placeSystemNamespaceFirst;
            var comparer          = specialCaseSystem
                ? UsingsAndExternAliasesDirectiveComparer.SystemFirstInstance
                : UsingsAndExternAliasesDirectiveComparer.NormalInstance;

            var usings = new List <UsingDirectiveSyntax>();

            usings.AddRange(namespaceDeclaration.Usings);
            usings.AddRange(usingDirectives);

            if (namespaceDeclaration.Usings.IsSorted(comparer))
            {
                usings.Sort(comparer);
            }

            usings = usings.Select(u => u.WithAdditionalAnnotations(annotations)).ToList();
            var newNamespace = namespaceDeclaration.WithUsings(usings.ToSyntaxList());

            return(newNamespace);
        }
 private static TextSpan GetUsingsSpan(CompilationUnitSyntax root, PackageDeclarationSyntax namespaceDeclaration)
 {
     if (namespaceDeclaration != null)
     {
         var usings = namespaceDeclaration.Usings;
         var start  = usings.First().SpanStart;
         var end    = usings.Last().Span.End;
         return(TextSpan.FromBounds(start, end));
     }
     else
     {
         var rootUsings = root.Usings;
         if (rootUsings.Any())
         {
             var start = rootUsings.First().SpanStart;
             var end   = rootUsings.Last().Span.End;
             return(TextSpan.FromBounds(start, end));
         }
         else
         {
             var start = 0;
             var end   = root.Members.Any()
                 ? root.Members.First().GetFirstToken().Span.End
                 : root.Span.End;
             return(TextSpan.FromBounds(start, end));
         }
     }
 }
예제 #3
0
        internal static PackageDeclarationSyntax AddMethodTo(
            PackageDeclarationSyntax destination,
            IMethodSymbol method,
            CodeGenerationOptions options,
            IList <bool> availableIndices)
        {
            var declaration = GenerateMethodDeclaration(method, CodeGenerationDestination.Namespace, options);
            var members     = Insert(destination.Members, declaration, options, availableIndices, after: LastMethod);

            return(destination.WithMembers(members.ToSyntaxList()));
        }
예제 #4
0
        public static PackageDeclarationSyntax AddNamedTypeTo(
            ICodeGenerationService service,
            PackageDeclarationSyntax destination,
            INamedTypeSymbol namedType,
            CodeGenerationOptions options,
            IList <bool> availableIndices)
        {
            var declaration = GenerateNamedTypeDeclaration(service, namedType, CodeGenerationDestination.Namespace, options);
            var members     = Insert(destination.Members, declaration, options, availableIndices);

            return(ConditionallyAddFormattingAnnotationTo(
                       destination.WithMembers(members),
                       members));
        }
예제 #5
0
        public static PackageDeclarationSyntax AddNamespaceTo(
            ICodeGenerationService service,
            PackageDeclarationSyntax destination,
            INamespaceSymbol @namespace,
            CodeGenerationOptions options,
            IList <bool> availableIndices)
        {
            var declaration = GenerateNamespaceDeclaration(service, @namespace, options);

            if (!(declaration is PackageDeclarationSyntax))
            {
                throw new ArgumentException(CSharpWorkspaceResources.NamespaceCanNotBeAddedIn);
            }

            var members = Insert(destination.Members, (PackageDeclarationSyntax)declaration, options, availableIndices);

            return(destination.WithMembers(members));
        }
예제 #6
0
            public override SyntaxNode VisitPackageDeclaration(PackageDeclarationSyntax node)
            {
                var result = (PackageDeclarationSyntax)base.VisitPackageDeclaration(node);

                IList <INamespaceSymbol> namespaces;

                if (!namespacesToImport.TryGetValue(node, out namespaces))
                {
                    return(result);
                }

                if (!result.CanAddUsingDirectives(cancellationToken))
                {
                    return(result);
                }

                var directives = CreateDirectives(namespaces);

                return(result.AddUsingDirectives(directives, placeSystemNamespaceFirst, Formatter.Annotation));
            }
예제 #7
0
        private IList <INamespaceSymbol> GetExistingNamespaces(
            SemanticModel semanticModel, PackageDeclarationSyntax namespaceDeclaration, CancellationToken cancellationToken)
        {
            var q = from u in namespaceDeclaration.Usings
                    let symbol = semanticModel.GetSymbolInfo(u.Name, cancellationToken).Symbol as INamespaceSymbol
                                 where symbol != null && !symbol.IsGlobalNamespace
                                 select symbol;

            var usingImports = q.ToList();

            var namespaceSymbol  = semanticModel.GetDeclaredSymbol(namespaceDeclaration, cancellationToken) as INamespaceSymbol;
            var namespaceImports = GetContainingNamespacesAndThis(namespaceSymbol).ToList();

            var outerNamespaces = this.GetExistingNamespaces(semanticModel, namespaceDeclaration.Parent, cancellationToken);

            return(outerNamespaces.Concat(namespaceImports).Concat(usingImports)
                   .Distinct()
                   .OrderBy(INamespaceSymbolExtensions.CompareNamespaces)
                   .ToList());
        }