move defaultconstructor injection to the beginning befor typechecking the classes
This commit is contained in:
parent
9657731a93
commit
c7e72dbde3
@ -5,19 +5,28 @@ import Ast
|
|||||||
|
|
||||||
|
|
||||||
typeCheckCompilationUnit :: CompilationUnit -> CompilationUnit
|
typeCheckCompilationUnit :: CompilationUnit -> CompilationUnit
|
||||||
typeCheckCompilationUnit classes = map (`typeCheckClass` classes) classes
|
typeCheckCompilationUnit classes =
|
||||||
|
let
|
||||||
|
-- Helper function to add a default constructor if none are present
|
||||||
|
ensureDefaultConstructor :: Class -> Class
|
||||||
|
ensureDefaultConstructor (Class className constructors methods fields) =
|
||||||
|
let
|
||||||
|
defaultConstructor = ConstructorDeclaration className [] (Block [])
|
||||||
|
constructorsWithDefault = if null constructors then [defaultConstructor] else constructors
|
||||||
|
in Class className constructorsWithDefault methods fields
|
||||||
|
|
||||||
|
-- Inject default constructors into all classes
|
||||||
|
classesWithDefaultConstructors = map ensureDefaultConstructor classes
|
||||||
|
|
||||||
|
in map (`typeCheckClass` classesWithDefaultConstructors) classesWithDefaultConstructors
|
||||||
|
|
||||||
typeCheckClass :: Class -> [Class] -> Class
|
typeCheckClass :: Class -> [Class] -> Class
|
||||||
typeCheckClass (Class className constructors methods fields) classes =
|
typeCheckClass (Class className constructors methods fields) classes =
|
||||||
let
|
let
|
||||||
-- Add a default constructor if none are present
|
|
||||||
defaultConstructor = ConstructorDeclaration className [] (Block [])
|
|
||||||
constructorsWithDefault = if null constructors then [defaultConstructor] else constructors
|
|
||||||
|
|
||||||
-- Fields and methods dont need to be added to the symtab because they are looked upon automatically under "this"
|
-- Fields and methods dont need to be added to the symtab because they are looked upon automatically under "this"
|
||||||
-- if its not a declared local variable. Also shadowing wouldnt be possible then.
|
-- if its not a declared local variable. Also shadowing wouldnt be possible then.
|
||||||
initalSymTab = [("this", className)]
|
initalSymTab = [("this", className)]
|
||||||
checkedConstructors = map (\constructor -> typeCheckConstructorDeclaration constructor initalSymTab classes) constructorsWithDefault
|
checkedConstructors = map (\constructor -> typeCheckConstructorDeclaration constructor initalSymTab classes) constructors
|
||||||
checkedMethods = map (\method -> typeCheckMethodDeclaration method initalSymTab classes) methods
|
checkedMethods = map (\method -> typeCheckMethodDeclaration method initalSymTab classes) methods
|
||||||
checkedFields = map (\field -> typeCheckVariableDeclaration field initalSymTab classes) fields
|
checkedFields = map (\field -> typeCheckVariableDeclaration field initalSymTab classes) fields
|
||||||
in Class className checkedConstructors checkedMethods checkedFields
|
in Class className checkedConstructors checkedMethods checkedFields
|
||||||
|
Loading…
Reference in New Issue
Block a user