public CompilationUnitSyntax Transform(IDocumentTransformationResult transformationResult) { var requiredNamespaces = transformationResult.AnalyzationResult.AllTypes .SelectMany(o => o.GetSelfAndDescendantsTypes()) .SelectMany(o => o.MethodsAndAccessors .SelectMany(m => m.GetSelfAndDescendantsFunctions() .SelectMany(f => f.FunctionReferences.Where(r => _extensionMethods.Contains(r.AsyncCounterpartSymbol))))) .Select(o => o.AsyncCounterpartSymbol.ContainingNamespace.ToString()) .Distinct() .ToList(); if (!requiredNamespaces.Any() || requiredNamespaces.All(o => transformationResult.AnalyzationResult.GlobalNamespace.NestedNamespaces.Any(n => n.Symbol.ToString().StartsWith(o)) || transformationResult.Transformed.Usings.Any(u => u.Name.ToString() == o))) { return(null); } var transformed = transformationResult.Transformed; foreach (var requiredNamespace in requiredNamespaces.Where(o => transformationResult.Transformed.Usings.All(u => u.Name.ToString() != o))) { transformed = transformed .AddUsings( UsingDirective(ConstructNameSyntax(requiredNamespace)) .WithUsingKeyword(Token(TriviaList(), SyntaxKind.UsingKeyword, TriviaList(Space))) .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(transformationResult.EndOfLineTrivia)))); } return(transformed); }
public CompilationUnitSyntax Transform(IDocumentTransformationResult transformationResult) { if (!_enabled) { return(null); } var transformed = transformationResult.Transformed; var firstNode = transformed.DescendantNodes().FirstOrDefault(); if (firstNode == null) { return(null); } var directive = NullableDirectiveTrivia( Token(SyntaxKind.HashToken), Token(TriviaList(), SyntaxKind.NullableKeyword, TriviaList(Space)), Token(SyntaxKind.RestoreKeyword), Token(TriviaList(), SyntaxKind.EndOfDirectiveToken, TriviaList(transformationResult.EndOfLineTrivia)), true); return(transformed.ReplaceNode(firstNode, firstNode.WithLeadingTrivia(firstNode.GetLeadingTrivia().Add(Trivia(directive))))); }
public CompilationUnitSyntax Transform(IDocumentTransformationResult transformationResult) { var transformed = transformationResult.Transformed; // Start and end hash of an empty region will always be on the same token var directives = transformed.DescendantTokens() .Where(o => o.ContainsDirectives) .Select(o => o.Span) .OrderByDescending(o => o.Start) .ToList(); foreach (var span in directives) { var token = transformed.DescendantTokens().First(o => o.Span == span); var toRemoveRegions = new List <RegionInfo>(); var currentRegion = new RegionInfo(); var stack = new Stack <RegionInfo>(); for (var i = 0; i < token.LeadingTrivia.Count; i++) { var trivia = token.LeadingTrivia[i]; // End of line trivia can be also located on the trailing trivia of a parent token in this case check for the whitespace if (trivia.IsKind(SyntaxKind.EndOfLineTrivia) || (!currentRegion.EndOfLineIndex.HasValue && trivia.IsKind(SyntaxKind.WhitespaceTrivia))) { currentRegion.EndOfLineIndex = i; } else if (trivia.IsKind(SyntaxKind.RegionDirectiveTrivia)) { if (currentRegion.StartRegionIndex.HasValue) // Nested regions { stack.Push(currentRegion); currentRegion = new RegionInfo { Parent = currentRegion }; } currentRegion.StartRegionIndex = i; currentRegion.StartRegionEndOfLineIndex = currentRegion.EndOfLineIndex; } else if (trivia.IsKind(SyntaxKind.EndRegionDirectiveTrivia)) { if (currentRegion.StartRegionIndex.HasValue) { currentRegion.EndIndex = i; toRemoveRegions.Add(currentRegion); } currentRegion = stack.Any() ? stack.Pop() : new RegionInfo(); } } if (!toRemoveRegions.Any()) { continue; } var newToken = token; foreach (var regionInfo in toRemoveRegions.Select(o => o.GetValidRoot()).Where(o => o != null).Distinct().OrderByDescending(o => o.StartIndex)) { for (var j = regionInfo.EndIndex.GetValueOrDefault(); j >= regionInfo.StartIndex.GetValueOrDefault(); j--) { newToken = newToken.WithLeadingTrivia(newToken.LeadingTrivia.RemoveAt(j)); } } transformed = transformed.ReplaceToken(token, newToken); } return(transformed); }