Skip to content

Commit 6830e6b

Browse files
committed
Fix paths in "duplicate attribute ID '$ID', previously defined at $PATH" errors
Error count: 58 -> 51 (-7). Fixed: [info] - id_clash_params_vs_inst_pos *** FAILED *** [info] [id_clash_params_vs_inst_pos.ksy: /instances/foo: [info] error: duplicate attribute ID 'foo', previously defined at /params/0 [info] ] [info] did not equal [info] [id_clash_params_vs_inst_pos.ksy: /instances/foo: [info] error: duplicate attribute ID 'foo', previously defined at /params/0/id [info] ] (SimpleMatchers.scala:34) [info] - id_clash_params_vs_inst_value *** FAILED *** [info] [id_clash_params_vs_inst_value.ksy: /instances/bar: [info] error: duplicate attribute ID 'bar', previously defined at /params/1 [info] ] [info] did not equal [info] [id_clash_params_vs_inst_value.ksy: /instances/bar: [info] error: duplicate attribute ID 'bar', previously defined at /params/1/id [info] ] (SimpleMatchers.scala:34) [info] - id_clash_params_vs_seq *** FAILED *** [info] [id_clash_params_vs_seq.ksy: /seq/0: [info] error: duplicate attribute ID 'foo', previously defined at /params/1 [info] ] [info] did not equal [info] [id_clash_params_vs_seq.ksy: /seq/0/id: [info] error: duplicate attribute ID 'foo', previously defined at /params/1/id [info] ] (SimpleMatchers.scala:34) [info] - id_clash_seq_vs_inst_pos *** FAILED *** [info] [id_clash_seq_vs_inst_pos.ksy: /instances/foo: [info] error: duplicate attribute ID 'foo', previously defined at /seq/0 [info] ] [info] did not equal [info] [id_clash_seq_vs_inst_pos.ksy: /instances/foo: [info] error: duplicate attribute ID 'foo', previously defined at /seq/0/id [info] ] (SimpleMatchers.scala:34) [info] - id_clash_seq_vs_inst_value *** FAILED *** [info] [id_clash_seq_vs_inst_value.ksy: /instances/bar: [info] error: duplicate attribute ID 'bar', previously defined at /seq/1 [info] ] [info] did not equal [info] [id_clash_seq_vs_inst_value.ksy: /instances/bar: [info] error: duplicate attribute ID 'bar', previously defined at /seq/1/id [info] ] (SimpleMatchers.scala:34) [info] - id_dup_params *** FAILED *** [info] [id_dup_params.ksy: /params/2: [info] error: duplicate attribute ID 'foo', previously defined at /params/0 [info] ] [info] did not equal [info] [id_dup_params.ksy: /params/2/id: [info] error: duplicate attribute ID 'foo', previously defined at /params/0/id [info] ] (SimpleMatchers.scala:34) [info] - id_dup_seq *** FAILED *** [info] [id_dup_seq.ksy: /seq/2: [info] error: duplicate attribute ID 'foo', previously defined at /seq/0 [info] ] [info] did not equal [info] [id_dup_seq.ksy: /seq/2/id: [info] error: duplicate attribute ID 'foo', previously defined at /seq/0/id [info] ] (SimpleMatchers.scala:34)
1 parent 639e3eb commit 6830e6b

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

shared/src/main/scala/io/kaitai/struct/format/ClassSpec.scala

+12-2
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,19 @@ object ClassSpec {
253253
private def checkDupId(prevAttrOpt: Option[MemberSpec], id: String, nowAttr: YAMLPath): Unit = {
254254
prevAttrOpt match {
255255
case Some(prevAttr) =>
256+
// Report error at position where referenced param / attribute / instance is defined.
257+
// Add `id` for attributes in `seq` and `params`, do not add for instances
258+
val path = nowAttr match {
259+
case _: InstanceSpec => nowAttr.path
260+
case _ => nowAttr.path :+ "id"
261+
}
262+
val prevPath = prevAttr match {
263+
case _: InstanceSpec => prevAttr.path
264+
case _ => prevAttr.path :+ "id"
265+
}
256266
throw KSYParseError.withText(
257-
s"duplicate attribute ID '$id', previously defined at /${prevAttr.pathStr}",
258-
nowAttr.path
267+
s"duplicate attribute ID '$id', previously defined at /${prevPath.mkString("/")}",
268+
path
259269
)
260270
case None =>
261271
// no dups, ok

0 commit comments

Comments
 (0)