mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-28 16:48:03 +00:00
done TODOs for TypedReturn but not all
This commit is contained in:
parent
875d0adac4
commit
c7d756b083
@ -40,12 +40,7 @@ public class TypedExpressionUtil {
|
||||
return typedMethodCall;
|
||||
}
|
||||
else if (expression instanceof New newStmt) {
|
||||
TypedNew typedNew = new TypedNew();
|
||||
typedNew.setType(newStmt.type());
|
||||
for (var arg : newStmt.args()) {
|
||||
typedNew.getArgs().add(getKindOfExpression(localVar, clas, arg));
|
||||
}
|
||||
return typedNew;
|
||||
return new TypedNew(localVar, clas, newStmt);
|
||||
}
|
||||
else if (expression instanceof Unary unary) {
|
||||
TypedUnary typedUnary = new TypedUnary();
|
||||
|
@ -25,6 +25,10 @@ public class TypedBlock implements TypedNode {
|
||||
|
||||
public void blockToTypedBlock(Map<String, Type> localVar, TypedClass clas, Block unTypedBlock) {
|
||||
|
||||
if(unTypedBlock == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Declaration var : unTypedBlock.localVariables()) {
|
||||
TypedLocalVariable typedVar = new TypedLocalVariable(localVar, clas, var);
|
||||
vars.add(typedVar);
|
||||
@ -68,8 +72,9 @@ public class TypedBlock implements TypedNode {
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof New newStmt) {
|
||||
TypedNew typedNew = new TypedNew();
|
||||
//TODO: implement this
|
||||
TypedNew typedNew = new TypedNew(localVar, clas, newStmt);
|
||||
typedNew.typeCheck(localVar, clas);
|
||||
stmts.add(typedNew);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -37,16 +37,16 @@ public class TypedClass implements TypedNode {
|
||||
typedFields.add(new TypedField(localVar, this, field));
|
||||
}
|
||||
|
||||
for (Constructor constructor : c.constructors()) {
|
||||
typedConstructors.add(new TypedConstructor(localVar, this, constructor));
|
||||
typedConstructors.get(typedConstructors.size() - 1).convertToBlock(localVar, this, constructor);
|
||||
}
|
||||
|
||||
for (Method method : c.methods()) {
|
||||
typedMethods.add(new TypedMethod(localVar, this, method));
|
||||
typedMethods.get(typedMethods.size() - 1).convertToTypedBlock(localVar, this, method);
|
||||
}
|
||||
|
||||
|
||||
for (Constructor constructor : c.constructors()) {
|
||||
typedConstructors.add(new TypedConstructor(localVar, this, constructor));
|
||||
typedConstructors.get(typedConstructors.size() - 1).convertToBlock(localVar, this, constructor);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -33,14 +33,28 @@ public class TypedMethod implements TypedNode {
|
||||
for (Parameter parameter : unTypedMethod.params()) {
|
||||
typedParameters.add(new TypedParameter(localVar, clas, parameter));
|
||||
}
|
||||
typedBlock = new TypedBlock(localVar, clas, unTypedMethod.block());
|
||||
for (var method : clas.getTypedMethods()) {
|
||||
if (method.getName().equals(name) && method.getTypedParameters().size() == typedParameters.size()
|
||||
&& method.getReturnType().equals(returnType)) {
|
||||
|
||||
for (int i = 0; i < method.getTypedParameters().size(); i++){
|
||||
if(method.getTypedParameters().get(i).getType().equals(typedParameters.get(i).getType())){
|
||||
throw new RuntimeException("Method " + name + " already exists");
|
||||
}
|
||||
}
|
||||
|
||||
if (method.getTypedParameters().isEmpty() && typedParameters.isEmpty()) {
|
||||
throw new RuntimeException("Method " + name + " already exists");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void convertToTypedBlock(Map<String, Type> localVar, TypedClass clas, Method unTypedMethod) {
|
||||
typedBlock = new TypedBlock(localVar, clas, unTypedMethod.block());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Type typeCheck(Map<String, Type> localVar, TypedClass clas) {
|
||||
if (localVar.containsKey(name)) {
|
||||
|
@ -1,39 +1,55 @@
|
||||
package de.maishai.typedast.typedclass;
|
||||
|
||||
import de.maishai.ast.records.Expression;
|
||||
import de.maishai.ast.records.New;
|
||||
import de.maishai.ast.records.Node;
|
||||
import de.maishai.ast.records.Parameter;
|
||||
import de.maishai.typedast.*;
|
||||
import lombok.Data;
|
||||
import org.objectweb.asm.MethodVisitor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static de.maishai.typedast.Util.TypedExpressionUtil.getKindOfExpression;
|
||||
|
||||
@Data
|
||||
public class TypedNew implements TypedExpression, TypedStatement {
|
||||
private Type type;
|
||||
private List<TypedExpression> args;
|
||||
private List<TypedExpression> args = new ArrayList<>();
|
||||
|
||||
public TypedNew convertToTypedNew(New unTypedNew) {
|
||||
//TODO: Implement this
|
||||
return null;
|
||||
public TypedNew(Map<String, Type> localVar, TypedClass clas, New unTypedNew) {
|
||||
convertToTypedNew(localVar, clas, unTypedNew);
|
||||
}
|
||||
public void convertToTypedNew(Map<String, Type> localVar, TypedClass clas, New unTypedNew) {
|
||||
type = unTypedNew.type();
|
||||
for (Expression arg : unTypedNew.args()) {
|
||||
args.add(getKindOfExpression(localVar, clas, arg));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type typeCheck(Map<String, Type> localVar, TypedClass clas) {
|
||||
if(clas == null){
|
||||
throw new RuntimeException("Class not found");
|
||||
}
|
||||
|
||||
if (clas.getTypedFields().size() != args.size()) {
|
||||
throw new RuntimeException("number of arguments is invalid for class" + this.type.getReference());
|
||||
}
|
||||
for (int i = 0; i < args.size(); i++) {
|
||||
Type type = args.get(i).typeCheck(localVar, clas);
|
||||
if (!type.equals(clas.getTypedFields().get(i).getType())) {
|
||||
throw new RuntimeException("False type for argument " + i + " in class " + type.getKind());
|
||||
for(var constructor : clas.getTypedConstructors()){
|
||||
if(constructor.getTypedParameters().size() == args.size()){
|
||||
boolean valid = true;
|
||||
for(int i = 0; i < args.size(); i++){
|
||||
if(!constructor.getTypedParameters().get(i).getType().equals(args.get(i).typeCheck(localVar, clas))){
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(valid){
|
||||
return Type.REFERENCE(clas.getClassName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return Type.VOID;
|
||||
throw new RuntimeException("No matching constructor found");
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,10 +28,10 @@ public class TypedReturn implements TypedStatement {
|
||||
|
||||
@Override
|
||||
public Type typeCheck(Map<String, Type> localVar, TypedClass clas) {
|
||||
|
||||
//TODO: not localvar
|
||||
for(var typedMethod : clas.getTypedMethods()) {
|
||||
if(!localVar.containsKey(typedMethod.getName())) {
|
||||
if(typedMethod.getReturnType() != this.type) {
|
||||
if(localVar.containsKey(typedMethod.getName())) {
|
||||
if(typedMethod.getReturnType().getKind() != this.type.getKind()) {
|
||||
//TODO: exception auslagern
|
||||
StringBuilder exp = new StringBuilder();
|
||||
exp.append("\nMismatched return type: ");
|
||||
@ -42,7 +42,6 @@ public class TypedReturn implements TypedStatement {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user