Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions JavaToCSharp.Tests/CommentTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,80 @@ public virtual void Method1()

Assert.Equal(expected.ReplaceLineEndings(), parsed.ReplaceLineEndings());
}

[Fact]
public void JavadocBeforePackage_ShouldNotCrash()
{
const string javaCode = """
/**
* Some comments
*/
package foo;

import java.util.List;

public class Foo {
}
""";
var options = new JavaConversionOptions();
options.Usings.Clear();

var parsed = JavaToCSharpConverter.ConvertText(javaCode, options) ?? "";

testOutputHelper.WriteLine(parsed);

const string expected = """
/*
* Some comments
*/
using Java.Util;

namespace Foo
{
public class Foo
{
}
}
""";

Assert.Equal(expected.ReplaceLineEndings(), parsed.ReplaceLineEndings());
}

[Fact]
public void JavadocBeforeImport_ShouldNotCrash()
{
const string javaCode = """
package foo;

/**
* Import comment
*/
import java.util.List;

public class Foo {
}
""";
var options = new JavaConversionOptions();
options.Usings.Clear();

var parsed = JavaToCSharpConverter.ConvertText(javaCode, options) ?? "";

testOutputHelper.WriteLine(parsed);

const string expected = """
/*
* Import comment
*/
using Java.Util;

namespace Foo
{
public class Foo
{
}
}
""";

Assert.Equal(expected.ReplaceLineEndings(), parsed.ReplaceLineEndings());
}
}
53 changes: 44 additions & 9 deletions JavaToCSharp/CommentsHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,7 @@ public static UsingDirectiveSyntax AddUsingComments(UsingDirectiveSyntax syntax,

foreach (var (comment, _) in comments)
{
var (kind, pre, post) = GetCommentInfo(comment);
var commentTrivia = SyntaxFactory.SyntaxTrivia(kind, pre + comment.getContent() + post);
leadingTriviaList.Add(commentTrivia);
leadingTriviaList.Add(CreateNonMemberCommentTrivia(comment));
}

return syntax.WithUsingKeyword(SyntaxFactory.Token(SyntaxKind.UsingKeyword).WithLeadingTrivia(leadingTriviaList));
Expand All @@ -59,9 +57,7 @@ public static CompilationUnitSyntax AddPackageComments(CompilationUnitSyntax syn

if (compilationUnit.getComment().FromOptional<JavaComments.Comment>() is { } compilationUnitComment)
{
var (kind, pre, post) = GetCommentInfo(compilationUnitComment);
var commentTrivia = SyntaxFactory.SyntaxTrivia(kind, pre + compilationUnitComment.getContent() + post + Environment.NewLine);
leadingTriviaList.Add(commentTrivia);
leadingTriviaList.Add(CreateNonMemberCommentTrivia(compilationUnitComment, Environment.NewLine));
}

if (packageDeclaration is not null)
Expand All @@ -72,9 +68,7 @@ public static CompilationUnitSyntax AddPackageComments(CompilationUnitSyntax syn
{
foreach (var (comment, _) in packageComments)
{
var (kind, pre, post) = GetCommentInfo(comment);
var commentTrivia = SyntaxFactory.SyntaxTrivia(kind, pre + comment.getContent() + post + Environment.NewLine);
leadingTriviaList.Add(commentTrivia);
leadingTriviaList.Add(CreateNonMemberCommentTrivia(comment, Environment.NewLine));
}
}
}
Expand Down Expand Up @@ -128,6 +122,47 @@ public static CompilationUnitSyntax AddPackageComments(CompilationUnitSyntax syn
return syntax;
}

/// <summary>
/// Builds comment trivia for positions that cannot carry XML doc comments, such as file-level
/// and using directive comments. Javadoc is rendered as a block comment instead.
/// </summary>
private static SyntaxTrivia CreateNonMemberCommentTrivia(JavaComments.Comment comment, string suffix = "")
{
var (kind, pre, post) = GetCommentInfo(comment);

if (kind == SyntaxKind.XmlComment)
{
return SyntaxFactory.SyntaxTrivia(SyntaxKind.MultiLineCommentTrivia,
FormatAsBlockComment(comment.getContent()) + suffix);
}

return SyntaxFactory.SyntaxTrivia(kind, pre + comment.getContent() + post + suffix);
}

private static string FormatAsBlockComment(string content)
{
var lines = content.ReplaceLineEndings("\n")
.Split('\n')
.Select(line => line.TrimStart().TrimStart('*').Trim())
.ToList();

TrimTrailingEmptyLines(lines);

while (lines.Count > 0 && lines[0].Length == 0)
{
lines.RemoveAt(0);
}

var builder = new System.Text.StringBuilder("/*");

foreach (var line in lines)
{
builder.Append(Environment.NewLine).Append(line.Length == 0 ? " *" : " * " + line);
}

return builder.Append(Environment.NewLine).Append(" */").ToString();
}

private static (SyntaxKind kind, string? pre, string? post) GetCommentInfo(
JavaComments.Comment comment)
{
Expand Down
Loading