diff options
-rw-r--r-- | frontend/check.icl | 9 | ||||
-rw-r--r-- | frontend/explicitimports.dcl | 2 | ||||
-rw-r--r-- | frontend/explicitimports.icl | 47 | ||||
-rw-r--r-- | frontend/parse.icl | 6 | ||||
-rw-r--r-- | frontend/postparse.icl | 8 | ||||
-rw-r--r-- | frontend/syntax.dcl | 6 | ||||
-rw-r--r-- | frontend/syntax.icl | 4 |
7 files changed, 55 insertions, 27 deletions
diff --git a/frontend/check.icl b/frontend/check.icl index 76653c3..33e7b80 100644 --- a/frontend/check.icl +++ b/frontend/check.icl @@ -1595,9 +1595,16 @@ checkDclModules imports_of_icl_mod dcl_modules macro_defs heaps cs=:{cs_symbol_t get_mod_imports _ imports_of_icl_mod dcl_modules cs_symbol_table = (imports_of_icl_mod, dcl_modules, cs_symbol_table) + get_expl_imp_symbols :: ParsedImport *([Ident],Int,[ExplicitImport],*SymbolTable) -> ([Ident],Int,[ExplicitImport],*SymbolTable) get_expl_imp_symbols {import_module,import_symbols,import_file_position,import_qualified} (expl_imp_symbols_accu, nr_of_expl_imp_symbols, expl_imp_indices_accu, cs_symbol_table) # (expl_imp_symbols_accu, nr_of_expl_imp_symbols, expl_imp_indices, cs_symbol_table) - = foldSt get_expl_imp_symbol import_symbols (expl_imp_symbols_accu, nr_of_expl_imp_symbols, [], cs_symbol_table) + = case import_symbols of + ImportSymbolsOnly import_symbols + # (expl_imp_symbols_accu, nr_of_expl_imp_symbols, expl_imp_indices, cs_symbol_table) + = foldSt get_expl_imp_symbol import_symbols (expl_imp_symbols_accu, nr_of_expl_imp_symbols, [], cs_symbol_table) + -> (expl_imp_symbols_accu, nr_of_expl_imp_symbols, ImportSymbolsOnly expl_imp_indices, cs_symbol_table) + ImportSymbolsAll + -> (expl_imp_symbols_accu, nr_of_expl_imp_symbols, ImportSymbolsAll, cs_symbol_table) ({ste_index}, cs_symbol_table) = readPtr import_module.id_info cs_symbol_table explicit_import = {ei_module_n=ste_index, ei_position=import_file_position, ei_symbols=expl_imp_indices, ei_qualified=import_qualified} diff --git a/frontend/explicitimports.dcl b/frontend/explicitimports.dcl index 867b467..9479a4b 100644 --- a/frontend/explicitimports.dcl +++ b/frontend/explicitimports.dcl @@ -10,7 +10,7 @@ import syntax, checksupport :: ExplicitImport = ! { ei_module_n :: !Int, ei_position :: !Position, - ei_symbols :: ![ImportNrAndIdents], + ei_symbols :: !ImportSymbols [ImportNrAndIdents], ei_qualified:: !ImportQualified } diff --git a/frontend/explicitimports.icl b/frontend/explicitimports.icl index 30a4638..9f07158 100644 --- a/frontend/explicitimports.icl +++ b/frontend/explicitimports.icl @@ -112,9 +112,9 @@ solveExplicitImports :: !(IntKeyHashtable [ExplicitImport]) !{#Int} !Index -> (!.SolvedImports,! (!v:{#DclModule},!.{#Int},!{!.ExplImpInfo},!.CheckState)) solveExplicitImports expl_imp_indices_ikh modules_in_component_set importing_mod (dcl_modules, visited_modules, expl_imp_info, cs) # import_indices = ikhSearch` importing_mod expl_imp_indices_ikh - expl_imp_indices = [ imports \\ imports=:{ei_symbols=[_:_],ei_qualified=NotQualified} <- import_indices ] - qualified_expl_imp_indices = [ imports \\ imports=:{ei_symbols=[_:_],ei_qualified=Qualified} <- import_indices ] - impl_imports = [ (ei_module_n,ei_position) \\ imports=:{ei_module_n,ei_position,ei_symbols=[]} <- import_indices ] + + (expl_imp_indices,qualified_expl_imp_indices,impl_imports) = split_imports import_indices + state = (dcl_modules, visited_modules, expl_imp_info, cs) path = [importing_mod] (expl_imports, state) @@ -126,8 +126,21 @@ solveExplicitImports expl_imp_indices_ikh modules_in_component_set importing_mod qualified_expl_imp_indices state = ({ si_explicit=expl_imports, si_qualified_explicit=qualified_expl_imports, si_implicit=impl_imports }, state) where + split_imports :: [ExplicitImport] -> (![ExplicitImport],![ExplicitImport],![(Int,Position)]) + split_imports [imports:import_indices] + # (expl_imp_indices,qualified_expl_imp_indices,impl_imports) = split_imports import_indices + = case imports of + {ei_symbols=ImportSymbolsOnly _,ei_qualified=NotQualified} + -> ([imports:expl_imp_indices],qualified_expl_imp_indices,impl_imports) + {ei_symbols=ImportSymbolsOnly _} + -> (expl_imp_indices,[imports:qualified_expl_imp_indices],impl_imports) + {ei_symbols=ImportSymbolsAll,ei_module_n,ei_position} + -> (expl_imp_indices,qualified_expl_imp_indices,[(ei_module_n,ei_position):impl_imports]) + split_imports [] + = ([],[],[]) + solve_expl_imp_from_module expl_imp_indices_ikh modules_in_component_set path - {ei_module_n=imported_mod, ei_position=position, ei_symbols=imported_symbols} (dcl_modules, visited_modules, expl_imp_info, cs) + {ei_module_n=imported_mod, ei_position=position, ei_symbols=ImportSymbolsOnly imported_symbols} (dcl_modules, visited_modules, expl_imp_info, cs) # (not_exported_symbols,decl_accu, unsolved_belonging, visited_modules, expl_imp_info) = search_expl_imp_symbols imported_symbols expl_imp_indices_ikh modules_in_component_set path imported_mod ([],[], [], visited_modules, expl_imp_info) @@ -139,7 +152,7 @@ solveExplicitImports expl_imp_indices_ikh modules_in_component_set importing_mod = ((decl_accu, position), (dcl_modules, visited_modules, expl_imp_info, cs)) solve_qualified_expl_imp_from_module expl_imp_indices_ikh modules_in_component_set path - {ei_module_n=imported_mod, ei_position=position, ei_symbols=imported_symbols} (dcl_modules, visited_modules, expl_imp_info, cs) + {ei_module_n=imported_mod, ei_position=position, ei_symbols=ImportSymbolsOnly imported_symbols} (dcl_modules, visited_modules, expl_imp_info, cs) # (not_exported_symbols,decl_accu, unsolved_belonging, visited_modules, expl_imp_info) = search_qualified_expl_imp_symbols imported_symbols expl_imp_indices_ikh modules_in_component_set path imported_mod ([],[], [], visited_modules, expl_imp_info) @@ -344,22 +357,24 @@ solveExplicitImports expl_imp_indices_ikh modules_in_component_set importing_mod [imported_mod:path] eii_declaring_modules (bitvectSet imported_mod visited_modules) - try_children [{ei_module_n=imp_imp_mod,ei_symbols=imp_imp_symbols}:imports] expl_imp_indices_ikh + try_children [{ei_module_n=imp_imp_mod,ei_symbols}:imports] expl_imp_indices_ikh modules_in_component_set imported_symbol belong_nr belong_ident path eii_declaring_modules visited_modules | bitvectSelect imp_imp_mod visited_modules = try_children imports expl_imp_indices_ikh modules_in_component_set imported_symbol belong_nr belong_ident path eii_declaring_modules visited_modules - | not (isEmpty imp_imp_symbols) - // follow the path trough an explicit import only if the symbol is listed there - # (found, opt_belongs) - = search_imported_symbol imported_symbol imp_imp_symbols - | not (found && implies (belong_nr<>cUndef) (belong_ident_found belong_ident opt_belongs)) - = try_children imports expl_imp_indices_ikh modules_in_component_set imported_symbol - belong_nr belong_ident path eii_declaring_modules visited_modules - = continue imp_imp_mod imports expl_imp_indices_ikh modules_in_component_set imported_symbol - belong_nr belong_ident path eii_declaring_modules visited_modules - = continue imp_imp_mod imports expl_imp_indices_ikh modules_in_component_set imported_symbol + = case ei_symbols of + ImportSymbolsAll + -> continue imp_imp_mod imports expl_imp_indices_ikh modules_in_component_set imported_symbol belong_nr belong_ident path eii_declaring_modules visited_modules + ImportSymbolsOnly imp_imp_symbols + // follow the path trough an explicit import only if the symbol is listed there + # (found, opt_belongs) + = search_imported_symbol imported_symbol imp_imp_symbols + | not (found && implies (belong_nr<>cUndef) (belong_ident_found belong_ident opt_belongs)) + -> try_children imports expl_imp_indices_ikh modules_in_component_set imported_symbol + belong_nr belong_ident path eii_declaring_modules visited_modules + -> continue imp_imp_mod imports expl_imp_indices_ikh modules_in_component_set imported_symbol + belong_nr belong_ident path eii_declaring_modules visited_modules where continue imp_imp_mod imports expl_imp_indices_ikh modules_in_component_set imported_symbol belong_nr belong_ident path eii_declaring_modules visited_modules diff --git a/frontend/parse.icl b/frontend/parse.icl index 2909658..4021e3e 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -1176,7 +1176,7 @@ wantModuleImports scanContext ident_class pState (first_ident, pState) = stringToIdent first_name ident_class pState (file_name, line_nr, pState) = getFileAndLineNr pState position = LinePos file_name line_nr - module_import = {import_module = first_ident, import_symbols = [], import_file_position = position, import_qualified = import_qualified} + module_import = {import_module = first_ident, import_symbols = ImportSymbolsAll, import_file_position = position, import_qualified = import_qualified} (token, pState) = nextToken scanContext pState | token == CommaToken # (rest, pState) = wantModuleImports scanContext ident_class pState @@ -1193,11 +1193,11 @@ wantFromImports pState | case token of IdentToken "qualified" -> True ; _ -> False # (import_symbols, pState) = wantImportDeclarations pState pState = wantEndOfDefinition "from imports" pState - = ( { import_module = mod_ident, import_symbols = import_symbols, + = ( { import_module = mod_ident, import_symbols = ImportSymbolsOnly import_symbols, import_file_position = LinePos file_name line_nr, import_qualified = Qualified }, pState) # (import_symbols, pState) = wantImportDeclarationsT token pState pState = wantEndOfDefinition "from imports" pState - = ( { import_module = mod_ident, import_symbols = import_symbols, + = ( { import_module = mod_ident, import_symbols = ImportSymbolsOnly import_symbols, import_file_position = LinePos file_name line_nr, import_qualified = NotQualified }, pState) where wantImportDeclarations pState diff --git a/frontend/postparse.icl b/frontend/postparse.icl index d547327..fef6944 100644 --- a/frontend/postparse.icl +++ b/frontend/postparse.icl @@ -1128,7 +1128,7 @@ where = (False, No,NoIndex, [],cached_modules, files, ca) # pdefs = mod.mod_defs # (_, defs, imports, imported_objects,foreign_exports,ca) = reorganiseDefinitionsAndAddTypes mod_ident support_dynamics False pdefs ca - # mod = { mod & mod_imports = imports, mod_imported_objects = imported_objects, mod_defs = defs} + # mod = { mod & mod_imports = imports, mod_imported_objects = imported_objects, mod_defs = defs} # cached_modules = [mod.mod_ident:cached_modules] # (import_ok, parsed_modules,files, ca) = scanModules imports [] cached_modules searchPaths support_generics support_dynamics modtimefunction files ca = (import_ok, Yes mod, NoIndex,parsed_modules, cached_modules,files, ca) @@ -1455,11 +1455,11 @@ determine_symbols_of_conses [{pc_cons_ident,pc_cons_arity} : conses] next_cons_i determine_symbols_of_conses [] next_cons_index = ([], next_cons_index) -make_implicit_qualified_imports_explicit [import_=:{import_qualified=Qualified,import_symbols=[],import_module,import_file_position}:imports] hash_table +make_implicit_qualified_imports_explicit [import_=:{import_qualified=Qualified,import_symbols=ImportSymbolsAll,import_module,import_file_position}:imports] hash_table # (qualified_idents,hash_table) = get_qualified_idents_from_hash_table import_module hash_table # import_declarations = qualified_idents_to_import_declarations qualified_idents # (imports,hash_table) = make_implicit_qualified_imports_explicit imports hash_table - = ([{import_ & import_symbols=import_declarations}:imports],hash_table) + = ([{import_ & import_symbols=ImportSymbolsOnly import_declarations}:imports],hash_table) make_implicit_qualified_imports_explicit [import_:imports] hash_table # (imports,hash_table) = make_implicit_qualified_imports_explicit imports hash_table = ([import_:imports],hash_table) @@ -1486,7 +1486,7 @@ reorganiseDefinitionsAndAddTypes mod_ident support_dynamics icl_module defs ca = predefined_idents.[PD_CleanTypes] # clean_types_module = { import_module = clean_types_module_ident - , import_symbols = [] + , import_symbols = ImportSymbolsAll , import_file_position = NoPos , import_qualified = NotQualified } diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index 7ce1a1a..14a3e8b 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -475,11 +475,15 @@ cNameLocationDependent :== True :: Import = { import_module :: !Ident - , import_symbols :: ![ImportDeclaration] + , import_symbols :: !ImportSymbols [ImportDeclaration] , import_file_position:: !Position // for error messages , import_qualified :: !ImportQualified } +:: ImportSymbols import_declarations + = ImportSymbolsAll + | ImportSymbolsOnly !import_declarations + :: ImportQualified = NotQualified | Qualified instance toString Import, AttributeVar, TypeAttribute, Annotation diff --git a/frontend/syntax.icl b/frontend/syntax.icl index a9b5666..83b32f1 100644 --- a/frontend/syntax.icl +++ b/frontend/syntax.icl @@ -825,7 +825,9 @@ where instance <<< Import where - (<<<) file {import_module, import_symbols} + (<<<) file {import_module, import_symbols=ImportSymbolsAll} + = file <<< "import " <<< import_module + (<<<) file {import_module, import_symbols=ImportSymbolsOnly import_symbols} = file <<< "import " <<< import_module <<< import_symbols instance <<< ImportDeclaration |