package bluej.parser.entity;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import bluej.debugger.gentype.ConstructorReflective;
import bluej.debugger.gentype.FieldReflective;
import bluej.debugger.gentype.GenTypeClass;
import bluej.debugger.gentype.GenTypeDeclTpar;
import bluej.debugger.gentype.JavaType;
import bluej.debugger.gentype.MethodReflective;
import bluej.debugger.gentype.Reflective;
import bluej.parser.JavaParser;
import bluej.parser.nodes.FieldNode;
import bluej.parser.nodes.MethodNode;
import bluej.parser.nodes.ParsedNode;
import bluej.parser.nodes.ParsedTypeNode;
import bluej.parser.nodes.TypeInnerNode;
import bluej.utility.JavaUtils;
import threadchecker.OnThread;
import threadchecker.Tag;
| A Reflective implementation for classes which are parsed, but not necessarily compiled.
|
| @author Davin McCall
|
@OnThread(value = Tag.FXPlatform, ignoreParent = true)
public class ParsedReflective
extends Reflective{
private ParsedTypeNode pnode;
public ParsedReflective(ParsedTypeNode pnode)
{
this.pnode = pnode;
}
@Override
public String getName()
{
return pnode.getPrefix() + pnode.getName();
}
@Override
public Reflective getArrayOf()
{
return new ParsedArrayReflective(this, "L" + getName() + ";");
}
@Override
public Reflective getRelativeClass(String name)
{
TypeEntity tent = pnode.resolveQualifiedClass(name);
if (tent != null) {
GenTypeClass ctype = tent.getType().asClass();
if (ctype != null) {
return ctype.getReflective();
}
}
return null;
}
@Override
public List getSuperTypes()
{
List<GenTypeClass> rval = new LinkedList<GenTypeClass>();
for (JavaEntity etype : pnode.getExtendedTypes()) {
TypeEntity tent = etype.resolveAsType();
if (tent != null) {
GenTypeClass ct = tent.getType().asClass();
if (ct != null) {
rval.add(ct);
}
}
}
if (! isInterface()) {
if (rval.isEmpty()) {
TypeEntity tent = pnode.resolveQualifiedClass("java.lang.Object");
if (tent != null) {
GenTypeClass ct = tent.getType().asClass();
if (ct != null) {
rval.add(ct);
}
}
}
}
for (JavaEntity etype : pnode.getImplementedTypes()) {
TypeEntity tent = etype.resolveAsType();
if (tent != null) {
GenTypeClass ct = tent.getType().asClass();
if (ct != null) {
rval.add(ct);
}
}
}
return rval;
}
@Override
public List getSuperTypesR()
{
List<Reflective> rlist = new ArrayList<Reflective>();
List<JavaEntity> extendedTypes = pnode.getExtendedTypes();
if (extendedTypes != null && ! extendedTypes.isEmpty()) {
for (JavaEntity etype : extendedTypes) {
TypeEntity etypeTEnt = etype.resolveAsType();
if (etypeTEnt != null) {
GenTypeClass superGTC = etypeTEnt.getType().asClass();
if (superGTC != null) {
rlist.add(superGTC.getReflective());
}
}
}
}
if (rlist.isEmpty() && ! isInterface()) {
TypeEntity objEntity = pnode.resolveQualifiedClass("java.lang.Object");
if (objEntity != null) {
GenTypeClass superGTC = objEntity.getType().asClass();
if (superGTC != null) {
rlist.add(superGTC.getReflective());
}
}
}
extendedTypes = pnode.getImplementedTypes();
if (extendedTypes != null && ! extendedTypes.isEmpty()) {
for (JavaEntity etype : extendedTypes) {
TypeEntity etypeTEnt = etype.resolveAsType();
if (etypeTEnt != null) {
GenTypeClass superGTC = etypeTEnt.getType().asClass();
if (superGTC != null) {
rlist.add(superGTC.getReflective());
}
}
}
}
return rlist;
}
@Override
public List getTypeParams()
{
List<TparEntity> tparEntList = pnode.getTypeParams();
if (tparEntList == null) {
return Collections.emptyList();
}
List<GenTypeDeclTpar> tparList = new ArrayList<GenTypeDeclTpar>(tparEntList.size());
for (TparEntity tpar : tparEntList) {
GenTypeDeclTpar tparType = tpar.getType();
if (tparType != null) {
tparList.add(tparType);
}
}
return tparList;
}
@Override
public boolean isAssignableFrom(Reflective r)
{
Set<String> done = new HashSet<String>();
LinkedList<Reflective> todo = new LinkedList<Reflective>();
while (r != null){
String rname = r.getName();
if (rname.equals(getName())) {
return true;
}
if (done.add(r.getName())) {
todo.addAll(r.getSuperTypesR());
}
r = todo.poll();
}
return false;
}
@Override
public boolean isInterface()
{
return pnode.getTypeKind() == JavaParser.TYPEDEF_INTERFACE;
}
@Override
public boolean isStatic()
{
return Modifier.isStatic(pnode.getModifiers());
}
@Override
public boolean isPublic()
{
return Modifier.isPublic(pnode.getModifiers());
}
@Override
public boolean isFinal()
{
return Modifier.isFinal(pnode.getModifiers());
}
@Override
public Map getDeclaredFields()
{
Map<String,Set<FieldNode>> allfields = pnode.getInner().getFields();
Map<String, FieldNode> fields = new HashMap<>();
for (String name : allfields.keySet()) {
fields.put(name, allfields.get(name).iterator().next());
}
Map<String,FieldReflective> rmap = new HashMap<String,FieldReflective>();
for (Iterator<String> i = fields.keySet().iterator(); i.hasNext(); ) {
String fieldName = i.next();
FieldNode fieldNode = fields.get(fieldName);
JavaEntity ftypeEnt = fieldNode.getFieldType().resolveAsType();
if (ftypeEnt != null) {
FieldReflective fref = new FieldReflective(fieldName, ftypeEnt.getType(),
fieldNode.getModifiers(), this);
rmap.put(fieldName, fref);
}
}
return rmap;
}
@Override
public Map> getDeclaredMethods()
{
TypeInnerNode pnodeInner = pnode.getInner();
if (pnodeInner == null) {
return Collections.emptyMap();
}
Map<String,Set<MethodNode>> methods = pnodeInner.getMethods();
Map<String,Set<MethodReflective>> rmap = new HashMap<String,Set<MethodReflective>>();
for (Iterator<String> i = methods.keySet().iterator(); i.hasNext(); ) {
String name = i.next();
Set<MethodNode> mset = methods.get(name);
Set<MethodReflective> rset = new HashSet<MethodReflective>();
methodLoop:
for (Iterator<MethodNode> j = mset.iterator(); j.hasNext(); ) {
MethodNode method = j.next();
JavaEntity rtypeEnt = method.getReturnType();
if (rtypeEnt == null) continue;
rtypeEnt = rtypeEnt.resolveAsType();
if (rtypeEnt == null) continue;
JavaType rtype = rtypeEnt.getType();
List<JavaType> paramTypes = new ArrayList<JavaType>();
List<JavaEntity> mparamTypes = method.getParamTypes();
for (JavaEntity mparam : mparamTypes) {
TypeEntity mtent = mparam.resolveAsType();
if (mtent == null) continue methodLoop;
paramTypes.add(mtent.getType());
}
List<GenTypeDeclTpar> tparTypes = method.getTypeParams();
MethodReflective mref = new MethodReflective(name, rtype, tparTypes,
paramTypes, this, method.isVarArgs(), method.getModifiers());
mref.setJavaDoc(JavaUtils.javadocToString(method.getJavadoc()));
mref.setParamNames(method.getParamNames());
rset.add(mref);
}
if (! rset.isEmpty()) {
rmap.put(name, rset);
}
}
return rmap;
}
@Override
public List getDeclaredConstructors()
{
return Collections.emptyList();
}
@Override
public Reflective getOuterClass()
{
ParsedTypeNode containing = pnode.getContainingClass();
if (containing != null) {
return new ParsedReflective(containing);
}
return null;
}
@Override
public ParsedReflective getInnerClass(String name)
{
Map<String,ParsedNode> contained = pnode.getInner().getContainedClasses();
ParsedNode innerParsedNode = contained.get(name);
if (innerParsedNode instanceof ParsedTypeNode) {
return new ParsedReflective((ParsedTypeNode) innerParsedNode);
}
return null;
}
@Override
public String getModuleName()
{
return null;
}
@Override
public boolean equals(Object obj)
{
if (obj == this) {
return true;
}
if (obj instanceof ParsedReflective) {
ParsedReflective other = (ParsedReflective) obj;
return pnode == other.pnode;
}
return false;
}
@Override
public int hashCode()
{
return pnode.hashCode();
}
}
top,
use,
map,
class ParsedReflective
. ParsedReflective
. getName
. getArrayOf
. getRelativeClass
. getSuperTypes
. getSuperTypesR
. getTypeParams
. isAssignableFrom
. isInterface
. isStatic
. isPublic
. isFinal
. getDeclaredFields
. getDeclaredMethods
. getDeclaredConstructors
. getOuterClass
. getInnerClass
. getModuleName
. equals
. hashCode
451 neLoCode
+ 2 LoComm