Class AsmReferenceResolver
java.lang.Object
org.codehaus.groovy.ast.decompiled.AsmReferenceResolver
Helper class for resolving class references encountered in bytecode stubs decompiled from compiled classes.
Bridges between ASM's internal type descriptors/names and Groovy's
ClassNode representation
by consulting both classes currently being compiled in the compilation unit and already-loaded classes
via the ClassNodeResolver.
Resolution Strategy
AsmReferenceResolver implements a two-tier lookup strategy:
- Compilation-time classes: First checks the compilation unit's AST for classes being compiled in the same batch. This ensures references to companion classes resolve correctly.
- Runtime classes: If not found in the compilation unit, delegates to the
ClassNodeResolver, which consults already-compiled and third-party classes.
Type Descriptor Handling
The resolver handles multiple bytecode formats:
- Primitive types: Resolved via
ClassHelper.make(String)(e.g.,"I"→int.class). - Object types: Converted from JVMS internal names (e.g.,
"java/lang/String") to dot notation and resolved viaresolveClass(String). - Array types: Handled recursively by
resolveType(Type)and marked viaClassNode.makeArray().
Error Handling
The resolver distinguishes between two resolution modes:
resolveClass(String)- ThrowsNoClassDefFoundErrorif the class cannot be resolved. Used when a type is required.resolveClassNullable(String)- Returnsnullif the class cannot be resolved. Used for optional type information (e.g., exception types).
Thread Safety
AsmReferenceResolver instances are typically created once per compilation unit and are
thread-safe for concurrent read access. The underlying ClassNodeResolver and
CompilationUnit manage their own synchronization.
-
Constructor Summary
ConstructorsConstructorDescriptionAsmReferenceResolver(ClassNodeResolver resolver, CompilationUnit unit) Creates an ASM reference resolver for a compilation unit. -
Method Summary
Modifier and TypeMethodDescriptionresolveClass(String className) Resolves a fully qualified class name to aClassNode.resolveClassNullable(String className) Attempts to resolve a fully qualified class name to aClassNode, returningnullif not found.resolveJvmClass(String name) Resolves a fully qualified class name to a runtime JVMClassobject.resolveType(org.objectweb.asm.Type type) Resolves an ASMTypeto aClassNode, handling array types by wrapping element types.
-
Constructor Details
-
AsmReferenceResolver
Creates an ASM reference resolver for a compilation unit.- Parameters:
resolver- theClassNodeResolverused to resolve class namesunit- theCompilationUnitcontaining classes being compiled and metadata
-
-
Method Details
-
resolveClass
Resolves a fully qualified class name to aClassNode. First checks classes being compiled in this unit, then consults the resolver for already-loaded classes.- Parameters:
className- the fully qualified class name- Returns:
- the resolved
ClassNode - Throws:
NoClassDefFoundError- if the class cannot be resolved
-
resolveClassNullable
Attempts to resolve a fully qualified class name to aClassNode, returningnullif not found. First checks classes being compiled in this unit, then consults the resolver for already-loaded classes.- Parameters:
className- the fully qualified class name- Returns:
- the resolved
ClassNode, ornullif not resolvable
-
resolveType
Resolves an ASMTypeto aClassNode, handling array types by wrapping element types.- Parameters:
type- the ASM type to resolve- Returns:
- the corresponding
ClassNode, with dimensions for array types - Throws:
NoClassDefFoundError- if an object type cannot be resolved
-
resolveJvmClass
Resolves a fully qualified class name to a runtime JVMClassobject. Uses the compilation unit's class loader to load the class.- Parameters:
name- the fully qualified class name- Returns:
- the loaded runtime
Class - Throws:
GroovyBugError- if the class cannot be loaded (wrapped ClassNotFoundException)
-