コード例 #1
0
        /// <summary>
        /// Add a using directive.
        /// </summary>
        /// <param name="compilationUnit">The <see cref="CompilationUnitSyntax"/>.</param>
        /// <param name="usingDirective">The <see cref="UsingDirectiveSyntax"/>.</param>
        /// <param name="semanticModel">The <see cref="SemanticModel"/>.</param>
        /// <returns>The updated <see cref="CompilationUnitSyntax"/>.</returns>
        public static CompilationUnitSyntax AddUsing(this CompilationUnitSyntax compilationUnit, UsingDirectiveSyntax usingDirective, SemanticModel semanticModel)
        {
            if (compilationUnit is null)
            {
                throw new System.ArgumentNullException(nameof(compilationUnit));
            }

            if (semanticModel is null)
            {
                throw new System.ArgumentNullException(nameof(semanticModel));
            }

            if (usingDirective is null)
            {
                throw new System.ArgumentNullException(nameof(usingDirective));
            }

            if (compilationUnit.Members.TrySingleOfType <MemberDeclarationSyntax, NamespaceDeclarationSyntax>(out NamespaceDeclarationSyntax? ns) &&
                UsingDirectiveComparer.IsSameOrContained(ns, usingDirective))
            {
                return(compilationUnit);
            }

            using (var walker = UsingDirectiveWalker.Borrow(compilationUnit))
            {
                if (walker.UsingDirectives.Count == 0)
                {
                    if (walker.NamespaceDeclarations.TryFirst(out var namespaceDeclaration))
                    {
                        if (CodeStyle.UsingDirectivesInsideNamespace(semanticModel) != CodeStyleResult.No)
                        {
                            return(compilationUnit.ReplaceNode(namespaceDeclaration, namespaceDeclaration.WithUsings(SyntaxFactory.SingletonList(usingDirective))));
                        }

                        return(compilationUnit.ReplaceNode(compilationUnit, compilationUnit.WithUsings(SyntaxFactory.SingletonList(usingDirective))));
                    }

                    return(compilationUnit);
                }

                UsingDirectiveSyntax?previous = null;
                foreach (var directive in walker.UsingDirectives)
                {
                    var compare = UsingDirectiveComparer.Compare(directive, usingDirective);
                    if (compare == 0)
                    {
                        return(compilationUnit);
                    }

                    if (compare > 0)
                    {
                        return(compilationUnit.InsertNodesBefore(directive, new[] { usingDirective.WithTrailingElasticLineFeed() }));
                    }

                    previous = directive;
                }

                return(compilationUnit.InsertNodesAfter(previous, new[] { usingDirective.WithTrailingElasticLineFeed() }));
            }
        }
        public void SystemFirst(string s1, string s2, int expected)
        {
            var ud1 = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(s1));
            var ud2 = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(s2));

            Assert.AreEqual(expected, UsingDirectiveComparer.Compare(ud1, ud2));
            Assert.AreEqual(-expected, UsingDirectiveComparer.Compare(ud2, ud1));
        }
        public void Simple(string s1, string s2, int expected)
        {
            var ud1 = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(s1));
            var ud2 = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(s2));

            Assert.AreEqual(expected, UsingDirectiveComparer.Compare(ud1, ud2));
            Assert.AreEqual(-expected, UsingDirectiveComparer.Compare(ud2, ud1));
            Assert.AreEqual(expected, Math.Sign(StringComparer.OrdinalIgnoreCase.Compare(s1, s2)));
        }
コード例 #4
0
        async Task <ProjectContent> LoadContentAsync(Project project, ProjectScriptInfo config)
        {
            var usingDirectives = ImmutableArray.CreateBuilder <UsingDirectiveSyntax>();
            var parts           = ImmutableArray.CreateBuilder <ScriptPart>();
            var documents       = project.Documents
                                  .Where(document => !IsDebugDocument(document.FilePath, config))
                                  .ToList();

            var readmeDocument = project.Documents
                                 .Where(document => DirectoryOf(document)?.Equals(Path.GetDirectoryName(project.FilePath), StringComparison.CurrentCultureIgnoreCase) ?? false)
                                 .FirstOrDefault(document => NameOf(document).Equals("readme", StringComparison.CurrentCultureIgnoreCase));

            string readme = null;

            if (readmeDocument != null)
            {
                documents.Remove(readmeDocument);
                readme = (await readmeDocument.GetTextAsync()).ToString().Replace("\r\n", "\n");
                if (!readme.EndsWith("\n"))
                {
                    readme += "\n";
                }
            }

            for (var index = 0; index < documents.Count; index++)
            {
                var document = documents[index];
                var result   = await _analyzer.AnalyzeAndTransformAsync(document, Macros).ConfigureAwait(false);

                if (result == null)
                {
                    continue;
                }
                usingDirectives.AddRange(result.UsingDirectives);
                parts.AddRange(result.Parts);
            }

            var comparer = new UsingDirectiveComparer();

            return(new ProjectContent(usingDirectives.Distinct(comparer).ToImmutableArray(), parts.ToImmutable(), readme));
        }
コード例 #5
0
        async Task <ProjectContent> LoadContentAsync(Project project, MDKProjectProperties config)
        {
            var usingDirectives = ImmutableArray.CreateBuilder <UsingDirectiveSyntax>();
            var parts           = ImmutableArray.CreateBuilder <ScriptPart>();
            var documents       = project.Documents
                                  .Where(document => !IsDebugDocument(document.FilePath, config))
                                  .ToList();

            var readmeDocuments = project.AdditionalDocuments
                                  .Where(document => DirectoryOf(document)?.Equals(Path.GetDirectoryName(project.FilePath), StringComparison.CurrentCultureIgnoreCase) ?? false)
                                  .Where(document => ExtensionOf(document).Equals("readme", StringComparison.CurrentCultureIgnoreCase))
                                  .OrderBy(NameOf)
                                  .ToList();

            var readMe = new StringBuilder();

            for (int i = 0, n = readmeDocuments.Count - 1; i <= n; i++)
            {
                var document = readmeDocuments[i];
                if (i > 0)
                {
                    readMe.Append('\n');
                }
                readMe.Append(await LoadReadMeContentsAsync(document));
            }
            documents.RemoveAll(d => readmeDocuments.Contains(d));
            WrapAsComment(readMe);

            var legacyReadmeDocument = project.Documents
                                       .Where(document => DirectoryOf(document)?.Equals(Path.GetDirectoryName(project.FilePath), StringComparison.CurrentCultureIgnoreCase) ?? false)
                                       .FirstOrDefault(document => NameOf(document).Equals("readme", StringComparison.CurrentCultureIgnoreCase));

            if (legacyReadmeDocument != null)
            {
                documents.Remove(legacyReadmeDocument);
                if (readMe.Length > 0)
                {
                    readMe.Append('\n');
                }
                readMe.Append(await LoadReadMeContentsAsync(legacyReadmeDocument));
            }

            readmeDocuments.Add(legacyReadmeDocument);

            for (var index = 0; index < documents.Count; index++)
            {
                var document = documents[index];
                var result   = await _analyzer.AnalyzeAndTransformAsync(document, Macros).ConfigureAwait(false);

                if (result == null)
                {
                    continue;
                }
                usingDirectives.AddRange(result.UsingDirectives);
                parts.AddRange(result.Parts);
            }

            var comparer = new UsingDirectiveComparer();

            return(new ProjectContent(usingDirectives.Distinct(comparer).ToImmutableArray(), parts.ToImmutable(), readMe.Length > 0? readMe.ToString() : null));
        }