// ino.module.SourceFile.8722.package package de.dhbwstuttgart.syntaxtree; // ino.end // ino.module.SourceFile.8722.import import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import org.apache.log4j.Logger; import de.dhbwstuttgart.bytecode.ClassFile; import de.dhbwstuttgart.core.AClassOrInterface; import de.dhbwstuttgart.core.MyCompiler; import de.dhbwstuttgart.myexception.CTypeReconstructionException; import de.dhbwstuttgart.myexception.JVMCodeException; import de.dhbwstuttgart.myexception.SCClassException; import de.dhbwstuttgart.myexception.SCException; import de.dhbwstuttgart.parser.JavaClassName; import de.dhbwstuttgart.syntaxtree.misc.DeclId; import de.dhbwstuttgart.syntaxtree.misc.UsedId; import de.dhbwstuttgart.syntaxtree.modifier.Modifiers; import de.dhbwstuttgart.syntaxtree.modifier.Public; import de.dhbwstuttgart.syntaxtree.type.BooleanType; 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.syntaxtree.type.Void; import de.dhbwstuttgart.typeinference.ConstraintsSet; import de.dhbwstuttgart.typeinference.FunN; import de.dhbwstuttgart.typeinference.FunNInterface; import de.dhbwstuttgart.typeinference.FunNMethod; import de.dhbwstuttgart.typeinference.Pair; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; import de.dhbwstuttgart.typeinference.UndConstraint; import de.dhbwstuttgart.typeinference.assumptions.ClassAssumption; import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption; import de.dhbwstuttgart.typeinference.assumptions.ParameterAssumption; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.exceptions.DebugException; import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.unify.FC_TTO; import de.dhbwstuttgart.typeinference.unify.Unify; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import sun.reflect.generics.reflectiveObjects.TypeVariableImpl; // ino.class.SourceFile.21355.declaration public class SourceFile extends SyntaxTreeNode // ino.end // ino.class.SourceFile.21355.body { // ino.attribute.LOAD_BASIC_ASSUMPTIONS_FROM_JRE.21358.decldescription type=javadoc /** * @autor HOTI * Dieses Flag bestimmt, ob die basicAssumptions (Integer, Vector, ...) direkt von * der Java-Laufzeitumgebung anhand der Imports oder von den "Fixed Hacks" geladen * werden (Mit Fixed Hacks sind die von Hand eingetragene Basetypes gemeint) */ // ino.end // ino.attribute.LOAD_BASIC_ASSUMPTIONS_FROM_JRE.21358.declaration private static final boolean LOAD_BASIC_ASSUMPTIONS_FROM_JRE = true; // ino.end // ino.attribute.READ_OBJECT_SUPERCLASSES_FROM_JRE.21361.decldescription type=javadoc /** * @autor HOTI * Wenn dieses Flag auf true gesetzt ist, wird immer als Superklasse Object * mit rein geladen. Dies hat natürlich zur Folge, dass man in der GUI jeden Typ * auswählen muss, weil ALLES in Java von Object erbt. Sobald die GUI das über eine * Checkbox o.ä. ausblendbar macht kann es aktiviert werden. Ebenso beeinflusst es * die superclass von allen Class-Objekten. (Wenn true ist jede Class automatisch * wenn nicht anders eingegeben Subclass von Object (Wie es sein muss)) */ // ino.end // ino.attribute.READ_OBJECT_SUPERCLASSES_FROM_JRE.21361.declaration public static final boolean READ_OBJECT_SUPERCLASSES_FROM_JRE = false; // ino.end // ino.attribute.READ_BASE_TYPE_SUPERCLASSES_FROM_JRE.21364.decldescription type=javadoc /** * Wenn dieses Flag auf false ist, werden für alle Basisklassen (definiert * durch die Hashtable baseTypeTranslationTable) KEINE Superklassen geladen. D.h. * Integer hat bspw. nicht die Superklasse Number sondern OBJECT. * Dies verursacht bei den Int-Operationen ein Problem * (+,-,*,/,<,>,...) */ // ino.end // ino.attribute.READ_BASE_TYPE_SUPERCLASSES_FROM_JRE.21364.declaration private static final boolean READ_BASE_TYPE_SUPERCLASSES_FROM_JRE = false; // ino.end /** * @autor PL * Wenn dieses Flag auf false ist, werden für alle importierten Klassen * KEINE Superklassen geladen. */ private static final boolean READ_IMPORTED_SUPERCLASSES_FROM_JRE = false; // ino.attribute.codegenlog.21367.decldescription type=line // Logger fuer Code-Gen // ino.end // ino.attribute.codegenlog.21367.declaration protected static Logger codegenlog = Logger.getLogger("codegen"); // ino.end // ino.attribute.inferencelog.21370.declaration protected static Logger inferencelog = Logger.getLogger("inference"); // ino.end // ino.attribute.pkgName.21373.declaration private UsedId pkgName; // ino.end // ino.attribute.KlassenVektor.21376.declaration public Vector KlassenVektor = new Vector(); // ino.end // ino.attribute.InterfaceVektor.21379.declaration public Vector InterfaceVektor = new Vector(); // ino.end /** * Die SourceFile repräsntiert eine zu einem Syntaxbaum eingelesene Java-Datei. * SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar. */ public SourceFile(){ // HOTI 4.5.06 // Base-Type-Translations anlegen (siehe kommentar BaseTypeTranslationTable) baseTypeTranslationTable=new Hashtable(); baseTypeTranslationTable.put("int","java.lang.Integer"); baseTypeTranslationTable.put("char","java.lang.Character"); baseTypeTranslationTable.put("boolean","java.lang.Boolean"); baseTypeTranslationTable.put("double","java.lang.Double"); baseTypeTranslationTable.put("long","java.lang.Long"); baseTypeTranslationTable.put("float","java.lang.Float"); //baseTypeTranslationTable.put("this.is.a.temporary.entry","java.util.Vector"); auskommentiert PL 07-08-11 this.imports=new ImportDeclarations(); this.imports.add(UsedId.createFromQualifiedName("java.lang.Integer",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.String",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.Character",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.Boolean",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.Double",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.Float",-1)); this.imports.add(UsedId.createFromQualifiedName("java.lang.Long",-1)); //this.imports.add(UsedId.createFromQualifiedName("java.lang.Byte")); // HOTI 4.5.06 Wenn die Klassen immer als "Daddy" Object haben, // muss das der JCC auch kennen if(READ_OBJECT_SUPERCLASSES_FROM_JRE){ this.imports.add(UsedId.createFromQualifiedName("java.lang.Object",-1)); } } public SourceFile(Vector classDefinitions) { this.KlassenVektor = classDefinitions; } // ino.attribute.imports.21382.decldescription type=javadoc /** * HOTI 4.5.06 * Beinhaltet alle Imports des aktuell geparsten Files * in Form einer UsedId */ // ino.end // ino.attribute.imports.21382.declaration private ImportDeclarations imports=new ImportDeclarations(); // ino.end // ino.attribute.baseTypeTranslationTable.21385.decldescription type=javadoc /** * Table zum Übersetzen der nicht implementierten Base-Types: * Überall im Compiler wird statt bspw. int Integer verwendet * d.h. 1+2 liefert ein Integer * Deshalb benötigen wir hier eine Tabelle, mit der man die von * der JRE gelieferten Base-Typen (int,char, etc) und die Objekt- * Typen umwandeln können */ // ino.end // ino.attribute.baseTypeTranslationTable.21385.declaration private Hashtable baseTypeTranslationTable; // ino.end // ino.method.addElement.21394.defdescription type=javadoc /** * Fuegt ein neues Element (Interface oder Klasse) hinzu. * @param c */ // ino.end // ino.method.addElement.21394.definition public void addElement(AClassOrInterface e) // ino.end // ino.method.addElement.21394.body { if (e instanceof Class) { KlassenVektor.addElement((Class) e); } else if (e instanceof Interface) { InterfaceVektor.addElement((Interface) e); } } // ino.end // ino.method.codegen.21397.defdescription type=javadoc /** * Startet die Bytecodegenerierung fuer alle in der Datei * enthaltenen Klassen und Interfaces. * // ino.end // ino.method.codegen.21397.definition public Vector codegen(ResultSet result) throws JVMCodeException // ino.end // ino.method.codegen.21397.body { Vector ret = new Vector(); codegenlog.info("Anzahl der Interfaces: " + Integer.toString(InterfaceVektor.size())); for(int i = 0; i < InterfaceVektor.size(); i++) { InterfaceVektor.elementAt(i).codegen(result); } codegenlog.info("Anzahl der Klassen: " + Integer.toString(KlassenVektor.size())); for(int i = 0; i < KlassenVektor.size(); i++) { ret.add(KlassenVektor.elementAt(i).codegen(result)); } return ret; } // ino.end */ // ino.method.createPairFromClassAndSuperclass.21400.defdescription type=javadoc /** * Erstellt ein Typ-Paar, welches im 1. Durchlauf in die Menge der Finite Closure * aufgenommen wird Input: Klassenname, Name der Superklasse, ParameterDerKlasse, * Parameter der Superklasse * @return */ // ino.end // ino.method.createPairFromClassAndSuperclass.21400.definition private Pair createPairFromClassAndSuperclass(Class baseClass, Class superclass, Vector classParaOrg, Vector superclassParaOrg) // ino.end // ino.method.createPairFromClassAndSuperclass.21400.body { // Paar erstellen if(classParaOrg!=null && classParaOrg.size()==0){ classParaOrg=null; } if(superclassParaOrg!=null && superclassParaOrg.size()==0){ superclassParaOrg=null; } /* Pair P = new Pair( new RefType( className.toString(), classParaOrg,-1), new RefType( superclassName.toString(), superclassParaOrg,-1) ); */ Pair P = new Pair(baseClass.getType(), superclass.getType()); //PL 04-12-29 freshe Variablen ANFANG RefType r1 = (RefType)P.getTA1Copy(); RefType r2 = (RefType)P.getTA2Copy(); // #JB# 05.04.2005 // ########################################################### Hashtable substHash = new Hashtable(); //fuer jedes Paar komplett neue Variablen Unify.varSubst(r1, substHash); Unify.varSubst(r2, substHash); // ########################################################### P = new Pair(r1, r2); //PL 04-12-29 freshe Variablen ENDE //HIER AUSKOMMENTIERT, SOLLTE MAN AM ENDE WIEDER DAZU NEHMEN PL 04-12-28 // gleiches Paar aufnehmen //vFC.add( new Pair( P.getTA1Copy(), P.getTA1Copy() ) ); return(P); } // ino.end // ino.method.makeFC.21403.defdescription type=javadoc /** * Erstellt die Finite Closure * @return FC_TTO-Object, welches die Finite Closure repräsentiert */ // ino.end // ino.method.makeFC.21403.definition public FC_TTO makeFC( ) // ino.end // ino.method.makeFC.21403.body { // Menge FC bilden Vector vFC = new Vector(); // Menge FC // 1. Menge <= in FC aufnehmen --> Iteration ueber alle Klassen for( int i = 0; i < KlassenVektor.size(); i++ ) { Class tempKlasse = KlassenVektor.elementAt(i); inferencelog.debug("Verarbeite "+tempKlasse.getName()); //TODO: SuperKlasse erstellen, dies sollte am besten beim Konstruktoraufruf von Class geschehen. Diese kann dann mit getSuperClass abgefragt werden. if( tempKlasse.superclassid != null ) { // Klasse hat Superklasse Pair P=createPairFromClassAndSuperclass(tempKlasse,tempKlasse.getSuperClass(),tempKlasse.get_ParaList(),tempKlasse.superclassid.get_ParaList()); vFC.add( P ); } if(tempKlasse.getSuperInterfaces()!=null){ Iterator interfaceIterator=tempKlasse.getSuperInterfaces().iterator(); while(interfaceIterator.hasNext()){ Interface intf=interfaceIterator.next(); Pair P=createPairFromClassAndSuperclass(tempKlasse,intf,tempKlasse.get_ParaList(),intf.get_ParaList()); vFC.add( P ); } } } // Schleifenende durch Klassenvektor for(int i=0; i interfaceIterator=intf.getSuperInterfaces().iterator(); while(interfaceIterator.hasNext()){ Interface superintf=interfaceIterator.next(); Pair P=createPairFromClassAndSuperclass(intf,superintf,intf.getParaList(), superintf.get_ParaList()); vFC.add( P ); } } } Vector tto = (Vector)vFC.clone(); Unify.printMenge( "FC", vFC, 6 ); /* z.B. ******************************* Menge FC = { (Vektor< A >, Vektor< A >), (Vektor< A >, AbstractList< A >), (Matrix< A >, Matrix< A >), (Matrix< A >, Vektor< Vektor< A > >), (ExMatrix< A >, ExMatrix< A >), (ExMatrix< A >, Matrix< A >) } ******************************* ODER ******************************* Menge FC = { (BB< A >, BB< A >), (BB< A >, CC< A >), (AA< A, B >, AA< A, B >), (AA< A, B >, BB< DD< B, A > >) } ******************************* */ // 2. Regel 2 der Huellendefinition "eingeschraenkt" anwenden // d.h. sinnvolle Substitutionen suchen (nicht alle) boolean bPaarHinzu = true; while( bPaarHinzu ) { bPaarHinzu = false; //PL 04-12-29 nur wenn hinzugefuegt auf true setzen // konkret: rechte Seite von FC nach Typkonstruktoren in der Parameterliste durchsuchen for( int n = 0; n < vFC.size(); n++ ) { // Elemente in FC k�nnen nur Pair's sein --> Cast ohne Abfrage Pair PTypKonst = vFC.elementAt(n); // Parameter des rechten Typausdrucks des betrachteten Paars extrahieren Vector vPara = ((RefType)(PTypKonst.TA2)).get_ParaList(); RefType Subst = null; // Substitution int nSubstStelle = 0; inferencelog.debug("nSubstStelleStart" + nSubstStelle + " " + n); // Parameter durchlaufen und nach Typkonstruktor suchen // #JB# 17.05.2005 // ########################################################### if(vPara!=null){ // ########################################################### for( ; nSubstStelle < vPara.size(); nSubstStelle++ ) { inferencelog.debug("nSubstStelle" + nSubstStelle); if( vPara.elementAt(nSubstStelle) instanceof RefType && ((RefType)vPara.elementAt(nSubstStelle)).get_ParaList() != null ) { // Typkonstruktor gefunden -> wird nun als Substitution verwendet Subst = new RefType( (RefType)vPara.elementAt(nSubstStelle) ,-1); inferencelog.debug( "Ausgangstyp:" + ((RefType)PTypKonst.TA2).getName() ); inferencelog.debug( "RefType = " + ((RefType)vPara.elementAt(nSubstStelle)).getName() ); break; // Einschraenkung - nur fuer ein RefType wird eine Substitution gesucht } } // ########################################################### } // ########################################################### if( Subst != null ) { // Rechter Typ hat einen Typkonstruktor --> sinvolles neues Paar bilden // d.h. Rechter Typ auf linker Paarseite suchen // System.out.println("Subststelle = " + nSubstStelle ); for( int t = 0; t < vFC.size(); t++ ) { Pair PSuchen = vFC.elementAt(t); if( ((RefType)(PTypKonst.TA2)).getTypeName().equals( ((RefType)PSuchen.TA1).getTypeName() ) ) { inferencelog.debug(" gefundener Typ links: " + ((RefType)(PSuchen.TA1)).getName() ); inferencelog.debug(" gefundener Typ rechts: " + ((RefType)(PSuchen.TA2)).getName() ); // Paar gefunden, das als linken Typ den gleichen Typen enth�lt, der als Parameter einen Typkonstruktor hat // Substitution //Pair P = new Pair( PSuchen.getTA1Copy( ), PSuchen.getTA2Copy( ) ); //linker Typterm bleibt gleich //rechter Typterm wird aussen auf den Supertyp gesetzt. //restliches FC erfolgt ueber die Transitivitaet //siehe im unteren Teil Pair P = new Pair( PTypKonst.getTA1Copy( ), PSuchen.getTA2Copy( ) ); // System.out.println(" Subst " + Subst.getName() ); // System.out.println(" Vor: P = " + P.toString() + P.TA1 ); // System.out.println(" Vor: PSuchen = " + PSuchen.toString() + PSuchen.TA1 ); // Parameter, der substituiert wird, sollte TV sein ??? //TypePlaceholder TV = null; // if( ((RefType)P.TA1).isTV( nSubstStelle ) ) // try // { // TV = new TypePlaceholder( ((RefType)P.TA1).getParaN( nSubstStelle ) ); // } // catch( Exception E ) // { // continue; // } // else // continue; //es werden alle Parameter in einem Typeterm, der //der Argumente hat ersetzt PL 04-12-28 Hashtable hts = new Hashtable(); //for(int u = nSubstStelle; u < vPara.size(); u++) { for(int u = 0; u < vPara.size(); u++) { try { // #JB# 05.04.2005 // ########################################################### //TV = new TypePlaceholder( ((RefType)PSuchen.TA1).getParaN(u) ); //System.out.println("TV_Name: " + u + TV.Type2String()); // ########################################################### inferencelog.debug("Typterm_Name: " + vPara.elementAt(u)); inferencelog.debug("Typterm_Name: " + ((Type)vPara.elementAt(u)).Type2String()); hts.put(new JavaClassName(((RefType)PSuchen.TA1).getParaN(u)), vPara.elementAt(u)); } catch( Exception E ) { inferencelog.error(E.getMessage()); //FIXME Throw Exception or Error instead of exiting! System.exit(0); } // Subst( P, // 2, // TV, // new RefType( (RefType)vPara.elementAt(u) ), // false ); // rechte Seite substituieren //Es genuegt die rechte Seite zu substituieren, da //die linke Seite ein Typterm ausschlie�lich mit //Typvariablen ist } //Unify.SubstHashtableGeneric(((RefType)P.TA1), hts); //funktioniert nicht Unify.SubstHashtableGeneric(((RefType)P.TA2), hts); //funktioniert nicht // System.out.println(" TV!!!= " + TV.getName() ); //Subst( P, 1, TV, Subst, false ); // linke Seite substituieren //Subst( P, 2, TV, Subst, false ); // rechte Seite substituieren // System.out.println(" nach Subst: P = " + P.toString() ); // System.out.println(" Nach: PSuchen = " + PSuchen.toString() ); // System.out.println(" Nach: " + P.toString() ); // Paar einfuegen, falls noch nicht vorhanden // System.out.println("Paar alt:" + PSuchen.toString() ); // System.out.println("Paar neu:" + P.toString() ); if( !P.isInVector( vFC ) ) { vFC.add( P ); Unify.printMenge( "FC", vFC, 6 ); bPaarHinzu = true; } //PL 04-12-29 // else //unnoetig, da am Anfang bereits false gesetzt // { // bPaarHinzu = false; // } } } } // end if: Substitution gefunden??? } // end for: Typkonstruktor suchen // Transitivitaet berechnen for( int u = 0; u < vFC.size(); u++ ) { Pair PTemp = vFC.elementAt(u); // falls rechtes Paar = RefType if( PTemp.TA2 instanceof RefType ) { RefType R = (RefType)PTemp.TA2; // rechte Seite auf linker Seite suchen for( int e = 0; e < vFC.size(); e++ ) { Pair PSuch = vFC.elementAt(e); // als linke Paarseite theortisch nur RefType's moeglich --> Cast RefType RSuch = (RefType)PSuch.TA1; //if( R.getName().equals(RSuch.getName()) ) if (R.is_Equiv(RSuch, new Hashtable())) //eingefuegt PL 05-01-07 { // Paar einfuegen, falls noch nicht vorhanden RefType L1 = (RefType)PTemp.getTA1Copy(); RefType L2 = (RefType)PTemp.getTA2Copy(); RefType R1 = (RefType)PSuch.getTA1Copy(); RefType R2 = (RefType)PSuch.getTA2Copy(); //zunaechst Variablen disjunkt machen ANFANG // #JB# 05.04.2005 // ########################################################### Hashtable substHash1 = new Hashtable(); Unify.varSubst(L1, substHash1); Unify.varSubst(L2, substHash1); Hashtable substHash2 = new Hashtable(); Unify.varSubst(R1, substHash2); Unify.varSubst(R2, substHash2); // ########################################################### //zunaechst Variablen disjunkt machen ENDE //Variablen so umbennen, dass transitiver Abschluss richtige //Namen hat ANFANG // #JB# 05.04.2005 // ########################################################### Hashtable h = new Hashtable(); L2.Equiv2Equal(R1, h); Hashtable substHash3 = h; Unify.varSubst(L1, substHash3); Unify.varSubst(R2, substHash3); // ########################################################### //Variablen so umbennen, dass transitiver Abschluss richitge //Namen hat ENDE //Pair P = new Pair( (RefType)PTemp.TA1, (RefType)PSuch.TA2 ); Pair P = new Pair(L1, R2); if( !P.isInVector( vFC ) ) { vFC.add( P ); bPaarHinzu = true; } else { bPaarHinzu = false; } } } // end for: linke Seite suchen } // end if: Element ist RefType } // end for: Transitivit�ten berechnen //PL HIER REFLEXIVE HUELLE EINFUEGEN // 05-01-07 } // Ende WHILE /* z.B. ******************************* Menge nach trans: FC = { (Vektor< A >, Vektor< A >), (Vektor< A >, AbstractList< A >), (Matrix< A >, Matrix< A >), (Matrix< A >, Vektor< Vektor< A > >), (ExMatrix< A >, ExMatrix< A >), (ExMatrix< A >, Matrix< A >), (Vektor< Vektor< A > >, Vektor< Vektor< A > >), (Vektor< Vektor< A > >, AbstractList< Vektor< A > >), (Matrix< A >, AbstractList< Vektor< A > >), (ExMatrix< A >, Vektor< Vektor< A > >), (ExMatrix< A >, AbstractList< Vektor< A > >) } ODER ******************************* Menge nach trans: FC = { (BB< A >, BB< A >), (BB< A >, CC< A >), (AA< A, B >, AA< A, B >), (AA< A, B >, BB< DD< B, A > >), (BB< DD< B, A > >, BB< DD< B, A > >), (BB< DD< B, A > >, CC< DD< B, A > >), (AA< A, B >, CC< DD< B, A > >) } ******************************* ******************************* */ // printMenge( "nach trans: FC", vFC, 6 ); FC_TTO fctto = new FC_TTO(vFC, tto,KlassenVektor); return fctto; } // ino.end public TypeAssumptions getPublicFieldAssumptions(){ TypeAssumptions publicAssumptions = new TypeAssumptions(null); //Alle PublicAssumptions der in dieser SourceFile enthaltenen Klassen sammeln: for(Class klasse : KlassenVektor){ publicAssumptions.add(klasse.getPublicFieldAssumptions()); } return publicAssumptions; } ///////////////////////////////////////////////////////////////////////// // TypeReconstructionAlgorithmus ///////////////////////////////////////////////////////////////////////// // ino.method.typeReconstruction.21406.defdescription type=javadoc /** * Tyrekonstruktionsalgorithmus: ruft f�r jede Klasse den Algorithmus TRProg auf. * Dessen Ergebnismenge A, die Menge aller Typannahmen, f�r eine Klasse dient als * Eingabe f�r TRProg der n�chsten Klasse. Am Ende enth�lt A alle m�glichen * Typkombinationen f�r alle Klassen zusammen. *
Author: J�rg B�uerle * @return Liste aller m�glichen Typkombinationen * @throws CTypeReconstructionException Wenn was schief l�uft */ // ino.end // ino.method.typeReconstruction.21406.definition public Vector typeReconstruction(TypeAssumptions globalAssumptions) throws CTypeReconstructionException // ino.end // ino.method.typeReconstruction.21406.body { Vector ret = new Vector(); //Logger initialisieren: Logger typinferenzLog = Logger.getLogger("Typeinference"); //FiniteClosure generieren: FC_TTO finiteClosure = this.makeFC(); //Alle Assumptions für diese SourceFile sammeln: for(Class klasse : this.KlassenVektor){ globalAssumptions.add(klasse.getPublicFieldAssumptions()); } //Assumptions der importierten Klassen sammeln: TypeAssumptions importAssumptions = this.makeBasicAssumptionsFromJRE(imports); globalAssumptions.add(importAssumptions); typinferenzLog.debug("Von JRE erstellte Assumptions: "+importAssumptions); ConstraintsSet oderConstraints = new ConstraintsSet(); //Alle Constraints der in dieser SourceFile enthaltenen Klassen sammeln: for(Class klasse : KlassenVektor){ oderConstraints.add(klasse.typeReconstruction(finiteClosure, globalAssumptions)); } //////////////// //Karthesisches Produkt bilden: //////////////// //Die Constraints in Pair's umwandeln (Karthesisches Produkt bilden): Vector> xConstraints = new Vector>();// = oderConstraints.getConstraints(); for(Vector uC:oderConstraints.getConstraints()){ //mit dem getConstraints-Aufruf wird das Karthesische Produkt erzeugt. Vector cons = new Vector(); for(UndConstraint undCons:uC){ cons.addAll(undCons.getConstraintPairs()); } xConstraints.add(cons); } typinferenzLog.debug("Karthesisches Produkt der Constraints: "+xConstraints); finiteClosure.generateFullyNamedTypes(globalAssumptions); ////////////////////////////// // Unifizierung der Constraints: ////////////////////////////// boolean unifyFail = true; for(Vector constraints : xConstraints){ //Alle durch das Karthesische Produkt entstandenen Möglichkeiten durchgehen: Vector> result = new Vector>(); //Alle FunN-Typen werden per clone-methode in RefTypes verwandelt. (Die clone Methode in FunN darf nicht überschrieben werden. for(Pair p : constraints){ if(p.TA1 instanceof FunN){ p.TA1 = p.TA1.clone(); } if(p.TA2 instanceof FunN){ p.TA2 = p.TA2.clone(); } } /* //Alle Generischen Typvariablen in TPH umwandeln: HashMap gtv2tph = new HashMap(); for(Pair pair : constraints){ if(pair.TA1 instanceof GenericTypeVar){ TypePlaceholder tph = gtv2tph.get(pair.TA1); if(tph == null){ tph = TypePlaceholder.fresh(); gtv2tph.put((GenericTypeVar)pair.TA1, tph); } pair.TA1 = tph; } if(pair.TA2 instanceof GenericTypeVar){ TypePlaceholder tph = gtv2tph.get(pair.TA2); if(tph == null){ tph = TypePlaceholder.fresh(); gtv2tph.put((GenericTypeVar)pair.TA2, tph); } pair.TA2 = tph; } } */ //Erst die Unifizierung erstellen: Vector constraintsClone = (Vector)constraints.clone(); /* //Typen kontrollieren: for(Pair p : constraintsClone){ Type t = p.TA1; //TypeCheck, falls es sich um einen RefType handelt: if(t!=null && (t instanceof RefType)&& !(t instanceof de.dhbwstuttgart.syntaxtree.type.Void)){ Type replaceType = null; replaceType = globalAssumptions.getTypeFor((RefType)t, null); if(!(replaceType == null))p.TA1 = replaceType; } t = p.TA2; //TypeCheck, falls es sich um einen RefType handelt: if(t!=null && (t instanceof RefType)&& !(t instanceof de.dhbwstuttgart.syntaxtree.type.Void)){ Type replaceType = null; replaceType = globalAssumptions.getTypeFor((RefType)t, null); if(!(replaceType == null))p.TA2 = replaceType; } } */ Vector> unifyResult = Unify.unify(constraintsClone, finiteClosure); //Dann den Ergebnissen anfügen result.addAll(unifyResult); // Debugoutput:Vector> typinferenzLog.debug("Unifiziertes Ergebnis: "+result); /* // Prüfe ob eindeutige Lösung: if(result.size()>1 && !Unify.hasSolvedForm(result.elementAt(0))){ typinferenzLog.debug("Keine eindeutige Lösung!"); }else if(result.size()>1){ //Replace TPH: for(Pair res : result.elementAt(0)){ if(res.OperatorEqual()){ if(res.TA1 instanceof TypePlaceholder)((TypePlaceholder)res.TA1).fireReplaceTypeEvent(new CReplaceTypeEvent(res.TA1, res.TA2)); } } } */ //typinferenzLog.debug(); //typinferenzLog.debug(supportData.getFiniteClosure()); //typinferenzLog.debug("Typinformationen: \n"+this.getTypeInformation(this.getMethodList(), fieldInitializers)); typinferenzLog.debug("\nJavaFiles:\n"); //typinferenzLog.debug(this.printJavaCode(new ResultSet(new Vector()))); //Für jede Klasse in diesem SourceFile gilt das selbe ResultSet: for(Class klasse : this.KlassenVektor){ //Der Unifikationsalgorithmus kann wiederum auch mehrere Lösungen errechnen, diese werden im folgenden durchlaufen: for(Vector resultSet : result){ unifyFail = false; //Ein Unifiziertes Ergebnis ist entstanden (es kann auch leer sein, das bedeutet nur, dass die Constraints mindestens in einem Fall Sinn ergaben) //Add Result set as a new ReconstructionResult to ret: TypeinferenceResultSet reconstructionResult = new TypeinferenceResultSet(klasse, constraints, new ResultSet(resultSet)); ret.add(reconstructionResult); //ResultSet res = new ResultSet(resultSet); typinferenzLog.debug("JavaFile für ResultSet "+reconstructionResult+"\n"); typinferenzLog.debug(klasse.printJavaCode(reconstructionResult)); } } } if(unifyFail){ if(!this.KlassenVektor.isEmpty())throw new TypeinferenceException("Fehler in Typinferierung", this.KlassenVektor.firstElement()); } return ret; /* // HOTI: Nur zur Info.Ich habe den Loglevel auf Info geschaltet, damit // in der GUI (Eclipse-Plugin) die Console nicht zugemüllt wird. // Wers braucht kanns natürlich ausschalten // inferencelog.setLevel(Level.INFO); Vector A = new Vector(); TypeAssumptions basics; basics = this.makeBasicAssumptions(); //A.addElement(basics); //auskommentiert von Andreas Stadelmeier // PL 05-07-31 alle GenericTypeVars werden ueberprueft, ob sie nicht // deklarierte Classen sind und dann ggfs. gewandelt. for (int i = 0; i < this.KlassenVektor.size(); i++) { Class tempKlasse = this.KlassenVektor.elementAt(i); MyCompiler.wandleGeneric2RefType(tempKlasse.getContainedTypes(), this.KlassenVektor); if(tempKlasse.getSuperInterfaces()!=null){ for(int k=0;k0){ for(int j=0;j intf_it = InterfaceVektor.iterator(); while (intf_it.hasNext()) { Interface intf = intf_it.next(); // HOTI In diesem Moment gibt es nur _eine_ potentielle CTypeReconstructionResult, d.h. // dort können die Definitionen der Interfaces (Methodintersectiontypes, FieldDecls) abgelegt werden //intf.addThisToAssumptions(basics); } // Fuer jede Klasse die Assumptions der öffentlichen Felder zusammentragen: TypeAssumptions publicFieldsAssumptions = new TypeAssumptions(); for(Class cl : KlassenVektor){ publicFieldsAssumptions.add(cl.getPublicFieldAssumptions()); } // Die BasicAssumptions anfügen: publicFieldsAssumptions.add(this.getBasicAssumptions()); // Fuer jede Klasse separat den TRA aufrufen Iterator class_it = KlassenVektor.iterator(); while (class_it.hasNext()) { Class cl = class_it.next(); CSupportData supportData = new CSupportData(finiteClosure, A, cl.getName(), cl.get_ParaList()); inferencelog.info("Rufe " + cl.getName() + ".TRProg()..."); A.addAll(cl.typeReconstruction(supportData, publicFieldsAssumptions)); } return A; */ } // ino.end /** * Erstellt die Basic Assumptions (siehe MakeBasicAssumptions) als AssumptionSet * @return @Deprecated //angefügt von Andreas Stadelmeier. Grund: Die Funktion wurde neu als makeBasicAssumptionsFromJRE angelegt private TypeAssumptions getBasicAssumptions() { TypeAssumptions ret = new TypeAssumptions(null); // AB hier der Teil aus makeBasicAssumptionsFromJRE: Vector doneImports=new Vector(); //CTypeReconstructionResult basicAssumptions = new CTypeReconstructionResult(null); Modifiers mod = new Modifiers(); mod.addModifier(new Public()); // Für jede einzelne Klasse while (imports.size()>0) { UsedId importDecl = imports.get(0); // Properties laden java.lang.Class x; try { x = java.lang.Class.forName(importDecl.getQualifiedName().toString()); } catch (ClassNotFoundException e) { throw new CTypeReconstructionException("Fehlerhafte Import-Declaration: "+e.getMessage(),importDecl); } java.lang.reflect.Field[] fields=x.getDeclaredFields(); java.lang.reflect.Method[] methods=x.getDeclaredMethods(); java.lang.reflect.Constructor[] constructors=x.getConstructors(); java.lang.reflect.TypeVariable[] tvs=x.getTypeParameters(); //String className=x.getSimpleName(); String className=x.getName(); // Generische Typen erzeugen Hashtable jreSpiderRegistry=new Hashtable(); Vector typeGenPara = new Vector(); for(int j=0;j0){ //basicAssumptions.addGenericTypeVars(className, typeGenPara); //myCl.set_ParaList((Vector)typeGenPara); } if(x.getSuperclass()!=null){ //boolean isObject=x.getSuperclass().getSimpleName().equalsIgnoreCase("Object"); boolean isObject=x.getSuperclass().getName().equalsIgnoreCase("java.lang.Object"); boolean isBaseType=isBaseType(className); //if((!isObject || READ_OBJECT_SUPERCLASSES_FROM_JRE) && (!isBaseType|| READ_BASE_TYPE_SUPERCLASSES_FROM_JRE)) if (((!isObject || READ_OBJECT_SUPERCLASSES_FROM_JRE) && READ_IMPORTED_SUPERCLASSES_FROM_JRE) //eingefuegt 07-08-11 || (isBaseType && READ_BASE_TYPE_SUPERCLASSES_FROM_JRE)) { String superclassFullyQualifiedName = x.getSuperclass().getCanonicalName(); //Andere Methode, da Vector.contains bei Strings nicht richtig vergleicht. if(!containsString(imports,superclassFullyQualifiedName) && !containsString(doneImports,superclassFullyQualifiedName)){ imports.addElement(UsedId.createFromQualifiedName(superclassFullyQualifiedName,-1)); } //UsedId ui = new UsedId(); //ui.set_Name(x.getSuperclass().getSimpleName()); UsedId ui=UsedId.createFromQualifiedName(x.getSuperclass().getName(),-1); java.lang.Class superClass=x.getSuperclass(); java.lang.reflect.TypeVariable[] superclassTVS=superClass.getTypeParameters(); Vector supertypeGenPara = new Vector(); for(int tvi=0;tvi()); CInstVarTypeAssumption instVar = new CInstVarTypeAssumption(className, fields[j].getName(), new RefType(fields[j].getType().getName(),-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector()); //basicAssumptions.addFieldOrLocalVarAssumption(instVar); //ret.add(instVar); //auskommentiert von Andreas Stadelmeier } } for(int j=0;j(),null); for(int k=0;k())); } //basicAssumptions.addMethodIntersectionType(new CIntersectionType(method)); //ret.add(method); //auskommentiert von Andreas Stadelmeier } } for(int j=0;j(),null); for(int k=0;k())); } //basicAssumptions.addMethodIntersectionType(new CIntersectionType(constructor)); //ret.add(constructor); //auskommentiert von Andreas Stadelmeier } } imports.removeElement(importDecl); doneImports.addElement(importDecl); } imports.addAll(doneImports); return ret; }*/ // ino.method.makeBasicAssumptionsFromJRE.21409.definition private TypeAssumptions makeBasicAssumptionsFromJRE(Vector imports) // ino.end // ino.method.makeBasicAssumptionsFromJRE.21409.body { //return null; ///* Vector doneImports=new Vector(); //TypeinferenceResultSet basicAssumptions = new TypeinferenceResultSet(null); TypeAssumptions basicAssumptions = new TypeAssumptions(); Modifiers mod = new Modifiers(); mod.addModifier(new Public()); //Für Object: imports.add(new UsedId("java.lang.Object",-1)); // Für jede einzelne Klasse while (imports.size()>0) { UsedId importDecl = imports.get(0); // Properties laden java.lang.Class x; try { x = java.lang.Class.forName(importDecl.getQualifiedName().toString()); } catch (ClassNotFoundException e) { throw new CTypeReconstructionException("Fehlerhafte Import-Declaration: "+e.getMessage(),importDecl); } java.lang.reflect.Field[] fields=x.getDeclaredFields(); java.lang.reflect.Method[] methods=x.getDeclaredMethods(); java.lang.reflect.Constructor[] constructors=x.getConstructors(); java.lang.reflect.TypeVariable[] tvs=x.getTypeParameters(); //String className=x.getSimpleName(); String className=x.getName(); Class parentClass = new Class(className, mod, 0); // Generische Typen erzeugen Hashtable jreSpiderRegistry=new Hashtable(); Vector typeGenPara = new Vector(); for(int j=0;j0){ //auskommentiert von Andreas Stadelmeier: //basicAssumptions.addGenericTypeVars(className, typeGenPara); parentClass.set_ParaList((Vector)typeGenPara);//myCl.set_ParaList((Vector)typeGenPara); } if(x.getSuperclass()!=null){ //boolean isObject=x.getSuperclass().getSimpleName().equalsIgnoreCase("Object"); boolean isObject=x.getSuperclass().getName().equalsIgnoreCase("java.lang.Object"); boolean isBaseType=isBaseType(className); //if((!isObject || READ_OBJECT_SUPERCLASSES_FROM_JRE) && (!isBaseType|| READ_BASE_TYPE_SUPERCLASSES_FROM_JRE)) if (((!isObject || READ_OBJECT_SUPERCLASSES_FROM_JRE) && READ_IMPORTED_SUPERCLASSES_FROM_JRE) //eingefuegt 07-08-11 || (isBaseType && READ_BASE_TYPE_SUPERCLASSES_FROM_JRE)) { String superclassFullyQualifiedName = x.getSuperclass().getCanonicalName(); //Andere Methode, da Vector.contains bei Strings nicht richtig vergleicht. if(!containsString(imports,superclassFullyQualifiedName) && !containsString(doneImports,superclassFullyQualifiedName)){ imports.addElement(UsedId.createFromQualifiedName(superclassFullyQualifiedName,-1)); } //UsedId ui = new UsedId(); //ui.set_Name(x.getSuperclass().getSimpleName()); UsedId ui=UsedId.createFromQualifiedName(x.getSuperclass().getName(),-1); java.lang.Class superClass=x.getSuperclass(); java.lang.reflect.TypeVariable[] superclassTVS=superClass.getTypeParameters(); Vector supertypeGenPara = new Vector(); for(int tvi=0;tvi(),null); Method method = de.dhbwstuttgart.syntaxtree.Method.createEmptyMethod(methodName, parentClass); method.setType(returnType); ParameterList parameterList = new ParameterList(); for(int k=0;k())); FormalParameter parameter = new FormalParameter(new DeclId(type.get_Name())); parameter.setType(type); parameterList.formalparameter.add(parameter); } method.setParameterList(parameterList); //basicAssumptions.addMethodIntersectionType(new CIntersectionType(method)); parentClass.addField(method); //} } } for(int j=0;j searchVector, String searchString) { boolean found = false; for(UsedId id : searchVector) { String s = id.getQualifiedName().toString(); found |= s.equals(searchString); } return found; } // ino.method.createTypeFromJavaGenericType.21415.definition private Type createTypeFromJavaGenericType(java.lang.reflect.Type type, java.lang.Class cl, HashtablejreSpiderRegistry, Class parentClass) // ino.end // ino.method.createTypeFromJavaGenericType.21415.body { if(type instanceof TypeVariableImpl){ TypeVariableImpl tvi=((TypeVariableImpl)type); return(new GenericTypeVar(jreSpiderRegistry.get(tvi.getName()).getName().toString(),parentClass,-1)); }else{ //String jccNameForClass=baseTypeTranslationTable.get(cl.getSimpleName()); String jccNameForClass=baseTypeTranslationTable.get(cl.getName()); if(cl.getSimpleName().equalsIgnoreCase("void")){ return(new Void(parentClass,-1)); }else if(jccNameForClass!=null){ RefType rt=new RefType(jccNameForClass,parentClass,-1); rt.setPrimitiveFlag(true); return(rt); }else{ //return(new RefType(cl.getSimpleName())); return(new RefType(cl.getName(),parentClass,-1)); } } } // ino.end // ino.method.makeBasicAssumptions.21418.defdescription type=javadoc /** * Erzeugt die Anfangsinformationen �ber bereits bekannte Klassen. *
Achtung Workaround: Die RefTypes m�ssen sp�ter noch durch BaseTypes * ersetzt werden.
* Author: J�rg B�uerle * * @return A priori Typinformationen * @throws ClassNotFoundException */ // ino.end // ino.method.makeBasicAssumptions.21418.definition private TypeAssumptions makeBasicAssumptions() // ino.end // ino.method.makeBasicAssumptions.21418.body { /* if(LOAD_BASIC_ASSUMPTIONS_FROM_JRE){ Vector strImports=new Vector(); ImportDeclarations usedIdImports=getImports(); for(int i=0;i()); foo.addFieldOrLocalVarAssumption(instVar); meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "", new RefType("java.lang.Integer",-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); meth.addParaAssumption(new CParaTypeAssumption("java.lang.Integer", "", 1, 0,"value", new RefType("java.lang.Integer",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector())); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Integer", 0), "intValue", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); c = new BasicAssumptionClass("java.lang.Integer", mod); // ui = new UsedId(); // ui.set_Name("Super-Class-Blub"); // c.set_UsedId(ui); // pl = new Vector(); // pl.addElement(new GenericTypeVar("bla")); // c.set_ParaList(pl); this.addElement(c); //------------------------ // Boolean bauen: //------------------------ foo.addClassName("java.lang.Boolean"); //PL 05-08-01 eingefuegt meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "", new RefType("java.lang.Boolean",-1),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "", new RefType("java.lang.Boolean",-1), 1,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); meth.addParaAssumption(new CParaTypeAssumption("java.lang.Boolean", "", 1, 0, "value", new RefType("java.lang.Boolean",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector())); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Boolean", 0), "booleanValue", new RefType("java.lang.Boolean",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); c = new BasicAssumptionClass("java.lang.Boolean", mod); // ui = new UsedId(); // ui.set_Name("Super-Class-Blub"); // c.set_UsedId(ui); // pl = new Vector(); // pl.addElement(new GenericTypeVar("bla")); // c.set_ParaList(pl); this.addElement(c); //------------------------ // Character bauen: //------------------------ foo.addClassName("java.lang.Character"); //PL 05-08-01 eingefuegt meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "", new RefType("java.lang.Character",-1),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "", new RefType("java.lang.Character",-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); meth.addParaAssumption(new CParaTypeAssumption("java.lang.Character", "", 1, 0,"value", new RefType("java.lang.Character",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector())); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Character", 0), "charValue", new BooleanType(),0, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); c = new BasicAssumptionClass("java.lang.Character", mod); // ui = new UsedId(); // ui.set_Name("Super-Class-Blub"); // c.set_UsedId(ui); // pl = new Vector(); // pl.addElement(new GenericTypeVar("bla")); // c.set_ParaList(pl); this.addElement(c); //------------------------ // Vector bauen: //------------------------ foo.addClassName("java.lang.Vector"); //PL 05-08-01 eingefuegt TypePlaceholder E = TypePlaceholder.fresh(); // Sp�ter ersetzen durch GenericTypeVar Vector typeGenPara = new Vector(); typeGenPara.addElement(new GenericTypeVar(E.getName(),-1)); foo.addGenericTypeVars("java.lang.Vector", typeGenPara); meth = new CMethodTypeAssumption(new RefType("java.lang.Vector", 0), "elementAt", new GenericTypeVar(E.getName(),-1), 1,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); meth.addParaAssumption(new CParaTypeAssumption("java.lang.Vector", "elementAt", 1, 0, "index", new RefType("java.lang.Integer",-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector())); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Vector", 0), "addElement", new Void(-1),1, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); meth.addParaAssumption(new CParaTypeAssumption("java.lang.Vector", "addElement", 1, 0,"element", new GenericTypeVar(E.getName(),-1), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector())); foo.addMethodIntersectionType(new CIntersectionType(meth)); meth = new CMethodTypeAssumption(new RefType("java.lang.Vector", 0), "size", new RefType("java.lang.Integer",-1), 0,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector(),null); foo.addMethodIntersectionType(new CIntersectionType(meth)); c = new BasicAssumptionClass("java.lang.Vector", mod); // ui = new UsedId(); // ui.set_Name("Super-Class-Blub"); // c.set_UsedId(ui); // pl = new Vector(); // pl.addElement(E); // c.set_ParaList(pl); this.addElement(c); //------------------------ // Stack bauen: //------------------------ foo.addClassName("java.lang.Stack"); //PL 05-08-01 eingefuegt c = new BasicAssumptionClass("java.lang.Stack", mod); ui = new UsedId(-1); ui.set_Name("java.lang.Vector"); c.set_UsedId(ui); // pl = new Vector(); // pl.addElement(E); // c.set_ParaList(pl); this.addElement(c); return foo; */ TypeAssumptions ret = new TypeAssumptions(); //Basic Assumptions für die FunN Interfaces: //TODO: Hier mehr als Fun1-Fun5 implementieren for(int i = 0; i<6; i++){ FunNInterface funN = new FunNInterface(i); ret.add(funN.getPublicFieldAssumptions()); } return ret; //TODO: Diese TypeAssumptions mit basic-Assumptions füllen } // ino.end // ino.method.setImports.21421.definition private void setImports(ImportDeclarations newImports) // ino.end // ino.method.setImports.21421.body { this.imports=newImports; } // ino.end // ino.method.removeBasicAssumptions.21424.defdescription type=javadoc /** * L�scht die Anfangsinformation wieder aus dem Klassenvektor *
Author: J�rg B�uerle */ // ino.end // ino.method.removeBasicAssumptions.21424.definition private void removeBasicAssumptions() // ino.end // ino.method.removeBasicAssumptions.21424.body { for(int i=0; iAuthor: J�rg B�uerle * @param res * / * /*private void addClassNamesAndGenericsToRR(CTypeReconstructionResult res){ * Iterator it = this.getClassIterator(); * while(it.hasNext()){ * Class cl = it.next(); * res.addClassName(cl.get_classname()); * Vector genericsList = new Vector(); * * for(int i =0; i getClassIterator() // ino.end // ino.method.getClassIterator.21439.body { return KlassenVektor.iterator(); } // ino.end // ino.method.getInterfaceIterator.21442.definition public Iterator getInterfaceIterator() // ino.end // ino.method.getInterfaceIterator.21442.body { return InterfaceVektor.iterator(); } // ino.end @Override public void parserPostProcessing(SyntaxTreeNode parent) { if(parent!=null)throw new DebugException("Eine SourceFile hat kein Elternelement im Syntaxbaum"); super.parserPostProcessing(parent); //for(SyntaxTreeNode node : this.getChildren())node.parserPostProcessing(this); } @Override public SyntaxTreeNode getParent() { return null; } @Override public Vector getChildren() { Vector ret = new Vector(); for(Class cl : this.KlassenVektor){ ret.add(cl); } return ret; } /** * SourceFile stellt eine geparste Java-Datei dar. Mit dieser Methode wird der Name der eingelesenen Datei gesetzt. * @param filename - Der Name der eingelesenen JavaDatei */ @Deprecated public void setFileName(String filename) { //this.filename = filename; } @Override public int getOffset() { // TODO Auto-generated method stub return 0; } @Override public int getVariableLength() { // TODO Auto-generated method stub return 0; } } // ino.end