package bluej.parser.entity;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import bluej.debugger.gentype.FieldReflective;
import bluej.debugger.gentype.GenTypeClass;
import bluej.debugger.gentype.GenTypeParameter;
import bluej.debugger.gentype.JavaType;
import bluej.debugger.gentype.Reflective;
import bluej.utility.JavaReflective;
import bluej.utility.JavaUtils;
import threadchecker.OnThread;
import threadchecker.Tag;


| An entity which essentially wraps a JavaType. | | @author Davin McCall | public class TypeEntity extends PackageOrClass{ private JavaType thisType; public TypeEntity(JavaType type) { thisType = type; } public TypeEntity(Reflective ref) { thisType = new GenTypeClass(ref); } public TypeEntity(Class<?> c) { Reflective thisRef = new JavaReflective(c); thisType = new GenTypeClass(thisRef); } TypeEntity(Reflective r, GenTypeClass outer) { thisType = new GenTypeClass(r, Collections.<GenTypeParameter>emptyList(), outer); } public JavaType getType() { return thisType; } public GenTypeClass getClassType() { return thisType.asClass(); } @OnThread(Tag.FXPlatform) @Override public JavaEntity getSubentity(String name, Reflective accessor) { GenTypeClass thisClass = thisType.asClass(); if (thisClass == null) { return null; } else if (thisClass.getArrayComponent() != null) { return null; } LinkedList<Reflective> stypes = new LinkedList<Reflective>(); Reflective ctypeRef = thisClass.getReflective(); stypes.add(ctypeRef); while (! stypes.isEmpty()){ ctypeRef = stypes.poll(); Map<String,FieldReflective> m = ctypeRef.getDeclaredFields(); FieldReflective field = m.get(name); if (field != null) { boolean accessAllowed = JavaUtils.checkMemberAccess(ctypeRef, thisClass, accessor, field.getModifiers(), true); if (accessAllowed) { thisClass = thisClass.mapToSuper(ctypeRef.getName()); JavaType fieldType = field.getType().mapTparsToTypes(thisClass.getMap()).getUpperBound(); return new ValueEntity(name, fieldType); } } stypes.addAll(ctypeRef.getSuperTypesR()); } return getPackageOrClassMember(name); } @Override @OnThread(Tag.FXPlatform) public TypeEntity getPackageOrClassMember(String name) { GenTypeClass thisClass = thisType.asClass(); if (thisClass == null || thisClass.getArrayComponent() != null) { return null; } LinkedList<Reflective> stypes = new LinkedList<Reflective>(); stypes.add(thisClass.getReflective()); while (! stypes.isEmpty()){ Reflective thisRef = stypes.poll(); Reflective member = thisRef.getInnerClass(name); if (member != null) { GenTypeClass inner = new GenTypeClass(member, Collections.<GenTypeParameter>emptyList(), thisClass); return new TypeEntity(inner); } stypes.addAll(thisRef.getSuperTypesR()); } return null; } public String getName() { return getType().toString(); }
| | @see bluej.parser.entity.ClassEntity#setTypeParams(java.util.List) | public TypeEntity setTypeArgs(List<TypeArgumentEntity> tparams) { GenTypeClass classType = thisType.asClass(); if (classType == null) { return null; } GenTypeClass outer = classType.getOuterType(); List<GenTypeParameter> ttparams = new LinkedList<GenTypeParameter>(); for (TypeArgumentEntity eparam : tparams) { GenTypeParameter tparamType = eparam.getType(); if (tparamType == null) { return null; } ttparams.add(tparamType); } return new TypeEntity(new GenTypeClass(classType.getReflective(), ttparams, outer)); } @Override public TypeEntity resolveAsType() { return this; } }
top, use, map, class TypeEntity

.   TypeEntity
.   TypeEntity
.   TypeEntity
.   getType
.   getClassType
.   getSubentity
.   getPackageOrClassMember
.   getName
.   setTypeArgs
.   resolveAsType




198 neLoCode + 4 LoComm