コード例 #1
0
        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);
        }
コード例 #2
0
        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)))));
        }
コード例 #3
0
        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);
        }