Type löschen

This commit is contained in:
JanUlrich 2016-12-09 04:34:50 +01:00
parent 343c7d3a55
commit aff39ba442
4 changed files with 37 additions and 327 deletions

View File

@ -21,6 +21,8 @@ import de.dhbwstuttgart.typeinference.Menge;
public class ASTFactory { public class ASTFactory {
private final JavaClassRegistry names;
/** /**
* Anmerkung: * Anmerkung:
* Die ASTFactory Methoden, welche ASTBäume aus java.lang.Class Objekten generieren, können davon ausgehen, * Die ASTFactory Methoden, welche ASTBäume aus java.lang.Class Objekten generieren, können davon ausgehen,
@ -107,14 +109,14 @@ public class ASTFactory {
* @param inClass * @param inClass
* @return * @return
*/ */
public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){ public Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){
String name = jreMethod.getName(); String name = jreMethod.getName();
Type returnType = createType(jreMethod.getReturnType()); Type returnType = createType(jreMethod.getReturnType());
Parameter[] jreParams = jreMethod.getParameters(); Parameter[] jreParams = jreMethod.getParameters();
List<FormalParameter> params = new ArrayList<>(); List<FormalParameter> params = new ArrayList<>();
for(Parameter jreParam : jreParams){ for(Parameter jreParam : jreParams){
Type paramType = createType(jreParam.getType()); RefType paramType = createType(jreParam.getType());
params.add(new FormalParameter(jreParam.getName(),paramType)); params.add(new FormalParameter(jreParam.getName(),paramType,-1));
} }
ParameterList parameterList = new ParameterList(params); ParameterList parameterList = new ParameterList(params);
Block block = new Block(new ArrayList<Statement>(), -1); Block block = new Block(new ArrayList<Statement>(), -1);
@ -128,14 +130,21 @@ public class ASTFactory {
return new Method(name, returnType, parameterList, block, gtvDeclarations, offset); return new Method(name, returnType, parameterList, block, gtvDeclarations, offset);
} }
public RefType createType(java.lang.Class jreClass){ public RefType createType(java.lang.Class jreClass){
List<RefType> params = new ArrayList<>();
for(TypeVariable jreTV : jreClass.getTypeParameters()){ for(TypeVariable jreTV : jreClass.getTypeParameters()){
GenericTypeVar gtv = createGeneric(jreTV, jreClass); RefType gtv = createType(jreTV);
gtvs.add(gtv); params.add(gtv);
} }
jreClass.getT jreClass
return new RefType(jreClass.getName(), -1); return new RefType(jreClass.getName(), params, -1);
}
public RefType createType(java.lang.reflect.Type type){
RefType ret = new RefType(type.getTypeName(), -1);
//TODO hier die Generischen Variablen extrahieren
return ret;
} }
/** /**
@ -151,10 +160,11 @@ public class ASTFactory {
public GenericTypeVar createGeneric(TypeVariable jreTypeVar, java.lang.Class inClass){ public GenericTypeVar createGeneric(TypeVariable jreTypeVar, java.lang.Class inClass){
//TODO: Bei den Namen der Parameter des Generishen Typs nachschauen, ob er in der Klasse als Generic deklariert wurde //TODO: Bei den Namen der Parameter des Generishen Typs nachschauen, ob er in der Klasse als Generic deklariert wurde
String name = jreTypeVar.getTypeName(); String name = jreTypeVar.getTypeName();
List<Type> genericBounds = new ArrayList<>();
java.lang.reflect.Type[] bounds = jreTypeVar.getBounds(); java.lang.reflect.Type[] bounds = jreTypeVar.getBounds();
if(bounds.length > 0){ if(bounds.length > 0){
for(java.lang.reflect.Type bound : bounds){ for(java.lang.reflect.Type bound : bounds){
bound genericBounds.add(createType(bound));
} }
return new BoundedGenericVar(); return new BoundedGenericVar();
} }

View File

@ -45,7 +45,7 @@ public class RefType extends ObjectType implements IMatchable
*/ */
private boolean IsArray = false; private boolean IsArray = false;
private List<Type> parameter = null; private List<RefType> parameter = null;
/** /**
* Ist primitiveFlag auf true, muss beim Codegen dieser Reftype durch * Ist primitiveFlag auf true, muss beim Codegen dieser Reftype durch
* den primitiven Datentyp ersetzt werden * den primitiven Datentyp ersetzt werden
@ -69,7 +69,7 @@ public class RefType extends ObjectType implements IMatchable
} }
// ino.method.RefType.26640.definition // ino.method.RefType.26640.definition
public RefType(String fullyQualifiedName, List parameter,SyntaxTreeNode parent, int offset) public RefType(String fullyQualifiedName, List<RefType> parameter, int offset)
// ino.end // ino.end
// ino.method.RefType.26640.body // ino.method.RefType.26640.body
{ {
@ -77,12 +77,8 @@ public class RefType extends ObjectType implements IMatchable
this.setName(fullyQualifiedName); this.setName(fullyQualifiedName);
if(parameter != null && parameter.size()>0)this.set_ParaList(parameter); if(parameter != null && parameter.size()>0)this.set_ParaList(parameter);
} }
// ino.end
// ino.method.RefType.26643.definition
public RefType( RefType R, SyntaxTreeNode parent,int offset ) public RefType( RefType R, SyntaxTreeNode parent,int offset )
// ino.end
// ino.method.RefType.26643.body
{ {
super(R.name.toString(),offset); super(R.name.toString(),offset);
// otth: Copy-Konstruktor // otth: Copy-Konstruktor
@ -480,7 +476,13 @@ public class RefType extends ObjectType implements IMatchable
ret.addAll(this.printJavaCode(resultSet).getUnresolvedTPH()); ret.addAll(this.printJavaCode(resultSet).getUnresolvedTPH());
return ret; return ret;
} }
@Override
public boolean involves(TypePlaceholder tph) {
for(RefType param : parameter)
return false;
}
@Override @Override
public Menge<TypePlaceholder> getInvolvedTypePlaceholder() { public Menge<TypePlaceholder> getInvolvedTypePlaceholder() {
Menge<TypePlaceholder> ret = super.getInvolvedTypePlaceholder(); Menge<TypePlaceholder> ret = super.getInvolvedTypePlaceholder();
@ -541,7 +543,12 @@ public class RefType extends ObjectType implements IMatchable
String ret = new org.apache.bcel.generic.ObjectType(combinedType).getSignature(); String ret = new org.apache.bcel.generic.ObjectType(combinedType).getSignature();
return ret; return ret;
} }
@Override
public String getClassSignature(ClassGenerator cg, TypeinferenceResultSet rs) {
return null;
}
public String getCombinedType(ClassGenerator cg, TypeinferenceResultSet rs){ public String getCombinedType(ClassGenerator cg, TypeinferenceResultSet rs){
//Bsp.: Ljava/util/Vector<Ljava/lang/String;>; //Bsp.: Ljava/util/Vector<Ljava/lang/String;>;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();

View File

@ -1,298 +0,0 @@
// ino.module.Type.8677.package
package de.dhbwstuttgart.syntaxtree.type;
// ino.end
// ino.module.Type.8677.import
import java.util.ArrayList;
import java.util.List;
import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.bytecode.ClassGenerator;
import de.dhbwstuttgart.core.IItemWithOffset;
import de.dhbwstuttgart.parser.JavaClassName;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.typeinference.JavaCodeResult;
import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
//TODO: Die Klasse Type muss abstract werden!
// ino.class.Type.26716.declaration
public abstract class Type extends SyntaxTreeNode implements IItemWithOffset
// ino.end
// ino.class.Type.26716.body
{
protected JavaClassName name;
private int offset;
public Type(JavaClassName s, int offset)
{
super(offset);
this.offset = offset;
this.name = s;
}
// ino.method.getOffset.26735.definition
public int getOffset()
// ino.end
// ino.method.getOffset.26735.body
{
return offset;
}
// ino.end
public void setOffset(int offset){
this.offset = offset;
}
// ino.method.getVariableLength.26738.definition
public int getVariableLength()
// ino.end
// ino.method.getVariableLength.26738.body
{
if(this.name!=null){return this.name.toString().length();}
else{return 1;}
}
// ino.end
// ino.method.get_Name.26747.definition
public String get_Name()
// ino.end
// ino.method.get_Name.26747.body
{
return name.toString();
}
// ino.end
// ino.method.Type2String.26756.definition
public String Type2String()
// ino.end
// ino.method.Type2String.26756.body
{
return "((TypePlaceholder))" + getName();
}
// ino.end
// ino.method.Type2Key.26759.definition
public String Type2Key()
// ino.end
// ino.method.Type2Key.26759.body
{
return "";
}
// ino.end
// ino.method.getName.26762.definition
public JavaClassName getName()
// ino.end
// ino.method.getName.26762.body
{
return name;
}
// ino.end
// ino.method.equals.26765.defdescription type=javadoc
/**
* Author: ¯Â¿Â½rg ¯Â¿Â½uerle<br/>
* @param Object
* @return
*/
// ino.end
// ino.method.equals.26765.definition
public boolean equals(Object obj)
// ino.end
// ino.method.equals.26765.body
{
if(obj instanceof Type){
// String name2 = ((Type)obj).printJavaCode(new ResultSet()).toString();
//return printJavaCode(new ResultSet()).toString().equals(name2);
if(((Type)obj).name == null)return false; //Auch wenn der Name dieses Typs auch null ist. Typen sind nur gleich wenn sie einen gleichen Namen haben, welcher nicht null ist.
return ((Type)obj).name.equals(name);
}
else{
return false;
}
}
// ino.end
// ino.method.clone.26768.defdescription type=javadoc
/**
* <br>Author: ¯Â¿Â½rg ¯Â¿Â½uerle
* @return
// ino.end
// ino.method.clone.26768.definition
public Type clone()
// ino.end
// ino.method.clone.26768.body
{
return new RefType(this.getName().toString(), this.getParent(),getOffset());
}
// ino.end
*/
public abstract Type clone();
// ino.method.toString.26771.defdescription type=javadoc
/**
* <br/>Author: ¯Â¿Â½rg ¯Â¿Â½uerle
* @return
*/
// ino.end
// ino.method.toString.26771.definition
public String toString()
// ino.end
// ino.method.toString.26771.body
{
return getName().toString();
}
// ino.end
/*
// ino.method.removeClassParameters.26774.definition
public Type removeClassParameters()
// ino.end
// ino.method.removeClassParameters.26774.body
{
if(this instanceof RefType){
RefType rt=(RefType)this.clone();
rt.set_ParaList(null);
return(rt);
}else{
return(this);
}
}
// ino.end
*/
// ino.method.getSimpleName.26777.defdescription type=javadoc
/**
* HOTI
* Liefert bei Klassen die fullyQualified angegeben wurden
* nur den schlussendlichen Bezeichner
* p.ex. de.dhbwstuttgart.typeinference.Menge => Menge
* @return
*/
// ino.end
// ino.method.getSimpleName.26777.definition
public String getSimpleName()
// ino.end
// ino.method.getSimpleName.26777.body
{
return name.getName();
}
// ino.end
public JavaCodeResult printJavaCode(ResultSet resultSet){
return new JavaCodeResult(this.name.toString());
}
public JavaCodeResult printJavaCode(ResultSet resultSet, boolean resolveTPHs){
return printJavaCode(resultSet);
}
public Type applyResultSet(ResultSet result){
return this.clone();
}
/**
* Liefert alle SuperWildcardTypes, die in diesem Typ enthalten sind.
* @return
*/
public ArrayList<SuperWildcardType> getSuperWildcardTypes() {
ArrayList<SuperWildcardType> ret = new ArrayList<SuperWildcardType>();
if(this instanceof SuperWildcardType)ret.add((SuperWildcardType)this);
return ret;
}
/**
* Sucht nach TPHs in diesem Typ, denen das resultSet keinen Typ zuordnen kann.
* @param resultSet
* @return
*/
public Menge<TypePlaceholder> getUnresolvedTPH(ResultSet resultSet) {
return new Menge<TypePlaceholder>();
}
/**
* Prüft ob der Typ von dem übergebenen TypPlaceholder abhängt.
* @param tph
* @return
*/
public boolean involves(TypePlaceholder tph) {
return false;
}
/**
* Prüft ob der Typ in den Assumptions ass vorhanden ist.
* Dabei kann eine neue Instanz eines Typs entstehen, welche von der Methode zurückgegeben wird.
* @param ass - Die Assumptions ¼r den jeweiligen Kontext in dem sich der Typ befindet.
public ConstraintType checkType(TypeAssumptions ass, SyntaxTreeNode parent){
ConstraintType t = ass.getTypeFor(this, this);
if(t==null)
throw new TypeinferenceException("Der Typ "+this.getName()+" ist nicht korrekt", parent);
return t;
}
*/
//TODO: checkType wird nicht mehr gebraucht. TYPE übernimmt dessen Aufgabe. Es muss nur sichergestellt werden, dass jeder Typ in den Constraints landet, dadurch wird ¼r jeden Typ die Methode TYPE aufgerufen.
public Type TYPE(TypeAssumptions ass, SyntaxTreeNode parent){
Type t = ass.getTypeFor(this, parent);
if(t==null)
throw new TypeinferenceException("Der Typ "+this.getName()+" ist nicht korrekt", parent);
return t;
}
/**
* Sammelt alle TypePlaceholder, welche in diesem Typ vorkommen.
* @return
*/
public Menge<TypePlaceholder> getInvolvedTypePlaceholder(){
Menge<TypePlaceholder> ret = new Menge<>();
return ret;
}
@Override
public Menge<SyntaxTreeNode> getChildren() {
return new Menge<>();
}
public Type checkTYPE(TypeAssumptions ass, SyntaxTreeNode method){
return this;
}
public abstract org.apache.bcel.generic.Type getBytecodeType(ClassGenerator cg, TypeinferenceResultSet rs);
/**
* Erzeugt einen String, welcher den Typ genauer angibt.
* Dieser kann dann in Methoden und Feldersignaturen verwendet werden
* @param cg
* @return
*/
public String getBytecodeSignature(ClassGenerator cg, TypeinferenceResultSet rs) {
return this.getBytecodeType(cg, rs).getSignature();
}
/**
* @param cg
* @return Die Signatur wie sie in Klassensignaturen verwendet wird
*/
public String getClassSignature(ClassGenerator cg, TypeinferenceResultSet rs){
return this.getBytecodeSignature(cg, rs);
}
/**
* Wird beim Bytecode gebraucht.
* Einige Klassen werden vom Compiler als gegeben angenommen,
* obwohl sie sich nicht in der Java Standard Library befinden.
* Diese müssen beim generieren von Bytecode als zusätzliche Klassen generiert werden.
*
* @return - Eine Liste der Klassen, welche bei Verwendung dieses Typs zusätzlich gebraucht werden.
*/
//public abstract List<de.dhbwstuttgart.syntaxtree.Class> isClassFromJavaX();
}
// ino.end

View File

@ -18,7 +18,7 @@ import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
* *
*/ */
public abstract class WildcardType extends Type{ public abstract class WildcardType extends RefType{
protected ObjectType innerType = null; protected ObjectType innerType = null;
@ -46,20 +46,11 @@ public abstract class WildcardType extends Type{
* Author: Arne ¼dtke<br/> * Author: Arne ¼dtke<br/>
* Die Allgemeine Wildcard enthält keinen Typen. * Die Allgemeine Wildcard enthält keinen Typen.
*/ */
public Type GetWildcardType() public RefType GetWildcardType()
{ {
return null; return null;
} }
/**
* Author: Arne ¼dtke<br/>
* Setzt den Typ in der Wildcard, Allgemeine Wildcard hat aber keinen Typen.
* @param T - Type to be set
*/
public void SetWildcardType(Type T)
{
}
@Override @Override
public JavaCodeResult printJavaCode(ResultSet resultSet) { public JavaCodeResult printJavaCode(ResultSet resultSet) {
@ -67,7 +58,7 @@ public abstract class WildcardType extends Type{
} }
@Override @Override
public Type TYPE(TypeAssumptions ass, SyntaxTreeNode parent) { public RefType TYPE(TypeAssumptions ass, SyntaxTreeNode parent) {
this.innerType = (ObjectType) innerType.TYPE(ass, this); this.innerType = (ObjectType) innerType.TYPE(ass, this);
return this; return this;
} }