aboutsummaryrefslogtreecommitdiff
path: root/frontend/checksupport.icl
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/checksupport.icl')
-rw-r--r--frontend/checksupport.icl93
1 files changed, 49 insertions, 44 deletions
diff --git a/frontend/checksupport.icl b/frontend/checksupport.icl
index 6a388f7..17fc7bc 100644
--- a/frontend/checksupport.icl
+++ b/frontend/checksupport.icl
@@ -217,66 +217,65 @@ addDefToSymbolTable level def_index def_ident=:{id_info} def_kind symbol_table e
= (symbol_table <:= (id_info,entry), error)
= (symbol_table, checkError def_ident "already defined" error)
-addDeclarationsOfDclModToSymbolTable :: .Int !{!Declaration} !{!Declaration} !*CheckState -> .CheckState;
-addDeclarationsOfDclModToSymbolTable ste_index locals imported cs
- # cs=add_imports_in_array_to_symbol_table 0 imported cs
- = addLocalSymbolsForImportToSymbolTable 0 locals ste_index cs
+addDeclarationsOfDclModToSymbolTable :: Int !{!Declaration} !{!Declaration} !*{#DclModule} !*CheckState -> (!*{#DclModule},!*CheckState)
+addDeclarationsOfDclModToSymbolTable ste_index locals imported dcl_modules cs
+ # (dcl_modules,cs) = add_imports_in_array_to_symbol_table 0 imported dcl_modules cs
+ = addLocalSymbolsForImportToSymbolTable 0 locals ste_index dcl_modules cs
where
- add_imports_in_array_to_symbol_table symbol_index symbols cs=:{cs_x}
+ add_imports_in_array_to_symbol_table :: !Int !{!Declaration} !*{#DclModule} !*CheckState -> (!*{#DclModule},!*CheckState)
+ add_imports_in_array_to_symbol_table symbol_index symbols dcl_modules cs=:{cs_x}
| symbol_index<size symbols
#! (Declaration {decl_ident,decl_pos,decl_kind},symbols) = symbols![symbol_index]
= case decl_kind of
STE_Imported def_kind def_mod
#! declaration = symbols.[symbol_index]
# (Declaration {decl_index}) = declaration
- # (_, cs)
- = addSymbol No decl_ident decl_pos decl_kind
- def_kind decl_index def_mod cUndef cs
- -> add_imports_in_array_to_symbol_table (symbol_index+1) symbols cs
+ # (_,dcl_modules,cs) = addSymbol No decl_ident decl_pos decl_kind def_kind decl_index def_mod cUndef dcl_modules cs
+ -> add_imports_in_array_to_symbol_table (symbol_index+1) symbols dcl_modules cs
STE_FunctionOrMacro _
#! declaration = symbols.[symbol_index]
# (Declaration {decl_index}) = declaration
- # (_, cs)
- = addImportedFunctionOrMacro No decl_ident decl_index cs
- -> add_imports_in_array_to_symbol_table (symbol_index+1) symbols cs
- = cs
+ # (_,dcl_modules,cs) = addImportedFunctionOrMacro No decl_ident decl_index dcl_modules cs
+ -> add_imports_in_array_to_symbol_table (symbol_index+1) symbols dcl_modules cs
+ = (dcl_modules,cs)
- addLocalSymbolsForImportToSymbolTable :: !Int !{!Declaration} Int !*CheckState -> .CheckState;
- addLocalSymbolsForImportToSymbolTable symbol_index symbols mod_index cs
+ addLocalSymbolsForImportToSymbolTable :: !Int !{!Declaration} Int !*{#DclModule} !*CheckState -> (!*{#DclModule},!*CheckState)
+ addLocalSymbolsForImportToSymbolTable symbol_index symbols mod_index dcl_modules cs
| symbol_index<size symbols
# (Declaration {decl_ident,decl_pos,decl_kind,decl_index},symbols) = symbols![symbol_index]
= case decl_kind of
STE_FunctionOrMacro _
- # (_, cs)
- = addImportedFunctionOrMacro No decl_ident decl_index cs
- -> addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index cs
+ # (_,dcl_modules,cs) = addImportedFunctionOrMacro No decl_ident decl_index dcl_modules cs
+ -> addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index dcl_modules cs
STE_Imported def_kind def_mod
- # (_, cs)
- = addSymbol No decl_ident decl_pos decl_kind
- def_kind decl_index mod_index cUndef cs
- -> addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index cs
- = cs
-
-addImportedFunctionOrMacro :: !(Optional IndexRange) !Ident !Int !*CheckState -> (!Bool, !.CheckState)
-addImportedFunctionOrMacro opt_dcl_macro_range ident=:{id_info} def_index cs=:{cs_symbol_table}
+ # (_,dcl_modules,cs) = addSymbol No decl_ident decl_pos decl_kind def_kind decl_index mod_index cUndef dcl_modules cs
+ -> addLocalSymbolsForImportToSymbolTable (symbol_index+1) symbols mod_index dcl_modules cs
+ = (dcl_modules,cs)
+
+addImportedFunctionOrMacro :: !(Optional IndexRange) !Ident !Int !*{#DclModule} !*CheckState -> (!Bool,!*{#DclModule},!.CheckState)
+addImportedFunctionOrMacro opt_dcl_macro_range ident=:{id_info} def_index dcl_modules cs=:{cs_symbol_table}
# (entry, cs_symbol_table) = readPtr id_info cs_symbol_table
cs = { cs & cs_symbol_table = cs_symbol_table }
= case entry.ste_kind of
STE_Empty
- -> (True, { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_FunctionOrMacro [])
+ -> (True, dcl_modules, { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_FunctionOrMacro [])
def_index cModuleScope entry})
STE_FunctionOrMacro _
| entry.ste_index == def_index || within_opt_range opt_dcl_macro_range def_index
- -> (False, cs)
+ -> (False, dcl_modules, cs)
+ STE_Imported _ module_n
+ | module_n>=0 && module_n<size dcl_modules
+ # (dcl_name,dcl_modules) = dcl_modules![module_n].dcl_name
+ cs & cs_error = checkError ident ("multiply defined (also defined in module "+++toString dcl_name+++")") cs.cs_error
+ -> (False, dcl_modules, cs)
_
- -> (False, { cs & cs_error = checkError ident "multiply defined" cs.cs_error})
+ -> (False, dcl_modules, { cs & cs_error = checkError ident "multiply defined" cs.cs_error})
where
within_opt_range (Yes {ir_from, ir_to}) i
= ir_from<=i && i<ir_to
within_opt_range No _
= False
-
addFieldToSelectorDefinition :: !Ident (Global .Int) !*CheckState -> .CheckState;
addFieldToSelectorDefinition {id_info} glob_field_index cs=:{cs_symbol_table}
# (entry, cs_symbol_table) = readPtr id_info cs_symbol_table
@@ -287,32 +286,38 @@ addFieldToSelectorDefinition {id_info} glob_field_index cs=:{cs_symbol_table}
_
-> { cs & cs_symbol_table = NewEntry cs.cs_symbol_table id_info (STE_Selector [glob_field_index]) NoIndex cModuleScope entry }
-addSymbol :: !(Optional a) !Ident !Position !STE_Kind !STE_Kind !.Int !.Int !Int !*CheckState -> (!Bool, !.CheckState)
-addSymbol yes_for_icl_module ident pos decl_kind def_kind def_index def_mod importing_mod cs=:{cs_symbol_table}
+addSymbol :: !(Optional a) !Ident !Position !STE_Kind !STE_Kind !.Int !.Int !Int !*{#DclModule} !*CheckState -> (!Bool,!*{#DclModule},!*CheckState)
+addSymbol yes_for_icl_module ident pos decl_kind def_kind def_index def_mod importing_mod dcl_modules cs=:{cs_symbol_table}
# (entry, cs_symbol_table) = readPtr ident.id_info cs_symbol_table
= add_indirectly_imported_symbol yes_for_icl_module entry ident pos def_kind def_index def_mod
- importing_mod { cs & cs_symbol_table = cs_symbol_table }
+ importing_mod dcl_modules {cs & cs_symbol_table = cs_symbol_table}
where
- add_indirectly_imported_symbol _ {ste_kind = STE_Empty} {id_info} _ def_kind def_index def_mod _ cs=:{cs_symbol_table}
+ add_indirectly_imported_symbol _ {ste_kind = STE_Empty} {id_info} _ def_kind def_index def_mod _ dcl_modules cs=:{cs_symbol_table}
# (entry, cs_symbol_table) = readPtr id_info cs_symbol_table
cs = { cs & cs_symbol_table = NewEntry cs_symbol_table id_info decl_kind def_index cModuleScope entry}
= case def_kind of
STE_Field selector_id
- -> (True, addFieldToSelectorDefinition selector_id { glob_module = def_mod, glob_object = def_index } cs)
+ -> (True, dcl_modules, addFieldToSelectorDefinition selector_id { glob_module = def_mod, glob_object = def_index } cs)
_
- -> (True, cs)
- add_indirectly_imported_symbol _ {ste_kind = STE_Imported kind mod_index, ste_index} _ _ def_kind def_index def_mod _ cs
+ -> (True, dcl_modules, cs)
+ add_indirectly_imported_symbol _ {ste_kind = STE_Imported kind mod_index, ste_index} _ _ def_kind def_index def_mod _ dcl_modules cs
| kind == def_kind && mod_index == def_mod && ste_index == def_index
- = (False, cs)
- add_indirectly_imported_symbol (Yes _) _ _ _ def_kind def_index def_mod _ cs
+ = (False, dcl_modules, cs)
+ add_indirectly_imported_symbol (Yes _) _ _ _ def_kind def_index def_mod _ dcl_modules cs
| def_mod == cs.cs_x.x_main_dcl_module_n
// an icl module imports one of it's definitions from the dcl module
- = (False, cs)
- add_indirectly_imported_symbol _ _ _ _ def_kind def_index def_mod importing_mod cs
+ = (False, dcl_modules, cs)
+ add_indirectly_imported_symbol _ _ _ _ def_kind def_index def_mod importing_mod dcl_modules cs
| importing_mod==def_mod // a dcl module imports a definition from itself (cycle)
- = (False, cs)
- add_indirectly_imported_symbol _ entry ident pos def_kind def_index def_mod _ cs=:{cs_error}
- = (False, { cs & cs_error = checkError ident "multiply defined" cs_error})
+ = (False, dcl_modules, cs)
+ add_indirectly_imported_symbol _ {ste_kind = STE_Imported _ mod_index, ste_index} _ _ def_kind def_index def_mod _ dcl_modules cs=:{cs_error}
+ | mod_index>=0 && mod_index<size dcl_modules && def_mod>=0 && def_mod<size dcl_modules
+ # (dcl_name1,dcl_modules) = dcl_modules![def_mod].dcl_name
+ (dcl_name2,dcl_modules) = dcl_modules![mod_index].dcl_name
+ cs & cs_error = checkError ident ("multiply defined (in module "+++toString dcl_name1+++" and already in module "+++toString dcl_name2+++")") cs_error
+ = (False, dcl_modules, cs)
+ add_indirectly_imported_symbol _ entry ident pos def_kind def_index def_mod _ dcl_modules cs=:{cs_error}
+ = (False, dcl_modules, { cs & cs_error = checkError ident "multiply defined" cs_error})
addGlobalDefinitionsToSymbolTable :: ![Declaration] !*CheckState -> .CheckState;
addGlobalDefinitionsToSymbolTable decls cs