ASTFactory createClass setzt SuperType

GenericClass erhält richtigen SuperType
Tests für ? extends und ? super angelegt
This commit is contained in:
Enrico Schrödter 2015-10-30 12:29:43 +01:00
parent 64dce5d814
commit e9607e37b1
8 changed files with 126 additions and 27 deletions

View File

@ -240,7 +240,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
* @param modifiers * @param modifiers
* @param supertypeGenPara - Eine Liste von Namen, welche die Generischen Parameter der Klasse darstellen. * @param supertypeGenPara - Eine Liste von Namen, welche die Generischen Parameter der Klasse darstellen.
*/ */
public Class(String name, RefType superClass, Modifiers modifiers, public Class(String name, Type superClass, Modifiers modifiers,
Menge<String> supertypeGenPara) { Menge<String> supertypeGenPara) {
this(name,superClass,modifiers,0); this(name,superClass,modifiers,0);
if(supertypeGenPara == null)return; if(supertypeGenPara == null)return;
@ -252,7 +252,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
this.setGenericParameter(new GenericDeclarationList(gtvs,0)); this.setGenericParameter(new GenericDeclarationList(gtvs,0));
} }
public Class(String name, RefType superClass, Modifiers mod, int offset){ public Class(String name, Type superClass, Modifiers mod, int offset){
this(name,mod,offset); this(name,mod,offset);
if(superClass == null)this.superClass = new Class("java.lang.Object",-1).getType(); if(superClass == null)this.superClass = new Class("java.lang.Object",-1).getType();
else this.superClass = superClass; else this.superClass = superClass;

View File

@ -8,8 +8,11 @@ import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.misc.DeclId; 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.statement.Block; import de.dhbwstuttgart.syntaxtree.statement.Block;
import de.dhbwstuttgart.syntaxtree.statement.SuperCall; import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
import de.dhbwstuttgart.syntaxtree.type.RefType;
import de.dhbwstuttgart.syntaxtree.type.Type;
import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
@ -48,15 +51,12 @@ public class ASTFactory {
return new Constructor(method, superClass); return new Constructor(method, superClass);
} }
public static Class createClass(String className, String superClass, SourceFile parent) { public static Class createClass(String className, Type type, Modifiers modifiers, Menge<String> supertypeGenPara, SourceFile parent) {
// TODO bytecode createClass // TODO bytecode createClass
Class generatedClass = new Class(className, 0); //String name, RefType superClass, Modifiers modifiers, Menge<String> supertypeGenPara
Class generatedClass = new Class(className, type, modifiers, supertypeGenPara);
generatedClass.addField(ASTFactory.createEmptyConstructor(generatedClass)); generatedClass.addField(ASTFactory.createEmptyConstructor(generatedClass));
if(superClass != null){
generatedClass.superclassid = UsedId.createFromQualifiedName(superClass, 0);
}
generatedClass.parserPostProcessing(parent); generatedClass.parserPostProcessing(parent);
return generatedClass; return generatedClass;

View File

@ -0,0 +1,23 @@
package de.dhbwstuttgart.syntaxtree.type;
import de.dhbwstuttgart.bytecode.ClassGenerator;
import de.dhbwstuttgart.parser.JavaClassName;
import de.dhbwstuttgart.syntaxtree.Class;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
public class GenericClassType extends RefType{
public GenericClassType(String fullyQualifiedName, Menge parameter, SyntaxTreeNode parent, int offset) {
super(fullyQualifiedName, parameter, parent, offset);
}
@Override
public String getBytecodeSignature(ClassGenerator cg) {
return "L"+getTypeName()+";";
}
}

View File

@ -833,27 +833,10 @@ public class RefType extends ObjectType implements IMatchable
@Override @Override
public String getBytecodeSignature(ClassGenerator cg) { public String getBytecodeSignature(ClassGenerator cg) {
/*
String paramString = "";
if(this.parameter != null && this.parameter.size()>0){
paramString+="<";
Iterator<Type> it = this.parameter.iterator();
while(it.hasNext()){
Type param = it.next();
paramString+=param.getBytecodeSignature(cg);
}
paramString+=">";
}
String typeSignature = this.getBytecodeType(cg).getSignature();
typeSignature = typeSignature.substring(0, typeSignature.length()-1);
return typeSignature+paramString+";";
*/
//TODO: bytecode woher bekommt ich die parent klasse //TODO: bytecode woher bekommt ich die parent klasse
String combinedType = getCombinedType(cg); String combinedType = getCombinedType(cg);
if(!combinedType.equals(getName().toString())){ if(!combinedType.equals(getName().toString())){
// TODO bytecode statt getParentClass die eigene Class?!?! Class generatedClass = ASTFactory.createClass(getCombinedType(cg), getGenericClassType(), null, null, new SourceFile());
Class generatedClass = ASTFactory.createClass(getCombinedType(cg), getName().toString(), new SourceFile());
cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResultSet(generatedClass, new Menge<>(), new ResultSet())).getByteCode()); cg.addExtraClass(generatedClass.genByteCode(new TypeinferenceResultSet(generatedClass, new Menge<>(), new ResultSet())).getByteCode());
} }
@ -874,7 +857,7 @@ public class RefType extends ObjectType implements IMatchable
}else if(type instanceof TypePlaceholder){ }else if(type instanceof TypePlaceholder){
sb.append(((TypePlaceholder) type).getBytecodeType(cg).toString().replace(".", "%")); sb.append(((TypePlaceholder) type).getBytecodeType(cg).toString().replace(".", "%"));
}else{ }else{
sb.append(((TypePlaceholder) type).getBytecodeType(cg).toString().replace(".", "%")); sb.append(type.getBytecodeType(cg).toString().replace(".", "%"));
} }
sb.append("%"); sb.append("%");
@ -886,6 +869,10 @@ public class RefType extends ObjectType implements IMatchable
return sb.toString(); return sb.toString();
} }
public GenericClassType getGenericClassType(){
return new GenericClassType(getName().toString(), getParaList(), parent, getOffset());
}
} }
// ino.end // ino.end

View File

@ -0,0 +1,13 @@
import java.util.Vector;
class SuperType{
Vector<Integer> integerVector;
void method() {
method(integerVector);
}
void method(Vector<? extends Number> v) {
}
}

View File

@ -0,0 +1,31 @@
package bytecode.types;
import static org.junit.Assert.*;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Vector;
import org.junit.Test;
import bytecode.BytecodeTest;
public class ExtendsType extends BytecodeTest{
@Override
protected void init() {
testName = "SuperType";
rootDirectory = System.getProperty("user.dir")+"/test/bytecode/types/";
}
@Test
public void testConstruct() throws Exception{
ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
assertTrue(true);
}
}

View File

@ -0,0 +1,13 @@
import java.util.Vector;
class SuperType{
Vector<Number> numberVector;
void method() {
method(numberVector);
}
void method(Vector<? super Integer> v) {
}
}

View File

@ -0,0 +1,32 @@
package bytecode.types;
import static org.junit.Assert.*;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Vector;
import org.junit.Test;
import bytecode.BytecodeTest;
public class SuperType extends BytecodeTest{
@Override
protected void init() {
testName = "ExtendsType";
rootDirectory = System.getProperty("user.dir")+"/test/bytecode/types/";
}
@Test
public void testConstruct() throws Exception{
ClassLoader classLoader = getClassLoader();
Class cls = classLoader.loadClass(testName);
Object obj = cls.newInstance();
assertTrue(true);
}
}