diff --git a/src/Typecheck.hs b/src/Typecheck.hs index ba49157..f7e63ae 100644 --- a/src/Typecheck.hs +++ b/src/Typecheck.hs @@ -21,7 +21,7 @@ typeCheckMethodDeclaration (MethodDeclaration retType name params body) classFie let -- Combine class fields with method parameters to form the initial symbol table for the method methodParams = [(identifier, dataType) | ParameterDeclaration dataType identifier <- params] - initialSymtab = classFields ++ methodParams + initialSymtab = ("thisMeth", retType) : classFields ++ methodParams checkedBody = typeCheckStatement body initialSymtab classes bodyType = getTypeFromStmt checkedBody -- Check if the type of the body matches the declared return type @@ -37,6 +37,7 @@ typeCheckExpression (CharacterLiteral c) _ _ = TypedExpression "char" (Character typeCheckExpression (BooleanLiteral b) _ _ = TypedExpression "boolean" (BooleanLiteral b) typeCheckExpression NullLiteral _ _ = TypedExpression "null" NullLiteral typeCheckExpression (Reference id) symtab classes = + -- TODO: maybe maje exception for "this" in first lookup? case lookup id symtab of Just t -> TypedExpression t (LocalVariable id) Nothing -> @@ -208,12 +209,16 @@ typeCheckStatement (If cond thenStmt elseStmt) symtab classes = elseStmt' = case elseStmt of Just stmt -> Just (typeCheckStatement stmt symtab classes) Nothing -> Nothing + thenType = getTypeFromStmt thenStmt' + elseType = maybe "void" getTypeFromStmt elseStmt' + ifType = if thenType /= "void" && elseType /= "void" && thenType == elseType then thenType else "void" in if getTypeFromExpr cond' == "boolean" then - TypedStatement (getTypeFromStmt thenStmt') (If cond' thenStmt' elseStmt') + TypedStatement ifType (If cond' thenStmt' elseStmt') else error "If condition must be of type boolean" + typeCheckStatement (LocalVariableDeclaration (VariableDeclaration dataType identifier maybeExpr)) symtab classes = -- Check for redefinition in the current scope if any ((== identifier) . snd) symtab