package me.tomassetti.turin.resolvers.jdk; import me.tomassetti.jvm.JvmFieldDefinition; import me.tomassetti.turin.resolvers.SymbolResolver; import me.tomassetti.turin.symbols.Symbol; import me.tomassetti.turin.typesystem.TypeUsage; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class ReflectionBasedField implements Symbol { @Override public TypeUsage calcType() { return ReflectionTypeDefinitionFactory.toTypeUsage(field.getType(), symbolResolver); } @Override public Symbol getField(String fieldName) { TypeUsage fieldType = ReflectionTypeDefinitionFactory.toTypeUsage(field.getType(), symbolResolver); return fieldType.getInstanceField(fieldName, this); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ReflectionBasedField that = (ReflectionBasedField) o; if (!field.equals(that.field)) return false; return true; } @Override public String toString() { return "ReflectionBaseField{" + "field=" + field + '}'; } @Override public int hashCode() { return field.hashCode(); } private Field field; private SymbolResolver symbolResolver; public ReflectionBasedField(Field field, SymbolResolver symbolResolver) { this.field = field; this.symbolResolver = symbolResolver; } public boolean isStatic() { return Modifier.isStatic(field.getModifiers()); } public JvmFieldDefinition toJvmField(SymbolResolver resolver) { TypeUsage fieldType = ReflectionTypeDefinitionFactory.toTypeUsage(field.getType(), symbolResolver); TypeUsage ownerType = ReflectionTypeDefinitionFactory.toTypeUsage(field.getDeclaringClass(), symbolResolver); return new JvmFieldDefinition(ownerType.jvmType().getInternalName(), field.getName(), fieldType.jvmType().getSignature(), true); } }