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