diff options
| -rw-r--r-- | frontend/checktypes.icl | 58 | ||||
| -rw-r--r-- | frontend/explicitimports.dcl | 2 | ||||
| -rw-r--r-- | frontend/explicitimports.icl | 15 | 
3 files changed, 73 insertions, 2 deletions
diff --git a/frontend/checktypes.icl b/frontend/checktypes.icl index 393459d..2c7c413 100644 --- a/frontend/checktypes.icl +++ b/frontend/checktypes.icl @@ -3,7 +3,7 @@ implementation module checktypes  import StdEnv, compare_types  import syntax, checksupport, typesupport, utilities  import genericsupport -from explicitimports import search_qualified_ident,::NameSpaceN,TypeNameSpaceN,ClassNameSpaceN +from explicitimports import search_qualified_ident,qualified_import_for_type,::NameSpaceN,TypeNameSpaceN,ClassNameSpaceN  ::	TypeSymbols =   	{	ts_type_defs		:: !.{# CheckedTypeDef} @@ -377,7 +377,7 @@ check_context_class (TCGeneric gtc=:{gtc_generic, gtc_kind}) tc_types mod_index  				= (tc_class, class_defs, modules, cs)  				# cs = {cs & cs_error = checkError gen_ident "a generic context is not allowed in a dynamic type" cs.cs_error}  				= (tc_class, class_defs, modules, cs) -			# cs_error = checkError gen_ident "generic used with wrong arity: generic has always has one class argument" cs.cs_error   +			# cs_error = checkError gen_ident "generic used with wrong arity: generic always has one class argument" cs.cs_error    			= (TCGeneric {gtc & gtc_class=clazz}, class_defs, modules, {cs & cs_error = cs_error})  		# cs_error = checkError gen_ident "generic undefined" cs.cs_error  		= (TCGeneric {gtc & gtc_class=clazz}, class_defs, modules, {cs & cs_error = cs_error}) @@ -392,6 +392,59 @@ check_context_types tc_class [TV _ : types] cs  check_context_types tc_class [type : types] cs  	= check_context_types tc_class types cs +cached_used_type_is_imported :: !Ident !Int !SymbolPtr !*SymbolTable -> (!Bool,!*SymbolTable) +cached_used_type_is_imported {id_info,id_name} module_n module_ptr symbol_table +	# (entry=:{ste_kind,ste_def_level,ste_index}, symbol_table)	= readPtr id_info symbol_table +	// both normal and qualified import are allowed, because the required information is no longer available (to do) +	= case ste_kind of +		STE_Type +			| ste_def_level==cGlobalScope +				-> (True,symbol_table) +		STE_Imported STE_Type ste_mod_index +			| ste_mod_index==module_n +				-> (True,symbol_table) +		_ +			# ({ste_kind}, symbol_table) = readPtr module_ptr symbol_table +			-> case ste_kind of +				STE_ModuleQualifiedImports sorted_qualified_imports +					| qualified_import_for_type id_name sorted_qualified_imports +						-> (True,symbol_table) +				_ +					-> (False,symbol_table) + +check_imports_of_cached_used_types :: [GlobalIndex] Int Int *{#CheckedTypeDef} *{#DclModule} *CheckState -> (!*{#CheckedTypeDef},!*{#DclModule},!*CheckState) +check_imports_of_cached_used_types [{gi_module,gi_index} : used_types] module_index type_index ts_type_defs modules cs +	| gi_module==cPredefinedModuleIndex +		= check_imports_of_cached_used_types used_types module_index type_index ts_type_defs modules cs +	# (module_ptr,modules) = modules![gi_module].dcl_name.id_info +	| gi_module==module_index +		# (type_ident,ts_type_defs) = ts_type_defs![gi_index].td_ident +		  (is_imported,symbol_table) = cached_used_type_is_imported type_ident gi_module module_ptr cs.cs_symbol_table +		  cs & cs_symbol_table=symbol_table +		| is_imported +			= check_imports_of_cached_used_types used_types module_index type_index ts_type_defs modules cs +			= error_and_check_imports_of_cached_used_types type_ident used_types module_index type_index ts_type_defs modules cs +		# (type_ident,modules) = modules![gi_module].dcl_common.com_type_defs.[gi_index].td_ident +		  (is_imported,symbol_table) = cached_used_type_is_imported type_ident gi_module module_ptr cs.cs_symbol_table +		  cs & cs_symbol_table=symbol_table +		| is_imported +			= check_imports_of_cached_used_types used_types module_index type_index ts_type_defs modules cs +			= error_and_check_imports_of_cached_used_types type_ident used_types module_index type_index ts_type_defs modules cs +where +	error_and_check_imports_of_cached_used_types type_ident used_types module_index type_index ts_type_defs modules cs +		# (module_name,modules) = modules![gi_module].dcl_name.id_name +		# (td_pos, ts_type_defs) = ts_type_defs![type_index].td_pos +		# cs & cs_error = checkErrorWithPosition type_ident td_pos ("not imported in implementation module (from "+++module_name+++")") cs.cs_error +		= check_imports_of_cached_used_types used_types module_index type_index ts_type_defs modules cs +check_imports_of_cached_used_types [] module_index type_index ts_type_defs modules cs +	= (ts_type_defs,modules,cs) + +check_imports_of_cached_type_def :: Int Int *TypeSymbols *CheckState -> (!*TypeSymbols,!*CheckState) +check_imports_of_cached_type_def type_index module_index ts=:{ts_type_defs,ts_modules} cs +	# (td_used_types, ts_type_defs) = ts_type_defs![type_index].td_used_types +	#! (ts_type_defs,ts_modules,cs) = check_imports_of_cached_used_types td_used_types module_index type_index ts_type_defs ts_modules cs +	= ({ts & ts_type_defs = ts_type_defs, ts_modules = ts_modules},cs) +  emptyIdent name :== { id_name = name, id_info = nilPtr }  checkTypeDef :: !Index !Index !v:{#ClassDef} !*TypeSymbols !*TypeInfo !*CheckState -> (!v:{#ClassDef},!*TypeSymbols,!*TypeInfo,!*CheckState); @@ -635,6 +688,7 @@ where  	check_type_def module_index opt_icl_info type_index (class_defs, ts, ti, cs)  		| has_to_be_checked module_index opt_icl_info type_index  			= checkTypeDef type_index module_index class_defs ts ti cs +			# (ts,cs) = check_imports_of_cached_type_def type_index module_index ts cs  			= (class_defs, ts, ti, cs)  	has_to_be_checked module_index No type_index diff --git a/frontend/explicitimports.dcl b/frontend/explicitimports.dcl index f428874..afd799a 100644 --- a/frontend/explicitimports.dcl +++ b/frontend/explicitimports.dcl @@ -48,4 +48,6 @@ search_qualified_ident :: !Ident {#Char} !NameSpaceN !*CheckState -> (!Bool,!Dec  search_qualified_import :: !String !SortedQualifiedImports !NameSpaceN -> (!Bool,!DeclarationRecord)  search_qualified_imports :: !String !SortedQualifiedImports !NameSpaceN -> [DeclarationRecord] +qualified_import_for_type :: !String !SortedQualifiedImports -> Bool +  restore_module_ste_kinds_in_symbol_table :: ![(SymbolPtr,STE_Kind)] !*SymbolTable -> *SymbolTable diff --git a/frontend/explicitimports.icl b/frontend/explicitimports.icl index de2c248..40b6ecd 100644 --- a/frontend/explicitimports.icl +++ b/frontend/explicitimports.icl @@ -1021,6 +1021,21 @@ search_qualified_imports name (SortedQualifiedImports (Declaration declaration=:  		= search_qualified_imports name sqi_left  name_space_n  		= search_qualified_imports name sqi_right name_space_n +qualified_import_for_type :: !String !SortedQualifiedImports -> Bool +qualified_import_for_type name EmptySortedQualifiedImports +	= False +qualified_import_for_type name (SortedQualifiedImports (Declaration declaration=:{decl_ident={id_name},decl_kind}) sqi_left sqi_right) +	| name==id_name +		# decl_name_space_n = imported_ste_kind_to_name_space_n decl_kind +		| TypeNameSpaceN == decl_name_space_n +			= True +		| TypeNameSpaceN < decl_name_space_n +			= qualified_import_for_type name sqi_left +			= qualified_import_for_type name sqi_right +	| name<id_name +		= qualified_import_for_type name sqi_left +		= qualified_import_for_type name sqi_right +  restore_module_ste_kinds_in_symbol_table :: ![(SymbolPtr,STE_Kind)] !*SymbolTable -> *SymbolTable  restore_module_ste_kinds_in_symbol_table [(ptr,ste_kind):ptrs_and_ste_kinds] symbol_table  	# (ste,symbol_table) = readPtr ptr symbol_table  | 
