forked from JavaTX/JavaCompilerCore
Beginn der Generierung der GenericKlasse, Problem ist der Konstruktor, dieser wird auf Objekt aufgerufen und nicht auf der SUperklasse
This commit is contained in:
parent
6a8590ab0d
commit
50dda3041f
@ -24,6 +24,7 @@ import de.dhbwstuttgart.bytecode.DHBWInstructionFactory;
|
|||||||
import de.dhbwstuttgart.core.AClassOrInterface;
|
import de.dhbwstuttgart.core.AClassOrInterface;
|
||||||
import de.dhbwstuttgart.core.IItemWithOffset;
|
import de.dhbwstuttgart.core.IItemWithOffset;
|
||||||
import de.dhbwstuttgart.parser.JavaClassName;
|
import de.dhbwstuttgart.parser.JavaClassName;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
|
||||||
import de.dhbwstuttgart.syntaxtree.misc.UsedId;
|
import de.dhbwstuttgart.syntaxtree.misc.UsedId;
|
||||||
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers;
|
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
||||||
@ -1035,11 +1036,65 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
|
|||||||
Collection<ByteCodeResult> results = new Menge<>();
|
Collection<ByteCodeResult> results = new Menge<>();
|
||||||
|
|
||||||
//Super Klasse
|
//Super Klasse
|
||||||
String name = "java/util/Vectorjava/lang/String"; //getParentClass().getType().getBytecodeSignature(_cg);
|
String name = getType().getCombinedType(_cg);
|
||||||
|
|
||||||
Type superClass = new Class("java/util/Vector",-1).getType();
|
Class superClass = new Class("java/util/Vector",-1);
|
||||||
|
Type superClassType = superClass.getType();
|
||||||
|
|
||||||
_cg = new ClassGenerator(name, superClass, name + ".java", Constants.ACC_PUBLIC , new String[] { }, new TypeinferenceResultSet(null, null, null));
|
//_cg = new ClassGenerator(name, superClassType, name + ".java", Constants.ACC_PUBLIC , new String[] { }, new TypeinferenceResultSet(null, null, null));
|
||||||
|
|
||||||
|
Class generatedClass = new Class(name, 0);
|
||||||
|
|
||||||
|
Block konstruktorBlock = new Block();
|
||||||
|
konstruktorBlock.statements.add(new SuperCall(konstruktorBlock));
|
||||||
|
Constructor standardKonstruktor = new Constructor(Method.createEmptyMethod(konstruktorBlock, name, superClass), superClass);
|
||||||
|
|
||||||
|
generatedClass.addField(standardKonstruktor);
|
||||||
|
|
||||||
|
results.addAll(generatedClass.genByteCode(new TypeinferenceResultSet(generatedClass, new Menge<>(), new ResultSet())));
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//Die Felder in Methoden Felder und Konstruktoren aufteilen:
|
||||||
|
Menge<FieldDeclaration> fieldDeclarations = new Menge<>();
|
||||||
|
Menge<Constructor> constructors = new Menge<>();
|
||||||
|
|
||||||
|
Block konstruktorBlock = new Block();
|
||||||
|
konstruktorBlock.statements.add(new SuperCall(konstruktorBlock));
|
||||||
|
|
||||||
|
Method constructorMethod = Method.createEmptyMethod(konstruktorBlock, name, superClass);
|
||||||
|
|
||||||
|
constructorMethod.parameterlist = new ParameterList();
|
||||||
|
Constructor constructor = new Constructor(constructorMethod, superClass);
|
||||||
|
constructor.parserPostProcessing(superClass);
|
||||||
|
|
||||||
|
constructors.add(constructor);
|
||||||
|
|
||||||
|
InstructionList fieldInitializations = new InstructionList();
|
||||||
|
for(FieldDeclaration f : fieldDeclarations){
|
||||||
|
fieldInitializations.append(f.genByteCode(_cg));
|
||||||
|
}
|
||||||
|
//Die Konstruktoren müssen die Feld initialisierungswerte beinhalten:
|
||||||
|
for(Constructor c : constructors){
|
||||||
|
c.genByteCode(_cg, fieldInitializations);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Block konstruktorBlock = new Block();
|
||||||
|
konstruktorBlock.statements.add(new SuperCall(konstruktorBlock));
|
||||||
|
Constructor standardKonstruktor = new Constructor(Method.createEmptyMethod(konstruktorBlock,name, superClass), superClass);
|
||||||
|
|
||||||
|
Menge<Constructor> constructors = new Menge<>();
|
||||||
|
constructors.add(standardKonstruktor);
|
||||||
|
|
||||||
|
//Die Konstruktoren müssen die Feld initialisierungswerte beinhalten:
|
||||||
|
for(Constructor c : constructors){
|
||||||
|
c.genByteCode(_cg, new InstructionList());
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
ByteCodeResult code = new ByteCodeResult(_cg);
|
ByteCodeResult code = new ByteCodeResult(_cg);
|
||||||
|
|
||||||
|
@ -814,7 +814,7 @@ public class RefType extends ObjectType implements IMatchable
|
|||||||
}
|
}
|
||||||
|
|
||||||
public org.apache.commons.bcel6.generic.Type getBytecodeType(ClassGenerator cg) {
|
public org.apache.commons.bcel6.generic.Type getBytecodeType(ClassGenerator cg) {
|
||||||
return new org.apache.commons.bcel6.generic.ObjectType(this.get_Name());
|
return new org.apache.commons.bcel6.generic.ObjectType(getCombinedType(cg));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -852,6 +852,23 @@ public class RefType extends ObjectType implements IMatchable
|
|||||||
return typeSignature+paramString+";";
|
return typeSignature+paramString+";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCombinedType(ClassGenerator cg){
|
||||||
|
//Bsp.: Ljava/util/Vector<Ljava/lang/String;>;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
sb.append(this.get_Name().replace(".", "%"));
|
||||||
|
|
||||||
|
if(parameter != null){
|
||||||
|
sb.append("%%");
|
||||||
|
for(Type type: parameter){
|
||||||
|
sb.append(((RefType) type).getCombinedType(cg));
|
||||||
|
sb.append("%");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// ino.end
|
// ino.end
|
||||||
|
|
||||||
|
@ -32,17 +32,12 @@ public class ExtendsVectorStringTest extends BytecodeTest{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConstruct(){
|
public void testConstruct() throws Exception{
|
||||||
try{
|
Class cls = getClassToTest();
|
||||||
Class cls = getClassToTest();
|
|
||||||
|
Constructor method = cls.getConstructor(new Class[]{});
|
||||||
Constructor method = cls.getConstructor(new Class[]{});
|
method.newInstance();
|
||||||
method.newInstance();
|
assertTrue(true);
|
||||||
assertTrue(true);
|
|
||||||
}catch(Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
fail();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user