Skip to main content

Module generics

Module generics 

Source
Expand description

Recursive descent parser for JVM generic signatures (JVMS 4.7.9.1).

The JVM stores generic type information in Signature attributes as compact strings following a specific grammar. This module parses those strings into the structured types defined in crate::stub::model.

§Grammar (JVMS 4.7.9.1)

ClassSignature     = FormalTypeParameters? SuperclassSignature SuperinterfaceSignature*
MethodSignature    = FormalTypeParameters? '(' TypeSignature* ')' ReturnType ThrowsSignature*
FormalTypeParameters = '<' FormalTypeParameter+ '>'
FormalTypeParameter = Identifier ClassBound InterfaceBound*
ClassBound         = ':' FieldTypeSignature?
InterfaceBound     = ':' FieldTypeSignature
FieldTypeSignature = ClassTypeSignature | ArrayTypeSignature | TypeVariableSignature
ClassTypeSignature = 'L' (Identifier '/')* Identifier TypeArguments? ('.' Identifier TypeArguments?)* ';'
TypeArguments      = '<' TypeArgument+ '>'
TypeArgument       = WildcardIndicator? FieldTypeSignature | '*'
WildcardIndicator  = '+' | '-'
TypeVariableSignature = 'T' Identifier ';'
ArrayTypeSignature = '[' TypeSignature
TypeSignature      = FieldTypeSignature | BaseType
ReturnType         = TypeSignature | 'V'
ThrowsSignature    = '^' ClassTypeSignature | '^' TypeVariableSignature
BaseType           = 'B' | 'C' | 'D' | 'F' | 'I' | 'J' | 'S' | 'Z'

§Examples

use sqry_classpath::bytecode::generics::{parse_class_signature, parse_method_signature, parse_field_signature};

// HashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>
let sig = "<K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/util/Map<TK;TV;>;";
let parsed = parse_class_signature(sig).unwrap();
assert_eq!(parsed.type_parameters.len(), 2);

// <T:Object>(T)T
let method_sig = "<T:Ljava/lang/Object;>(TT;)TT;";
let parsed = parse_method_signature(method_sig).unwrap();
assert_eq!(parsed.type_parameters.len(), 1);

// List<String>
let field_sig = "Ljava/util/List<Ljava/lang/String;>;";
let parsed = parse_field_signature(field_sig).unwrap();

Functions§

parse_class_signature
Parse a class-level generic signature (JVMS 4.7.9.1 ClassSignature).
parse_field_signature
Parse a field-level type signature (JVMS 4.7.9.1 FieldTypeSignature).
parse_method_signature
Parse a method-level generic signature (JVMS 4.7.9.1 MethodSignature).