Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
afd2319d78
@ -41,7 +41,9 @@ public class MethodDecl implements Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TypeCheckResult result = new TypeCheckResult();
|
TypeCheckResult result = new TypeCheckResult();
|
||||||
codeBlock.typeCheck(methodContext, typeContext, localVars);
|
String CodeBlockType = codeBlock.typeCheck(methodContext, typeContext, localVars).type;
|
||||||
|
if(!Objects.equals(this.returnType, CodeBlockType))
|
||||||
|
throw new Exception("TypeCheck Exception: Method retruns wrong type");
|
||||||
result.type = codeBlock.returnType;
|
result.type = codeBlock.returnType;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -51,11 +51,12 @@ public class BlockStatement extends AbstractType implements IStatement {
|
|||||||
String firstType = substrings[0];
|
String firstType = substrings[0];
|
||||||
String secondType = substrings[1];
|
String secondType = substrings[1];
|
||||||
|
|
||||||
|
|
||||||
if (!firstType.equals(this.returnType) || !firstType.equals(this.returnType)) {
|
if (!firstType.equals(this.returnType) || !firstType.equals(this.returnType)) {
|
||||||
if (!firstType.equals("void")) {
|
if (!firstType.equals("void") && this.returnType != null) {
|
||||||
throw new Exception("TypeCheck Exception: if paths return wrong type");
|
throw new Exception("TypeCheck Exception: if paths return wrong type");
|
||||||
}
|
}
|
||||||
if (!secondType.equals("void")) {
|
if (!secondType.equals("void") && this.returnType != null) {
|
||||||
throw new Exception("TypeCheck Exception: else paths return wrong type");
|
throw new Exception("TypeCheck Exception: else paths return wrong type");
|
||||||
}
|
}
|
||||||
boolean firstIsVoid = firstType.equals("void");
|
boolean firstIsVoid = firstType.equals("void");
|
||||||
@ -73,7 +74,7 @@ public class BlockStatement extends AbstractType implements IStatement {
|
|||||||
continue;
|
continue;
|
||||||
// set return of block if not known yet
|
// set return of block if not known yet
|
||||||
|
|
||||||
if(this.returnType.equals("not"))
|
if(this.returnType == null)
|
||||||
this.returnType = typeOfCurrentStatement.type;
|
this.returnType = typeOfCurrentStatement.type;
|
||||||
|
|
||||||
if (!typeOfCurrentStatement.type.equals(this.returnType))
|
if (!typeOfCurrentStatement.type.equals(this.returnType))
|
||||||
@ -82,6 +83,7 @@ public class BlockStatement extends AbstractType implements IStatement {
|
|||||||
result.type = this.returnType;
|
result.type = this.returnType;
|
||||||
// todo check if the block returns the needed return type in every case
|
// todo check if the block returns the needed return type in every case
|
||||||
// todo ignore unreachable statements?
|
// todo ignore unreachable statements?
|
||||||
|
setTypeCheckResult(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,21 +29,18 @@ public class IfElseStatement extends AbstractType implements IStatement{
|
|||||||
|
|
||||||
TypeCheckResult conditionType = condition.typeCheck(methodContext, typeContext, localVars);
|
TypeCheckResult conditionType = condition.typeCheck(methodContext, typeContext, localVars);
|
||||||
|
|
||||||
if (!conditionType.equals("bool")) {
|
if (!conditionType.type.equals("bool")) {
|
||||||
throw new IllegalArgumentException("should be boolean");
|
throw new IllegalArgumentException("should be boolean");
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeCheckResult ifStatementType = ifStatement.typeCheck(methodContext, typeContext, localVars);
|
TypeCheckResult ifStatementType = ifStatement.typeCheck(methodContext, typeContext, localVars);
|
||||||
TypeCheckResult elseStatementType = elseStatement.typeCheck(methodContext, typeContext, localVars);
|
TypeCheckResult elseStatementType = elseStatement.typeCheck(methodContext, typeContext, localVars);
|
||||||
|
|
||||||
if (!ifStatementType.equals(elseStatementType)) {
|
if (!ifStatementType.type.equals(elseStatementType.type)) {
|
||||||
throw new IllegalArgumentException("if and else have different types");
|
if(ifStatementType.type != "void" && elseStatementType.type != "void")
|
||||||
}
|
throw new IllegalArgumentException("TypeCeck Exception: if and else have different types");
|
||||||
if(ifStatementType.type != "void" && elseStatementType.type != "void"){
|
|
||||||
if(Objects.equals(ifStatementType.type, elseStatementType.type)){
|
|
||||||
throw new Exception("TypeCeck Exception: If and else return different not-void types");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result.type = ifStatementType.type + "," + elseStatementType.type;
|
result.type = ifStatementType.type + "," + elseStatementType.type;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ public class ReturnStatement extends AbstractType implements IStatement{
|
|||||||
expression.codeGen(mv, localVars, typeContext);
|
expression.codeGen(mv, localVars, typeContext);
|
||||||
//Get the Type of the expression
|
//Get the Type of the expression
|
||||||
//TODO: Resolve how do we get the type of the expression
|
//TODO: Resolve how do we get the type of the expression
|
||||||
String type = expression.typeCheck(null, null, null).type;
|
String type = expression.getTypeCheckResult().type;
|
||||||
|
|
||||||
if (type.equals("int") || type.equals("bool") || type.equals("char")) {
|
if (type.equals("int") || type.equals("bool") || type.equals("char")) {
|
||||||
mv.visitInsn(Opcodes.IRETURN);
|
mv.visitInsn(Opcodes.IRETURN);
|
||||||
|
Loading…
Reference in New Issue
Block a user