2014-09-04 16:35:44 +02:00
package de.dhbwstuttgart.syntaxtree ;
2013-10-18 13:33:46 +02:00
import java.util.Hashtable ;
import java.util.Iterator ;
2016-05-25 17:46:33 +02:00
import java.util.List ;
2016-03-24 11:57:17 +01:00
import java.util.Set ;
2015-08-27 13:36:14 +02:00
2015-04-22 21:40:22 +02:00
import de.dhbwstuttgart.typeinference.Menge ;
2015-08-27 13:36:14 +02:00
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.core.MyCompiler ;
2016-12-15 15:45:23 +01:00
import de.dhbwstuttgart.typecheck.JavaClassName ;
2016-03-24 11:57:17 +01:00
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory ;
2014-09-05 11:49:31 +02:00
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers ;
2014-09-02 10:33:54 +02:00
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar ;
import de.dhbwstuttgart.syntaxtree.type.RefType ;
import de.dhbwstuttgart.syntaxtree.type.Type ;
import de.dhbwstuttgart.syntaxtree.type.Void ;
2015-08-27 13:36:14 +02:00
import de.dhbwstuttgart.typeinference.ByteCodeResult ;
2014-09-02 10:33:54 +02:00
import de.dhbwstuttgart.typeinference.ConstraintsSet ;
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 ;
2015-11-06 16:42:22 +01:00
import de.dhbwstuttgart.typeinference.TypeinferenceResults ;
2016-03-29 13:23:05 +02:00
import de.dhbwstuttgart.typeinference.UnifyConstraintsSet ;
2014-09-02 10:33:54 +02:00
import de.dhbwstuttgart.typeinference.assumptions.ClassAssumption ;
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions ;
import de.dhbwstuttgart.typeinference.exceptions.DebugException ;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException ;
2016-04-13 18:32:09 +02:00
import de.dhbwstuttgart.typeinference.unify.TypeUnify ;
2016-05-25 17:46:33 +02:00
import de.dhbwstuttgart.typeinference.unify.Unifikationsalgorithmus ;
2016-03-24 11:57:17 +01:00
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure ;
2016-05-25 17:46:33 +02:00
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType ;
2016-04-04 11:23:14 +02:00
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair ;
2013-10-18 13:33:46 +02:00
2016-12-07 14:32:48 +01:00
public class SourceFile extends SyntaxTreeNode
2013-10-18 13:33:46 +02:00
{
protected static Logger codegenlog = Logger . getLogger ( " codegen " ) ;
protected static Logger inferencelog = Logger . getLogger ( " inference " ) ;
2016-09-10 00:40:17 +02:00
private String pkgName ;
2013-10-18 13:33:46 +02:00
2016-12-07 14:32:48 +01:00
public List < Class > KlassenVektor = new Menge < Class > ( ) ;
private List < JavaClassName > imports ;
2013-10-18 13:33:46 +02:00
/ * *
2015-05-12 19:49:27 +02:00
* Die SourceFile reprà ¤ sntiert eine zu einem Syntaxbaum eingelesene Java - Datei .
2014-02-11 16:30:38 +01:00
* SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar .
2013-10-18 13:33:46 +02:00
* /
2016-12-07 14:32:48 +01:00
public SourceFile ( List < Class > classDefinitions ) {
this . KlassenVektor = classDefinitions ;
2014-09-16 11:31:15 +02:00
}
2016-05-25 17:46:33 +02:00
/ * *
* PL 2014 - 10 - 25
* schnitt1 checkt ob die Typeplaceholders aus in den Elemeneten aus vars enthalten sind
* RÃ ¼ ckgabe ist die Menge der Indizies von vars der Schnittmengen mit var nicht leer sind .
* @param var
* @param vars
* @param indexe
* @return
* /
static Menge < Integer > schnitt1 ( Menge < PlaceholderType > var , Menge < Menge < PlaceholderType > > vars , Menge < Integer > indexe ) {
int j = - 1 ;
for ( Menge < PlaceholderType > varelems : vars ) {
j + + ;
if ( varelems ! = null ) {
if ( var . stream ( ) . map ( x - > varelems . contains ( x ) ) . reduce ( false , ( a , b ) - > ( a | | b ) )
& & ( ! indexe . contains ( j ) ) )
{
Menge < PlaceholderType > rekvarelements = vars . elementAt ( j ) ;
vars . setElementAt ( null , j ) ; //Element erledigt muss nicht nochmals bearbeitet werden.
indexe . addElement ( j ) ;
indexe = schnitt1 ( rekvarelements , vars , indexe ) ;
}
}
}
return indexe ;
}
/ * *
* Bildet Schnittmengen der Mengen von Typeplaceholders
* Rueckgabe ist die Menge der Menge von Indizies die Schnittmengen sind .
* @param vars
* @return
* /
public static Menge < Menge < Integer > > schnitt ( Menge < Menge < PlaceholderType > > vars ) {
Menge < Menge < Integer > > ret = new Menge < > ( ) ;
int i = - 1 ;
for ( Menge < PlaceholderType > var : vars ) {
i + + ;
if ( var ! = null ) { //Element wurde noch bearbeitet
Menge < Integer > indexe = new Menge < > ( ) ;
indexe . add ( i ) ;
ret . add ( schnitt1 ( var , vars , indexe ) ) ;
}
}
return ret ;
}
public static Set < Set < UnifyPair > > cartesianProduct ( List < UnifyPair > constraints , FiniteClosure finiteClosure ) {
//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
Menge < Menge < PlaceholderType > > constraintsclonevars = constraints . stream ( ) . map ( p - > { Menge < PlaceholderType > TPHs = new Menge < > ( ) ;
TPHs . addAll ( p . getInvolvedPlaceholderTypes ( ) ) ;
TPHs . addAll ( p . getInvolvedPlaceholderTypes ( ) ) ;
return TPHs ; }
) . collect ( Menge : : new , Menge : : add , Menge : : 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
Menge < Menge < Integer > > indexeset = new Menge < > ( ) ;
if ( constraintsclonevars ! = null & & constraintsclonevars . size ( ) > 0 ) {
indexeset = SourceFile . schnitt ( constraintsclonevars ) ;
}
//Schritt 3: Umwandlung der Indizes in die zugehoerigen Elemente
// In streamconstraintsclone sind die Mengen von Paar enthalten die unifiziert werden muessen
Stream < Menge < UnifyPair > > streamconstraintsclone = indexeset . stream ( ) . < Menge < UnifyPair > > map ( x - > x . stream ( )
. < UnifyPair > map ( i - > constraints . get ( i ) )
. < Menge < UnifyPair > > collect ( Menge : : new , Menge : : add , Menge : : addAll ) ) ;
//Menge<Menge<Pair>> vecconstraintsclone = streamconstraintsclone.collect(Menge::new, Menge::add, Menge::addAll);
//System.out.println();
//Schritt 4: Unifikation
Menge < Set < Set < UnifyPair > > > vecunifyResult =
//streamconstraintsclone.map(x -> Unify.unify(x, finiteClosure)).collect(Menge::new, Menge::add, Menge::addAll);
//DEBUG-Variante
streamconstraintsclone . map ( x - >
{ Set < Set < UnifyPair > > z = new TypeUnify ( ) . unify ( x , finiteClosure ) ;
return z ;
}
) . collect ( Menge : : new , Menge : : add , Menge : : addAll ) ;
//card gibt die Cardinalitaet der unifizierten Mengen an
Menge < Integer > card = vecunifyResult . stream ( ) . map ( x - > x . size ( ) ) . collect ( Menge : : new , Menge : : add , Menge : : 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]]
Set < Set < UnifyPair > > cardprodret_start = new Menge < > ( ) ;
cardprodret_start . add ( new Menge < UnifyPair > ( ) ) ;
//cart. Produkt mit Linkverschiebung
Set < Set < UnifyPair > > unifyResult = vecunifyResult . stream ( ) . reduce ( cardprodret_start , ( x , y ) - > {
Set < Set < UnifyPair > > cardprodret = new Menge < > ( ) ;
if ( y . size ( ) > 0 ) {
//System.out.println(y);
//Menge<Menge<Pair>> cardprodretold = x;
//cardprodret = new Menge<>();
for ( Set < UnifyPair > xElement : x ) {
for ( Set < UnifyPair > yElement : y ) {
Set < UnifyPair > help = new Menge < > ( ) ;
help . addAll ( yElement ) ;
help . addAll ( xElement ) ;
cardprodret . add ( help ) ;
}
}
}
else
return new Menge < > ( ) ; //kein unifiziertes Ergebnis, damit wird das Geseamtergebnis []
return cardprodret ;
} ) ;
return unifyResult ;
}
2014-02-11 02:47:39 +01:00
2013-10-18 13:33:46 +02:00
/////////////////////////////////////////////////////////////////////////
// TypeReconstructionAlgorithmus
/////////////////////////////////////////////////////////////////////////
/ * *
2015-05-12 19:49:27 +02:00
* 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 .
* < br > Author : JÃ ¯ Â ¿ Â ½ rg BÃ ¯ Â ¿ Â ½ uerle
* @return Liste aller mà ¯  ¿  ½ glichen Typkombinationen
* @throws CTypeReconstructionException Wenn was schief là ¯  ¿  ½ uft
2013-10-18 13:33:46 +02:00
* /
2015-04-22 21:40:22 +02:00
public Menge < TypeinferenceResultSet > typeReconstruction ( TypeAssumptions globalAssumptions )
2013-10-18 13:33:46 +02:00
{
2015-04-22 21:40:22 +02:00
Menge < TypeinferenceResultSet > ret = new Menge < TypeinferenceResultSet > ( ) ;
2014-02-11 02:47:39 +01:00
//Logger initialisieren:
Logger typinferenzLog = Logger . getLogger ( " Typeinference " ) ;
2015-05-12 19:49:27 +02:00
//Alle Assumptions für diese SourceFile sammeln:
2014-02-14 17:31:55 +01:00
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-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 ) {
2016-03-24 11:57:17 +01:00
oderConstraints . add ( klasse . typeReconstruction ( globalAssumptions ) ) ;
2014-03-19 15:14:50 +01:00
}
2016-03-24 11:57:17 +01:00
/ * ////////////////
* Paare in MPairs umwandeln
* ( Wird zunächst mal weggelassen . Constraints werden erst beim Unifizieren umgewandelt
* /////////////////
//UnifyTypeFactory.convert(oderConstraints);
2016-05-24 00:36:59 +02:00
//FiniteClosure generieren:
FiniteClosure finiteClosure = UnifyTypeFactory . generateFC ( globalAssumptions ) ;
typinferenzLog . debug ( " FiniteClosure: \ n " + finiteClosure , Section . TYPEINFERENCE ) ;
2016-03-24 11:57:17 +01:00
2014-03-19 15:14:50 +01:00
////////////////
2016-03-29 13:23:05 +02:00
//Typen in UnifyTypen umwandeln:
2014-03-19 15:14:50 +01:00
////////////////
2016-03-29 13:23:05 +02:00
UnifyConstraintsSet unifyConstraints = UnifyTypeFactory . convert ( oderConstraints ) ;
2014-10-01 17:12:16 +02:00
2015-05-12 19:49:27 +02:00
//Unmögliche ConstraintsSets aussortieren durch Unifizierung
2016-05-25 17:46:33 +02:00
Unifikationsalgorithmus unifier = ( pairs ) - > new TypeUnify ( ) . unify ( pairs , finiteClosure ) ;
2015-12-08 15:48:35 +01:00
2016-05-25 17:46:33 +02:00
unifyConstraints . filterWrongConstraints ( unifier ) ;
2016-07-21 16:20:37 +02:00
//unifyConstraints.unifyUndConstraints(unifier); //rausgeworfen für Tests (08.12.2015)
2016-03-29 13:23:05 +02:00
2016-03-30 18:16:27 +02:00
typinferenzLog . debug ( " Ã briggebliebene Konstraints: \ n " + oderConstraints + " \ n " , Section . TYPEINFERENCE ) ;
typinferenzLog . debug ( " Ã briggebliebene Konvertierte Konstraints: \ n " + unifyConstraints + " \ n " , Section . TYPEINFERENCE ) ;
2016-07-21 16:20:37 +02:00
2016-03-29 13:23:05 +02:00
////////////////
//Karthesisches Produkt bilden:
////////////////
2016-04-04 11:23:14 +02:00
Set < Set < UnifyPair > > xConstraints = unifyConstraints . cartesianProduct ( ) ;
2016-03-29 13:23:05 +02:00
2016-05-25 17:46:33 +02:00
//Sets zu Listen umwandeln:
//Set<List<UnifyPair>> allUnifiedConstraints = xConstraints.stream().map((set)-> new ArrayList<>(set)).collect(Menge::new, Menge::add, Menge::addAll);;
2016-04-07 14:39:07 +02:00
typinferenzLog . debug ( " Finite Closure: " + finiteClosure , Section . TYPEINFERENCE ) ;
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
2016-03-24 11:57:17 +01: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 ;
2016-04-04 11:23:14 +02:00
for ( Set < UnifyPair > constraints : xConstraints ) {
2015-05-12 19:49:27 +02:00
//Alle durch das Karthesische Produkt entstandenen Möglichkeiten durchgehen:
2014-02-11 02:47:39 +01:00
2016-04-12 10:06:58 +02:00
typinferenzLog . debug ( " \ nUnifiziere Constraints: \ n " + constraints , Section . TYPEINFERENCE ) ;
2016-04-14 14:50:31 +02:00
typinferenzLog . debug ( " \ nFC: \ n " + finiteClosure , Section . TYPEINFERENCE ) ;
2016-04-20 17:10:26 +02:00
long start = System . currentTimeMillis ( ) ;
2016-04-13 18:32:09 +02:00
Set < Set < UnifyPair > > unifyResult = new TypeUnify ( ) . unify ( constraints , finiteClosure ) ;
2016-04-20 17:10:26 +02:00
long time = System . currentTimeMillis ( ) - start ;
2016-04-14 14:50:31 +02:00
typinferenzLog . debug ( " \ nErgebnis der Unifizierung: \ n " + unifyResult , Section . TYPEINFERENCE ) ;
2016-04-20 18:38:20 +02:00
typinferenzLog . debug ( " \ nAnzahl Lösungen: \ n " + unifyResult . size ( ) , Section . TYPEINFERENCE ) ;
2016-05-25 17:46:33 +02:00
//typinferenzLog.debug("\nZeit für Unifizierung: "+time + "ms", Section.TYPEINFERENCE);
2016-04-20 17:10:26 +02:00
2016-04-14 14:50:31 +02:00
2016-04-04 11:23:14 +02:00
Menge < Menge < Pair > > convertedResult = unifyResult . parallelStream ( ) . < Menge < Pair > > map ( ( Set < UnifyPair > resultSet ) - > {
Menge < Pair > innerConvert = resultSet . stream ( ) . map ( ( UnifyPair mp ) - > UnifyTypeFactory . convert ( mp ) )
2016-03-30 18:16:27 +02:00
. collect ( Menge < Pair > : : new , Menge : : add , Menge : : addAll ) ;
return innerConvert ;
} ) . collect ( Menge : : new , Menge : : add , Menge : : addAll ) ;
Menge < Pair > convertedConstraints = constraints . stream ( ) . map (
2016-04-04 11:23:14 +02:00
( UnifyPair mp ) - > { return UnifyTypeFactory . convert ( mp ) ; }
2016-03-30 18:16:27 +02:00
) . collect ( Menge < Pair > : : new , Menge : : add , Menge : : addAll ) ;
2015-05-12 19:49:27 +02:00
//Dann den Ergebnissen anfügen
2016-04-14 14:50:31 +02:00
typinferenzLog . debug ( " \ nErgebnis der Unifizierung (Konvertiert): \ n " + convertedResult , Section . TYPEINFERENCE ) ;
2016-03-30 18:16:27 +02:00
//result.addAll(convertedResult);
2014-03-19 15:14:50 +01:00
2014-10-09 17:38:10 +02:00
typinferenzLog . debug ( " \ nJavaFiles: \ n " , Section . TYPEINFERENCE ) ;
2014-03-19 15:14:50 +01:00
2015-04-22 21:40:22 +02:00
//typinferenzLog.debug(this.printJavaCode(new ResultSet(new Menge<Pair>())));
2014-03-19 15:14:50 +01:00
2015-05-12 19:49:27 +02:00
//Für jede Klasse in diesem SourceFile gilt das selbe ResultSet:
2014-03-19 15:14:50 +01:00
for ( Class klasse : this . KlassenVektor ) {
2015-05-12 19:49:27 +02:00
//Der Unifikationsalgorithmus kann wiederum auch mehrere Lösungen errechnen, diese werden im folgenden durchlaufen:
2016-03-30 18:16:27 +02:00
for ( Menge < Pair > resultSet : convertedResult ) {
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:
2016-03-30 18:16:27 +02:00
TypeinferenceResultSet reconstructionResult = new TypeinferenceResultSet ( klasse , convertedConstraints , new ResultSet ( resultSet ) ) ;
2014-03-19 15:14:50 +01:00
ret . add ( reconstructionResult ) ;
//ResultSet res = new ResultSet(resultSet);
2015-05-12 19:49:27 +02:00
typinferenzLog . debug ( " JavaFile für ResultSet " + reconstructionResult + " \ n " , Section . TYPEINFERENCE ) ;
2014-10-09 17:38:10 +02:00
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
}
2014-10-08 19:00:17 +02:00
/ * *
2015-05-12 19:49:27 +02:00
* Erstellt die Assumptions der standardmà ¤ à ig importierten Packages ( java . lang . ) sowie der von imports à ¼ bergebenen Klassen zusammen .
2014-10-08 19:00:17 +02:00
* @param imports
2015-05-12 19:49:27 +02:00
* @param withSuptypes - Gibt an , ob auch die subklassen der Packages den Assumptions angefà ¼ gt werden sollen .
2014-10-08 19:00:17 +02:00
* @return
2016-09-10 00:40:17 +02:00
* TODO : Diese Methode neu erstellen
2014-10-08 19:00:17 +02:00
* /
2016-09-10 00:40:17 +02:00
public TypeAssumptions makeBasicAssumptionsFromJRE ( List < JavaClassName > imports , boolean withSubtypes )
2013-10-18 13:33:46 +02:00
// ino.end
// ino.method.makeBasicAssumptionsFromJRE.21409.body
{
2016-12-07 14:32:48 +01:00
return null ;
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
2015-05-12 19:49:27 +02:00
Menge < String > supertypeGenPara = new Menge < > ( ) ; //Die Generischen Parameter für die Superklasse berechnen:
2014-10-07 15:36:18 +02:00
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
2015-05-12 19:49:27 +02:00
ass . addClassAssumption ( new ClassAssumption ( ss ) ) ; //Die beiden SuperKlassen den Assumptions anfügen...
2014-10-07 10:47:52 +02:00
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
2015-04-22 21:40:22 +02:00
/ * Die contains Methode des Menges vergleicht bei Strings nicht korrekt ,
2013-10-18 13:33:46 +02:00
* da zwei Strings mit dem gleichen Inhalt unterschiedliche Instanzen sind .
* Deshalb diese Methode 07 - 01 - 20 luar * /
2015-04-22 21:40:22 +02:00
private boolean containsString ( Menge < UsedId > searchMenge , String searchString )
2013-10-18 13:33:46 +02:00
{
boolean found = false ;
2015-04-22 21:40:22 +02:00
for ( UsedId id : searchMenge )
2013-10-18 13:33:46 +02:00
{
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
{
2015-05-12 19:49:27 +02:00
/ * auskommentiert , da die Klassen von Sun in der Open JDK 1 . 8 nicht unterstà ¼ 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.method.getPackageName.21427.defdescription type=javadoc
/ * *
2015-05-12 19:49:27 +02:00
* Erzeugt fà ¯  ¿  ½ r jede Klasse einen Menge , in den Referenzen auf die GenericTypeVars
2015-04-22 21:40:22 +02:00
* dieser Klasse gespeichert werden . Diese Mengeen werden unter den Klassennamen
2013-10-18 13:33:46 +02:00
* in der
2015-05-12 19:49:27 +02:00
* Ergebnisdatenstruktur abgelegt . Auà ¯  ¿  ½ erdem werden alle Klassennamen gespeichert .
* < br / > Author : JÃ ¯ Â ¿ Â ½ rg BÃ ¯ Â ¿ Â ½ uerle
2013-10-18 13:33:46 +02:00
* @param res
* /
* / * private void addClassNamesAndGenericsToRR ( CTypeReconstructionResult res ) {
* Iterator < Class > it = this . getClassIterator ( ) ;
* while ( it . hasNext ( ) ) {
* Class cl = it . next ( ) ;
* res . addClassName ( cl . get_classname ( ) ) ;
2015-04-22 21:40:22 +02:00
* Menge < GenericTypeVar > genericsList = new Menge < GenericTypeVar > ( ) ;
2013-10-18 13:33:46 +02:00
*
* 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
public ImportDeclarations getImports ( )
{
return ( imports ) ;
}
// 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 " ) ;
2015-08-26 14:48:51 +02:00
super . parserPostProcessing ( this ) ;
2014-02-19 23:04:48 +01:00
//for(SyntaxTreeNode node : this.getChildren())node.parserPostProcessing(this);
2014-02-11 16:30:38 +01:00
}
@Override
public SyntaxTreeNode getParent ( ) {
return null ;
}
@Override
2015-04-22 21:40:22 +02:00
public Menge < SyntaxTreeNode > getChildren ( ) {
Menge < SyntaxTreeNode > ret = new Menge < 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 ;
}
2015-08-27 13:36:14 +02:00
/ * *
2016-10-07 14:12:18 +02:00
* Bytecode generieren für das resultSet
2015-08-27 13:36:14 +02:00
* @return
* /
2015-11-06 16:42:22 +01:00
public Menge < ByteCodeResult > generateBytecode ( TypeinferenceResults results ) {
2015-10-22 20:40:33 +02:00
Menge < ByteCodeResult > ret = new Menge < > ( ) ;
2015-08-27 13:36:14 +02:00
for ( Class cl : this . KlassenVektor ) {
2015-11-06 16:42:22 +01:00
ret . add ( cl . genByteCode ( results ) ) ;
2015-08-27 13:36:14 +02:00
}
2016-10-28 18:31:42 +02:00
//Alle FunN Klassen erzeugen:
for ( ClassAssumption funNAss : MyCompiler . makeFunNAssumptions ( ) . getClassAssumptions ( ) ) {
ret . add ( funNAss . getAssumedClass ( ) . genByteCode ( results ) ) ;
}
2016-10-07 14:12:18 +02:00
/ *
//Add all FunN Interfaces
for ( Pair ucons : results . getUnifiedConstraints ( ) ) {
for ( Type t : ucons . getTypes ( ) ) {
List < Class > xClasses = t . isClassFromJavaX ( ) ;
for ( Class xClass : xClasses ) {
ByteCodeResult bC = xClass . genByteCode ( results ) ;
if ( ! ret . contains ( bC ) ) ret . add ( bC ) ;
}
}
}
* /
2015-08-27 13:36:14 +02:00
return ret ;
}
2013-10-18 13:33:46 +02:00
}
// ino.end