private static IEnumerable <SyntaxTrivia> ConvertVBTrivia(SyntaxTrivia t) { 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); yield return(SyntaxFactory.SyntaxTrivia(CSSyntaxKind.SingleLineCommentTrivia, outputCommentText)); //It's always single line...even when it has multiple lines yield return(_endOfLine); yield break; } if (t.IsKind(VBSyntaxKind.WhitespaceTrivia)) { yield return(SyntaxFactory.ElasticWhitespace(t.ToString())); yield break; } if (t.IsKind(VBSyntaxKind.EndOfLineTrivia)) { yield return(SyntaxFactory.EndOfLine(t.ToString())); yield break; } if (t.HasStructure) { bool wasConverted = false; foreach (var converted in ConvertStructuredVBTrivia(t)) { yield return(converted); wasConverted = true; } if (wasConverted) { 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} {t.ToFullString()}*/") : default(SyntaxTrivia)); }