mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-27 09:08:04 +00:00
Capture all return cases
This commit is contained in:
parent
a4c3e931a0
commit
ac23df965d
@ -1,5 +1,6 @@
|
||||
package de.maishai.typedast.typedclass;
|
||||
|
||||
import de.maishai.ast.records.IfElse;
|
||||
import de.maishai.ast.records.Method;
|
||||
import de.maishai.ast.records.Node;
|
||||
import de.maishai.ast.records.Parameter;
|
||||
@ -63,13 +64,39 @@ public class TypedMethod implements TypedNode {
|
||||
return localVariables.stream().filter(localVariable -> localVariable.getName().equals(localVarName)).findFirst().get().getType();
|
||||
}
|
||||
|
||||
private boolean hasEvenReturnsInIfElseBlocks() {
|
||||
List<TypedIfElse> typedIfElses = new ArrayList<>();
|
||||
for (var stmt : typedBlock.getStmts()) {
|
||||
if (stmt instanceof TypedIfElse ifElse) {
|
||||
for (var stmt2 : ifElse.getIfTypedBlock().getStmts()) {
|
||||
if (stmt2 instanceof TypedReturn) {
|
||||
typedIfElses.add(ifElse);
|
||||
}
|
||||
}
|
||||
for (var stmt2 : ifElse.getElseTypedBlock().getStmts()) {
|
||||
if (stmt2 instanceof TypedReturn) {
|
||||
typedIfElses.add(ifElse);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typedIfElses.size() % 2 == 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type typeCheck(TypedClass clas) {
|
||||
if(returnType != Type.VOID){
|
||||
if(typedBlock.typeCheck(clas).getKind() != returnType.getKind()){
|
||||
throw new RuntimeException("Method " + name + " must return " + returnType);
|
||||
}
|
||||
if (returnType != Type.VOID && !hasEvenReturnsInIfElseBlocks()) {
|
||||
if (typedBlock.typeCheck(clas).getKind() != returnType.getKind()) {
|
||||
if (hasEvenReturnsInIfElseBlocks()) {
|
||||
throw new RuntimeException("Method " + name + " must have even returns in if else blocks");
|
||||
} else {
|
||||
throw new RuntimeException("Method " + name + " must return " + returnType.getKind());
|
||||
}
|
||||
}
|
||||
}
|
||||
return returnType;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user