From a03420c2b42697e4fabf8a9a06826d9bd5fec0c3 Mon Sep 17 00:00:00 2001 From: Petr Pucil Date: Sun, 7 Apr 2024 12:36:26 +0200 Subject: [PATCH] Fix missing checks that args match top-level `params` Fixes https://github.com/kaitai-io/kaitai_struct/issues/1086 Until now, top-level types were treated the same as opaque types, which had the unintended consequence that arguments passed to top-level types were not validated against the number and data types of declared parameters. This commit fixes the `formats_err` tests added in https://github.com/kaitai-io/kaitai_struct_tests/commit/9d518e6816f2a18d6459423aad23c77450cb6ab6 - more specifically, these failures in `sbt test` output are now fixed: ``` - params_call_bad_type_top_import *** FAILED *** [] did not equal [params_call_bad_type_top_import.ksy: /seq/0/type: error: can't pass argument #1 of type CalcFloatType into parameter `has_trailer` of type CalcBooleanType ] (SimpleMatchers.scala:34) - params_call_bad_type_top_local *** FAILED *** [] did not equal [params_call_bad_type_top_local.ksy: /seq/0/type: error: can't pass argument #1 of type CalcFloatType into parameter `has_trailer` of type CalcBooleanType ] (SimpleMatchers.scala:34) - params_call_too_many_top_import *** FAILED *** [] did not equal [params_call_too_many_top_import.ksy: /seq/0/type: error: parameter count mismatch: 2 declared, but 3 used ] (SimpleMatchers.scala:34) - params_call_too_many_top_local *** FAILED *** [] did not equal [params_call_too_many_top_local.ksy: /seq/0/type: error: parameter count mismatch: 2 declared, but 3 used ] (SimpleMatchers.scala:34) ``` --- shared/src/main/scala/io/kaitai/struct/datatype/DataType.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/main/scala/io/kaitai/struct/datatype/DataType.scala b/shared/src/main/scala/io/kaitai/struct/datatype/DataType.scala index 7316bbcdd..b5b0317b5 100644 --- a/shared/src/main/scala/io/kaitai/struct/datatype/DataType.scala +++ b/shared/src/main/scala/io/kaitai/struct/datatype/DataType.scala @@ -174,7 +174,7 @@ object DataType { classSpec.get.isExternal(curClass) def isOpaque = { val cs = classSpec.get - cs.isTopLevel || cs.meta.isOpaque + cs.meta.isOpaque } } case class UserTypeInstream(