From 4127484a079a53fd8d68a80a6635cd3b3dbaf548 Mon Sep 17 00:00:00 2001 From: Mingun Date: Tue, 24 Nov 2020 10:29:59 +0500 Subject: [PATCH 1/2] Rename EnumByLabel & Co to EnumVariant and document them --- .../kaitai/struct/exprlang/ExpressionsSpec.scala | 10 +++++----- .../io/kaitai/struct/GraphvizClassCompiler.scala | 2 +- .../main/scala/io/kaitai/struct/exprlang/Ast.scala | 9 ++++++++- .../io/kaitai/struct/exprlang/Expressions.scala | 11 ++++++----- .../io/kaitai/struct/languages/JavaCompiler.scala | 4 ++-- .../kaitai/struct/translators/BaseTranslator.scala | 14 +++++++++++--- .../struct/translators/CSharpTranslator.scala | 4 ++-- .../struct/translators/ConstructTranslator.scala | 4 ++-- .../kaitai/struct/translators/CppTranslator.scala | 4 ++-- .../struct/translators/ExpressionValidator.scala | 6 +++--- .../kaitai/struct/translators/GoTranslator.scala | 8 ++++---- .../struct/translators/JavaScriptTranslator.scala | 4 ++-- .../kaitai/struct/translators/JavaTranslator.scala | 4 ++-- .../kaitai/struct/translators/LuaTranslator.scala | 4 ++-- .../kaitai/struct/translators/NimTranslator.scala | 4 ++-- .../kaitai/struct/translators/PHPTranslator.scala | 4 ++-- .../kaitai/struct/translators/PerlTranslator.scala | 4 ++-- .../struct/translators/PythonTranslator.scala | 4 ++-- .../kaitai/struct/translators/RubyTranslator.scala | 4 ++-- .../kaitai/struct/translators/RustTranslator.scala | 4 ++-- .../kaitai/struct/translators/TypeDetector.scala | 2 +- 21 files changed, 65 insertions(+), 49 deletions(-) diff --git a/jvm/src/test/scala/io/kaitai/struct/exprlang/ExpressionsSpec.scala b/jvm/src/test/scala/io/kaitai/struct/exprlang/ExpressionsSpec.scala index 309630fac..f260ffc46 100644 --- a/jvm/src/test/scala/io/kaitai/struct/exprlang/ExpressionsSpec.scala +++ b/jvm/src/test/scala/io/kaitai/struct/exprlang/ExpressionsSpec.scala @@ -133,12 +133,12 @@ class ExpressionsSpec extends AnyFunSpec { // Enums it("parses port::http") { - Expressions.parse("port::http") should be (EnumByLabel(identifier("port"), identifier("http"))) + Expressions.parse("port::http") should be (EnumVariant(identifier("port"), identifier("http"))) } it("parses some_type::port::http") { Expressions.parse("some_type::port::http") should be ( - EnumByLabel( + EnumVariant( identifier("port"), identifier("http"), typeId(absolute = false, Seq("some_type")) @@ -148,7 +148,7 @@ class ExpressionsSpec extends AnyFunSpec { it("parses parent_type::child_type::port::http") { Expressions.parse("parent_type::child_type::port::http") should be ( - EnumByLabel( + EnumVariant( identifier("port"), identifier("http"), typeId(absolute = false, Seq("parent_type", "child_type")) @@ -158,7 +158,7 @@ class ExpressionsSpec extends AnyFunSpec { it("parses ::parent_type::child_type::port::http") { Expressions.parse("::parent_type::child_type::port::http") should be ( - EnumByLabel( + EnumVariant( identifier("port"), identifier("http"), typeId(absolute = true, Seq("parent_type", "child_type")) @@ -171,7 +171,7 @@ class ExpressionsSpec extends AnyFunSpec { Compare( BinOp( Attribute( - EnumByLabel(identifier("port"),identifier("http")), + EnumVariant(identifier("port"),identifier("http")), identifier("to_i") ), Add, diff --git a/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala b/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala index 22c746953..3bed2e72b 100644 --- a/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala @@ -345,7 +345,7 @@ class GraphvizClassCompiler(classSpecs: ClassSpecs, topClass: ClassSpec) extends affectedVars(left) ++ affectedVars(right) case Ast.expr.IntNum(_) | Ast.expr.FloatNum(_) | Ast.expr.Str(_) | Ast.expr.Bool(_) => List() - case _: Ast.expr.EnumByLabel => + case _: Ast.expr.EnumVariant => List() case Ast.expr.EnumById(_, id, _) => affectedVars(id) diff --git a/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala b/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala index 2acf1943b..e80c79eee 100644 --- a/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala +++ b/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala @@ -76,7 +76,14 @@ object Ast { case class FloatNum(n: BigDecimal) extends expr case class Str(s: String) extends expr case class Bool(n: Boolean) extends expr - case class EnumByLabel(enumName: identifier, label: identifier, inType: typeId = EmptyTypeId) extends expr + /** + * Reference to the enum variant `variant` in the enumeration `enumName`, + * defined in the type `inType`. In expression language represented as + * `enumName::variant` or `::enumName::variant` where `` + * can be an absolute or a relative path to the type, defined in the current + * KSY file. + */ + case class EnumVariant(enumName: identifier, variant: identifier, inType: typeId = EmptyTypeId) extends expr case class EnumById(enumName: identifier, id: expr, inType: typeId = EmptyTypeId) extends expr case class Attribute(value: expr, attr: identifier) extends expr diff --git a/shared/src/main/scala/io/kaitai/struct/exprlang/Expressions.scala b/shared/src/main/scala/io/kaitai/struct/exprlang/Expressions.scala index 0ef98ce71..7fe7a6d0c 100644 --- a/shared/src/main/scala/io/kaitai/struct/exprlang/Expressions.scala +++ b/shared/src/main/scala/io/kaitai/struct/exprlang/Expressions.scala @@ -125,7 +125,7 @@ object Expressions { "(" ~ test ~ ")" | "[" ~ list ~ "]" | // "{" ~ dictorsetmaker ~ "}" | - enumByName | + enumVariant | byteSizeOfType | bitSizeOfType | fstring | @@ -167,17 +167,18 @@ object Expressions { def testlist1[$: P]: P[Seq[Ast.expr]] = P( test.rep(1, sep = ",") ) - def enumByName[$: P]: P[Ast.expr.EnumByLabel] = P("::".!.? ~ NAME.rep(2, "::")).map { + /** Parses reference to an enumeration variant. */ + def enumVariant[$: P]: P[Ast.expr.EnumVariant] = P("::".!.? ~ NAME.rep(2, "::")).map { case (first, names: Seq[Ast.identifier]) => val isAbsolute = first.nonEmpty - val (enumName, enumLabel) = names.takeRight(2) match { + val (enumName, variant) = names.takeRight(2) match { case Seq(a, b) => (a, b) } val typePath = names.dropRight(2) if (typePath.isEmpty) { - Ast.expr.EnumByLabel(enumName, enumLabel, Ast.EmptyTypeId) + Ast.expr.EnumVariant(enumName, variant, Ast.EmptyTypeId) } else { - Ast.expr.EnumByLabel(enumName, enumLabel, Ast.typeId(isAbsolute, typePath.map(_.name))) + Ast.expr.EnumVariant(enumName, variant, Ast.typeId(isAbsolute, typePath.map(_.name))) } } diff --git a/shared/src/main/scala/io/kaitai/struct/languages/JavaCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/JavaCompiler.scala index ee19058d3..7ef310297 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/JavaCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/JavaCompiler.scala @@ -587,10 +587,10 @@ class JavaCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) // Java is very specific about what can be used as "condition" in "case // condition:". val condStr = condition match { - case enumByLabel: Ast.expr.EnumByLabel => + case variant: Ast.expr.EnumVariant => // If switch is over a enum, only literal enum values are supported, // and they must be written as "MEMBER", not "SomeEnum.MEMBER". - value2Const(enumByLabel.label.name) + value2Const(variant.variant.name) case _ => expression(condition) } diff --git a/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala index 421038bfa..d04a293a7 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala @@ -62,9 +62,9 @@ abstract class BaseTranslator(val provider: TypeProvider) case Ast.expr.EnumById(enumType, id, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) doEnumById(enumSpec, translate(id)) - case Ast.expr.EnumByLabel(enumType, label, inType) => + case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) - doEnumByLabel(enumSpec, label.name) + doEnumVariant(enumSpec, variant.name) case Ast.expr.Name(name: Ast.identifier) => if (name.name == Identifier.SIZEOF) { byteSizeOfClassSpec(provider.nowClass) @@ -186,7 +186,15 @@ abstract class BaseTranslator(val provider: TypeProvider) def kaitaiStructField(value: Ast.expr, name: String): String = anyField(value, name) - def doEnumByLabel(enumSpec: EnumSpec, label: String): String + /** + * Translates reference to the enum variant into target language + * + * @param enumSpec An enum definition + * @param variant Enum variant + * + * @return String in the target language with reference to the enum variant + */ + def doEnumVariant(enumSpec: EnumSpec, variant: String): String def doEnumById(enumSpec: EnumSpec, id: String): String // Predefined methods of various types diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala index 9fdfedc99..fe6fc828c 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala @@ -61,8 +61,8 @@ class CSharpTranslator(provider: TypeProvider, importList: ImportList) extends B override def doInternalName(id: Identifier): String = CSharpCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - s"${enumClass(enumSpec.name)}.${Utils.upperCamelCase(label)}" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + s"${enumClass(enumSpec.name)}.${Utils.upperCamelCase(variant)}" override def doEnumById(enumSpec: EnumSpec, id: String): String = s"((${enumClass(enumSpec.name)}) $id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/ConstructTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/ConstructTranslator.scala index 7e25982dc..7677c2604 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/ConstructTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/ConstructTranslator.scala @@ -23,8 +23,8 @@ class ConstructTranslator(provider: TypeProvider, importList: ImportList) extend } } - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - s"'$label'" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + s"'$variant'" override def kaitaiStreamSize(value: Ast.expr): String = s"stream_size(${translate(value)})" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala index dccb1c0ab..23964d0cb 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala @@ -142,13 +142,13 @@ class CppTranslator(provider: TypeProvider, importListSrc: CppImportList, import override def doInternalName(id: Identifier): String = CppCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = { + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = { val isExternal = enumSpec.isExternal(provider.nowClass) if (isExternal) { importListHdr.addLocal(CppCompiler.outFileNameHeader(enumSpec.name.head)) } CppCompiler.types2class(enumSpec.name.dropRight(1)) + "::" + - Utils.upperUnderscoreCase(enumSpec.name.last + "_" + label) + Utils.upperUnderscoreCase(enumSpec.name.last + "_" + variant) } override def doEnumById(enumSpec: EnumSpec, id: String): String = s"static_cast<${CppCompiler.types2class(enumSpec.name)}>($id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala b/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala index 8d2741282..50c6f43f4 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala @@ -34,10 +34,10 @@ class ExpressionValidator(val provider: TypeProvider) case Ast.expr.EnumById(enumType, id, inType) => provider.resolveEnum(inType, enumType.name) validate(id) - case Ast.expr.EnumByLabel(enumType, label, inType) => + case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) - if (!enumSpec.map.values.exists(_.name == label.name)) { - throw new EnumMemberNotFoundError(label.name, enumType.name, enumSpec.path.mkString("/")) + if (!enumSpec.map.values.exists(_.name == variant.name)) { + throw new EnumMemberNotFoundError(variant.name, enumType.name, enumSpec.path.mkString("/")) } case Ast.expr.Name(name: Ast.identifier) => if (name.name == Identifier.SIZEOF) { diff --git a/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala index 28647aec8..57d8d874a 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala @@ -50,9 +50,9 @@ class GoTranslator(out: StringLanguageOutputWriter, provider: TypeProvider, impo case Ast.expr.EnumById(enumType, id, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) trEnumById(enumSpec.name, translate(id)) - case Ast.expr.EnumByLabel(enumType, label, inType) => + case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) - trEnumByLabel(enumSpec.name, label.name) + trEnumVariant(enumSpec.name, variant.name) case Ast.expr.Name(name: Ast.identifier) => if (name.name == Identifier.SIZEOF) { byteSizeOfClassSpec(provider.nowClass) @@ -253,8 +253,8 @@ class GoTranslator(out: StringLanguageOutputWriter, provider: TypeProvider, impo ResultLocalVar(v1) } - def trEnumByLabel(enumTypeAbs: List[String], label: String) = - ResultString(GoCompiler.enumToStr(enumTypeAbs, label)) + def trEnumVariant(enumTypeAbs: List[String], variant: String) = + ResultString(GoCompiler.enumToStr(enumTypeAbs, variant)) def trEnumById(enumTypeAbs: List[String], id: String) = ResultString(s"${types2class(enumTypeAbs)}($id)") diff --git a/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala index 867282002..62859cfec 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala @@ -56,13 +56,13 @@ class JavaScriptTranslator(provider: TypeProvider, importList: ImportList) exten override def doInternalName(id: Identifier): String = JavaScriptCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = { + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = { val isExternal = enumSpec.isExternal(provider.nowClass) if (isExternal) { val className = JavaScriptCompiler.type2class(enumSpec.name.head) importList.add(s"./$className") } - s"${JavaScriptCompiler.types2class(enumSpec.name, isExternal)}.${Utils.upperUnderscoreCase(label)}" + s"${JavaScriptCompiler.types2class(enumSpec.name, isExternal)}.${Utils.upperUnderscoreCase(variant)}" } override def doEnumById(enumSpec: EnumSpec, id: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually diff --git a/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala index 18eb78dda..320ce4fd0 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala @@ -66,8 +66,8 @@ class JavaTranslator(provider: TypeProvider, importList: ImportList) extends Bas override def doInternalName(id: Identifier): String = JavaCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - s"${enumClass(enumSpec.name)}.${Utils.upperUnderscoreCase(label)}" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + s"${enumClass(enumSpec.name)}.${Utils.upperUnderscoreCase(variant)}" override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${enumClass(enumSpec.name)}.byId($id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala index 5d45b0a3a..7bcbe857b 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala @@ -82,8 +82,8 @@ class LuaTranslator(provider: TypeProvider, importList: ImportList) extends Base override def doInternalName(id: Identifier): String = LuaCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - s"${LuaCompiler.types2class(enumSpec.name)}.$label" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + s"${LuaCompiler.types2class(enumSpec.name)}.$variant" override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${LuaCompiler.types2class(enumSpec.name)}($id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala index f82e00eb7..939e48313 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala @@ -15,8 +15,8 @@ class NimTranslator(provider: TypeProvider, importList: ImportList) extends Base s"""encode($bytesExpr, ${doStringLiteral(encoding)})""" } override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${namespaced(enumSpec.name)}($id)" -// override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = s"${namespaced(enumSpec.name)}($label)" - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = s"${enumSpec.name.head}.$label" +// override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${namespaced(enumSpec.name)}($variant)" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${enumSpec.name.head}.$variant" override def doName(s: String): String = s match { case Identifier.ROOT => "root" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala index dafc23b21..e1aaf41a3 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala @@ -70,9 +70,9 @@ class PHPTranslator(provider: TypeProvider, config: RuntimeConfig) extends BaseT override def doInternalName(id: Identifier): String = PHPCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = { + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = { val enumClass = types2classAbs(enumSpec.name) - s"$enumClass::${Utils.upperUnderscoreCase(label)}" + s"$enumClass::${Utils.upperUnderscoreCase(variant)}" } override def doEnumById(enumSpec: EnumSpec, id: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala index 9c57890e5..dd6e9d2bd 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala @@ -76,7 +76,7 @@ class PerlTranslator(provider: TypeProvider, importList: ImportList) extends Bas override def doInternalName(id: Identifier): String = PerlCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = { + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = { val isExternal = enumSpec.isExternal(provider.nowClass) if (isExternal) { importList.add(PerlCompiler.type2class(enumSpec.name.head)) @@ -84,7 +84,7 @@ class PerlTranslator(provider: TypeProvider, importList: ImportList) extends Bas val enumClass = PerlCompiler.types2class(enumSpec.name.init) val enumClassWithScope = if (enumClass.isEmpty) "" else s"$enumClass::" val enumName = Utils.upperUnderscoreCase(enumSpec.name.last) - s"$$$enumClassWithScope${enumName}_${Utils.upperUnderscoreCase(label)}" + s"$$$enumClassWithScope${enumName}_${Utils.upperUnderscoreCase(variant)}" } override def doEnumById(enumSpec: EnumSpec, id: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala index 8c91c010f..c0f6eceba 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala @@ -56,12 +56,12 @@ class PythonTranslator(provider: TypeProvider, importList: ImportList, config: R override def doInternalName(id: Identifier): String = PythonCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = { + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = { val isExternal = enumSpec.isExternal(provider.nowClass) if (isExternal) { PythonCompiler.externalTypeDeclaration(ExternalEnum(enumSpec), importList, config) } - s"${PythonCompiler.types2class(enumSpec.name, isExternal)}.$label" + s"${PythonCompiler.types2class(enumSpec.name, isExternal)}.$variant" } override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${PythonCompiler.kstreamName}.resolve_enum(${PythonCompiler.types2class(enumSpec.name, enumSpec.isExternal(provider.nowClass))}, $id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala index 8018430dc..7fe2b7007 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala @@ -40,8 +40,8 @@ class RubyTranslator(provider: TypeProvider) extends BaseTranslator(provider) override def doInternalName(id: Identifier): String = RubyCompiler.privateMemberName(id) - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - RubyCompiler.enumValue(enumSpec.name.last, label) + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + RubyCompiler.enumValue(enumSpec.name.last, variant) override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${RubyCompiler.kstreamName}::resolve_enum(${enumDirectMap(enumSpec.name)}, $id)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala index 788d49182..e461aa120 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala @@ -335,8 +335,8 @@ class RustTranslator(provider: TypeProvider, config: RuntimeConfig) override def doInternalName(id: Identifier): String = s"${doLocalName(idToStr(id))}" - override def doEnumByLabel(enumSpec: EnumSpec, label: String): String = - s"${RustCompiler.types2class(enumSpec.name)}::${Utils.upperCamelCase(label)}" + override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = + s"${RustCompiler.types2class(enumSpec.name)}::${Utils.upperCamelCase(variant)}" override def doNumericCompareOp(left: Ast.expr, op: Ast.cmpop, right: Ast.expr): String = { val lt = detectType(left) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala b/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala index 49cf61ef2..f711cbbdb 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala @@ -50,7 +50,7 @@ class TypeDetector(provider: TypeProvider) { case Ast.expr.Str(_) => CalcStrType case Ast.expr.InterpolatedStr(_) => CalcStrType case Ast.expr.Bool(_) => CalcBooleanType - case Ast.expr.EnumByLabel(enumType, _, inType) => + case Ast.expr.EnumVariant(enumType, _, inType) => val t = EnumType(inType.names.toList :+ enumType.name, CalcIntType) t.enumSpec = Some(provider.resolveEnum(inType, enumType.name)) t From 00629d9e8eaf048d19c33d96e186402859cc4a87 Mon Sep 17 00:00:00 2001 From: Mingun Date: Tue, 24 Nov 2020 11:10:04 +0500 Subject: [PATCH 2/2] Rename EnumById & Co to EnumCast and document them --- .../io/kaitai/struct/GraphvizClassCompiler.scala | 4 ++-- .../main/scala/io/kaitai/struct/exprlang/Ast.scala | 8 +++++++- .../io/kaitai/struct/format/InstanceSpec.scala | 4 ++-- .../components/EveryReadIsExpression.scala | 2 +- .../struct/languages/components/GoReads.scala | 2 +- .../kaitai/struct/translators/BaseTranslator.scala | 14 +++++++++++--- .../struct/translators/CSharpTranslator.scala | 4 ++-- .../kaitai/struct/translators/CppTranslator.scala | 4 ++-- .../struct/translators/ExpressionValidator.scala | 4 ++-- .../kaitai/struct/translators/GoTranslator.scala | 8 ++++---- .../struct/translators/JavaScriptTranslator.scala | 4 ++-- .../kaitai/struct/translators/JavaTranslator.scala | 4 ++-- .../kaitai/struct/translators/LuaTranslator.scala | 4 ++-- .../kaitai/struct/translators/NimTranslator.scala | 2 +- .../kaitai/struct/translators/PHPTranslator.scala | 4 ++-- .../kaitai/struct/translators/PerlTranslator.scala | 4 ++-- .../struct/translators/PythonTranslator.scala | 4 ++-- .../kaitai/struct/translators/RubyTranslator.scala | 4 ++-- .../kaitai/struct/translators/RustTranslator.scala | 6 +++--- .../kaitai/struct/translators/TypeDetector.scala | 2 +- 20 files changed, 53 insertions(+), 39 deletions(-) diff --git a/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala b/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala index 3bed2e72b..3e433eb18 100644 --- a/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/GraphvizClassCompiler.scala @@ -347,8 +347,8 @@ class GraphvizClassCompiler(classSpecs: ClassSpecs, topClass: ClassSpec) extends List() case _: Ast.expr.EnumVariant => List() - case Ast.expr.EnumById(_, id, _) => - affectedVars(id) + case Ast.expr.EnumCast(_, value, _) => + affectedVars(value) case Ast.expr.Attribute(value, attr) => if (attr.name == Identifier.SIZEOF) { val vars = value match { diff --git a/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala b/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala index e80c79eee..ce6795c52 100644 --- a/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala +++ b/shared/src/main/scala/io/kaitai/struct/exprlang/Ast.scala @@ -84,7 +84,13 @@ object Ast { * KSY file. */ case class EnumVariant(enumName: identifier, variant: identifier, inType: typeId = EmptyTypeId) extends expr - case class EnumById(enumName: identifier, id: expr, inType: typeId = EmptyTypeId) extends expr + /** + * Transformation of the `value` expression into the `enumName` type, + * defined in the type `inType`. Unlike other nodes this node never + * parsed from the expression language, because at parse time any + * identifier can represent an enum and actual resolution performed later + */ + case class EnumCast(enumName: identifier, value: expr, inType: typeId = EmptyTypeId) extends expr case class Attribute(value: expr, attr: identifier) extends expr case class CastToType(value: expr, typeName: typeId) extends expr diff --git a/shared/src/main/scala/io/kaitai/struct/format/InstanceSpec.scala b/shared/src/main/scala/io/kaitai/struct/format/InstanceSpec.scala index 4a66307ed..467019991 100644 --- a/shared/src/main/scala/io/kaitai/struct/format/InstanceSpec.scala +++ b/shared/src/main/scala/io/kaitai/struct/format/InstanceSpec.scala @@ -56,12 +56,12 @@ object InstanceSpec { // value instance ParseUtils.ensureLegalKeys(srcMap, LEGAL_KEYS_VALUE_INST, path, Some("value instance")) - // Wrap everything in EnumById if "enum" is used + // Wrap everything in EnumCast if "enum" is used val value2 = ParseUtils.getOptValueStr(srcMap, "enum", path) match { case None => value case Some(enumName) => - Ast.expr.EnumById(Ast.identifier(enumName), value) + Ast.expr.EnumCast(Ast.identifier(enumName), value) } val ifExpr = ParseUtils.getOptValueExpression(srcMap, "if", path) diff --git a/shared/src/main/scala/io/kaitai/struct/languages/components/EveryReadIsExpression.scala b/shared/src/main/scala/io/kaitai/struct/languages/components/EveryReadIsExpression.scala index 887239370..cdf957e16 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/components/EveryReadIsExpression.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/components/EveryReadIsExpression.scala @@ -51,7 +51,7 @@ trait EveryReadIsExpression val expr = translator.bytesToStr(parseExprBytes(t.bytes, io), t.encoding) handleAssignment(id, expr, rep, isRaw) case t: EnumType => - val expr = translator.doEnumById(t.enumSpec.get, parseExpr(t.basedOn, t.basedOn, io, defEndian)) + val expr = translator.doEnumCast(t.enumSpec.get, parseExpr(t.basedOn, t.basedOn, io, defEndian)) handleAssignment(id, expr, rep, isRaw) case _ => val expr = parseExpr(dataType, assignType, io, defEndian) diff --git a/shared/src/main/scala/io/kaitai/struct/languages/components/GoReads.scala b/shared/src/main/scala/io/kaitai/struct/languages/components/GoReads.scala index 9772ab647..4a8a5deb1 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/components/GoReads.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/components/GoReads.scala @@ -71,7 +71,7 @@ trait GoReads extends CommonReads with ObjectOrientedLanguage with GoSwitchOps { case t: EnumType => val r1 = translator.outVarCheckRes(parseExpr(t.basedOn, io, defEndian)) val enumSpec = t.enumSpec.get - val expr = translator.trEnumById(enumSpec.name, translator.resToStr(r1)) + val expr = translator.trEnumCast(enumSpec.name, translator.resToStr(r1)) handleAssignment(id, expr, rep, isRaw) case _: BitsType1 => val expr = parseExpr(dataType, io, defEndian) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala index d04a293a7..ce9bdf46c 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/BaseTranslator.scala @@ -59,9 +59,9 @@ abstract class BaseTranslator(val provider: TypeProvider) doInterpolatedStringLiteral(s) case Ast.expr.Bool(n) => doBoolLiteral(n) - case Ast.expr.EnumById(enumType, id, inType) => + case Ast.expr.EnumCast(enumType, value, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) - doEnumById(enumSpec, translate(id)) + doEnumCast(enumSpec, translate(value)) case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) doEnumVariant(enumSpec, variant.name) @@ -195,7 +195,15 @@ abstract class BaseTranslator(val provider: TypeProvider) * @return String in the target language with reference to the enum variant */ def doEnumVariant(enumSpec: EnumSpec, variant: String): String - def doEnumById(enumSpec: EnumSpec, id: String): String + /** + * Translates cast of expression to the enumeration type. + * + * @param enumSpec An enum definition + * @param value Translated expression which should have enum type + * + * @return String in the target language transformation of the expression result into enumeration type + */ + def doEnumCast(enumSpec: EnumSpec, value: String): String // Predefined methods of various types def strConcat(left: Ast.expr, right: Ast.expr, extPrec: Int) = diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala index fe6fc828c..b53da85ee 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CSharpTranslator.scala @@ -63,8 +63,8 @@ class CSharpTranslator(provider: TypeProvider, importList: ImportList) extends B override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${enumClass(enumSpec.name)}.${Utils.upperCamelCase(variant)}" - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"((${enumClass(enumSpec.name)}) $id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"((${enumClass(enumSpec.name)}) $value)" def enumClass(enumTypeAbs: List[String]): String = { val enumTypeRel = Utils.relClass(enumTypeAbs, provider.nowClass.name) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala index 23964d0cb..eb11dc113 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala @@ -150,8 +150,8 @@ class CppTranslator(provider: TypeProvider, importListSrc: CppImportList, import CppCompiler.types2class(enumSpec.name.dropRight(1)) + "::" + Utils.upperUnderscoreCase(enumSpec.name.last + "_" + variant) } - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"static_cast<${CppCompiler.types2class(enumSpec.name)}>($id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"static_cast<${CppCompiler.types2class(enumSpec.name)}>($value)" override def doStrCompareOp(left: Ast.expr, op: Ast.cmpop, right: Ast.expr) = { if (op == Ast.cmpop.Eq) { diff --git a/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala b/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala index 50c6f43f4..8a4ed4608 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/ExpressionValidator.scala @@ -31,9 +31,9 @@ class ExpressionValidator(val provider: TypeProvider) _: Ast.expr.FloatNum | _: Ast.expr.Str | _: Ast.expr.Bool => // all simple literals are good and valid - case Ast.expr.EnumById(enumType, id, inType) => + case Ast.expr.EnumCast(enumType, value, inType) => provider.resolveEnum(inType, enumType.name) - validate(id) + validate(value) case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) if (!enumSpec.map.values.exists(_.name == variant.name)) { diff --git a/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala index 57d8d874a..3fb6d3c3e 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/GoTranslator.scala @@ -47,9 +47,9 @@ class GoTranslator(out: StringLanguageOutputWriter, provider: TypeProvider, impo trInterpolatedStringLiteral(s) case Ast.expr.Bool(n) => trBoolLiteral(n) - case Ast.expr.EnumById(enumType, id, inType) => + case Ast.expr.EnumCast(enumType, value, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) - trEnumById(enumSpec.name, translate(id)) + trEnumCast(enumSpec.name, translate(value)) case Ast.expr.EnumVariant(enumType, variant, inType) => val enumSpec = provider.resolveEnum(inType, enumType.name) trEnumVariant(enumSpec.name, variant.name) @@ -255,8 +255,8 @@ class GoTranslator(out: StringLanguageOutputWriter, provider: TypeProvider, impo def trEnumVariant(enumTypeAbs: List[String], variant: String) = ResultString(GoCompiler.enumToStr(enumTypeAbs, variant)) - def trEnumById(enumTypeAbs: List[String], id: String) = - ResultString(s"${types2class(enumTypeAbs)}($id)") + def trEnumCast(enumTypeAbs: List[String], value: String) = + ResultString(s"${types2class(enumTypeAbs)}($value)") override def doBytesCompareOp(left: Ast.expr, op: Ast.cmpop, right: Ast.expr): String = { op match { diff --git a/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala index 62859cfec..89663fe42 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/JavaScriptTranslator.scala @@ -64,9 +64,9 @@ class JavaScriptTranslator(provider: TypeProvider, importList: ImportList) exten } s"${JavaScriptCompiler.types2class(enumSpec.name, isExternal)}.${Utils.upperUnderscoreCase(variant)}" } - override def doEnumById(enumSpec: EnumSpec, id: String): String = + override def doEnumCast(enumSpec: EnumSpec, value: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually - id + value override def doBytesCompareOp(left: Ast.expr, op: Ast.cmpop, right: Ast.expr): String = s"(${JavaScriptCompiler.kstreamName}.byteArrayCompare(${translate(left)}, ${translate(right)}) ${cmpOp(op)} 0)" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala index 320ce4fd0..2a72a7aa0 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/JavaTranslator.scala @@ -68,8 +68,8 @@ class JavaTranslator(provider: TypeProvider, importList: ImportList) extends Bas override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${enumClass(enumSpec.name)}.${Utils.upperUnderscoreCase(variant)}" - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"${enumClass(enumSpec.name)}.byId($id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"${enumClass(enumSpec.name)}.byId($value)" def enumClass(enumTypeAbs: List[String]): String = { val enumTypeRel = Utils.relClass(enumTypeAbs, provider.nowClass.name) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala index 7bcbe857b..c5fadd6a9 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/LuaTranslator.scala @@ -84,8 +84,8 @@ class LuaTranslator(provider: TypeProvider, importList: ImportList) extends Base override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${LuaCompiler.types2class(enumSpec.name)}.$variant" - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"${LuaCompiler.types2class(enumSpec.name)}($id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"${LuaCompiler.types2class(enumSpec.name)}($value)" override def strConcat(left: Ast.expr, right: Ast.expr, extPrec: Int): String = s"${translate(left)} .. ${translate(right)}" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala index 939e48313..e8c2a14e9 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/NimTranslator.scala @@ -14,7 +14,7 @@ class NimTranslator(provider: TypeProvider, importList: ImportList) extends Base override def bytesToStr(bytesExpr: String, encoding: String): String = { s"""encode($bytesExpr, ${doStringLiteral(encoding)})""" } - override def doEnumById(enumSpec: EnumSpec, id: String): String = s"${namespaced(enumSpec.name)}($id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = s"${namespaced(enumSpec.name)}($value)" // override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${namespaced(enumSpec.name)}($variant)" override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = s"${enumSpec.name.head}.$variant" override def doName(s: String): String = diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala index e1aaf41a3..0f6526026 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PHPTranslator.scala @@ -74,9 +74,9 @@ class PHPTranslator(provider: TypeProvider, config: RuntimeConfig) extends BaseT val enumClass = types2classAbs(enumSpec.name) s"$enumClass::${Utils.upperUnderscoreCase(variant)}" } - override def doEnumById(enumSpec: EnumSpec, id: String): String = + override def doEnumCast(enumSpec: EnumSpec, value: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually - id + value override def arraySubscript(container: expr, idx: expr): String = s"${translate(container)}[${translate(idx)}]" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala index dd6e9d2bd..25926cd49 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PerlTranslator.scala @@ -86,9 +86,9 @@ class PerlTranslator(provider: TypeProvider, importList: ImportList) extends Bas val enumName = Utils.upperUnderscoreCase(enumSpec.name.last) s"$$$enumClassWithScope${enumName}_${Utils.upperUnderscoreCase(variant)}" } - override def doEnumById(enumSpec: EnumSpec, id: String): String = + override def doEnumCast(enumSpec: EnumSpec, value: String): String = // Just an integer, without any casts / resolutions - one would have to look up constants manually - id + value def enumClass(enumTypeAbs: List[String]): String = { val enumTypeRel = Utils.relClass(enumTypeAbs, provider.nowClass.name) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala index c0f6eceba..201140c12 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/PythonTranslator.scala @@ -63,8 +63,8 @@ class PythonTranslator(provider: TypeProvider, importList: ImportList, config: R } s"${PythonCompiler.types2class(enumSpec.name, isExternal)}.$variant" } - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"${PythonCompiler.kstreamName}.resolve_enum(${PythonCompiler.types2class(enumSpec.name, enumSpec.isExternal(provider.nowClass))}, $id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"${PythonCompiler.kstreamName}.resolve_enum(${PythonCompiler.types2class(enumSpec.name, enumSpec.isExternal(provider.nowClass))}, $value)" override def booleanOp(op: Ast.boolop) = op match { case Ast.boolop.Or => "or" diff --git a/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala index 7fe2b7007..5a7f440a5 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala @@ -42,8 +42,8 @@ class RubyTranslator(provider: TypeProvider) extends BaseTranslator(provider) override def doEnumVariant(enumSpec: EnumSpec, variant: String): String = RubyCompiler.enumValue(enumSpec.name.last, variant) - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"${RubyCompiler.kstreamName}::resolve_enum(${enumDirectMap(enumSpec.name)}, $id)" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"${RubyCompiler.kstreamName}::resolve_enum(${enumDirectMap(enumSpec.name)}, $value)" def enumDirectMap(enumTypeAndName: List[String]): String = { val enumTypeAbs = enumTypeAndName.dropRight(1) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala index e461aa120..06e32638c 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala @@ -352,8 +352,8 @@ class RustTranslator(provider: TypeProvider, config: RuntimeConfig) override def doStrCompareOp(left: Ast.expr, op: Ast.cmpop, right: Ast.expr): String = s"${ensure_deref(translate(left))} ${cmpOp(op)} ${remove_deref(translate(right))}.to_string()" - override def doEnumById(enumSpec: EnumSpec, id: String): String = - s"($id as i64).try_into()?" + override def doEnumCast(enumSpec: EnumSpec, value: String): String = + s"($value as i64).try_into()?" override def arraySubscript(container: expr, idx: expr): String = s"${remove_deref(translate(container))}[${translate(idx)} as usize]" @@ -396,7 +396,7 @@ class RustTranslator(provider: TypeProvider, config: RuntimeConfig) override def translate(v: Ast.expr): String = { v match { - case Ast.expr.EnumById(enumType, id, inType) => + case Ast.expr.EnumCast(enumType, id, inType) => id match { case ifExp: Ast.expr.IfExp => val enumSpec = provider.resolveEnum(inType, enumType.name) diff --git a/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala b/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala index f711cbbdb..927227e0d 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/TypeDetector.scala @@ -54,7 +54,7 @@ class TypeDetector(provider: TypeProvider) { val t = EnumType(inType.names.toList :+ enumType.name, CalcIntType) t.enumSpec = Some(provider.resolveEnum(inType, enumType.name)) t - case Ast.expr.EnumById(enumType, _, inType) => + case Ast.expr.EnumCast(enumType, _, inType) => val t = EnumType(List(enumType.name), CalcIntType) t.enumSpec = Some(provider.resolveEnum(inType, enumType.name)) t