Skip to content

Commit 5381aaa

Browse files
committed
Fix type resolution in type keys
This commit also unify type resolution in expression language and in `type` keys Fixes kaitai-io/kaitai_struct#786
1 parent cc8f669 commit 5381aaa

1 file changed

Lines changed: 7 additions & 48 deletions

File tree

shared/src/main/scala/io/kaitai/struct/precompile/ResolveTypes.scala

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,13 @@ class ResolveTypes(specs: ClassSpecs, topClass: ClassSpec, opaqueTypes: Boolean)
8686
}
8787

8888
private def resolveUserType(curClass: ClassSpec, typeName: List[String], path: List[String]): (Option[ClassSpec], Option[CompilationProblem]) = {
89-
val res = realResolveUserType(curClass, typeName, path)
89+
val res = try {
90+
val resolver = new ClassTypeProvider(specs, curClass)
91+
Some(resolver.resolveTypePath(curClass, typeName))
92+
} catch {
93+
case _: TypeNotFoundError =>
94+
None
95+
}
9096

9197
res match {
9298
case None =>
@@ -105,51 +111,4 @@ class ResolveTypes(specs: ClassSpecs, topClass: ClassSpec, opaqueTypes: Boolean)
105111
(res, None)
106112
}
107113
}
108-
109-
private def realResolveUserType(curClass: ClassSpec, typeName: List[String], path: List[String]): Option[ClassSpec] = {
110-
Log.typeResolve.info(() => s"resolveUserType: at ${curClass.name} doing ${typeName.mkString("|")}")
111-
112-
// First, try to do it in current class
113-
114-
// If we're seeking composite name, we only have to resolve the very first
115-
// part of it at this stage
116-
val firstName :: restNames = typeName
117-
118-
val resolvedHere = curClass.types.get(firstName).flatMap((nestedClass) =>
119-
if (restNames.isEmpty) {
120-
// No further names to resolve, here's our answer
121-
Some(nestedClass)
122-
} else {
123-
// Try to resolve recursively
124-
realResolveUserType(nestedClass, restNames, path)
125-
}
126-
)
127-
128-
resolvedHere match {
129-
case Some(_) => resolvedHere
130-
case None =>
131-
// No luck resolving here, let's try upper levels, if they exist
132-
curClass.upClass match {
133-
case Some(upClass) =>
134-
realResolveUserType(upClass, typeName, path)
135-
case None =>
136-
// Check this class if it's top-level class
137-
if (curClass.name.head == firstName) {
138-
Some(curClass)
139-
} else {
140-
// Check if top-level specs has this name
141-
// If there's None => no luck at all
142-
val resolvedTop = specs.get(firstName)
143-
resolvedTop match {
144-
case None => None
145-
case Some(classSpec) => if (restNames.isEmpty) {
146-
resolvedTop
147-
} else {
148-
realResolveUserType(classSpec, restNames, path)
149-
}
150-
}
151-
}
152-
}
153-
}
154-
}
155114
}

0 commit comments

Comments
 (0)