2013-10-18 13:33:46 +02:00
// ino.module.SourceFile.8722.package
2014-09-04 16:35:44 +02:00
package de.dhbwstuttgart.syntaxtree ;
2013-10-18 13:33:46 +02:00
// ino.end
// ino.module.SourceFile.8722.import
2014-03-12 16:32:50 +01:00
import java.util.Collection ;
2013-10-18 13:33:46 +02:00
import java.util.Enumeration ;
2014-03-28 18:36:08 +01:00
import java.util.HashMap ;
2013-10-18 13:33:46 +02:00
import java.util.Hashtable ;
import java.util.Iterator ;
import java.util.Vector ;
2014-11-03 10:40:28 +01:00
import java.util.stream.Stream ;
2014-02-09 16:07:31 +01:00
2014-10-09 12:01:16 +02:00
import de.dhbwstuttgart.logger.Logger ;
2014-10-09 17:38:10 +02:00
import de.dhbwstuttgart.logger.Section ;
2014-09-04 16:35:44 +02:00
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 ;
2014-09-05 11:49:31 +02:00
import de.dhbwstuttgart.parser.JavaClassName ;
2014-09-02 10:33:54 +02:00
import de.dhbwstuttgart.syntaxtree.misc.DeclId ;
import de.dhbwstuttgart.syntaxtree.misc.UsedId ;
2014-09-05 11:49:31 +02:00
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers ;
import de.dhbwstuttgart.syntaxtree.modifier.Public ;
2014-09-02 10:33:54 +02:00
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 ;
2014-09-08 15:12:47 +02:00
import de.dhbwstuttgart.typeinference.Pair ;
2014-09-02 10:33:54 +02:00
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 ;
2014-09-02 11:07:16 +02:00
import de.dhbwstuttgart.typeinference.unify.FC_TTO ;
2014-10-09 12:01:16 +02:00
import de.dhbwstuttgart.typeinference.unify.Unifier ;
2014-09-02 11:07:16 +02:00
import de.dhbwstuttgart.typeinference.unify.Unify ;
2013-10-18 13:33:46 +02:00
// ino.class.SourceFile.21355.declaration
public class SourceFile
2014-02-12 02:12:12 +01:00
extends SyntaxTreeNode
2013-10-18 13:33:46 +02:00
// 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 < b > true < / b > gesetzt ist , wird immer als Superklasse Object
* mit rein geladen . Dies hat nat <EFBFBD> rlich zur Folge , dass man in der GUI jeden Typ
* ausw <EFBFBD> hlen muss , weil ALLES in Java von Object erbt . Sobald die GUI das <EFBFBD> ber eine
* Checkbox o . <EFBFBD> . 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 < b > false < / b > ist , werden f <EFBFBD> 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 < b > false < / b > ist , werden f <EFBFBD> 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 < Class > KlassenVektor = new Vector < Class > ( ) ;
// ino.end
// ino.attribute.InterfaceVektor.21379.declaration
public Vector < Interface > InterfaceVektor = new Vector < Interface > ( ) ;
// ino.end
2014-03-07 22:05:10 +01:00
2013-10-18 13:33:46 +02:00
/ * *
2014-02-11 16:30:38 +01:00
* Die SourceFile repr <EFBFBD> sntiert eine zu einem Syntaxbaum eingelesene Java - Datei .
* SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar .
2013-10-18 13:33:46 +02:00
* /
2014-02-11 16:30:38 +01:00
public SourceFile ( ) {
// HOTI 4.5.06
2013-10-18 13:33:46 +02:00
// Base-Type-Translations anlegen (siehe kommentar BaseTypeTranslationTable)
baseTypeTranslationTable = new Hashtable < String , String > ( ) ;
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 ) ) ;
}
}
2014-02-11 16:30:38 +01:00
2014-09-16 11:31:15 +02:00
public SourceFile ( Vector < Class > classDefinitions ) {
this . KlassenVektor = classDefinitions ;
}
// ino.attribute.imports.21382.decldescription type=javadoc
2014-02-11 16:30:38 +01:00
/ * *
* 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 <EFBFBD> bersetzen der nicht implementierten Base - Types :
* <EFBFBD> berall im Compiler wird statt bspw . int Integer verwendet
* d . h . 1 + 2 liefert ein Integer
* Deshalb ben <EFBFBD> tigen wir hier eine Tabelle , mit der man die von
* der JRE gelieferten Base - Typen ( int , char , etc ) und die Objekt -
* Typen umwandeln k <EFBFBD> nnen
* /
// ino.end
// ino.attribute.baseTypeTranslationTable.21385.declaration
private Hashtable < String , String > baseTypeTranslationTable ;
2013-10-18 13:33:46 +02:00
// ino.end
2014-02-11 16:30:38 +01:00
2013-10-18 13:33:46 +02:00
// 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 .
*
2014-09-02 18:49:19 +02:00
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.codegen.21397.definition
2014-03-12 16:32:50 +01:00
public Vector < ClassFile > codegen ( ResultSet result )
2013-10-18 13:33:46 +02:00
throws JVMCodeException
// ino.end
// ino.method.codegen.21397.body
{
2014-03-12 16:32:50 +01:00
Vector < ClassFile > ret = new Vector < ClassFile > ( ) ;
2013-10-18 13:33:46 +02:00
codegenlog . info ( " Anzahl der Interfaces: "
+ Integer . toString ( InterfaceVektor . size ( ) ) ) ;
for ( int i = 0 ; i < InterfaceVektor . size ( ) ; i + + ) {
2014-03-27 16:50:36 +01:00
InterfaceVektor . elementAt ( i ) . codegen ( result ) ;
2013-10-18 13:33:46 +02:00
}
codegenlog . info ( " Anzahl der Klassen: "
+ Integer . toString ( KlassenVektor . size ( ) ) ) ;
for ( int i = 0 ; i < KlassenVektor . size ( ) ; i + + ) {
2014-03-12 16:32:50 +01:00
ret . add ( KlassenVektor . elementAt ( i ) . codegen ( result ) ) ;
2013-10-18 13:33:46 +02:00
}
2014-03-12 16:32:50 +01:00
return ret ;
2013-10-18 13:33:46 +02:00
}
// ino.end
2014-09-02 18:49:19 +02:00
* /
2013-10-18 13:33:46 +02:00
// 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
2014-09-18 16:26:02 +02:00
private Pair createPairFromClassAndSuperclass ( Class baseClass , Type superclass , Vector classParaOrg , Vector superclassParaOrg , TypeAssumptions ass )
2013-10-18 13:33:46 +02:00
// 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 ;
}
2014-09-14 18:38:43 +02:00
/ *
2013-10-18 13:33:46 +02:00
Pair P = new Pair (
2014-09-02 18:49:19 +02:00
new RefType ( className . toString ( ) , classParaOrg , - 1 ) ,
new RefType ( superclassName . toString ( ) , superclassParaOrg , - 1 )
2013-10-18 13:33:46 +02:00
) ;
2014-09-14 18:38:43 +02:00
* /
2014-09-18 16:26:02 +02:00
Pair P = new Pair ( baseClass . getType ( ) . TYPE ( ass , baseClass ) . getType ( ) , superclass . TYPE ( ass , baseClass ) . getType ( ) ) ;
2013-10-18 13:33:46 +02:00
//PL 04-12-29 freshe Variablen ANFANG
RefType r1 = ( RefType ) P . getTA1Copy ( ) ;
2014-09-18 16:26:02 +02:00
RefType r2 = ( RefType ) P . getTA2Copy ( ) ;
r1 = ( RefType ) r1 . TYPE ( ass , baseClass ) . getType ( ) ;
r2 = ( RefType ) r2 . TYPE ( ass , baseClass ) . getType ( ) ;
2013-10-18 13:33:46 +02:00
// #JB# 05.04.2005
// ###########################################################
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > substHash = new Hashtable < JavaClassName , Type > ( ) ; //fuer jedes Paar komplett neue Variablen
2013-10-18 13:33:46 +02:00
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 <EFBFBD> sentiert
* /
// ino.end
// ino.method.makeFC.21403.definition
2014-10-01 17:12:16 +02:00
public FC_TTO makeFC ( TypeAssumptions ass )
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.makeFC.21403.body
{
// Menge FC bilden
Vector < Pair > vFC = new Vector < Pair > ( ) ; // Menge FC
2014-10-08 19:00:17 +02:00
TypeAssumptions globalAssumptions = this . makeBasicAssumptionsFromJRE ( imports , false ) ;
2014-09-18 16:26:02 +02:00
globalAssumptions . add ( this . getPublicFieldAssumptions ( ) ) ;
2013-10-18 13:33:46 +02:00
// 1. Menge <= in FC aufnehmen --> Iteration ueber alle Klassen
2014-10-08 19:00:17 +02:00
Vector < Class > basicAssumptionsClassVector = new Vector < > ( ) ; //die Klassen aus den BasicAssumptions
2014-10-01 17:12:16 +02:00
for ( ClassAssumption cAss : ass . getClassAssumptions ( ) ) {
2014-10-07 09:20:35 +02:00
Type t1 = cAss . getAssumedClass ( ) . getType ( ) ;
2014-10-07 10:47:52 +02:00
Type t2 = cAss . getAssumedClass ( ) . getSuperClass ( ) ;
2014-10-07 09:20:35 +02:00
Pair p = new Pair ( t1 , t2 ) ;
2014-10-08 19:00:17 +02:00
//System.out.println("FCPair: "+p);
if ( ! t1 . equals ( t2 ) ) { //Um FC_TTO darf kein T <. T stehen.
//vFC.add(p); //Wird momentan nicht hinzugef<65> gt
basicAssumptionsClassVector . add ( cAss . getAssumedClass ( ) ) ; //Klasse ohne die Superklasse anf<6E> gen
2014-10-07 10:47:52 +02:00
} else {
2014-10-08 19:00:17 +02:00
//System.out.println("Wurde nicht aufgenommen");
2014-10-07 10:47:52 +02:00
}
2014-10-01 17:12:16 +02:00
}
2013-10-18 13:33:46 +02:00
for ( int i = 0 ; i < KlassenVektor . size ( ) ; i + + )
{
Class tempKlasse = KlassenVektor . elementAt ( i ) ;
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " Verarbeite " + tempKlasse . getName ( ) , Section . TYPEINFERENCE ) ;
2014-09-14 18:38:43 +02:00
//TODO: SuperKlasse erstellen, dies sollte am besten beim Konstruktoraufruf von Class geschehen. Diese kann dann mit getSuperClass abgefragt werden.
2013-10-18 13:33:46 +02:00
if ( tempKlasse . superclassid ! = null ) { // Klasse hat Superklasse
2014-09-18 16:26:02 +02:00
Pair P = createPairFromClassAndSuperclass ( tempKlasse , tempKlasse . getSuperClass ( ) , tempKlasse . get_ParaList ( ) , tempKlasse . superclassid . get_ParaList ( ) , globalAssumptions ) ;
2013-10-18 13:33:46 +02:00
vFC . add ( P ) ;
}
if ( tempKlasse . getSuperInterfaces ( ) ! = null ) {
2014-09-18 16:26:02 +02:00
Iterator < Type > interfaceIterator = tempKlasse . getSuperInterfaces ( ) . iterator ( ) ;
2013-10-18 13:33:46 +02:00
while ( interfaceIterator . hasNext ( ) ) {
2014-09-18 16:26:02 +02:00
RefType intf = ( RefType ) interfaceIterator . next ( ) ;
Pair P = createPairFromClassAndSuperclass ( tempKlasse , intf , tempKlasse . get_ParaList ( ) , intf . get_ParaList ( ) , globalAssumptions ) ;
2013-10-18 13:33:46 +02:00
vFC . add ( P ) ;
}
}
} // Schleifenende durch Klassenvektor
for ( int i = 0 ; i < InterfaceVektor . size ( ) ; i + + ) {
Interface intf = InterfaceVektor . get ( i ) ;
if ( intf . getSuperInterfaces ( ) ! = null ) {
2014-09-18 16:26:02 +02:00
Iterator < Type > interfaceIterator = intf . getSuperInterfaces ( ) . iterator ( ) ;
2013-10-18 13:33:46 +02:00
while ( interfaceIterator . hasNext ( ) ) {
2014-09-18 16:26:02 +02:00
RefType superintf = ( RefType ) interfaceIterator . next ( ) ;
Pair P = createPairFromClassAndSuperclass ( intf , superintf , intf . getParaList ( ) , superintf . get_ParaList ( ) , globalAssumptions ) ;
2013-10-18 13:33:46 +02:00
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 < Type > vPara = ( ( RefType ) ( PTypKonst . TA2 ) ) . get_ParaList ( ) ;
2014-12-05 17:11:22 +01:00
Integer Subst = null ; // Substitution
2013-10-18 13:33:46 +02:00
int nSubstStelle = 0 ;
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " nSubstStelleStart " + nSubstStelle + " " + n , Section . FINITECLOSURE ) ;
2013-10-18 13:33:46 +02:00
// Parameter durchlaufen und nach Typkonstruktor suchen
// #JB# 17.05.2005
// ###########################################################
if ( vPara ! = null ) {
// ###########################################################
for ( ; nSubstStelle < vPara . size ( ) ; nSubstStelle + + )
{
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " nSubstStelle " + nSubstStelle , Section . FINITECLOSURE ) ;
2013-10-18 13:33:46 +02:00
if ( vPara . elementAt ( nSubstStelle ) instanceof RefType & & ( ( RefType ) vPara . elementAt ( nSubstStelle ) ) . get_ParaList ( ) ! = null )
{
// Typkonstruktor gefunden -> wird nun als Substitution verwendet
2014-12-05 17:11:22 +01:00
Subst = 1 ; //new RefType( (RefType)vPara.elementAt(nSubstStelle) ,-1);
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " Ausgangstyp: " + ( ( RefType ) PTypKonst . TA2 ) . getName ( ) , Section . FINITECLOSURE ) ;
inferencelog . debug ( " RefType = " + ( ( RefType ) vPara . elementAt ( nSubstStelle ) ) . getName ( ) , Section . FINITECLOSURE ) ;
2013-10-18 13:33:46 +02:00
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 ( ) ) )
{
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " gefundener Typ links: " + ( ( RefType ) ( PSuchen . TA1 ) ) . getName ( ) , Section . FINITECLOSURE ) ;
inferencelog . debug ( " gefundener Typ rechts: " + ( ( RefType ) ( PSuchen . TA2 ) ) . getName ( ) , Section . FINITECLOSURE ) ;
2013-10-18 13:33:46 +02:00
// Paar gefunden, das als linken Typ den gleichen Typen enth<74> 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
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > hts = new Hashtable < JavaClassName , Type > ( ) ;
2013-10-18 13:33:46 +02:00
//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());
// ###########################################################
2014-11-04 13:47:05 +01:00
inferencelog . debug ( " Typterm_Name: " + vPara . elementAt ( u ) , Section . FINITECLOSURE ) ;
inferencelog . debug ( " Typterm_Name: " + ( ( Type ) vPara . elementAt ( u ) ) . Type2String ( ) , Section . FINITECLOSURE ) ;
2014-09-02 18:49:19 +02:00
hts . put ( new JavaClassName ( ( ( RefType ) PSuchen . TA1 ) . getParaN ( u ) ) , vPara . elementAt ( u ) ) ;
2013-10-18 13:33:46 +02:00
}
catch ( Exception E ) {
2014-11-04 13:47:05 +01:00
inferencelog . error ( E . getMessage ( ) , Section . FINITECLOSURE ) ;
2013-10-18 13:33:46 +02:00
//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<69> 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()) )
2014-09-02 18:49:19 +02:00
if ( R . is_Equiv ( RSuch , new Hashtable < JavaClassName , Type > ( ) ) ) //eingefuegt PL 05-01-07
2013-10-18 13:33:46 +02:00
{
// 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
// ###########################################################
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > substHash1 = new Hashtable < JavaClassName , Type > ( ) ;
2013-10-18 13:33:46 +02:00
Unify . varSubst ( L1 , substHash1 ) ;
Unify . varSubst ( L2 , substHash1 ) ;
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > substHash2 = new Hashtable < JavaClassName , Type > ( ) ;
2013-10-18 13:33:46 +02:00
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
// ###########################################################
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > h = new Hashtable < JavaClassName , Type > ( ) ;
2013-10-18 13:33:46 +02:00
L2 . Equiv2Equal ( R1 , h ) ;
2014-09-02 18:49:19 +02:00
Hashtable < JavaClassName , Type > substHash3 = h ;
2013-10-18 13:33:46 +02:00
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<69> 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 );
2014-10-08 19:00:17 +02:00
Vector < Class > KlassenVektorunImportierteKlassen = new Vector < > ( ) ;
KlassenVektorunImportierteKlassen . addAll ( basicAssumptionsClassVector ) ;
KlassenVektorunImportierteKlassen . addAll ( KlassenVektor ) ;
FC_TTO fctto = new FC_TTO ( vFC , tto , KlassenVektorunImportierteKlassen ) ;
2013-10-18 13:33:46 +02:00
return fctto ;
}
2014-02-11 02:47:39 +01:00
public TypeAssumptions getPublicFieldAssumptions ( ) {
2014-02-18 17:47:40 +01:00
TypeAssumptions publicAssumptions = new TypeAssumptions ( null ) ;
2014-02-11 02:47:39 +01:00
//Alle PublicAssumptions der in dieser SourceFile enthaltenen Klassen sammeln:
for ( Class klasse : KlassenVektor ) {
publicAssumptions . add ( klasse . getPublicFieldAssumptions ( ) ) ;
}
return publicAssumptions ;
}
2013-10-18 13:33:46 +02:00
/////////////////////////////////////////////////////////////////////////
// TypeReconstructionAlgorithmus
/////////////////////////////////////////////////////////////////////////
// ino.method.typeReconstruction.21406.defdescription type=javadoc
/ * *
* Tyrekonstruktionsalgorithmus : ruft f <EFBFBD> r jede Klasse den Algorithmus TRProg auf .
* Dessen Ergebnismenge A , die Menge aller Typannahmen , f <EFBFBD> r eine Klasse dient als
* Eingabe f <EFBFBD> r TRProg der n <EFBFBD> chsten Klasse . Am Ende enth <EFBFBD> lt A alle m <EFBFBD> glichen
* Typkombinationen f <EFBFBD> r alle Klassen zusammen .
* < br > Author : J <EFBFBD> rg B <EFBFBD> uerle
* @return Liste aller m <EFBFBD> glichen Typkombinationen
* @throws CTypeReconstructionException Wenn was schief l <EFBFBD> uft
* /
// ino.end
// ino.method.typeReconstruction.21406.definition
2014-02-11 02:47:39 +01:00
public Vector < TypeinferenceResultSet > typeReconstruction ( TypeAssumptions globalAssumptions )
2013-10-18 13:33:46 +02:00
throws CTypeReconstructionException
// ino.end
// ino.method.typeReconstruction.21406.body
{
2014-02-11 02:47:39 +01:00
Vector < TypeinferenceResultSet > ret = new Vector < TypeinferenceResultSet > ( ) ;
//Logger initialisieren:
Logger typinferenzLog = Logger . getLogger ( " Typeinference " ) ;
2014-02-14 17:31:55 +01:00
//Alle Assumptions f<> r diese SourceFile sammeln:
for ( Class klasse : this . KlassenVektor ) {
globalAssumptions . add ( klasse . getPublicFieldAssumptions ( ) ) ;
}
2014-04-03 10:35:25 +02:00
//Assumptions der importierten Klassen sammeln:
2014-10-08 19:00:17 +02:00
TypeAssumptions importAssumptions = this . makeBasicAssumptionsFromJRE ( imports , true ) ;
2014-04-03 10:35:25 +02:00
globalAssumptions . add ( importAssumptions ) ;
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " Von JRE erstellte Assumptions: " + importAssumptions , Section . TYPEINFERENCE ) ;
2014-04-03 10:35:25 +02:00
2014-10-01 17:12:16 +02:00
//FiniteClosure generieren:
FC_TTO finiteClosure = this . makeFC ( globalAssumptions ) ;
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " FiniteClosure: \ n " + finiteClosure , Section . TYPEINFERENCE ) ;
2014-10-01 17:12:16 +02:00
2014-03-19 15:14:50 +01:00
ConstraintsSet oderConstraints = new ConstraintsSet ( ) ;
2014-02-11 02:47:39 +01:00
//Alle Constraints der in dieser SourceFile enthaltenen Klassen sammeln:
for ( Class klasse : KlassenVektor ) {
2014-03-19 15:14:50 +01:00
oderConstraints . add ( klasse . typeReconstruction ( finiteClosure , globalAssumptions ) ) ;
}
////////////////
//Karthesisches Produkt bilden:
////////////////
2014-10-01 17:12:16 +02:00
//Unm<6E> gliche ConstraintsSets aussortieren durch Unifizierung
2014-10-09 12:01:16 +02:00
Unifier unifier = ( pairs ) - > {
Vector < Vector < Pair > > retValue = new Vector < > ( ) ;
retValue = Unify . unify ( pairs , finiteClosure ) ;
return retValue ; } ;
2015-02-17 22:12:31 +01:00
//oderConstraints.filterWrongConstraints(unifier);
//oderConstraints.unifyUndConstraints(unifier);
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " <EFBFBD> briggebliebene Konstraints:\ n " + oderConstraints + " \ n " , Section . TYPEINFERENCE ) ;
2014-03-19 15:14:50 +01:00
//Die Constraints in Pair's umwandeln (Karthesisches Produkt bilden):
Vector < Vector < Pair > > xConstraints = new Vector < Vector < Pair > > ( ) ; // = oderConstraints.getConstraints();
2014-10-09 12:01:16 +02:00
for ( Vector < UndConstraint > uC : oderConstraints . getConstraints ( ) ) { //mit dem getConstraints-Aufruf wird das Karthesische Produkt erzeugt.
2014-03-19 15:14:50 +01:00
Vector < Pair > cons = new Vector < Pair > ( ) ;
for ( UndConstraint undCons : uC ) {
cons . addAll ( undCons . getConstraintPairs ( ) ) ;
}
xConstraints . add ( cons ) ;
}
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " Karthesisches Produkt der Constraints: " + xConstraints , Section . TYPEINFERENCE ) ;
2014-09-03 16:15:04 +02:00
finiteClosure . generateFullyNamedTypes ( globalAssumptions ) ;
2014-03-19 15:14:50 +01:00
//////////////////////////////
// Unifizierung der Constraints:
//////////////////////////////
2014-06-10 20:23:01 +02:00
boolean unifyFail = true ;
2014-03-19 15:14:50 +01:00
for ( Vector < Pair > constraints : xConstraints ) {
//Alle durch das Karthesische Produkt entstandenen M<> glichkeiten durchgehen:
Vector < Vector < Pair > > result = new Vector < Vector < Pair > > ( ) ;
2014-02-11 02:47:39 +01:00
2014-03-19 15:14:50 +01:00
//Alle FunN-Typen werden per clone-methode in RefTypes verwandelt. (Die clone Methode in FunN darf nicht <20> 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 ( ) ;
}
2014-02-11 02:47:39 +01:00
}
2014-04-09 14:12:55 +02:00
/ *
2014-03-28 18:36:08 +01:00
//Alle Generischen Typvariablen in TPH umwandeln:
HashMap < GenericTypeVar , TypePlaceholder > gtv2tph = new HashMap < GenericTypeVar , TypePlaceholder > ( ) ;
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 ;
}
}
2014-04-09 14:12:55 +02:00
* /
2014-03-19 15:14:50 +01:00
//Erst die Unifizierung erstellen:
Vector < Pair > constraintsClone = ( Vector < Pair > ) constraints . clone ( ) ;
2014-04-28 08:26:11 +02:00
2014-09-03 16:15:04 +02:00
/ *
2014-04-28 08:26:11 +02:00
//Typen kontrollieren:
for ( Pair p : constraintsClone ) {
Type t = p . TA1 ;
//TypeCheck, falls es sich um einen RefType handelt:
if ( t ! = null & & ( t instanceof RefType ) & &
2014-09-02 10:33:54 +02:00
! ( t instanceof de . dhbwstuttgart . syntaxtree . type . Void ) ) {
2014-04-28 08:26:11 +02:00
Type replaceType = null ;
2014-08-11 14:35:33 +02:00
replaceType = globalAssumptions . getTypeFor ( ( RefType ) t , null ) ;
2014-04-28 08:26:11 +02:00
if ( ! ( replaceType = = null ) ) p . TA1 = replaceType ;
}
t = p . TA2 ;
//TypeCheck, falls es sich um einen RefType handelt:
if ( t ! = null & & ( t instanceof RefType ) & &
2014-09-02 10:33:54 +02:00
! ( t instanceof de . dhbwstuttgart . syntaxtree . type . Void ) ) {
2014-04-28 08:26:11 +02:00
Type replaceType = null ;
2014-08-11 14:35:33 +02:00
replaceType = globalAssumptions . getTypeFor ( ( RefType ) t , null ) ;
2014-04-28 08:26:11 +02:00
if ( ! ( replaceType = = null ) ) p . TA2 = replaceType ;
}
}
2014-09-03 16:15:04 +02:00
* /
2014-04-28 08:26:11 +02:00
2014-11-03 10:40:28 +01:00
//IDEE: Man bildet Zusammenhangskomponenten von Paaren, die gemeinsame Variablen haben
// und unifizert nur die Zusammenhangskomponenten in Schritten 1 - 5
//Schritt 1: Alle Variablen in den Paaren von Elementen einsammeln
Vector < Vector < TypePlaceholder > > constraintsclonevars = constraintsClone . stream ( ) . map ( p - > { Vector < TypePlaceholder > TPHs = new Vector < > ( ) ;
TPHs . addAll ( p . TA1 . getInvolvedTypePlaceholder ( ) ) ;
TPHs . addAll ( p . TA2 . getInvolvedTypePlaceholder ( ) ) ;
return TPHs ; }
) . collect ( Vector : : new , Vector : : add , Vector : : addAll ) ;
//Schritt 2: Schnittmengen jedes Elements mit jedem Elememt von vars bilden und dann index zusammenfassen
//in indexset sind dann die Mengen von Indizes enthalten, die gemeisam unifiziert wreden m<> ssen
Vector < Vector < Integer > > indexeset = new Vector < > ( ) ;
if ( constraintsclonevars ! = null & & constraintsclonevars . size ( ) > 0 ) {
indexeset = Unify . schnitt ( constraintsclonevars ) ;
}
//Schritt 3: Umwandlung der Indizes in die zugehoerigen Elemente
// In streamconstraintsclone sind die Mengen von Paar enthalten die unifiziert werden muessen
Stream < Vector < Pair > > streamconstraintsclone = indexeset . stream ( ) . map ( x - > x . stream ( )
. map ( i - > constraintsClone . elementAt ( i ) )
. collect ( Vector : : new , Vector : : add , Vector : : addAll ) ) ;
2015-01-16 22:02:05 +01:00
//Vector<Vector<Pair>> vecconstraintsclone = streamconstraintsclone.collect(Vector::new, Vector::add, Vector::addAll);
2014-11-03 10:40:28 +01:00
//Schritt 4: Unifikation
Vector < Vector < Vector < Pair > > > vecunifyResult =
streamconstraintsclone . map ( x - > Unify . unify ( x , finiteClosure ) ) . collect ( Vector : : new , Vector : : add , Vector : : addAll ) ;
//card gibt die Cardinalitaet der unifizierten Mengen an
Vector < Integer > card = vecunifyResult . stream ( ) . map ( x - > x . size ( ) ) . collect ( Vector : : new , Vector : : add , Vector : : addAll ) ;
; //.reduce(1,(a,b) -> { if ((a > 0) && (b > 0)) return (a * b); else return 1; });
//Schritt 5: Bildung des cartesischen Produkts
//sollte wieder entfernt werden: Weiterarbeit mit:
//[[x_1 -> t_1, x_2 -> t2], [x_1 -> t'_1, x_2 -> t'_2]] x ... x [[x_n -> t_1n], [x_n -> t2n], [x_n -> t3n]]
Vector < Vector < Pair > > cardprodret_start = new Vector < > ( ) ;
cardprodret_start . add ( new Vector < Pair > ( ) ) ;
//cart. Produkt mit kopieren
//Vector<Vector<Pair>> unifyResult = vecunifyResult.stream().reduce(cardprodret_start, (x, y) -> {
//Vector<Vector<Pair>> cardprodret= new Vector<>();
//if (y.size() > 0) {
////System.out.println(y);
//Vector<Vector<Pair>> cardprodretold = x;
//cardprodret = new Vector<>();
//for(int j = 0; j < cardprodretold.size(); j++) {
//for (int k = 0; k < y.size(); k++){
//Vector<Pair> help;
//if (y.size() == 1) help = cardprodretold.elementAt(j); //bei einem hinzuzufuegenden Element muss nicht kopiert werden
//else help = Unify.copyVectorPair(cardprodretold.elementAt(j));
//help.addAll(y.elementAt(k));
//cardprodret.add(help);
//}
//}
//}
//else
//return new Vector<>(); //kein unifiziertes Ergebnis, damit wird das Geseamtergebnis []
//return cardprodret;
//});
//cart. Produkt mit Linkverschiebung
Vector < Vector < Pair > > unifyResult = vecunifyResult . stream ( ) . reduce ( cardprodret_start , ( x , y ) - > {
Vector < Vector < Pair > > cardprodret = new Vector < > ( ) ;
if ( y . size ( ) > 0 ) {
//System.out.println(y);
//Vector<Vector<Pair>> cardprodretold = x;
//cardprodret = new Vector<>();
for ( int j = 0 ; j < x . size ( ) ; j + + ) {
for ( int k = 0 ; k < y . size ( ) ; k + + ) {
Vector < Pair > help = new Vector < > ( ) ;
help . addAll ( y . elementAt ( k ) ) ;
help . addAll ( x . elementAt ( j ) ) ;
cardprodret . add ( help ) ;
}
}
}
else
return new Vector < > ( ) ; //kein unifiziertes Ergebnis, damit wird das Geseamtergebnis []
return cardprodret ;
} ) ;
//Vector<Vector<Pair>> unifyResult = Unify.unify(constraintsClone, finiteClosure);
2014-03-19 15:14:50 +01:00
//Dann den Ergebnissen anf<6E> gen
result . addAll ( unifyResult ) ;
// Debugoutput:Vector<Vector<Pair>>
2014-11-04 17:01:35 +01:00
//typinferenzLog.debug("Unifiziertes Ergebnis: "+result, Section.TYPEINFERENCE);
2014-11-04 13:51:48 +01:00
/ *
2014-03-19 15:14:50 +01:00
// Pr<50> 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));
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " \ nJavaFiles: \ n " , Section . TYPEINFERENCE ) ;
2014-03-19 15:14:50 +01:00
//typinferenzLog.debug(this.printJavaCode(new ResultSet(new Vector<Pair>())));
//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 < Pair > resultSet : result ) {
2014-06-10 20:23:01 +02:00
unifyFail = false ; //Ein Unifiziertes Ergebnis ist entstanden (es kann auch leer sein, das bedeutet nur, dass die Constraints mindestens in einem Fall Sinn ergaben)
2014-03-19 15:14:50 +01:00
//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);
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " JavaFile f<> r ResultSet " + reconstructionResult + " \ n " , Section . TYPEINFERENCE ) ;
typinferenzLog . debug ( klasse . printJavaCode ( reconstructionResult ) , Section . TYPEINFERENCE ) ;
2014-03-19 15:14:50 +01:00
}
}
2014-02-11 02:47:39 +01:00
}
2014-06-10 20:23:01 +02:00
if ( unifyFail ) {
if ( ! this . KlassenVektor . isEmpty ( ) ) throw new TypeinferenceException ( " Fehler in Typinferierung " , this . KlassenVektor . firstElement ( ) ) ;
}
2014-02-11 02:47:39 +01:00
return ret ;
/ *
2013-10-18 13:33:46 +02:00
// 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);
2014-02-09 16:07:31 +01:00
Vector < TypeinferenceResultSet > A = new Vector < TypeinferenceResultSet > ( ) ;
2013-10-18 13:33:46 +02:00
2014-02-09 16:07:31 +01:00
TypeAssumptions basics ;
2013-10-18 13:33:46 +02:00
2014-03-18 20:18:57 +01:00
basics = this . makeBasicAssumptions ( ) ;
2013-10-18 13:33:46 +02:00
//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 ; k < tempKlasse . getSuperInterfaces ( ) . size ( ) ; k + + ) {
MyCompiler . wandleGeneric2RefType ( tempKlasse . getSuperInterfaces ( ) . elementAt ( k ) . get_ParaList ( ) , this . KlassenVektor ) ;
}
}
}
for ( int i = 0 ; i < this . InterfaceVektor . size ( ) ; i + + ) {
Interface tempIntf = this . InterfaceVektor . elementAt ( i ) ;
MyCompiler . wandleGeneric2RefType ( tempIntf . getContainedTypes ( ) ,
this . KlassenVektor ) ;
}
// HOTI 04-13-06 Alle Methoden der Klassen überprüfen, ob sie als
// RefType deklarierte Attribute haben, die aber GenericTypeVars sind
// Bsp.:
// bei public E elementAt(i){...} wird E vorerst als RefType erkannt
for ( int i = 0 ; i < this . KlassenVektor . size ( ) ; i + + ) {
Class tempKlasse = this . KlassenVektor . elementAt ( i ) ;
tempKlasse . wandleRefTypeAttributes2GenericAttributes ( ) ;
}
for ( int i = 0 ; i < this . InterfaceVektor . size ( ) ; i + + ) {
Interface tempInterface = this . InterfaceVektor . elementAt ( i ) ;
tempInterface . wandleRefTypeAttributes2GenericAttributes ( ) ;
}
// HOT 8.5.06 Wandelt alle Referenzen auf p.ex. Vector in java.util.Vector
for ( int i = 0 ; i < this . KlassenVektor . size ( ) ; i + + ) {
Class tempKlasse = this . KlassenVektor . elementAt ( i ) ;
MyCompiler . makeRefTypesFullyQualified ( tempKlasse . getContainedTypes ( ) , this . imports ) ;
String newSuperclass = MyCompiler . getFullyQualifiedNameFromClassname ( tempKlasse . get_Superclass_Name ( ) , this . imports ) ;
if ( newSuperclass ! = null ) {
// Hier nicht setUsedID, sondern nur den Namen updaten. Sonst gehen die Parameter der Superklasse verloren
tempKlasse . superclassid . name = UsedId . createFromQualifiedName ( newSuperclass , - 1 ) . name ;
}
if ( tempKlasse . getSuperInterfaces ( ) ! = null & & tempKlasse . getSuperInterfaces ( ) . size ( ) > 0 ) {
for ( int j = 0 ; j < tempKlasse . getSuperInterfaces ( ) . size ( ) ; j + + ) {
UsedId uid = tempKlasse . getSuperInterfaces ( ) . elementAt ( j ) ;
String newSuperif = MyCompiler . getFullyQualifiedNameFromClassname ( uid . getQualifiedName ( ) , this . imports ) ;
if ( newSuperif ! = null ) {
UsedId newuid = UsedId . createFromQualifiedName ( newSuperif , uid . getOffset ( ) ) ;
uid . name = newuid . name ;
}
MyCompiler . makeRefTypesFullyQualified ( uid . get_ParaList ( ) , this . imports ) ;
}
}
for ( int j = 0 ; j < tempKlasse . getUsedIdsToCheck ( ) . size ( ) ; j + + ) {
UsedId id = tempKlasse . getUsedIdsToCheck ( ) . elementAt ( j ) ;
String newClassname = MyCompiler . getFullyQualifiedNameFromClassname ( id . getQualifiedName ( ) , this . imports ) ;
if ( newClassname ! = null )
id . name = UsedId . createFromQualifiedName ( newClassname , - 1 ) . name ;
}
}
for ( int i = 0 ; i < this . InterfaceVektor . size ( ) ; i + + ) {
Interface tempIntf = this . InterfaceVektor . elementAt ( i ) ;
MyCompiler . makeRefTypesFullyQualified ( tempIntf . getContainedTypes ( ) , this . imports ) ;
}
inferencelog . info ( " Rufe \" SourceFile.makeFC() \" ... " ) ;
inferencelog . info ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
FC_TTO finiteClosure = this . makeFC ( ) ;
inferencelog . info ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
inferencelog . info ( " Bin aus \" SourceFile.makeFC() \" zur<75> ck. " ) ;
this . removeBasicAssumptions ( ) ;
// PL 05-08-02
// verschoben nach Class.java am Ende von TRProg
// this.addClassNamesAndGenericsToRR(basics);
// HOTI 04-22-06 Fuer jede Klasse die Methoden und Instanzvariablen in die Assumptions aufnehmen
//
Iterator < Interface > 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
2014-02-09 16:07:31 +01:00
//intf.addThisToAssumptions(basics);
2013-10-18 13:33:46 +02:00
}
// Fuer jede Klasse die Assumptions der <20> ffentlichen Felder zusammentragen:
TypeAssumptions publicFieldsAssumptions = new TypeAssumptions ( ) ;
for ( Class cl : KlassenVektor ) {
publicFieldsAssumptions . add ( cl . getPublicFieldAssumptions ( ) ) ;
}
// Die BasicAssumptions anf<6E> gen:
publicFieldsAssumptions . add ( this . getBasicAssumptions ( ) ) ;
// Fuer jede Klasse separat den TRA aufrufen
Iterator < Class > 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()... " ) ;
2014-02-11 02:47:39 +01:00
A . addAll ( cl . typeReconstruction ( supportData , publicFieldsAssumptions ) ) ;
2013-10-18 13:33:46 +02:00
}
return A ;
2014-02-11 02:47:39 +01:00
* /
2013-10-18 13:33:46 +02:00
}
// ino.end
/ * *
* Erstellt die Basic Assumptions ( siehe MakeBasicAssumptions ) als AssumptionSet
* @return
2014-09-04 16:35:44 +02:00
2014-04-03 10:35:25 +02:00
@Deprecated //angef<65> gt von Andreas Stadelmeier. Grund: Die Funktion wurde neu als makeBasicAssumptionsFromJRE angelegt
2013-10-18 13:33:46 +02:00
private TypeAssumptions getBasicAssumptions ( ) {
2014-02-18 17:47:40 +01:00
TypeAssumptions ret = new TypeAssumptions ( null ) ;
2013-10-18 13:33:46 +02:00
// AB hier der Teil aus makeBasicAssumptionsFromJRE:
Vector < UsedId > doneImports = new Vector < UsedId > ( ) ;
//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 {
2014-09-02 18:49:19 +02:00
x = java . lang . Class . forName ( importDecl . getQualifiedName ( ) . toString ( ) ) ;
2013-10-18 13:33:46 +02:00
} 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 < String , GenericTypeVar > jreSpiderRegistry = new Hashtable < String , GenericTypeVar > ( ) ;
Vector < GenericTypeVar > typeGenPara = new Vector < GenericTypeVar > ( ) ;
for ( int j = 0 ; j < tvs . length ; j + + ) {
GenericTypeVar gtv = new GenericTypeVar ( tvs [ j ] . getName ( ) , - 1 ) ;
typeGenPara . addElement ( gtv ) ;
jreSpiderRegistry . put ( tvs [ j ] . getName ( ) , gtv ) ;
}
//BasicAssumptionClass myCl = new BasicAssumptionClass(className, mod);
if ( typeGenPara . size ( ) > 0 ) {
//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 < Type > supertypeGenPara = new Vector < Type > ( ) ;
for ( int tvi = 0 ; tvi < superclassTVS . length ; tvi + + ) {
GenericTypeVar newGTV = new GenericTypeVar ( superclassTVS [ tvi ] . getName ( ) , - 1 ) ;
supertypeGenPara . addElement ( newGTV ) ;
}
if ( supertypeGenPara . size ( ) = = 0 ) {
supertypeGenPara = null ;
}
ui . set_ParaList ( supertypeGenPara ) ;
ui . vParaOrg = supertypeGenPara ;
//myCl.set_UsedId(ui);
}
}
//this.addElement(myCl);
//basicAssumptions.addClassName(className);
for ( int j = 0 ; j < fields . length ; j + + ) {
if ( java . lang . reflect . Modifier . isPublic ( fields [ j ] . getModifiers ( ) ) ) {
//CInstVarTypeAssumption instVar = new CInstVarTypeAssumption(className, fields[j].getName(), new RefType(fields[j].getType().getSimpleName()), MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector<Integer>());
CInstVarTypeAssumption instVar = new CInstVarTypeAssumption ( className , fields [ j ] . getName ( ) , new RefType ( fields [ j ] . getType ( ) . getName ( ) , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ;
//basicAssumptions.addFieldOrLocalVarAssumption(instVar);
2014-02-18 17:47:40 +01:00
//ret.add(instVar); //auskommentiert von Andreas Stadelmeier
2013-10-18 13:33:46 +02:00
}
}
for ( int j = 0 ; j < methods . length ; j + + ) {
if ( java . lang . reflect . Modifier . isPublic ( methods [ j ] . getModifiers ( ) ) ) {
String methodName = methods [ j ] . getName ( ) ;
java . lang . reflect . Type genericReturnType = methods [ j ] . getGenericReturnType ( ) ;
Type returnType = createTypeFromJavaGenericType ( genericReturnType , methods [ j ] . getReturnType ( ) , jreSpiderRegistry ) ;
java . lang . reflect . Type [ ] gpt = methods [ j ] . getGenericParameterTypes ( ) ;
java . lang . Class [ ] pt = methods [ j ] . getParameterTypes ( ) ;
CMethodTypeAssumption method = new CMethodTypeAssumption ( new RefType ( className , 0 ) , methodName , returnType , pt . length , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
for ( int k = 0 ; k < gpt . length ; k + + ) {
Type type = createTypeFromJavaGenericType ( gpt [ k ] , pt [ k ] , jreSpiderRegistry ) ;
// Fixme HOTI beachte overloaded id
2014-09-02 18:49:19 +02:00
method . addParaAssumption ( new CParaTypeAssumption ( className , methodName , pt . length , 0 , type . getName ( ) . toString ( ) , type , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ) ;
2013-10-18 13:33:46 +02:00
}
//basicAssumptions.addMethodIntersectionType(new CIntersectionType(method));
2014-02-18 17:47:40 +01:00
//ret.add(method); //auskommentiert von Andreas Stadelmeier
2013-10-18 13:33:46 +02:00
}
}
for ( int j = 0 ; j < constructors . length ; j + + ) {
if ( java . lang . reflect . Modifier . isPublic ( constructors [ j ] . getModifiers ( ) ) ) {
String methodName = " <init> " ;
CMethodTypeAssumption constructor = new CMethodTypeAssumption ( new RefType ( className , 0 ) , methodName , new RefType ( className , - 1 ) , constructors [ j ] . getParameterTypes ( ) . length , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
for ( int k = 0 ; k < constructors [ j ] . getParameterTypes ( ) . length ; k + + ) {
String paraType = constructors [ j ] . getParameterTypes ( ) [ k ] . getName ( ) ;
//String paraType=constructors[j].getParameterTypes()[k].getSimpleName();
// Fixme HOTI beachte overloaded id
constructor . addParaAssumption ( new CParaTypeAssumption ( className , methodName , constructors [ j ] . getParameterTypes ( ) . length , 0 , paraType , new RefType ( paraType , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ) ;
}
//basicAssumptions.addMethodIntersectionType(new CIntersectionType(constructor));
2014-02-18 17:47:40 +01:00
//ret.add(constructor); //auskommentiert von Andreas Stadelmeier
2013-10-18 13:33:46 +02:00
}
}
imports . removeElement ( importDecl ) ;
doneImports . addElement ( importDecl ) ;
}
imports . addAll ( doneImports ) ;
return ret ;
2014-09-04 16:35:44 +02:00
} * /
2013-10-18 13:33:46 +02:00
2014-10-08 19:00:17 +02:00
/ * *
* Erstellt die Assumptions der standardm <EFBFBD> <EFBFBD> ig importierten Packages ( java . lang . ) sowie der von imports <EFBFBD> bergebenen Klassen zusammen .
* @param imports
* @param withSuptypes - Gibt an , ob auch die subklassen der Packages den Assumptions angef <EFBFBD> gt werden sollen .
* @return
* /
private TypeAssumptions makeBasicAssumptionsFromJRE ( Vector < UsedId > imports , boolean withSubtypes )
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.makeBasicAssumptionsFromJRE.21409.body
{
2014-04-01 21:38:53 +02:00
//return null;
///*
2013-10-18 13:33:46 +02:00
Vector < UsedId > doneImports = new Vector < UsedId > ( ) ;
2014-04-01 21:38:53 +02:00
//TypeinferenceResultSet basicAssumptions = new TypeinferenceResultSet(null);
TypeAssumptions basicAssumptions = new TypeAssumptions ( ) ;
2013-10-18 13:33:46 +02:00
Modifiers mod = new Modifiers ( ) ;
mod . addModifier ( new Public ( ) ) ;
2014-05-07 21:57:29 +02:00
//F<> r Object:
imports . add ( new UsedId ( " java.lang.Object " , - 1 ) ) ;
2013-10-18 13:33:46 +02:00
// F<> r jede einzelne Klasse
while ( imports . size ( ) > 0 ) {
UsedId importDecl = imports . get ( 0 ) ;
// Properties laden
java . lang . Class < ? > x ;
try {
2014-09-02 18:49:19 +02:00
x = java . lang . Class . forName ( importDecl . getQualifiedName ( ) . toString ( ) ) ;
2013-10-18 13:33:46 +02:00
} 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 ( ) ;
2014-10-01 17:12:16 +02:00
//Ermittle die Superklasse:
2014-10-08 19:00:17 +02:00
Class sClass = new Class ( " Object " , 0 ) ;
if ( withSubtypes ) sClass = getSuperClassOfJREClass ( x , basicAssumptions ) ;
2014-09-04 16:35:44 +02:00
2014-10-08 19:00:17 +02:00
// Namen von Generische Typen erzeugen
2013-10-18 13:33:46 +02:00
Hashtable < String , GenericTypeVar > jreSpiderRegistry = new Hashtable < String , GenericTypeVar > ( ) ;
2014-10-08 19:00:17 +02:00
Vector < String > typeGenPara = new Vector < String > ( ) ;
2013-10-18 13:33:46 +02:00
for ( int j = 0 ; j < tvs . length ; j + + ) {
2014-10-08 19:00:17 +02:00
//GenericTypeVar gtv=new GenericTypeVar(tvs[j].getName(), parentClass,-1);
typeGenPara . addElement ( tvs [ j ] . getName ( ) ) ;
//jreSpiderRegistry.put(tvs[j].getName(),gtv);
2013-10-18 13:33:46 +02:00
}
2014-10-08 19:00:17 +02:00
Class parentClass = new Class ( className , sClass . getType ( ) , mod , typeGenPara ) ;
2014-04-01 21:38:53 +02:00
//BasicAssumptionClass myCl = new BasicAssumptionClass(className, mod);
2014-10-08 19:00:17 +02:00
for ( GenericTypeVar classParam : parentClass . getGenericParameter ( ) ) {
jreSpiderRegistry . put ( classParam . getName ( ) . toString ( ) , classParam ) ;
}
2013-10-18 13:33:46 +02:00
if ( typeGenPara . size ( ) > 0 ) {
2014-04-01 21:38:53 +02:00
//auskommentiert von Andreas Stadelmeier:
//basicAssumptions.addGenericTypeVars(className, typeGenPara);
2014-10-08 19:00:17 +02:00
//parentClass.set_ParaList((Vector)typeGenPara);//myCl.set_ParaList((Vector)typeGenPara);
2013-10-18 13:33:46 +02:00
}
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 < Type > supertypeGenPara = new Vector < Type > ( ) ;
for ( int tvi = 0 ; tvi < superclassTVS . length ; tvi + + ) {
2014-09-04 16:35:44 +02:00
GenericTypeVar newGTV = new GenericTypeVar ( superclassTVS [ tvi ] . getName ( ) , parentClass , - 1 ) ;
2013-10-18 13:33:46 +02:00
supertypeGenPara . addElement ( newGTV ) ;
}
2014-10-07 15:36:18 +02:00
2013-10-18 13:33:46 +02:00
if ( supertypeGenPara . size ( ) = = 0 ) {
supertypeGenPara = null ;
}
ui . set_ParaList ( supertypeGenPara ) ;
ui . vParaOrg = supertypeGenPara ;
2014-04-01 21:38:53 +02:00
parentClass . set_UsedId ( ui ) ;
2013-10-18 13:33:46 +02:00
}
}
2014-04-01 21:38:53 +02:00
//auskommentiert von Andreas Stadelmeier
//this.addElement(myCl);
//basicAssumptions.addClassName(className);
2013-10-18 13:33:46 +02:00
for ( int j = 0 ; j < fields . length ; j + + ) {
if ( java . lang . reflect . Modifier . isPublic ( fields [ j ] . getModifiers ( ) ) ) {
2014-09-14 18:38:43 +02:00
parentClass . addField ( new FieldDeclaration ( fields [ j ] . getName ( ) , new RefType ( fields [ j ] . getType ( ) . getName ( ) , parentClass , - 1 ) ) ) ;
2013-10-18 13:33:46 +02:00
}
}
for ( int j = 0 ; j < methods . length ; j + + ) {
if ( java . lang . reflect . Modifier . isPublic ( methods [ j ] . getModifiers ( ) ) ) {
String methodName = methods [ j ] . getName ( ) ;
2014-08-07 16:09:07 +02:00
//if(methodName.equals("add")){
2014-04-09 14:12:55 +02:00
2013-10-18 13:33:46 +02:00
java . lang . reflect . Type genericReturnType = methods [ j ] . getGenericReturnType ( ) ;
2014-09-04 16:35:44 +02:00
Type returnType = createTypeFromJavaGenericType ( genericReturnType , methods [ j ] . getReturnType ( ) , jreSpiderRegistry , parentClass ) ;
2014-09-03 10:42:12 +02:00
2013-10-18 13:33:46 +02:00
java . lang . reflect . Type [ ] gpt = methods [ j ] . getGenericParameterTypes ( ) ;
java . lang . Class [ ] pt = methods [ j ] . getParameterTypes ( ) ;
2014-04-03 10:35:25 +02:00
//CMethodTypeAssumption method = new CMethodTypeAssumption(new RefType(className, 0), methodName, returnType, pt.length,MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector<Integer>(),null);
2014-09-02 10:33:54 +02:00
Method method = de . dhbwstuttgart . syntaxtree . Method . createEmptyMethod ( methodName , parentClass ) ;
2014-04-03 10:35:25 +02:00
method . setType ( returnType ) ;
ParameterList parameterList = new ParameterList ( ) ;
2013-10-18 13:33:46 +02:00
for ( int k = 0 ; k < gpt . length ; k + + ) {
2014-09-04 16:35:44 +02:00
Type type = createTypeFromJavaGenericType ( gpt [ k ] , pt [ k ] , jreSpiderRegistry , parentClass ) ;
2013-10-18 13:33:46 +02:00
// Fixme HOTI beachte overloaded id
2014-04-03 10:35:25 +02:00
//method.addParaAssumption(new CParaTypeAssumption(className, methodName, pt.length,0,type.getName(), type, MyCompiler.NO_LINENUMBER,MyCompiler.NO_LINENUMBER,new Vector<Integer>()));
FormalParameter parameter = new FormalParameter ( new DeclId ( type . get_Name ( ) ) ) ;
parameter . setType ( type ) ;
parameterList . formalparameter . add ( parameter ) ;
2013-10-18 13:33:46 +02:00
}
2014-04-03 10:35:25 +02:00
method . setParameterList ( parameterList ) ;
2014-04-01 21:38:53 +02:00
//basicAssumptions.addMethodIntersectionType(new CIntersectionType(method));
2015-02-25 18:29:44 +01:00
2014-04-03 10:35:25 +02:00
parentClass . addField ( method ) ;
2014-04-09 14:12:55 +02:00
2014-08-07 16:09:07 +02:00
//}
2014-04-09 14:12:55 +02:00
}
2013-10-18 13:33:46 +02:00
}
for ( int j = 0 ; j < constructors . length ; j + + ) {
2014-09-14 18:38:43 +02:00
String methodName = className ;
Method constructorMethod = de . dhbwstuttgart . syntaxtree . Method . createEmptyMethod ( methodName , parentClass ) ;
2013-10-18 13:33:46 +02:00
if ( java . lang . reflect . Modifier . isPublic ( constructors [ j ] . getModifiers ( ) ) ) {
2014-08-28 18:42:40 +02:00
ParameterList paraList = new ParameterList ( ) ;
2013-10-18 13:33:46 +02:00
for ( int k = 0 ; k < constructors [ j ] . getParameterTypes ( ) . length ; k + + ) {
String paraType = constructors [ j ] . getParameterTypes ( ) [ k ] . getName ( ) ;
//String paraType=constructors[j].getParameterTypes()[k].getSimpleName();
2014-08-28 18:42:40 +02:00
// Fixme HOTI beachte overloaded id
FormalParameter fpara = new FormalParameter ( new DeclId ( " p " + k ) ) ;
2014-09-14 18:38:43 +02:00
fpara . setType ( new RefType ( paraType , constructorMethod , - 1 ) ) ;
2014-08-28 18:42:40 +02:00
paraList . formalparameter . add ( fpara ) ;
2013-10-18 13:33:46 +02:00
}
2014-04-01 21:38:53 +02:00
//basicAssumptions.addMethodIntersectionType(new CIntersectionType(constructor));
2014-08-28 18:42:40 +02:00
constructorMethod . parameterlist = paraList ;
2015-02-25 18:29:44 +01:00
Constructor constructor = new Constructor ( constructorMethod ) ;
constructor . parserPostProcessing ( parentClass ) ;
parentClass . addField ( constructor ) ;
2013-10-18 13:33:46 +02:00
}
}
2014-04-03 10:35:25 +02:00
basicAssumptions . add ( parentClass . getPublicFieldAssumptions ( ) ) ;
basicAssumptions . addClassAssumption ( new ClassAssumption ( parentClass ) ) ;
2013-10-18 13:33:46 +02:00
imports . removeElement ( importDecl ) ;
doneImports . addElement ( importDecl ) ;
}
imports . addAll ( doneImports ) ;
return basicAssumptions ;
2014-04-01 21:38:53 +02:00
//*/
2013-10-18 13:33:46 +02:00
}
// ino.end
2014-10-01 17:12:16 +02:00
private Class getSuperClassOfJREClass ( java . lang . Class < ? > x , TypeAssumptions ass ) {
Class ret ;
java . lang . Class s = x . getSuperclass ( ) ;
2014-10-07 10:47:52 +02:00
if ( s = = null ) {
return new Class ( " java.lang.Object " , new Modifiers ( ) , 0 ) ;
}
2014-10-07 15:36:18 +02:00
Vector < String > supertypeGenPara = new Vector < > ( ) ; //Die Generischen Parameter f<> r die Superklasse berechnen:
java . lang . reflect . TypeVariable [ ] superclassTVS = s . getTypeParameters ( ) ;
for ( int tvi = 0 ; tvi < superclassTVS . length ; tvi + + ) {
supertypeGenPara . addElement ( superclassTVS [ tvi ] . getName ( ) ) ;
}
2014-10-01 17:12:16 +02:00
Class ss = this . getSuperClassOfJREClass ( s , ass ) ;
2014-10-07 15:36:18 +02:00
ret = new Class ( s . getName ( ) , ss . getType ( ) , new Modifiers ( ) , supertypeGenPara ) ;
2014-10-07 10:47:52 +02:00
2014-10-07 15:36:18 +02:00
2014-10-07 10:47:52 +02:00
ass . addClassAssumption ( new ClassAssumption ( ss ) ) ; //Die beiden SuperKlassen den Assumptions anf<6E> gen...
ass . addClassAssumption ( new ClassAssumption ( ret ) ) ;
2014-10-01 17:12:16 +02:00
return ret ;
}
2013-10-18 13:33:46 +02:00
2014-10-01 17:12:16 +02:00
// ino.method.isBaseType.21412.definition
2013-10-18 13:33:46 +02:00
private boolean isBaseType ( String type )
// ino.end
// ino.method.isBaseType.21412.body
{
return baseTypeTranslationTable . containsValue ( type ) ;
}
// ino.end
/ * Die contains Methode des Vectors vergleicht bei Strings nicht korrekt ,
* da zwei Strings mit dem gleichen Inhalt unterschiedliche Instanzen sind .
* Deshalb diese Methode 07 - 01 - 20 luar * /
private boolean containsString ( Vector < UsedId > searchVector , String searchString )
{
boolean found = false ;
for ( UsedId id : searchVector )
{
2014-09-02 18:49:19 +02:00
String s = id . getQualifiedName ( ) . toString ( ) ;
2013-10-18 13:33:46 +02:00
found | = s . equals ( searchString ) ;
}
return found ;
}
// ino.method.createTypeFromJavaGenericType.21415.definition
2014-09-04 16:35:44 +02:00
private Type createTypeFromJavaGenericType ( java . lang . reflect . Type type , java . lang . Class < ? > cl , Hashtable < String , GenericTypeVar > jreSpiderRegistry , Class parentClass )
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.createTypeFromJavaGenericType.21415.body
{
2014-10-01 17:12:16 +02:00
/ * auskommentiert , da die Klassen von Sun in der Open JDK 1 . 8 nicht unterst <EFBFBD> tzt werden .
2013-10-18 13:33:46 +02:00
if ( type instanceof TypeVariableImpl ) {
2014-10-01 17:12:16 +02:00
TypeVariableImpl tvi = ( ( TypeVariableImpl ) type ) ;
2014-09-04 16:35:44 +02:00
return ( new GenericTypeVar ( jreSpiderRegistry . get ( tvi . getName ( ) ) . getName ( ) . toString ( ) , parentClass , - 1 ) ) ;
2013-10-18 13:33:46 +02:00
} else {
2014-10-01 17:12:16 +02:00
* /
2014-10-07 15:36:18 +02:00
GenericTypeVar gtv = jreSpiderRegistry . get ( type . getTypeName ( ) ) ;
if ( gtv ! = null ) return gtv ;
//new GenericTypeVar(jreSpiderRegistry.get(type.getTypeName()).getName().toString(),parentClass,-1));
//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 ) ) ;
}
2014-10-01 17:12:16 +02:00
//}
2013-10-18 13:33:46 +02:00
}
// ino.end
// ino.method.makeBasicAssumptions.21418.defdescription type=javadoc
/ * *
* Erzeugt die Anfangsinformationen <EFBFBD> ber bereits bekannte Klassen .
* < br / > Achtung Workaround : Die RefTypes m <EFBFBD> ssen sp <EFBFBD> ter noch durch BaseTypes
* ersetzt werden . < br >
* Author : J <EFBFBD> rg B <EFBFBD> uerle
*
* @return A priori Typinformationen
* @throws ClassNotFoundException
* /
// ino.end
// ino.method.makeBasicAssumptions.21418.definition
2014-04-14 18:05:24 +02:00
private TypeAssumptions makeBasicAssumptions ( )
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.makeBasicAssumptions.21418.body
{
2014-02-09 16:07:31 +01:00
/ *
2013-10-18 13:33:46 +02:00
if ( LOAD_BASIC_ASSUMPTIONS_FROM_JRE ) {
Vector < UsedId > strImports = new Vector < UsedId > ( ) ;
ImportDeclarations usedIdImports = getImports ( ) ;
for ( int i = 0 ; i < usedIdImports . size ( ) ; i + + ) {
UsedId uid = usedIdImports . get ( i ) ;
if ( uid . hasWildCard ( ) ) {
throw new CTypeReconstructionException ( " Wildcards in den Imports werden bislang nicht unterstuetzt: " + uid . getQualifiedName ( ) , uid ) ;
//throw new ClassNotFoundException("Bei den Imports sind momentan keine Wildcards erlaubt!");
} else {
strImports . addElement ( uid ) ;
}
}
2014-02-09 16:07:31 +01:00
TypeinferenceResultSet res = makeBasicAssumptionsFromJRE ( strImports ) ;
2013-10-18 13:33:46 +02:00
ImportDeclarations newImports = new ImportDeclarations ( ) ;
for ( int i = 0 ; i < strImports . size ( ) ; i + + ) {
newImports . addElement ( strImports . get ( i ) ) ;
}
setImports ( newImports ) ;
return ( res ) ;
}
2014-02-09 16:07:31 +01:00
TypeinferenceResultSet foo = new TypeinferenceResultSet ( null ) ;
2013-10-18 13:33:46 +02:00
CMethodTypeAssumption meth = null ;
CInstVarTypeAssumption instVar = null ;
Class c = null ;
UsedId ui = null ;
//Vector pl = null;
Modifiers mod = new Modifiers ( ) ;
mod . addModifier ( new Public ( ) ) ;
//------------------------
// Integer bauen:
//------------------------
foo . addClassName ( " java.lang.Integer " ) ; //PL 05-08-01 eingefuegt
instVar = new CInstVarTypeAssumption ( " java.lang.Integer " , " MAX_VALUE " , new RefType ( " java.lang.Integer " , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ;
foo . addFieldOrLocalVarAssumption ( instVar ) ;
meth = new CMethodTypeAssumption ( new RefType ( " java.lang.Integer " , 0 ) , " <init> " , new RefType ( " java.lang.Integer " , - 1 ) , 0 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
foo . addMethodIntersectionType ( new CIntersectionType ( meth ) ) ;
meth = new CMethodTypeAssumption ( new RefType ( " java.lang.Integer " , 0 ) , " <init> " , new RefType ( " java.lang.Integer " , - 1 ) , 1 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
meth . addParaAssumption ( new CParaTypeAssumption ( " java.lang.Integer " , " <init> " , 1 , 0 , " value " , new RefType ( " java.lang.Integer " , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ) ;
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 < Integer > ( ) , 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 ) , " <init> " , new RefType ( " java.lang.Boolean " , - 1 ) , 0 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
foo . addMethodIntersectionType ( new CIntersectionType ( meth ) ) ;
meth = new CMethodTypeAssumption ( new RefType ( " java.lang.Boolean " , 0 ) , " <init> " , new RefType ( " java.lang.Boolean " , - 1 ) , 1 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
meth . addParaAssumption ( new CParaTypeAssumption ( " java.lang.Boolean " , " <init> " , 1 , 0 , " value " , new RefType ( " java.lang.Boolean " , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ) ;
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 < Integer > ( ) , 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 ) , " <init> " , new RefType ( " java.lang.Character " , - 1 ) , 0 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
foo . addMethodIntersectionType ( new CIntersectionType ( meth ) ) ;
meth = new CMethodTypeAssumption ( new RefType ( " java.lang.Character " , 0 ) , " <init> " , new RefType ( " java.lang.Character " , - 1 ) , 1 , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) , null ) ;
meth . addParaAssumption ( new CParaTypeAssumption ( " java.lang.Character " , " <init> " , 1 , 0 , " value " , new RefType ( " java.lang.Character " , - 1 ) , MyCompiler . NO_LINENUMBER , MyCompiler . NO_LINENUMBER , new Vector < Integer > ( ) ) ) ;
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 < Integer > ( ) , 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<53> ter ersetzen durch GenericTypeVar
Vector < GenericTypeVar > typeGenPara = new Vector < GenericTypeVar > ( ) ;
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 < Integer > ( ) , 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 < Integer > ( ) ) ) ;
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 < Integer > ( ) , 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 < Integer > ( ) ) ) ;
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 < Integer > ( ) , 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 ;
2014-02-09 16:07:31 +01:00
* /
2014-03-18 20:18:57 +01:00
TypeAssumptions ret = new TypeAssumptions ( ) ;
2014-03-26 23:28:17 +01:00
//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 ( ) ) ;
}
2014-03-18 20:18:57 +01:00
return ret ; //TODO: Diese TypeAssumptions mit basic-Assumptions f<> llen
2013-10-18 13:33:46 +02:00
}
// 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 <EFBFBD> scht die Anfangsinformation wieder aus dem Klassenvektor
* < br / > Author : J <EFBFBD> rg B <EFBFBD> uerle
* /
// ino.end
// ino.method.removeBasicAssumptions.21424.definition
private void removeBasicAssumptions ( )
// ino.end
// ino.method.removeBasicAssumptions.21424.body
{
for ( int i = 0 ; i < KlassenVektor . size ( ) ; i + + ) {
Class cl = KlassenVektor . elementAt ( i ) ;
if ( cl instanceof BasicAssumptionClass ) {
KlassenVektor . removeElementAt ( i ) ;
i - - ;
}
}
}
// ino.end
// ino.method.getPackageName.21427.defdescription type=javadoc
/ * *
* Erzeugt f <EFBFBD> r jede Klasse einen Vector , in den Referenzen auf die GenericTypeVars
* dieser Klasse gespeichert werden . Diese Vectoren werden unter den Klassennamen
* in der
* Ergebnisdatenstruktur abgelegt . Au <EFBFBD> erdem werden alle Klassennamen gespeichert .
* < br / > Author : J <EFBFBD> rg B <EFBFBD> uerle
* @param res
* /
* / * private void addClassNamesAndGenericsToRR ( CTypeReconstructionResult res ) {
* Iterator < Class > it = this . getClassIterator ( ) ;
* while ( it . hasNext ( ) ) {
* Class cl = it . next ( ) ;
* res . addClassName ( cl . get_classname ( ) ) ;
* Vector < GenericTypeVar > genericsList = new Vector < GenericTypeVar > ( ) ;
*
* for ( int i = 0 ; i < cl . get_ParaList ( ) . size ( ) ; i + + ) {
* Type para = ( Type ) cl . get_ParaList ( ) . elementAt ( i ) ;
* if ( para instanceof GenericTypeVar ) {
* genericsList . addElement ( ( GenericTypeVar ) para ) ;
* }
* }
* res . addGenericTypeVars ( cl . get_classname ( ) , genericsList ) ;
* }
* }
* /
// ino.end
// ino.method.getPackageName.21427.definition
public UsedId getPackageName ( )
// ino.end
// ino.method.getPackageName.21427.body
{
return pkgName ;
}
// ino.end
// ino.method.setPackageName.21430.definition
public void setPackageName ( UsedId pkgName )
// ino.end
// ino.method.setPackageName.21430.body
{
this . pkgName = pkgName ;
// Die Package-Namen fuer alle Klassen und Interfaces
// im Source-File nachziehen
for ( int i = 0 ; i < KlassenVektor . size ( ) ; i + + ) {
KlassenVektor . elementAt ( i ) . setPackageName ( pkgName ) ;
}
}
// ino.end
// ino.method.addImports.21433.definition
public void addImports ( ImportDeclarations imports )
// ino.end
// ino.method.addImports.21433.body
{
this . imports . addAll ( imports ) ;
}
// ino.end
// ino.method.getImports.21436.definition
public ImportDeclarations getImports ( )
// ino.end
// ino.method.getImports.21436.body
{
if ( imports = = null ) {
return ( new ImportDeclarations ( ) ) ;
}
return ( imports ) ;
}
// ino.end
// ino.method.getClassIterator.21439.definition
public Iterator < Class > getClassIterator ( )
// ino.end
// ino.method.getClassIterator.21439.body
{
return KlassenVektor . iterator ( ) ;
}
// ino.end
// ino.method.getInterfaceIterator.21442.definition
public Iterator < Interface > getInterfaceIterator ( )
// ino.end
// ino.method.getInterfaceIterator.21442.body
{
return InterfaceVektor . iterator ( ) ;
}
// ino.end
2014-02-11 16:30:38 +01:00
@Override
public void parserPostProcessing ( SyntaxTreeNode parent ) {
2014-04-15 14:56:20 +02:00
if ( parent ! = null ) throw new DebugException ( " Eine SourceFile hat kein Elternelement im Syntaxbaum " ) ;
2014-02-19 23:04:48 +01:00
super . parserPostProcessing ( parent ) ;
//for(SyntaxTreeNode node : this.getChildren())node.parserPostProcessing(this);
2014-02-11 16:30:38 +01:00
}
@Override
public SyntaxTreeNode getParent ( ) {
return null ;
}
@Override
public Vector < SyntaxTreeNode > getChildren ( ) {
2014-02-19 23:04:48 +01:00
Vector < SyntaxTreeNode > ret = new Vector < SyntaxTreeNode > ( ) ;
2014-02-12 02:12:12 +01:00
for ( Class cl : this . KlassenVektor ) {
ret . add ( cl ) ;
}
return ret ;
2014-02-11 16:30:38 +01:00
}
/ * *
* SourceFile stellt eine geparste Java - Datei dar . Mit dieser Methode wird der Name der eingelesenen Datei gesetzt .
* @param filename - Der Name der eingelesenen JavaDatei
* /
2014-03-07 22:05:10 +01:00
@Deprecated
2014-02-11 16:30:38 +01:00
public void setFileName ( String filename ) {
2014-03-07 22:05:10 +01:00
//this.filename = filename;
2014-02-11 16:30:38 +01:00
}
2014-09-08 15:12:47 +02:00
@Override
public int getOffset ( ) {
// TODO Auto-generated method stub
return 0 ;
}
@Override
public int getVariableLength ( ) {
// TODO Auto-generated method stub
return 0 ;
}
2013-10-18 13:33:46 +02:00
}
// ino.end