use crate::jvms::attr::type_annotation::{TypeAnnotationTargetInfo, TypeAnnotationTargetPath};
use crate::jvms::attr::Attribute as JvmsAttribute;
use crate::jvms::attr::{LineNumberTableInfo, StackMapFrame};
use crate::jvms::element::AttributeInfo;
use crate::node::values::{
AnnotationValue, ConstValue, FieldInitialValue, LocalVariableInfo, LocalVariableTypeInfo,
ModuleAttrValue, ModuleExportValue, ModuleOpenValue, ModuleProvidesValue, ModuleRequireValue,
};
use crate::node::InsnNode;
use crate::*;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct ClassNode {
pub minor_version: u16,
pub major_version: u16,
pub access: u16,
pub name: InternalNameRef,
pub signature: Option<StrRef>,
pub super_name: Option<InternalNameRef>,
pub interfaces: Vec<InternalNameRef>,
pub source_file: Option<StrRef>,
pub source_debug: Option<StrRef>,
pub module: Option<ModuleNode>,
pub outer_class: Option<InternalNameRef>,
pub outer_method_name: Option<StrRef>,
pub outer_method_desc: Option<DescriptorRef>,
pub annotations: Vec<AnnotationNode>,
pub type_annotations: Vec<TypeAnnotationNode>,
pub attrs: Vec<UnknownAttribute>,
pub inner_classes: Vec<InnerClassNode>,
pub nest_host_class: Option<InternalNameRef>,
pub nest_members: Vec<InternalNameRef>,
pub permitted_subclasses: Vec<InternalNameRef>,
pub record_components: Vec<RecordComponentNode>,
pub fields: Vec<FieldNode>,
pub methods: Vec<MethodNode>,
}
#[derive(Clone, Debug)]
pub struct MethodNode {
pub access: u16,
pub name: StrRef,
pub desc: DescriptorRef,
pub signature: Option<StrRef>,
pub exceptions: Vec<InternalNameRef>,
pub parameters: Vec<ParameterNode>,
pub annotations: Vec<AnnotationNode>,
pub type_annotations: Vec<TypeAnnotationNode>,
pub parameter_annotations: Vec<Vec<AnnotationNode>>,
pub attrs: Vec<UnknownAttribute>,
pub annotation_default: Option<AnnotationValue>,
pub code_body: Option<CodeBodyNode>,
}
#[derive(Clone, Debug)]
pub struct CodeBodyNode {
pub instructions: Vec<InsnNode>,
pub exception_table: Vec<ExceptionTable>,
pub local_variables: Vec<LocalVariableNode>,
pub max_stack: u16,
pub max_locals: u16,
pub type_annotations: Vec<TypeAnnotationNode>,
pub stack_map_table: Vec<StackMapFrame>,
pub unknown_attributes: Vec<UnknownAttribute>,
}
#[derive(Clone, Debug)]
pub struct InnerClassNode {
pub name: InternalNameRef,
pub outer_name: Option<InternalNameRef>,
pub inner_name: StrRef,
pub access: u16,
}
#[derive(Clone, Debug)]
pub struct RecordComponentNode {
pub name: StrRef,
pub desc: DescriptorRef,
pub signature: Option<StrRef>,
pub annotations: Vec<AnnotationNode>,
pub type_annotations: Vec<TypeAnnotationNode>,
pub attrs: Vec<UnknownAttribute>,
}
#[derive(Clone, Debug)]
pub struct ParameterNode {
pub name: Option<StrRef>,
pub access: u16,
}
#[derive(Clone, Debug)]
pub struct FieldNode {
pub access: u16,
pub name: StrRef,
pub desc: DescriptorRef,
pub signature: Option<StrRef>,
pub value: Option<FieldInitialValue>,
pub annotations: Vec<AnnotationNode>,
pub type_annotations: Vec<TypeAnnotationNode>,
pub attrs: Vec<UnknownAttribute>,
}
#[derive(Clone, Debug)]
pub struct ModuleNode {
pub name: StrRef,
pub access: u16,
pub version: Option<StrRef>,
pub main_class: Option<StrRef>,
pub packages: Vec<StrRef>,
pub requires: Vec<ModuleRequireValue>,
pub exports: Vec<ModuleExportValue>,
pub opens: Vec<ModuleOpenValue>,
pub uses: Vec<InternalNameRef>,
pub provides: Vec<ModuleProvidesValue>,
}
#[derive(Clone, Debug)]
pub struct TypeAnnotationNode {
pub visible: bool,
pub target_info: TypeAnnotationTargetInfo,
pub target_path: TypeAnnotationTargetPath,
pub annotation_node: AnnotationNode,
}
#[derive(Clone, Debug)]
pub struct AnnotationNode {
pub visible: bool,
pub type_name: InternalNameRef,
pub values: Vec<(StrRef, AnnotationValue)>,
}
#[derive(Clone, Debug)]
pub struct TryCatchBlockNode {
pub start: LabelNode,
pub end: LabelNode,
pub handler: LabelNode,
pub catch_type: Option<InternalNameRef>,
pub type_annotations: Vec<TypeAnnotationNode>,
}
#[derive(Clone, Debug)]
pub struct LocalVariableNode {
pub name: StrRef,
pub desc: DescriptorRef,
pub signature: Option<StrRef>,
pub start: LabelNode,
pub end: LabelNode,
pub index: u16,
}
#[derive(Clone, Debug)]
pub struct UnknownAttribute {
pub name: StrRef,
pub origin: JvmsAttribute,
}
#[derive(Clone, Debug)]
pub enum Attribute {
Unknown(UnknownAttribute),
ConstantValue(ConstValue),
Code(CodeAttribute),
StackMapTable(Vec<StackMapFrame>),
Exceptions(Vec<InternalNameRef>),
InnerClasses(Vec<InnerClassNode>),
EnclosingMethod(EnclosingMethodAttribute),
Synthetic,
Signature(StrRef),
SourceFile(StrRef),
SourceDebugExtension(StrRef),
LineNumberTable(Vec<LineNumberNode>),
LocalVariableTable(Vec<LocalVariableInfo>),
LocalVariableTypeTable(Vec<LocalVariableTypeInfo>),
Deprecated,
RuntimeVisibleAnnotations(Vec<AnnotationNode>),
RuntimeInvisibleAnnotations(Vec<AnnotationNode>),
RuntimeVisibleParameterAnnotations(Vec<Vec<AnnotationNode>>),
RuntimeInvisibleParameterAnnotations(Vec<Vec<AnnotationNode>>),
RuntimeVisibleTypeAnnotations(Vec<TypeAnnotationNode>),
RuntimeInvisibleTypeAnnotations(Vec<TypeAnnotationNode>),
AnnotationDefault(AnnotationValue),
BootstrapMethods(Vec<BootstrapMethodAttr>),
MethodParameters(Vec<ParameterNode>),
Module(ModuleAttrValue),
ModulePackages(Vec<StrRef>),
ModuleMainClass(InternalNameRef),
NestHost(InternalNameRef),
NestMembers(Vec<InternalNameRef>),
Record(Vec<RecordComponentNode>),
PermittedSubclasses(Vec<InternalNameRef>),
}
#[derive(Clone, Debug)]
pub struct EnclosingMethodAttribute {
pub class: InternalNameRef,
pub method_name: StrRef,
pub method_desc: DescriptorRef,
}
#[derive(Clone, Debug)]
pub struct CodeAttribute {
pub max_stack: u16,
pub max_locals: u16,
pub code: Vec<u8>,
pub exception_table: Vec<ExceptionTable>,
pub attributes: Vec<(AttributeInfo, Attribute)>,
}
#[derive(Clone, Debug)]
pub struct ExceptionTable {
pub start: LabelNode, pub end: LabelNode,
pub handler: LabelNode,
pub catch_type: Option<InternalNameRef>,
}
pub type LineNumberNode = LineNumberTableInfo;
#[derive(Clone, Debug)]
pub struct BootstrapMethodAttr {
pub method_handle: Arc<ConstValue>, pub arguments: Vec<Arc<ConstValue>>,
}
pub type LabelNode = u16;