kaitai_struct_compiler
kaitai_struct_compiler copied to clipboard
Make `InvalidIdentifier` exception subclass of `ExpressionError` to report invalid attributes correctly
The test
# expr_bad_id_inst_value.ksy: /instances/foo/value:
# error: invalid ID: 'BAD', expected /^[a-z][a-z0-9_]*$/
#
meta:
id: expr_bad_id_inst_value
instances:
foo:
value: BAD
Fixes test which instead of reporting error shows this exception:
[info] - expr_bad_id_inst_value *** FAILED ***
[info] io.kaitai.struct.format.InvalidIdentifier: invalid ID: 'BAD', expected /^[a-z][a-z0-9_]*$/
[info] at io.kaitai.struct.format.Identifier$.checkIdentifier(Identifier.scala:52)
[info] at io.kaitai.struct.format.InstanceIdentifier.<init>(Identifier.scala:113)
[info] at io.kaitai.struct.ClassTypeProvider.resolveMember(ClassTypeProvider.scala:83)
[info] at io.kaitai.struct.ClassTypeProvider.determineType(ClassTypeProvider.scala:46)
[info] at io.kaitai.struct.ClassTypeProvider.determineType(ClassTypeProvider.scala:20)
[info] at io.kaitai.struct.translators.TypeDetector.detectTypeRaw(TypeDetector.scala:61)
[info] at io.kaitai.struct.translators.TypeDetector.detectType(TypeDetector.scala:25)
[info] at io.kaitai.struct.precompile.ValueTypesDeriver.$anonfun$deriveValueType$2(ValueTypesDeriver.scala:28)
[info] at io.kaitai.struct.precompile.ValueTypesDeriver.$anonfun$deriveValueType$2$adapted(ValueTypesDeriver.scala:21)
[info] at scala.collection.immutable.RedBlackTree$.foreach(RedBlackTree.scala:291)
[info] ...
Actually, I think, that this is incorrect test. You should check attribute IDs when you defines attribute, not when you use it. Obviously, you use that name with which attribute is defined. I expect, that this test will report unknown attribute BAD even when it is obviously violates ID requirements