From b2ec9e54d78b1485f27d1b74be8eaf8b868b8ed6 Mon Sep 17 00:00:00 2001 From: Petr Pucil Date: Sun, 7 Apr 2024 11:56:03 +0200 Subject: [PATCH] Generate imports also for imported nested types ..., not only for imported top-level types as before. Fixes https://github.com/kaitai-io/kaitai_struct/issues/703 Fixes the NestedTypesImport test in those target languages where the necessary imports were missing (C++, JavaScript, Python) --- .../main/scala/io/kaitai/struct/ClassCompiler.scala | 3 +-- .../main/scala/io/kaitai/struct/TypeProcessor.scala | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/shared/src/main/scala/io/kaitai/struct/ClassCompiler.scala b/shared/src/main/scala/io/kaitai/struct/ClassCompiler.scala index f26b6e5ea..feb7d3043 100644 --- a/shared/src/main/scala/io/kaitai/struct/ClassCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/ClassCompiler.scala @@ -31,8 +31,7 @@ class ClassCompiler( def compileOpaqueClasses(topClass: ClassSpec) = { TypeProcessor.getOpaqueClasses(topClass).foreach((classSpec) => - if (classSpec != topClass) - lang.opaqueClassDeclaration(classSpec) + lang.opaqueClassDeclaration(classSpec) ) } diff --git a/shared/src/main/scala/io/kaitai/struct/TypeProcessor.scala b/shared/src/main/scala/io/kaitai/struct/TypeProcessor.scala index 92314ae9d..51c2c0050 100644 --- a/shared/src/main/scala/io/kaitai/struct/TypeProcessor.scala +++ b/shared/src/main/scala/io/kaitai/struct/TypeProcessor.scala @@ -10,12 +10,12 @@ object TypeProcessor { def getOpaqueClasses(curClass: ClassSpec): Iterable[ClassSpec] = { val res = mutable.Set[ClassSpec]() curClass.seq.map((attr) => - res ++= getOpaqueDataTypes(attr.dataType) + res ++= getOpaqueDataTypes(attr.dataType, curClass) ) curClass.instances.foreach { case (_, inst) => inst match { case pis: ParseInstanceSpec => - res ++= getOpaqueDataTypes(pis.dataType) + res ++= getOpaqueDataTypes(pis.dataType, curClass) case _ => None } } @@ -28,17 +28,17 @@ object TypeProcessor { res } - def getOpaqueDataTypes(dataType: DataType): Iterable[ClassSpec] = { + def getOpaqueDataTypes(dataType: DataType, curClass: ClassSpec): Iterable[ClassSpec] = { dataType match { case ut: UserType => - if (ut.isOpaque) { + if (ut.isExternal(curClass)) { List(ut.classSpec.get) } else { List() } case st: SwitchType => st.cases.flatMap { case (_, ut) => - getOpaqueDataTypes(ut) + getOpaqueDataTypes(ut, curClass) } case _ => // all other types are not opaque external user types