diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedBlock.java b/src/main/java/de/maishai/typedast/typedclass/TypedBlock.java index 7b58117..52cac9e 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedBlock.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedBlock.java @@ -18,11 +18,12 @@ import java.util.List; public class TypedBlock implements TypedNode { private List vars = new ArrayList<>(); private List stmts = new ArrayList<>(); - private Type type; + private Type type = Type.VOID; public TypedBlock(TypedProgram typedProgram, Block unTypedBlock) { convertToTypedBlock(typedProgram, unTypedBlock); + clearLocalVariable(typedProgram); } public TypedBlock(List vars, List stmts) { @@ -89,24 +90,26 @@ public class TypedBlock implements TypedNode { stmts.add(typedPrint); } } - this.typeCheck(typedProgram); } @Override public Type typeCheck(TypedProgram typedProgram) { - Type chekType = null; - for (TypedStatement stmt : stmts) { - stmt.typeCheck(typedProgram); - if (stmt instanceof TypedReturn returnStmt) { - chekType = returnStmt.getType(); + return type; + } + + private void clearLocalVariable(TypedProgram typedProgram){ + for(var typedLocalVariable : vars){ + if (typedProgram.getCurrentClass().isCurrentMethodPresent() && !typedProgram.getCurrentClass().isCurrentConstructorPresent()) { + if (typedProgram.getCurrentClass().getCurrentMethod().isLocalVariableInMethod(typedLocalVariable.getName())) { + typedProgram.getCurrentClass().getCurrentMethod().deleteLocalVariableInMethod(typedLocalVariable.getName()); + } + } + if (!typedProgram.getCurrentClass().isCurrentMethodPresent() && typedProgram.getCurrentClass().isCurrentConstructorPresent()) { + if (typedProgram.getCurrentClass().getCurrentConstructor().isLocalVariableInConstructor(typedLocalVariable.getName())) { + typedProgram.getCurrentClass().getCurrentConstructor().deleteLocalVariableInConstructor(typedLocalVariable.getName()); + } } } - - if (chekType == null) { - chekType = Type.VOID; - } - type = chekType; - return type; } public void codeGen(MethodContext ctx) { diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedConstructor.java b/src/main/java/de/maishai/typedast/typedclass/TypedConstructor.java index 9fa5953..873866d 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedConstructor.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedConstructor.java @@ -71,6 +71,9 @@ public class TypedConstructor implements TypedNode { this.typedBlock = new TypedBlock(typedProgram, unTypedConstructor.block()); typeCheck(typedProgram); } + public void deleteLocalVariableInConstructor(String localVarName){ + localVariables.removeIf(localVariable -> localVariable.getName().equals(localVarName)); + } @Override public Type typeCheck(TypedProgram typedProgram) { diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedMethod.java b/src/main/java/de/maishai/typedast/typedclass/TypedMethod.java index 97e787f..3acbf7f 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedMethod.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedMethod.java @@ -66,6 +66,9 @@ public class TypedMethod implements TypedNode { return isLocalVariablePresent(localVarName) || isParameterPresent(localVarName); } + public void deleteLocalVariableInMethod(String localVarName){ + localVariables.removeIf(localVariable -> localVariable.getName().equals(localVarName)); + } public Type getLocalVariableType(String localVarName) { return localVariables.stream().filter(localVariable -> localVariable.getName().equals(localVarName)).findFirst().get().getType(); }