From 3875b3e0f84dfb57b6a843d412476b3362379665 Mon Sep 17 00:00:00 2001 From: Munishwar kalra Date: Mon, 17 Aug 2026 18:09:04 +0530 Subject: [PATCH] Fix nested type inheritance conversion --- .../ConvertNestedTypeInheritanceTests.cs | 45 +++++++++++++++++++ JavaToCSharp/TypeHelper.cs | 9 ++++ 2 files changed, 54 insertions(+) create mode 100644 JavaToCSharp.Tests/ConvertNestedTypeInheritanceTests.cs diff --git a/JavaToCSharp.Tests/ConvertNestedTypeInheritanceTests.cs b/JavaToCSharp.Tests/ConvertNestedTypeInheritanceTests.cs new file mode 100644 index 0000000..5a44fa6 --- /dev/null +++ b/JavaToCSharp.Tests/ConvertNestedTypeInheritanceTests.cs @@ -0,0 +1,45 @@ +namespace JavaToCSharp.Tests; + +public class ConvertNestedTypeInheritanceTests +{ + [Fact] + public void Extending_Nested_Type_Keeps_Declaring_Type_Qualifier() + { + const string javaCode = """ + package com.example; + public class GeneratorFactory { + public abstract static class AbstractXmlFeatureGeneratorFactory { + } + public interface XmlFeatureGeneratorFactory { + } + public class CachedFeatureGeneratorFactory + extends GeneratorFactory.AbstractXmlFeatureGeneratorFactory + implements GeneratorFactory.XmlFeatureGeneratorFactory { + } + } + """; + + var parsed = Convert(javaCode); + + Assert.Contains( + "public class CachedFeatureGeneratorFactory : GeneratorFactory.AbstractXmlFeatureGeneratorFactory, GeneratorFactory.XmlFeatureGeneratorFactory", + parsed); + } + + [Fact] + public void Extending_Simple_Type_Is_Unaffected() + { + const string javaCode = """ + package com.example; + public class Square extends Shape { + } + """; + + var parsed = Convert(javaCode); + + Assert.Contains("public class Square : Shape", parsed); + } + + private static string Convert(string javaCode) + => JavaToCSharpConverter.ConvertText(javaCode, new JavaConversionOptions { IncludeComments = false }) ?? ""; +} diff --git a/JavaToCSharp/TypeHelper.cs b/JavaToCSharp/TypeHelper.cs index 9b648a3..49ca3be 100644 --- a/JavaToCSharp/TypeHelper.cs +++ b/JavaToCSharp/TypeHelper.cs @@ -171,6 +171,15 @@ public static TypeSyntax GetSyntaxFromType(ClassOrInterfaceType type) typeSyntax = SyntaxFactory.ParseTypeName(typeName); } + // Nested types (e.g. `Outer.Inner`) carry their declaring type as a scope, which + // getNameAsString() above does not include. Prepend it so the declaring type isn't lost. + if (type.getScope().FromOptional() is { } scope + && typeSyntax is SimpleNameSyntax simpleName + && GetSyntaxFromType(scope) is NameSyntax scopeName) + { + return SyntaxFactory.QualifiedName(scopeName, simpleName); + } + return typeSyntax; }