1
1
package io .kaitai .struct
2
2
3
- import io .kaitai .struct .datatype .DataType .{KaitaiStreamType , UserTypeInstream }
4
- import io .kaitai .struct .datatype .{Endianness , FixedEndian , InheritedEndian }
3
+ import io .kaitai .struct .datatype .DataType ._
4
+ import io .kaitai .struct .datatype ._
5
+ import io .kaitai .struct .exprlang .Ast
5
6
import io .kaitai .struct .format ._
6
7
import io .kaitai .struct .languages .RustCompiler
7
8
import io .kaitai .struct .languages .components .ExtraAttrs
@@ -29,18 +30,19 @@ class RustClassCompiler(
29
30
30
31
// Basic struct declaration
31
32
lang.classHeader(curClass.name)
32
-
33
+
33
34
compileAttrDeclarations(curClass.seq ++ extraAttrs)
34
35
curClass.instances.foreach { case (instName, instSpec) =>
35
36
compileInstanceDeclaration(instName, instSpec)
36
37
}
37
-
38
+
38
39
// Constructor = Read() function
39
40
compileReadFunction(curClass)
40
-
41
+
41
42
compileInstances(curClass)
42
43
43
44
compileAttrReaders(curClass.seq ++ extraAttrs)
45
+ curClass.toStringExpr.foreach(expr => lang.classToString(expr))
44
46
lang.classFooter(curClass.name)
45
47
46
48
compileEnums(curClass)
@@ -49,7 +51,7 @@ class RustClassCompiler(
49
51
compileSubclasses(curClass)
50
52
}
51
53
52
- def compileReadFunction (curClass : ClassSpec ) = {
54
+ def compileReadFunction (curClass : ClassSpec ): Unit = {
53
55
lang.classConstructorHeader(
54
56
curClass.name,
55
57
curClass.parentType,
@@ -58,23 +60,41 @@ class RustClassCompiler(
58
60
curClass.params
59
61
)
60
62
61
- // FIXME
62
63
val defEndian = curClass.meta.endian match {
63
64
case Some (fe : FixedEndian ) => Some (fe)
64
65
case _ => None
65
66
}
66
-
67
- lang.readHeader(defEndian, false )
68
-
67
+
68
+ lang.readHeader(defEndian, isEmpty = false )
69
+
70
+ curClass.meta.endian match {
71
+ case Some (ce : CalcEndian ) => compileCalcEndian(ce)
72
+ case Some (_) => // Nothing to generate
73
+ case None => // Same here
74
+ }
75
+
69
76
compileSeq(curClass.seq, defEndian)
70
77
lang.classConstructorFooter
71
78
}
72
79
73
- override def compileInstances (curClass : ClassSpec ) = {
80
+ override def compileCalcEndian (ce : CalcEndian ): Unit = {
81
+ def renderProc (result : FixedEndian ): Unit = {
82
+ val v = result match {
83
+ case LittleEndian => Ast .expr.IntNum (1 )
84
+ case BigEndian => Ast .expr.IntNum (2 )
85
+ }
86
+ lang.instanceCalculate(IS_LE_ID , CalcIntType , v)
87
+ }
88
+ lang.switchCases[FixedEndian ](IS_LE_ID , ce.on, ce.cases, renderProc, renderProc)
89
+ lang.runReadCalc()
90
+ }
91
+
92
+ override def compileInstances (curClass : ClassSpec ): Unit = {
74
93
lang.instanceDeclHeader(curClass.name)
75
94
curClass.instances.foreach { case (instName, instSpec) =>
76
95
compileInstance(curClass.name, instName, instSpec, curClass.meta.endian)
77
96
}
97
+ lang.instanceFooter
78
98
}
79
99
80
100
override def compileInstance (className : List [String ], instName : InstanceIdentifier , instSpec : InstanceSpec , endian : Option [Endianness ]): Unit = {
@@ -88,16 +108,16 @@ class RustClassCompiler(
88
108
lang.instanceHeader(className, instName, dataType, instSpec.isNullable)
89
109
lang.instanceCheckCacheAndReturn(instName, dataType)
90
110
111
+ lang.instanceSetCalculated(instName)
91
112
instSpec match {
92
113
case vi : ValueInstanceSpec =>
93
114
lang.attrParseIfHeader(instName, vi.ifExpr)
94
115
lang.instanceCalculate(instName, dataType, vi.value)
95
116
lang.attrParseIfFooter(vi.ifExpr)
96
- case i : ParseInstanceSpec =>
97
- lang.attrParse(i , instName, None ) // FIXME
117
+ case pi : ParseInstanceSpec =>
118
+ lang.attrParse(pi , instName, None ) // FIXME
98
119
}
99
120
100
- lang.instanceSetCalculated(instName)
101
121
lang.instanceReturn(instName, dataType)
102
122
lang.instanceFooter
103
123
}
0 commit comments