diff --git a/src/de/dhbwstuttgart/syntaxtree/GenericDeclarationList.java b/src/de/dhbwstuttgart/syntaxtree/GenericDeclarationList.java index 45fb0f09..deadac39 100644 --- a/src/de/dhbwstuttgart/syntaxtree/GenericDeclarationList.java +++ b/src/de/dhbwstuttgart/syntaxtree/GenericDeclarationList.java @@ -19,17 +19,13 @@ import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; public class GenericDeclarationList extends SyntaxTreeNode implements Iterable{ private int offsetOfLastElement; - private Menge gtvs = new Menge<>(); + private List gtvs = new Menge<>(); - public GenericDeclarationList(Menge values, int endOffset) { - this.addAll(values); + public GenericDeclarationList(List values, int endOffset) { + gtvs = values; this.offsetOfLastElement = endOffset; } - private void addAll(Menge values) { - this.gtvs.addAll(values); - } - public int getEndOffset(){ return offsetOfLastElement; } @@ -62,10 +58,6 @@ public class GenericDeclarationList extends SyntaxTreeNode implements Iterable getMenge() { - return this.gtvs; - } - public void add(GenericTypeVar t) { this.gtvs.add(t); } diff --git a/src/de/dhbwstuttgart/syntaxtree/Method.java b/src/de/dhbwstuttgart/syntaxtree/Method.java index cd2ecc42..909615c0 100755 --- a/src/de/dhbwstuttgart/syntaxtree/Method.java +++ b/src/de/dhbwstuttgart/syntaxtree/Method.java @@ -301,8 +301,6 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable public static Method createEmptyMethod(String withSignature, Class parent) { Block block = new Block(new List()); Method ret = new Method(withSignature, new de.dhbwstuttgart.syntaxtree.type.Void(0), new ParameterList(), block, new EmptyGenericDeclarationList(), 0); - Method ret = new Method(0); - DeclId DImethod = new DeclId(); DImethod.set_Name(withSignature); ret.set_DeclId(DImethod); Block tempBlock = new Block(); diff --git a/src/de/dhbwstuttgart/syntaxtree/ParameterList.java b/src/de/dhbwstuttgart/syntaxtree/ParameterList.java index d2eb07c2..02874a1b 100755 --- a/src/de/dhbwstuttgart/syntaxtree/ParameterList.java +++ b/src/de/dhbwstuttgart/syntaxtree/ParameterList.java @@ -6,6 +6,7 @@ import de.dhbwstuttgart.typeinference.Menge; import java.util.Iterator; +import java.util.List; import de.dhbwstuttgart.bytecode.ClassGenerator; import de.dhbwstuttgart.syntaxtree.type.RefType; @@ -13,30 +14,15 @@ import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; -// ino.end - - - -// ino.class.ParameterList.23620.declaration public class ParameterList extends SyntaxTreeNode implements Iterable -// ino.end -// ino.class.ParameterList.23620.body { - // ino.attribute.formalparameter.23623.declaration - public Menge formalparameter = new Menge(); + public List formalparameter = new Menge(); // ino.end - - - // ino.method.set_AddParameter.23626.definition - public void set_AddParameter(FormalParameter fp) - // ino.end - // ino.method.set_AddParameter.23626.body - { - formalparameter.addElement(fp); + public ParameterList(List params){ + this.formalparameter = params; } - // ino.end // ino.method.getParameterAt.23632.definition public FormalParameter getParameterAt(int i) @@ -45,35 +31,24 @@ public class ParameterList extends SyntaxTreeNode implements Iterable= formalparameter.size() ) return null; - return formalparameter.elementAt(i); + return formalparameter.get(i); } // ino.end - // ino.method.sc_get_Formalparalist.23635.definition - public Menge sc_get_Formalparalist() - // ino.end - // ino.method.sc_get_Formalparalist.23635.body + public List sc_get_Formalparalist() { return formalparameter; } - // ino.end - - // ino.method.getParameterCount.23641.defdescription type=javadoc /** * Author: J�rg B�uerle
* @return Die Anzahl der Parameter */ - // ino.end - // ino.method.getParameterCount.23641.definition public int getParameterCount() - // ino.end - // ino.method.getParameterCount.23641.body { return formalparameter.size(); } - // ino.end /** * @author Andreas Stadelmeier, a10023 @@ -129,7 +104,7 @@ public class ParameterList extends SyntaxTreeNode implements Iterable getChildren() { + public List getChildren() { return formalparameter; } diff --git a/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java b/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java index 4dbf3885..321cad03 100644 --- a/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java +++ b/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java @@ -1,5 +1,7 @@ package de.dhbwstuttgart.syntaxtree; +import java.util.List; + import org.apache.bcel.generic.ClassGen; import de.dhbwstuttgart.typeinference.Menge; @@ -21,7 +23,6 @@ import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet; public abstract class SyntaxTreeNode implements IItemWithOffset{ protected SyntaxTreeNode parent; - protected SourceCodePosition position; /** * Wird nach dem Parsen aufgerufen. @@ -44,7 +45,7 @@ public abstract class SyntaxTreeNode implements IItemWithOffset{ return this.parent; } - public abstract Menge getChildren(); + public abstract List getChildren(); /* public Class getParentClass(){ diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index 3f063013..24211f8b 100644 --- a/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -1,5 +1,8 @@ package de.dhbwstuttgart.syntaxtree.factory; +import java.lang.reflect.AnnotatedType; +import java.lang.reflect.Parameter; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.List; @@ -11,6 +14,7 @@ import de.dhbwstuttgart.parser.JavaClassName; import de.dhbwstuttgart.syntaxtree.Class; import de.dhbwstuttgart.syntaxtree.Constructor; import de.dhbwstuttgart.syntaxtree.Field; +import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.GenericDeclarationList; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.ParameterList; @@ -19,10 +23,12 @@ import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.modifier.Modifiers; import de.dhbwstuttgart.syntaxtree.modifier.Public; import de.dhbwstuttgart.syntaxtree.statement.Block; +import de.dhbwstuttgart.syntaxtree.statement.Statement; import de.dhbwstuttgart.syntaxtree.statement.SuperCall; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.Type; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; @@ -95,19 +101,54 @@ public class ASTFactory { return new Class(name, methoden, felder, modifier, isInterface, superClass, implementedInterfaces, offset); } - public static Method createMethod(java.lang.reflect.Method jreMethod){ + public static Method createMethod(java.lang.reflect.Method jreMethod, java.lang.Class inClass){ String name = jreMethod.getName(); Type returnType = createType(jreMethod.getReturnType()); - , ParameterList parameterList, Block block, GenericDeclarationList gtvDeclarations, int offset - return new Method(); + Parameter[] jreParams = jreMethod.getParameters(); + List params = new ArrayList<>(); + for(Parameter jreParam : jreParams){ + Type paramType = createType(jreParam.getType()); + params.add(new FormalParameter(jreParam.getName(),paramType)); + } + ParameterList parameterList = new ParameterList(params); + Block block = new Block(new ArrayList(), -1); + List gtvs = new ArrayList<>(); + for(TypeVariable jreTV : jreMethod.getTypeParameters()){ + GenericTypeVar gtv = createGeneric(jreTV, inClass); + gtvs.add(gtv); + } + GenericDeclarationList gtvDeclarations = new GenericDeclarationList(gtvs,-1); + int offset = -1; + + return new Method(name, returnType, parameterList, block, gtvDeclarations, offset); } public static RefType createType(java.lang.Class jreClass){ - jreClass.getTypeParameters(); + for(TypeVariable jreTV : jreClass.getTypeParameters()){ + GenericTypeVar gtv = createGeneric(jreTV, jreClass); + gtvs.add(gtv); + } + jreClass.getT return new RefType(jreClass.getName(), -1); } - public static GenericTypeVar createGeneric(TypeVariable jreTypeVar){ + /** + * Erstellt eine GenericTypeVar oder eine BoundedGenericTypeVar + * Um die Variablen korrekt zu generieren, muss die Klasse inClass übergeben werden, in der dieser Generic auftaucht + * @param jreTypeVar + * @param inClass Die Klasse in der der Typ auftritt + * @return + */ + public static 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 + String name = jreTypeVar.getTypeName(); + java.lang.reflect.Type[] bounds = jreTypeVar.getBounds(); + if(bounds.length > 0){ + for(java.lang.reflect.Type bound : bounds){ + bound + } + return new BoundedGenericVar(); + } return new GenericTypeVar(); } } diff --git a/src/de/dhbwstuttgart/syntaxtree/factory/NameGenerator.java b/src/de/dhbwstuttgart/syntaxtree/factory/NameGenerator.java new file mode 100644 index 00000000..f20ea0cd --- /dev/null +++ b/src/de/dhbwstuttgart/syntaxtree/factory/NameGenerator.java @@ -0,0 +1,81 @@ +package de.dhbwstuttgart.syntaxtree.factory; + +public class NameGenerator { + + private static String strNextName = "A"; + + /** + * Berechnet einen neuen, eindeutigen Namen f�r eine neue + * TypePlaceholder.
Author: J�rg B�uerle + * @return Der Name + */ + public static String makeNewName() + { + // otth: Funktion berechnet einen neuen Namen anhand eines alten gespeicherten + String strReturn = strNextName; + + // n�chster Name berechnen und in strNextName speichern + inc( strNextName.length() - 1 ); + + return strReturn; + } + + /** + * Hilfsfunktion zur Berechnung eines neuen Namens + *
Author: J�rg B�uerle + * @param i + */ + private static void inc(int i) + { + // otth: Hilfsfunktion zur Berechnung eines neuen Namens + // otth: Erh�hung des Buchstabens an der Stelle i im String strNextName + // otth: Nach �berlauf: rekursiver Aufruf + + // falls i = -1 --> neuer Buchstabe vorne anf�gen + if ( i == -1 ) + { + strNextName = "A" + strNextName; + return; + } + + char cBuchstabe = (char)(strNextName.charAt( i )); + cBuchstabe++; + if ( cBuchstabe - 65 > 25 ) + { + // aktuelle Stelle: auf A zuruecksetzen + manipulate( i, 'A' ); + + // vorherige Stelle erh�hen + inc( i - 1 ); + } + else + { + // aktueller Buchstabe �ndern + manipulate( i, cBuchstabe ); + } + + } + + /** + * Hilfsfunktion zur Berechnung eines neuen Namens. + *
Author: J�rg B�uerle + * @param nStelle + * @param nWert + */ + private static void manipulate( int nStelle, char nWert ) + { + // otth: Hilfsfunktion zur Berechnung eines neuen Namens + // otth: Ersetzt im String 'strNextName' an der Position 'nStelle' den Buchstaben durch 'nWert' + + String strTemp = ""; + for( int i = 0; i < strNextName.length(); i++) + { + if ( i == nStelle ) + strTemp = strTemp + nWert; + else + strTemp = strTemp + strNextName.charAt( i ); + } + strNextName = strTemp; + } + +} diff --git a/src/de/dhbwstuttgart/syntaxtree/statement/Block.java b/src/de/dhbwstuttgart/syntaxtree/statement/Block.java index d25a1876..17bb9150 100755 --- a/src/de/dhbwstuttgart/syntaxtree/statement/Block.java +++ b/src/de/dhbwstuttgart/syntaxtree/statement/Block.java @@ -46,17 +46,8 @@ public class Block extends Statement private ConstantPoolGen _cp; private ClassGen _cg; - // ino.method.Block.25041.definition - public Block() - // ino.end - // ino.method.Block.25041.body - { - super(-1,-1); - } - // ino.end - - - public Block(List statements) { + public Block(List statements, int offset) { + super(offset); this.statements = statements; } @@ -82,38 +73,12 @@ public class Block extends Statement // ino.method.get_Statement.25065.definition - public Menge get_Statement() + public List get_Statement() // ino.end // ino.method.get_Statement.25065.body { return statements; } - // ino.end - - - - - // ino.method.set_Statement.25068.definition - public void set_Statement(Statement s) - // ino.end - // ino.method.set_Statement.25068.body - { - statements.addElement(s); - } - // ino.end - - - - // ino.method.set_Statement_Menge.25071.definition - public void set_Statement_Menge(Menge v) - // ino.end - // ino.method.set_Statement_Menge.25071.body - { - statements = v; - } - // ino.end - - ///////////////////////////////////////////////////////////////////////// // TypeReconstructionAlgorithmus @@ -136,33 +101,9 @@ public class Block extends Statement } // ino.end - - // ino.method.wandleRefTypeAttributes2GenericAttributes.25086.defdescription type=javadoc - /** - * In allen lokalen Variablendeklarationen die "falschen" RefTypes ersetzen - * @param paralist - * @param genericMethodParameters - */ - // ino.end - // ino.method.wandleRefTypeAttributes2GenericAttributes.25086.definition - public void wandleRefTypeAttributes2GenericAttributes(Menge paralist, Menge genericMethodParameters) - // ino.end - // ino.method.wandleRefTypeAttributes2GenericAttributes.25086.body - { - if(statements==null) - return; - - for(int i=0;i0){ - Statement stmt = statements.elementAt(statements.size()-1); + Statement stmt = statements.get(statements.size()-1); typinferenceLog.debug("Prozessing statement: "+stmt, Section.TYPEINFERENCE); this.setType(stmt.getType()); for(int i= statements.size()-2; i >= 0; i--) { - stmt = statements.elementAt(i); + stmt = statements.get(i); typinferenceLog.debug("Prozessing statement: "+stmt, Section.TYPEINFERENCE); if (!(stmt.getReturnType() instanceof Void)) if (this.getReturnType() instanceof Void) { @@ -191,8 +132,6 @@ public class Block extends Statement this.setType(tph); } } - }else{ - this.setType(new Void(this,0)); } return ret; } diff --git a/src/de/dhbwstuttgart/syntaxtree/statement/Statement.java b/src/de/dhbwstuttgart/syntaxtree/statement/Statement.java index ba9c326a..05eda0c0 100755 --- a/src/de/dhbwstuttgart/syntaxtree/statement/Statement.java +++ b/src/de/dhbwstuttgart/syntaxtree/statement/Statement.java @@ -65,14 +65,6 @@ public abstract class Statement extends SyntaxTreeNode implements IItemWithOffse { return variableLength; } - // ino.end - - - - - // ino.method.wandleRefTypeAttributes2GenericAttributes.26224.declaration - public abstract void wandleRefTypeAttributes2GenericAttributes(Menge paralist, Menge genericMethodParameters); - // ino.end /** * @author AI10023 - Andreas Stadelmeier diff --git a/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java b/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java index 39c1e690..069a2cc2 100755 --- a/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java @@ -28,8 +28,6 @@ import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; * @author J�rg B�uerle * @version $Date: 2013/09/22 20:12:53 $ */ -// ino.end -// ino.class.GenericTypeVar.26505.declaration public class GenericTypeVar extends ObjectType // ino.end // ino.class.GenericTypeVar.26505.body @@ -90,9 +88,7 @@ public class GenericTypeVar extends ObjectType { return new GenericTypeVar(this.getName().toString(), this.getParentClass(), getOffset()); } - // ino.end - - // ino.method.equals.26515.defdescription type=javadoc + /** *
Author: J�rg B�uerle * @param obj @@ -124,23 +120,16 @@ public class GenericTypeVar extends ObjectType return this.name.hashCode(); } - // ino.method.get_codegen_Type.26521.defdescription type=javadoc /** * hoti 4.5.06 * Generische Typen werden im Bytecode * aus Abwaertskompatiblitaet wie Object dargestellt */ - // ino.end - // ino.method.get_codegen_Type.26521.definition public String get_codegen_Type(Menge paralist) - // ino.end - // ino.method.get_codegen_Type.26521.body { return("Ljava/lang/Object;"); } - // ino.end - - // ino.method.getSignatureType.26524.definition + public String getSignatureType(Menge paralist) // ino.end // ino.method.getSignatureType.26524.body diff --git a/src/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java b/src/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java index 96274d36..61f979a8 100755 --- a/src/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/TypePlaceholder.java @@ -14,6 +14,7 @@ import de.dhbwstuttgart.bytecode.TypePlaceholderType; import de.dhbwstuttgart.core.MyCompiler; import de.dhbwstuttgart.parser.JavaClassName; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; +import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeInsertable; @@ -40,7 +41,6 @@ public class TypePlaceholder extends ObjectType { private static final Logger log = Logger.getLogger(TypePlaceholder.class.getName()); // ino.attribute.strNextName.26785.declaration - private static String strNextName = "A"; // ino.end // ino.attribute.m_TypePlaceholdersRegistry.26788.declaration private static Hashtable m_TypePlaceholdersRegistry = new Hashtable(); @@ -104,7 +104,7 @@ public class TypePlaceholder extends ObjectType TypePlaceholder typeVar = new TypePlaceholder(name, parent); TypePlaceholder oldTPH = m_TypePlaceholdersRegistry.put(typeVar.getName().toString(), typeVar); if(oldTPH != null){ - oldTPH.name = new JavaClassName(makeNewName()); + oldTPH.name = new JavaClassName(NameGenerator.makeNewName()); m_TypePlaceholdersRegistry.put(oldTPH.getName().toString(), oldTPH); } return typeVar; @@ -120,7 +120,7 @@ public class TypePlaceholder extends ObjectType * @return */ public static TypePlaceholder fresh(SyntaxTreeNode parent){ - TypePlaceholder ret= new TypePlaceholder(makeNewName(), parent); + TypePlaceholder ret= new TypePlaceholder(NameGenerator.makeNewName(), parent); m_TypePlaceholdersRegistry.put(ret.getName().toString(), ret); return ret; } @@ -132,98 +132,6 @@ public class TypePlaceholder extends ObjectType return ret; } - // ino.method.makeNewName.26803.defdescription type=javadoc - /** - * Berechnet einen neuen, eindeutigen Namen f�r eine neue - * TypePlaceholder.
Author: J�rg B�uerle - * @return Der Name - */ - // ino.end - // ino.method.makeNewName.26803.definition - private static String makeNewName() - // ino.end - // ino.method.makeNewName.26803.body - { - // otth: Funktion berechnet einen neuen Namen anhand eines alten gespeicherten - String strReturn = strNextName; - - // n�chster Name berechnen und in strNextName speichern - inc( strNextName.length() - 1 ); - - return strReturn; - } - // ino.end - - // ino.method.inc.26806.defdescription type=javadoc - /** - * Hilfsfunktion zur Berechnung eines neuen Namens - *
Author: J�rg B�uerle - * @param i - */ - // ino.end - // ino.method.inc.26806.definition - private static void inc(int i) - // ino.end - // ino.method.inc.26806.body - { - // otth: Hilfsfunktion zur Berechnung eines neuen Namens - // otth: Erh�hung des Buchstabens an der Stelle i im String strNextName - // otth: Nach �berlauf: rekursiver Aufruf - - // falls i = -1 --> neuer Buchstabe vorne anf�gen - if ( i == -1 ) - { - strNextName = "A" + strNextName; - return; - } - - char cBuchstabe = (char)(strNextName.charAt( i )); - cBuchstabe++; - if ( cBuchstabe - 65 > 25 ) - { - // aktuelle Stelle: auf A zuruecksetzen - manipulate( i, 'A' ); - - // vorherige Stelle erh�hen - inc( i - 1 ); - } - else - { - // aktueller Buchstabe �ndern - manipulate( i, cBuchstabe ); - } - - } - // ino.end - - // ino.method.manipulate.26809.defdescription type=javadoc - /** - * Hilfsfunktion zur Berechnung eines neuen Namens. - *
Author: J�rg B�uerle - * @param nStelle - * @param nWert - */ - // ino.end - // ino.method.manipulate.26809.definition - private static void manipulate( int nStelle, char nWert ) - // ino.end - // ino.method.manipulate.26809.body - { - // otth: Hilfsfunktion zur Berechnung eines neuen Namens - // otth: Ersetzt im String 'strNextName' an der Position 'nStelle' den Buchstaben durch 'nWert' - - String strTemp = ""; - for( int i = 0; i < strNextName.length(); i++) - { - if ( i == nStelle ) - strTemp = strTemp + nWert; - else - strTemp = strTemp + strNextName.charAt( i ); - } - strNextName = strTemp; - } - // ino.end - // ino.method.equals.26812.defdescription type=javadoc /** * Author: J�rg B�uerle
@@ -327,7 +235,7 @@ public class TypePlaceholder extends ObjectType //backdoorvars werden registiert, weil am Ende beim execute //auf den CSubstitution nicht registrierte Variablen zu //Exceptions fuehrt - TypePlaceholder typeVar = new TypePlaceholder(makeNewName(), null); + TypePlaceholder typeVar = new TypePlaceholder(NameGenerator.makeNewName(), null); m_TypePlaceholdersRegistry.put(typeVar.getName().toString(), typeVar); return typeVar;