private static IEnumerable <SyntaxTrivia> ConvertStructuredVBTrivia(SyntaxTrivia t)
    {
        var triviaStructure = t.GetStructure();

        if (triviaStructure is VBSyntax.RegionDirectiveTriviaSyntax rdts)
        {
            var regionDirective     = SyntaxFactory.RegionDirectiveTrivia(true);
            var regionKeyword       = regionDirective.RegionKeyword.WithTrailingTrivia(SyntaxFactory.Space);
            var endOfDirectiveToken = regionDirective.EndOfDirectiveToken.WithLeadingTrivia(SyntaxFactory.PreprocessingMessage(rdts.Name.Text.Trim('"'))).WithTrailingTrivia(_endOfLine);
            yield return(SyntaxFactory.Trivia(regionDirective.WithRegionKeyword(regionKeyword).WithEndOfDirectiveToken(endOfDirectiveToken)));

            yield break;
        }

        if (t.IsKind(VBSyntaxKind.EndRegionDirectiveTrivia))
        {
            yield return(SyntaxFactory.Trivia(SyntaxFactory.EndRegionDirectiveTrivia(true).WithTrailingTrivia(_endOfLine)));

            yield break;
        }
    }
예제 #2
0
        private static IEnumerable <SyntaxTrivia> ConvertVBTrivia(SyntaxTrivia t)
        {
            var endOfLine = SyntaxFactory.EndOfLine(Environment.NewLine);

            if (t.IsKind(VBSyntaxKind.CommentTrivia))
            {
                yield return(SyntaxFactory.SyntaxTrivia(CSSyntaxKind.SingleLineCommentTrivia, $"// {t.GetCommentText()}"));

                yield break;
            }
            if (t.IsKind(VBSyntaxKind.DocumentationCommentTrivia))
            {
                var previousWhitespace = t.GetPreviousTrivia(t.SyntaxTree, CancellationToken.None).ToString().Trim('\r', '\n');
                var commentTextLines   = t.GetCommentText().Replace("\r\n", "\n").Replace("\r", "\n").Split('\n');
                var outputCommentText  = "/// " + String.Join($"\r\n{previousWhitespace}/// ", commentTextLines) + Environment.NewLine;
                yield return(SyntaxFactory.SyntaxTrivia(CSSyntaxKind.SingleLineCommentTrivia, outputCommentText)); //It's always single line...even when it has multiple lines

                yield break;
            }

            if (t.IsKind(VBSyntaxKind.WhitespaceTrivia))
            {
                yield return(SyntaxFactory.SyntaxTrivia(CSSyntaxKind.WhitespaceTrivia, t.ToString()));

                yield break;
            }

            if (t.IsKind(VBSyntaxKind.EndOfLineTrivia))
            {
                // Mapping one to one here leads to newlines appearing where the natural line-end was in VB.
                // e.g. ToString\r\n()
                // Because C Sharp needs those brackets. Handling each possible case of this is far more effort than it's worth.
                yield return(SyntaxFactory.SyntaxTrivia(CSSyntaxKind.EndOfLineTrivia, t.ToString()));

                yield break;
            }

            if (t.HasStructure && t.GetStructure() is VBSyntax.RegionDirectiveTriviaSyntax rdts)
            {
                var regionDirective     = SyntaxFactory.RegionDirectiveTrivia(true);
                var regionKeyword       = regionDirective.RegionKeyword.WithTrailingTrivia(SyntaxFactory.Space);
                var endOfDirectiveToken = regionDirective.EndOfDirectiveToken.WithLeadingTrivia(SyntaxFactory.PreprocessingMessage(rdts.Name.Text.Trim('"'))).WithTrailingTrivia(endOfLine);
                yield return(SyntaxFactory.Trivia(regionDirective.WithRegionKeyword(regionKeyword).WithEndOfDirectiveToken(endOfDirectiveToken)));

                yield break;
            }

            if (t.IsKind(VBSyntaxKind.EndRegionDirectiveTrivia))
            {
                yield return(SyntaxFactory.Trivia(SyntaxFactory.EndRegionDirectiveTrivia(true).WithTrailingTrivia(endOfLine)));

                yield break;
            }

            //Each of these would need its own method to recreate for C# with the right structure probably so let's just warn about them for now.
            var convertedKind = t.GetCSKind();

            yield return(convertedKind.HasValue
                ? SyntaxFactory.Comment($"/* TODO ERROR: Skipped {convertedKind.Value} */")
                : default(SyntaxTrivia));
        }