From 7708c479e876df0b9565073039a0674f8195bdfb Mon Sep 17 00:00:00 2001 From: Dave Friedel Date: Wed, 23 Jul 2025 05:01:42 -0400 Subject: [PATCH 1/4] tweaks --- IronJava.Core/AST/Nodes/Annotations.cs | 5 +++++ IronJava.Core/AST/Nodes/CompilationUnit.cs | 12 +++++++++++ IronJava.Core/AST/Nodes/TypeDeclarations.cs | 14 ++++++++++++ IronJava.Core/AST/Nodes/Types.cs | 24 +++++++++++++++++++-- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/IronJava.Core/AST/Nodes/Annotations.cs b/IronJava.Core/AST/Nodes/Annotations.cs index 6db000f..cfb5e20 100644 --- a/IronJava.Core/AST/Nodes/Annotations.cs +++ b/IronJava.Core/AST/Nodes/Annotations.cs @@ -10,6 +10,11 @@ public class Annotation : JavaNode { public TypeReference Type { get; } public IReadOnlyList Arguments { get; } + + /// + /// Gets the name of the annotation (e.g., "Override" for @Override). + /// + public string Name => Type.Name; public Annotation( SourceRange location, diff --git a/IronJava.Core/AST/Nodes/CompilationUnit.cs b/IronJava.Core/AST/Nodes/CompilationUnit.cs index a176265..c5cfcfc 100644 --- a/IronJava.Core/AST/Nodes/CompilationUnit.cs +++ b/IronJava.Core/AST/Nodes/CompilationUnit.cs @@ -38,6 +38,11 @@ public class PackageDeclaration : JavaNode { public string PackageName { get; } public IReadOnlyList Annotations { get; } + + /// + /// Gets the package name. Alias for PackageName for consistency. + /// + public string Name => PackageName; public PackageDeclaration( SourceRange location, @@ -61,6 +66,13 @@ public class ImportDeclaration : JavaNode public string ImportPath { get; } public bool IsStatic { get; } public bool IsWildcard { get; } + + /// + /// Gets the name of the imported type or package. + /// For "import java.util.List", returns "java.util.List" + /// For "import java.util.*", returns "java.util.*" + /// + public string Name => ImportPath; public ImportDeclaration( SourceRange location, diff --git a/IronJava.Core/AST/Nodes/TypeDeclarations.cs b/IronJava.Core/AST/Nodes/TypeDeclarations.cs index 4459f51..db2b0cc 100644 --- a/IronJava.Core/AST/Nodes/TypeDeclarations.cs +++ b/IronJava.Core/AST/Nodes/TypeDeclarations.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using MarketAlly.IronJava.Core.AST.Visitors; namespace MarketAlly.IronJava.Core.AST.Nodes @@ -13,6 +14,11 @@ public abstract class TypeDeclaration : JavaNode public IReadOnlyList Annotations { get; } public IReadOnlyList TypeParameters { get; } public JavaDoc? JavaDoc { get; } + + /// + /// Gets the body/members of this type declaration. + /// + public abstract IEnumerable Body { get; } protected TypeDeclaration( SourceRange location, @@ -67,6 +73,8 @@ public ClassDeclaration( AddChildren(members); } + public override IEnumerable Body => Members; + public override T Accept(IJavaVisitor visitor) => visitor.VisitClassDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitClassDeclaration(this); } @@ -97,6 +105,8 @@ public InterfaceDeclaration( AddChildren(members); } + public override IEnumerable Body => Members; + public override T Accept(IJavaVisitor visitor) => visitor.VisitInterfaceDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitInterfaceDeclaration(this); } @@ -130,6 +140,8 @@ public EnumDeclaration( AddChildren(members); } + public override IEnumerable Body => Constants.Cast().Concat(Members); + public override T Accept(IJavaVisitor visitor) => visitor.VisitEnumDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitEnumDeclaration(this); } @@ -154,6 +166,8 @@ public AnnotationDeclaration( AddChildren(members); } + public override IEnumerable Body => Members; + public override T Accept(IJavaVisitor visitor) => visitor.VisitAnnotationDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitAnnotationDeclaration(this); } diff --git a/IronJava.Core/AST/Nodes/Types.cs b/IronJava.Core/AST/Nodes/Types.cs index 34aa485..2134654 100644 --- a/IronJava.Core/AST/Nodes/Types.cs +++ b/IronJava.Core/AST/Nodes/Types.cs @@ -9,6 +9,16 @@ namespace MarketAlly.IronJava.Core.AST.Nodes public abstract class TypeReference : JavaNode { protected TypeReference(SourceRange location) : base(location) { } + + /// + /// Gets the simple name of the type. + /// + public abstract string Name { get; } + + /// + /// Gets the fully qualified name of the type. + /// + public virtual string QualifiedName => Name; } /// @@ -17,6 +27,8 @@ protected TypeReference(SourceRange location) : base(location) { } public class PrimitiveType : TypeReference { public PrimitiveTypeKind Kind { get; } + + public override string Name => Kind.ToString().ToLower(); public PrimitiveType(SourceRange location, PrimitiveTypeKind kind) : base(location) { @@ -45,7 +57,9 @@ public enum PrimitiveTypeKind /// public class ClassOrInterfaceType : TypeReference { - public string Name { get; } + private readonly string _name; + + public override string Name => _name; public ClassOrInterfaceType? Scope { get; } public IReadOnlyList TypeArguments { get; } public IReadOnlyList Annotations { get; } @@ -57,7 +71,7 @@ public ClassOrInterfaceType( IReadOnlyList typeArguments, IReadOnlyList annotations) : base(location) { - Name = name; + _name = name; Scope = scope; TypeArguments = typeArguments; Annotations = annotations; @@ -68,6 +82,8 @@ public ClassOrInterfaceType( } public string FullName => Scope != null ? $"{Scope.FullName}.{Name}" : Name; + + public override string QualifiedName => FullName; public override T Accept(IJavaVisitor visitor) => visitor.VisitClassOrInterfaceType(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitClassOrInterfaceType(this); @@ -80,6 +96,10 @@ public class ArrayType : TypeReference { public TypeReference ElementType { get; } public int Dimensions { get; } + + public override string Name => ElementType.Name + new string('[', Dimensions) + new string(']', Dimensions); + + public override string QualifiedName => ElementType.QualifiedName + new string('[', Dimensions) + new string(']', Dimensions); public ArrayType( SourceRange location, From 2cc1e3d2836eb64caa82fbbb24f5b1ef3d7041c2 Mon Sep 17 00:00:00 2001 From: Dave Friedel Date: Wed, 23 Jul 2025 05:10:45 -0400 Subject: [PATCH 2/4] new nested types --- IronJava.Core/AST/Nodes/TypeDeclarations.cs | 24 +++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/IronJava.Core/AST/Nodes/TypeDeclarations.cs b/IronJava.Core/AST/Nodes/TypeDeclarations.cs index db2b0cc..b679e23 100644 --- a/IronJava.Core/AST/Nodes/TypeDeclarations.cs +++ b/IronJava.Core/AST/Nodes/TypeDeclarations.cs @@ -48,6 +48,7 @@ public class ClassDeclaration : TypeDeclaration public TypeReference? SuperClass { get; } public IReadOnlyList Interfaces { get; } public IReadOnlyList Members { get; } + public IReadOnlyList NestedTypes { get; } public bool IsRecord { get; } public ClassDeclaration( @@ -59,6 +60,7 @@ public ClassDeclaration( TypeReference? superClass, IReadOnlyList interfaces, IReadOnlyList members, + IReadOnlyList nestedTypes, JavaDoc? javaDoc, bool isRecord = false) : base(location, name, modifiers, annotations, typeParameters, javaDoc) @@ -66,14 +68,16 @@ public ClassDeclaration( SuperClass = superClass; Interfaces = interfaces; Members = members; + NestedTypes = nestedTypes; IsRecord = isRecord; if (superClass != null) AddChild(superClass); AddChildren(interfaces); AddChildren(members); + AddChildren(nestedTypes); } - public override IEnumerable Body => Members; + public override IEnumerable Body => Members.Cast().Concat(NestedTypes); public override T Accept(IJavaVisitor visitor) => visitor.VisitClassDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitClassDeclaration(this); @@ -86,6 +90,7 @@ public class InterfaceDeclaration : TypeDeclaration { public IReadOnlyList ExtendedInterfaces { get; } public IReadOnlyList Members { get; } + public IReadOnlyList NestedTypes { get; } public InterfaceDeclaration( SourceRange location, @@ -95,17 +100,20 @@ public InterfaceDeclaration( IReadOnlyList typeParameters, IReadOnlyList extendedInterfaces, IReadOnlyList members, + IReadOnlyList nestedTypes, JavaDoc? javaDoc) : base(location, name, modifiers, annotations, typeParameters, javaDoc) { ExtendedInterfaces = extendedInterfaces; Members = members; + NestedTypes = nestedTypes; AddChildren(extendedInterfaces); AddChildren(members); + AddChildren(nestedTypes); } - public override IEnumerable Body => Members; + public override IEnumerable Body => Members.Cast().Concat(NestedTypes); public override T Accept(IJavaVisitor visitor) => visitor.VisitInterfaceDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitInterfaceDeclaration(this); @@ -119,6 +127,7 @@ public class EnumDeclaration : TypeDeclaration public IReadOnlyList Interfaces { get; } public IReadOnlyList Constants { get; } public IReadOnlyList Members { get; } + public IReadOnlyList NestedTypes { get; } public EnumDeclaration( SourceRange location, @@ -128,19 +137,22 @@ public EnumDeclaration( IReadOnlyList interfaces, IReadOnlyList constants, IReadOnlyList members, + IReadOnlyList nestedTypes, JavaDoc? javaDoc) : base(location, name, modifiers, annotations, new List(), javaDoc) { Interfaces = interfaces; Constants = constants; Members = members; + NestedTypes = nestedTypes; AddChildren(interfaces); AddChildren(constants); AddChildren(members); + AddChildren(nestedTypes); } - public override IEnumerable Body => Constants.Cast().Concat(Members); + public override IEnumerable Body => Constants.Cast().Concat(Members).Concat(NestedTypes); public override T Accept(IJavaVisitor visitor) => visitor.VisitEnumDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitEnumDeclaration(this); @@ -152,6 +164,7 @@ public EnumDeclaration( public class AnnotationDeclaration : TypeDeclaration { public IReadOnlyList Members { get; } + public IReadOnlyList NestedTypes { get; } public AnnotationDeclaration( SourceRange location, @@ -159,14 +172,17 @@ public AnnotationDeclaration( Modifiers modifiers, IReadOnlyList annotations, IReadOnlyList members, + IReadOnlyList nestedTypes, JavaDoc? javaDoc) : base(location, name, modifiers, annotations, new List(), javaDoc) { Members = members; + NestedTypes = nestedTypes; AddChildren(members); + AddChildren(nestedTypes); } - public override IEnumerable Body => Members; + public override IEnumerable Body => Members.Cast().Concat(NestedTypes); public override T Accept(IJavaVisitor visitor) => visitor.VisitAnnotationDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitAnnotationDeclaration(this); From 5439aeb081d2e8842e46e9901782226f7450c3d2 Mon Sep 17 00:00:00 2001 From: Dave Friedel Date: Wed, 23 Jul 2025 05:24:18 -0400 Subject: [PATCH 3/4] Resolved build errors 1. Fixed constructor calls in AstTransformer.cs by adding missing nestedTypes parameter 2. Fixed constructor calls in AstJsonSerializer.cs by adding logic to deserialize nestedTypes 3. Fixed constructor calls in AstBuilder.cs by adding empty nestedTypes lists and correct parameters 4. Fixed test files by updating ClassDeclaration constructors with proper parameters --- IronJava.Core/AST/Builders/AstBuilder.cs | 20 ++++++++++++------- .../AST/Transformation/AstTransformer.cs | 3 +++ .../Serialization/AstJsonSerializer.cs | 12 +++++++---- .../AstQueryAndTransformationTests.cs | 12 ++++++++--- IronJava.Tests/AstVisitorPatternTests.cs | 16 +++++++++++---- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/IronJava.Core/AST/Builders/AstBuilder.cs b/IronJava.Core/AST/Builders/AstBuilder.cs index bb5058b..45b79b1 100644 --- a/IronJava.Core/AST/Builders/AstBuilder.cs +++ b/IronJava.Core/AST/Builders/AstBuilder.cs @@ -201,7 +201,7 @@ private PrimitiveTypeKind ParsePrimitiveTypeKind(string typeName) return new ClassDeclaration( location, name, modifiers, annotations, typeParameters, - superClass, interfaces, members, javaDoc + superClass, interfaces, members, new List(), javaDoc, false ); } @@ -218,7 +218,7 @@ private PrimitiveTypeKind ParsePrimitiveTypeKind(string typeName) return new InterfaceDeclaration( location, name, modifiers, annotations, typeParameters, - extendedInterfaces, members, javaDoc + extendedInterfaces, members, new List(), javaDoc ); } @@ -236,7 +236,7 @@ private PrimitiveTypeKind ParsePrimitiveTypeKind(string typeName) return new EnumDeclaration( location, name, modifiers, annotations, - interfaces, constants, members, javaDoc + interfaces, constants, members, new List(), javaDoc ); } @@ -250,7 +250,7 @@ private PrimitiveTypeKind ParsePrimitiveTypeKind(string typeName) var javaDoc = ExtractJavaDoc(context); return new AnnotationDeclaration( - location, name, modifiers, annotations, members, javaDoc + location, name, modifiers, annotations, members, new List(), javaDoc ); } @@ -1125,7 +1125,9 @@ private List BuildEnumConstants(Java9Parser.EnumConstantListContex null, new List(), members, - null + new List(), + null, + false ); } @@ -2108,7 +2110,9 @@ private string UnescapeStringLiteral(string literal) type, new List(), members, - null + new List(), + null, + false ); } @@ -2829,7 +2833,9 @@ private BlockStatement BuildBlockFromStatements(Java9Parser.BlockStatementsConte type, new List(), members, - null + new List(), + null, + false ); } diff --git a/IronJava.Core/AST/Transformation/AstTransformer.cs b/IronJava.Core/AST/Transformation/AstTransformer.cs index 37181cb..2feb93d 100644 --- a/IronJava.Core/AST/Transformation/AstTransformer.cs +++ b/IronJava.Core/AST/Transformation/AstTransformer.cs @@ -149,6 +149,7 @@ public IdentifierRenamer(string oldName, string newName) node.SuperClass, node.Interfaces, transformedMembers, + node.NestedTypes, node.JavaDoc, node.IsRecord ); @@ -201,6 +202,7 @@ public static ModifierTransformer RemoveModifier(Modifiers modifier) node.SuperClass, node.Interfaces, transformedMembers, + node.NestedTypes, node.JavaDoc, node.IsRecord ); @@ -336,6 +338,7 @@ public NodeRemover(Func shouldRemove) node.SuperClass, node.Interfaces, transformedMembers, + node.NestedTypes, node.JavaDoc, node.IsRecord ); diff --git a/IronJava.Core/Serialization/AstJsonSerializer.cs b/IronJava.Core/Serialization/AstJsonSerializer.cs index 79f8456..cc7bd34 100644 --- a/IronJava.Core/Serialization/AstJsonSerializer.cs +++ b/IronJava.Core/Serialization/AstJsonSerializer.cs @@ -829,9 +829,10 @@ private ClassDeclaration DeserializeClassDeclaration(JsonElement element, Source var interfaces = DeserializeList(element.GetProperty("interfaces")); var members = DeserializeList(element.GetProperty("members")); + var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); var isRecord = element.GetProperty("isRecord").GetBoolean(); - return new ClassDeclaration(location, name, modifiers, annotations, typeParameters, superClass, interfaces, members, javaDoc, isRecord); + return new ClassDeclaration(location, name, modifiers, annotations, typeParameters, superClass, interfaces, members, nestedTypes, javaDoc, isRecord); } private InterfaceDeclaration DeserializeInterfaceDeclaration(JsonElement element, SourceRange location) @@ -846,8 +847,9 @@ private InterfaceDeclaration DeserializeInterfaceDeclaration(JsonElement element var extendedInterfaces = DeserializeList(element.GetProperty("extendedInterfaces")); var members = DeserializeList(element.GetProperty("members")); + var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); - return new InterfaceDeclaration(location, name, modifiers, annotations, typeParameters, extendedInterfaces, members, javaDoc); + return new InterfaceDeclaration(location, name, modifiers, annotations, typeParameters, extendedInterfaces, members, nestedTypes, javaDoc); } private EnumDeclaration DeserializeEnumDeclaration(JsonElement element, SourceRange location) @@ -862,8 +864,9 @@ private EnumDeclaration DeserializeEnumDeclaration(JsonElement element, SourceRa var interfaces = DeserializeList(element.GetProperty("interfaces")); var constants = DeserializeList(element.GetProperty("constants")); var members = DeserializeList(element.GetProperty("members")); + var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); - return new EnumDeclaration(location, name, modifiers, annotations, interfaces, constants, members, javaDoc); + return new EnumDeclaration(location, name, modifiers, annotations, interfaces, constants, members, nestedTypes, javaDoc); } private AnnotationDeclaration DeserializeAnnotationDeclaration(JsonElement element, SourceRange location) @@ -876,8 +879,9 @@ private AnnotationDeclaration DeserializeAnnotationDeclaration(JsonElement eleme : null; var members = DeserializeList(element.GetProperty("members")); + var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); - return new AnnotationDeclaration(location, name, modifiers, annotations, members, javaDoc); + return new AnnotationDeclaration(location, name, modifiers, annotations, members, nestedTypes, javaDoc); } private FieldDeclaration DeserializeFieldDeclaration(JsonElement element, SourceRange location) diff --git a/IronJava.Tests/AstQueryAndTransformationTests.cs b/IronJava.Tests/AstQueryAndTransformationTests.cs index 58e1523..c61ab8c 100644 --- a/IronJava.Tests/AstQueryAndTransformationTests.cs +++ b/IronJava.Tests/AstQueryAndTransformationTests.cs @@ -246,7 +246,9 @@ public void TransformationBuilderWorks() null ) }, - null + new List(), + null, + false ); var builder = new TransformationBuilder() @@ -348,7 +350,9 @@ private CompilationUnit CreateSampleCompilationUnit() null, new List(), new List { mainMethod, helperMethod, field }, - null + new List(), + null, + false ); return new CompilationUnit( @@ -393,7 +397,9 @@ private CompilationUnit CreateComplexCompilationUnit() null, new List { serializableInterface }, new List { serializeMethod }, - null + new List(), + null, + false ); return new CompilationUnit( diff --git a/IronJava.Tests/AstVisitorPatternTests.cs b/IronJava.Tests/AstVisitorPatternTests.cs index 189ee9a..03a20a2 100644 --- a/IronJava.Tests/AstVisitorPatternTests.cs +++ b/IronJava.Tests/AstVisitorPatternTests.cs @@ -55,7 +55,9 @@ public void DemonstratesTypedASTStructure() null, new List(), new List { mainMethod }, - null + new List(), + null, + false ); var compilationUnit = new CompilationUnit( @@ -137,7 +139,9 @@ public void DemonstratesASTNavigation() null, new List(), new List(), - null + new List(), + null, + false ); var outerClass = new ClassDeclaration( @@ -149,7 +153,9 @@ public void DemonstratesASTNavigation() null, new List(), new List(), - null + new List(), + null, + false ); // Navigate the AST @@ -194,7 +200,9 @@ public void DemonstratesPrettyPrinting() null, new List(), new List { field }, - null + new List(), + null, + false ); var compilationUnit = new CompilationUnit( From 6b1f3d712492d5dab44e90f5de437976f63ebdee Mon Sep 17 00:00:00 2001 From: Dave Friedel Date: Wed, 23 Jul 2025 05:31:44 -0400 Subject: [PATCH 4/4] Update AstJsonSerializer.cs --- .../Serialization/AstJsonSerializer.cs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/IronJava.Core/Serialization/AstJsonSerializer.cs b/IronJava.Core/Serialization/AstJsonSerializer.cs index cc7bd34..79d6b67 100644 --- a/IronJava.Core/Serialization/AstJsonSerializer.cs +++ b/IronJava.Core/Serialization/AstJsonSerializer.cs @@ -154,6 +154,7 @@ private Dictionary SerializeLocation(SourceRange location) result["superClass"] = node.SuperClass?.Accept(this); result["interfaces"] = node.Interfaces.Select(i => i.Accept(this)).ToList(); result["members"] = node.Members.Select(m => m.Accept(this)).ToList(); + result["nestedTypes"] = node.NestedTypes.Select(t => t.Accept(this)).ToList(); result["isRecord"] = node.IsRecord; return result; } @@ -163,6 +164,7 @@ private Dictionary SerializeLocation(SourceRange location) var result = CreateTypeDeclarationBase(node); result["extendedInterfaces"] = node.ExtendedInterfaces.Select(i => i.Accept(this)).ToList(); result["members"] = node.Members.Select(m => m.Accept(this)).ToList(); + result["nestedTypes"] = node.NestedTypes.Select(t => t.Accept(this)).ToList(); return result; } @@ -172,6 +174,7 @@ private Dictionary SerializeLocation(SourceRange location) result["interfaces"] = node.Interfaces.Select(i => i.Accept(this)).ToList(); result["constants"] = node.Constants.Select(c => c.Accept(this)).ToList(); result["members"] = node.Members.Select(m => m.Accept(this)).ToList(); + result["nestedTypes"] = node.NestedTypes.Select(t => t.Accept(this)).ToList(); return result; } @@ -179,6 +182,7 @@ private Dictionary SerializeLocation(SourceRange location) { var result = CreateTypeDeclarationBase(node); result["members"] = node.Members.Select(m => m.Accept(this)).ToList(); + result["nestedTypes"] = node.NestedTypes.Select(t => t.Accept(this)).ToList(); return result; } @@ -829,8 +833,12 @@ private ClassDeclaration DeserializeClassDeclaration(JsonElement element, Source var interfaces = DeserializeList(element.GetProperty("interfaces")); var members = DeserializeList(element.GetProperty("members")); - var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); - var isRecord = element.GetProperty("isRecord").GetBoolean(); + var nestedTypes = element.TryGetProperty("nestedTypes", out var nestedTypesEl) + ? DeserializeList(nestedTypesEl) + : new List(); + var isRecord = element.TryGetProperty("isRecord", out var isRecordEl) + ? isRecordEl.GetBoolean() + : false; return new ClassDeclaration(location, name, modifiers, annotations, typeParameters, superClass, interfaces, members, nestedTypes, javaDoc, isRecord); } @@ -847,7 +855,9 @@ private InterfaceDeclaration DeserializeInterfaceDeclaration(JsonElement element var extendedInterfaces = DeserializeList(element.GetProperty("extendedInterfaces")); var members = DeserializeList(element.GetProperty("members")); - var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); + var nestedTypes = element.TryGetProperty("nestedTypes", out var nestedTypesEl) + ? DeserializeList(nestedTypesEl) + : new List(); return new InterfaceDeclaration(location, name, modifiers, annotations, typeParameters, extendedInterfaces, members, nestedTypes, javaDoc); } @@ -864,7 +874,9 @@ private EnumDeclaration DeserializeEnumDeclaration(JsonElement element, SourceRa var interfaces = DeserializeList(element.GetProperty("interfaces")); var constants = DeserializeList(element.GetProperty("constants")); var members = DeserializeList(element.GetProperty("members")); - var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); + var nestedTypes = element.TryGetProperty("nestedTypes", out var nestedTypesEl) + ? DeserializeList(nestedTypesEl) + : new List(); return new EnumDeclaration(location, name, modifiers, annotations, interfaces, constants, members, nestedTypes, javaDoc); } @@ -879,7 +891,9 @@ private AnnotationDeclaration DeserializeAnnotationDeclaration(JsonElement eleme : null; var members = DeserializeList(element.GetProperty("members")); - var nestedTypes = DeserializeList(element.GetProperty("nestedTypes")); + var nestedTypes = element.TryGetProperty("nestedTypes", out var nestedTypesEl) + ? DeserializeList(nestedTypesEl) + : new List(); return new AnnotationDeclaration(location, name, modifiers, annotations, members, nestedTypes, javaDoc); }