Skip to content

Commit b608f95

Browse files
committed
Code formatting cleanup, add Deprecated annotation unit test, #90
1 parent f5fea46 commit b608f95

File tree

3 files changed

+72
-64
lines changed

3 files changed

+72
-64
lines changed

JavaToCSharp.Tests/IntegrationTests.cs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ public void GeneralSuccessfulConversionTest(string filePath)
2525
{
2626
IncludeComments = false,
2727
};
28-
28+
2929
options.WarningEncountered += (_, eventArgs)
3030
=> throw new InvalidOperationException($"Encountered a warning in conversion: {eventArgs.Message}");
31-
31+
3232
var parsed = JavaToCSharpConverter.ConvertText(File.ReadAllText(filePath), options);
3333
Assert.NotNull(parsed);
3434
}
@@ -41,10 +41,11 @@ public void GeneralUnsuccessfulConversionTest(string filePath)
4141
{
4242
IncludeComments = false,
4343
};
44-
44+
4545
options.WarningEncountered += (_, eventArgs)
46-
=> throw new InvalidOperationException($"Encountered a warning in conversion when we expected a failure: {eventArgs.Message}");
47-
46+
=> throw new InvalidOperationException(
47+
$"Encountered a warning in conversion when we expected a failure: {eventArgs.Message}");
48+
4849
Assert.ThrowsAny<Exception>(() => JavaToCSharpConverter.ConvertText(File.ReadAllText(filePath), options));
4950
}
5051

@@ -57,45 +58,46 @@ public void GeneralUnsuccessfulConversionTest(string filePath)
5758
[InlineData("Resources/Java10TypeInference.java")]
5859
[InlineData("Resources/NewArrayLiteralBug.java")]
5960
[InlineData("Resources/OctalLiteralBug.java")]
61+
[InlineData("Resources/DeprecatedAnnotation.java")]
6062
public void FullIntegrationTests(string filePath)
6163
{
6264
var options = new JavaConversionOptions
6365
{
6466
ConvertSystemOutToConsole = true,
6567
IncludeComments = false,
6668
};
67-
69+
6870
options.WarningEncountered += (_, eventArgs)
6971
=> throw new InvalidOperationException($"Encountered a warning in conversion: {eventArgs.Message}");
7072

7173
var javaText = File.ReadAllText(filePath);
72-
74+
7375
var parsed = JavaToCSharpConverter.ConvertText(javaText, options);
7476
Assert.NotNull(parsed);
7577

7678
var fileName = Path.GetFileNameWithoutExtension(filePath);
7779
var assembly = CompileAssembly(fileName, parsed);
78-
80+
7981
var expectation = ParseExpectation(javaText);
80-
82+
8183
// NOTE: examples must have a class name of Program in the example package
8284
var programType = assembly.GetType("Example.Program");
8385

8486
if (programType is null)
8587
{
8688
throw new InvalidOperationException("Cannot find expected Program type in assembly");
8789
}
88-
90+
8991
var mainMethod = programType.GetMethod("Main", BindingFlags.Static | BindingFlags.Public);
9092

9193
if (mainMethod is null)
9294
{
9395
throw new InvalidOperationException("Cannot find expected Main method in assembly");
9496
}
95-
97+
9698
using var sw = new StringWriter();
9799
Console.SetOut(sw);
98-
100+
99101
try
100102
{
101103
mainMethod.Invoke(null, new object[] { Array.Empty<string>() });
@@ -109,7 +111,7 @@ public void FullIntegrationTests(string filePath)
109111

110112
return;
111113
}
112-
114+
113115
var output = sw.ToString().ReplaceLineEndings("\n");
114116

115117
if (expectation.Output != null)
@@ -129,14 +131,14 @@ public void FullIntegrationTests(string filePath)
129131
private static Assembly CompileAssembly(string assemblyName, string cSharpLanguageText)
130132
{
131133
var syntaxTree = CSharpSyntaxTree.ParseText(cSharpLanguageText);
132-
134+
133135
var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication)
134136
.WithOverflowChecks(true)
135137
.WithOptimizationLevel(OptimizationLevel.Debug);
136-
137-
var compilation = CSharpCompilation.Create(assemblyName,
138-
new List<SyntaxTree> { syntaxTree },
139-
GetMetadataReferencesForBcl(),
138+
139+
var compilation = CSharpCompilation.Create(assemblyName,
140+
new List<SyntaxTree> { syntaxTree },
141+
GetMetadataReferencesForBcl(),
140142
options);
141143

142144
var outputDir = Path.Join(Environment.CurrentDirectory, "bin");
@@ -150,7 +152,8 @@ private static Assembly CompileAssembly(string assemblyName, string cSharpLangua
150152

151153
if (!emitResult.Success)
152154
{
153-
throw new InvalidOperationException($"Failed to emit Roslyn assembly: {string.Join(", ", emitResult.Diagnostics)}");
155+
throw new InvalidOperationException(
156+
$"Failed to emit Roslyn assembly: {string.Join(", ", emitResult.Diagnostics)}");
154157
}
155158

156159
ms.Position = 0;
@@ -188,7 +191,7 @@ private static IEnumerable<MetadataReference> GetMetadataReferencesForBcl()
188191
yield return MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll"));
189192
}
190193
}
191-
194+
192195
private static Expectation ParseExpectation(string contents)
193196
{
194197
using var sr = new StringReader(contents);
@@ -216,7 +219,7 @@ private static Expectation ParseExpectation(string contents)
216219

217220
var literal = FindLiteralExpressionSyntax(root);
218221

219-
if (literal != null)
222+
if (literal != null)
220223
{
221224
expectation.Output = literal.Token.ValueText;
222225
}
@@ -235,7 +238,7 @@ private static Expectation ParseExpectation(string contents)
235238

236239
return expectation;
237240
}
238-
241+
239242
private static LiteralExpressionSyntax? FindLiteralExpressionSyntax(SyntaxNode node)
240243
{
241244
if (node is LiteralExpressionSyntax literal)
@@ -254,4 +257,4 @@ private class Expectation
254257

255258
public string? Error { get; set; }
256259
}
257-
}
260+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// Expect:
2+
/// - output: "Hello world!\n"
3+
package example;
4+
5+
@Deprecated
6+
public class Program {
7+
public static void main(String[] args) {
8+
System.out.println("Hello world!");
9+
}
10+
}

JavaToCSharp/Declarations/ClassOrInterfaceDeclarationVisitor.cs

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace JavaToCSharp.Declarations;
1212
public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOrInterfaceDeclaration>
1313
{
1414
public override MemberDeclarationSyntax? VisitForClass(
15-
ConversionContext context,
15+
ConversionContext context,
1616
ClassDeclarationSyntax classSyntax,
1717
ClassOrInterfaceDeclaration declaration,
1818
IReadOnlyList<ClassOrInterfaceType> extends,
@@ -21,16 +21,20 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
2121
return VisitClassDeclaration(context, declaration);
2222
}
2323

24-
public override MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax,
25-
ClassOrInterfaceDeclaration declaration)
24+
public override MemberDeclarationSyntax? VisitForInterface(ConversionContext context,
25+
InterfaceDeclarationSyntax interfaceSyntax,
26+
ClassOrInterfaceDeclaration declaration)
2627
{
2728
return VisitClassDeclaration(context, declaration);
2829
}
2930

30-
public static InterfaceDeclarationSyntax? VisitInterfaceDeclaration(ConversionContext context, ClassOrInterfaceDeclaration javai, bool isNested = false)
31+
public static InterfaceDeclarationSyntax? VisitInterfaceDeclaration(ConversionContext context,
32+
ClassOrInterfaceDeclaration javai, bool isNested = false)
3133
{
3234
var originalTypeName = javai.getName();
33-
var newTypeName = context.Options.StartInterfaceNamesWithI ? $"I{originalTypeName.getIdentifier()}" : originalTypeName.getIdentifier();
35+
var newTypeName = context.Options.StartInterfaceNamesWithI
36+
? $"I{originalTypeName.getIdentifier()}"
37+
: originalTypeName.getIdentifier();
3438

3539
if (context.Options.StartInterfaceNamesWithI)
3640
{
@@ -46,9 +50,11 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
4650

4751
var typeParams = javai.getTypeParameters().ToList<TypeParameter>();
4852

49-
if (typeParams is {Count: > 0})
53+
if (typeParams is { Count: > 0 })
5054
{
51-
classSyntax = classSyntax.AddTypeParameterListParameters(typeParams.Select(i => SyntaxFactory.TypeParameter(i.getNameAsString())).ToArray());
55+
classSyntax =
56+
classSyntax.AddTypeParameterListParameters(typeParams
57+
.Select(i => SyntaxFactory.TypeParameter(i.getNameAsString())).ToArray());
5258
}
5359

5460
var mods = javai.getModifiers().ToModifierKeywordSet();
@@ -67,7 +73,8 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
6773
{
6874
foreach (var extend in extends)
6975
{
70-
classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend)));
76+
classSyntax =
77+
classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend)));
7178
}
7279
}
7380

@@ -76,7 +83,8 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
7683
{
7784
foreach (var implement in implements)
7885
{
79-
classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement)));
86+
classSyntax =
87+
classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement)));
8088
}
8189
}
8290

@@ -96,7 +104,8 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
96104
return classSyntax.WithJavaComments(context, javai);
97105
}
98106

99-
public static ClassDeclarationSyntax? VisitClassDeclaration(ConversionContext context, ClassOrInterfaceDeclaration javac, bool isNested = false)
107+
public static ClassDeclarationSyntax? VisitClassDeclaration(ConversionContext context,
108+
ClassOrInterfaceDeclaration javac, bool isNested = false)
100109
{
101110
string name = javac.getNameAsString();
102111

@@ -109,9 +118,11 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
109118

110119
var typeParams = javac.getTypeParameters().ToList<TypeParameter>();
111120

112-
if (typeParams is {Count: > 0})
121+
if (typeParams is { Count: > 0 })
113122
{
114-
classSyntax = classSyntax.AddTypeParameterListParameters(typeParams.Select(i => SyntaxFactory.TypeParameter(i.getNameAsString())).ToArray());
123+
classSyntax =
124+
classSyntax.AddTypeParameterListParameters(typeParams
125+
.Select(i => SyntaxFactory.TypeParameter(i.getNameAsString())).ToArray());
115126
}
116127

117128
var mods = javac.getModifiers().ToModifierKeywordSet();
@@ -131,19 +142,22 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
131142

132143
foreach (var extend in extends)
133144
{
134-
classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend)));
145+
classSyntax =
146+
classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend)));
135147
}
136148

137149
var implements = javac.getImplementedTypes().ToList<ClassOrInterfaceType>() ?? new List<ClassOrInterfaceType>();
138150

139151
foreach (var implement in implements)
140152
{
141-
classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement)));
153+
classSyntax =
154+
classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement)));
142155
}
143156

144157
var members = javac.getMembers()?.ToList<BodyDeclaration>();
145158

146159
if (members is not null)
160+
{
147161
foreach (var member in members)
148162
{
149163
if (member is ClassOrInterfaceDeclaration childType)
@@ -181,54 +195,35 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor<ClassOr
181195
classSyntax = classSyntax.AddMembers(anon);
182196
}
183197
}
198+
}
184199

185-
bool isObsolete = false;
186-
187200
var annotations = javac.getAnnotations().ToList<AnnotationExpr>();
188201

189202
if (annotations is { Count: > 0 })
190203
{
191204
foreach (var annotation in annotations)
192205
{
193206
string annotationName = annotation.getNameAsString();
194-
string annotationText = "Obsolete"; // TODO parse from java comment
207+
const string annotationText = "Obsolete"; // TODO parse from java comment
195208

196209
if (annotationName == "Deprecated")
197210
{
198-
199-
classSyntax = classSyntax.AddAttributeLists(
200-
new AttributeListSyntax[]{
201-
SyntaxFactory.AttributeList(
202-
SyntaxFactory.SingletonSeparatedList<AttributeSyntax>(
203-
SyntaxFactory.Attribute(
204-
SyntaxFactory.IdentifierName("Obsolete")
205-
)
211+
classSyntax = classSyntax.AddAttributeLists(SyntaxFactory.AttributeList(
212+
SyntaxFactory.SingletonSeparatedList(
213+
SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("Obsolete"))
206214
.WithArgumentList(
207215
SyntaxFactory.AttributeArgumentList(
208-
SyntaxFactory.SingletonSeparatedList<AttributeArgumentSyntax>(
216+
SyntaxFactory.SingletonSeparatedList(
209217
SyntaxFactory.AttributeArgument(
210218
SyntaxFactory.LiteralExpression(
211219
SyntaxKind.StringLiteralExpression,
212-
SyntaxFactory.Literal(annotationText)
213-
)
214-
)
215-
)
216-
)
217-
)
218-
)
219-
)
220-
}
221-
);
222-
isObsolete = true;
223-
}
220+
SyntaxFactory.Literal(annotationText)))))))));
224221

225-
if (isObsolete)
226-
{
227222
break;
228223
}
229224
}
230225
}
231226

232227
return classSyntax.WithJavaComments(context, javac);
233228
}
234-
}
229+
}

0 commit comments

Comments
 (0)