src/Pure/Tools/imports.scala
changeset 67025 961285f581e6
parent 67023 e27e05d6f2a7
child 67026 687c822ee5e3
equal deleted inserted replaced
67024:72d37a2e9cca 67025:961285f581e6
    98     dirs: List[Path] = Nil,
    98     dirs: List[Path] = Nil,
    99     select_dirs: List[Path] = Nil,
    99     select_dirs: List[Path] = Nil,
   100     verbose: Boolean = false) =
   100     verbose: Boolean = false) =
   101   {
   101   {
   102     val full_sessions = Sessions.load(options, dirs = dirs, select_dirs = select_dirs)
   102     val full_sessions = Sessions.load(options, dirs = dirs, select_dirs = select_dirs)
   103     val (selected, selected_sessions) = full_sessions.selection(selection)
   103     val selected_sessions = full_sessions.selection(selection)
   104 
   104 
   105     val deps =
   105     val deps =
   106       Sessions.deps(selected_sessions, full_sessions.global_theories,
   106       Sessions.deps(selected_sessions, full_sessions.global_theories,
   107         progress = progress, verbose = verbose).check_errors
   107         progress = progress, verbose = verbose).check_errors
   108 
   108 
   109     val root_keywords = Sessions.root_syntax.keywords
   109     val root_keywords = Sessions.root_syntax.keywords
   110 
   110 
   111     if (operation_imports) {
   111     if (operation_imports) {
   112       val report_imports: List[Report] = selected.map((session_name: String) =>
   112       val report_imports: List[Report] =
   113       {
   113         selected_sessions.build_topological_order.map((session_name: String) =>
   114         val info = selected_sessions(session_name)
   114           {
   115         val session_base = deps(session_name)
   115             val info = selected_sessions(session_name)
   116 
   116             val session_base = deps(session_name)
   117         val declared_imports =
   117 
   118           selected_sessions.imports_requirements(List(session_name)).toSet
   118             val declared_imports =
   119 
   119               selected_sessions.imports_requirements(List(session_name)).toSet
   120         val extra_imports =
   120 
   121           (for {
   121             val extra_imports =
   122             (_, a) <- session_base.known.theories.iterator
   122               (for {
   123             if session_base.theory_qualifier(a) == info.name
   123                 (_, a) <- session_base.known.theories.iterator
   124             b <- deps.all_known.get_file(a.path.file)
   124                 if session_base.theory_qualifier(a) == info.name
   125             qualifier = session_base.theory_qualifier(b)
   125                 b <- deps.all_known.get_file(a.path.file)
   126             if !declared_imports.contains(qualifier)
   126                 qualifier = session_base.theory_qualifier(b)
   127           } yield qualifier).toSet
   127                 if !declared_imports.contains(qualifier)
   128 
   128               } yield qualifier).toSet
   129         val loaded_imports =
   129 
   130           selected_sessions.imports_requirements(
   130             val loaded_imports =
   131             session_base.loaded_theories.keys.map(a =>
   131               selected_sessions.imports_requirements(
   132               session_base.theory_qualifier(session_base.known.theories(a))))
   132                 session_base.loaded_theories.keys.map(a =>
   133           .toSet - session_name
   133                   session_base.theory_qualifier(session_base.known.theories(a))))
   134 
   134               .toSet - session_name
   135         val minimal_imports =
   135 
   136           loaded_imports.filter(s1 =>
   136             val minimal_imports =
   137             !loaded_imports.exists(s2 => selected_sessions.imports_graph.is_edge(s1, s2)))
   137               loaded_imports.filter(s1 =>
   138 
   138                 !loaded_imports.exists(s2 => selected_sessions.imports_graph.is_edge(s1, s2)))
   139         def make_result(set: Set[String]): Option[List[String]] =
   139 
   140           if (set.isEmpty) None
   140             def make_result(set: Set[String]): Option[List[String]] =
   141           else Some(selected_sessions.imports_topological_order.filter(set))
   141               if (set.isEmpty) None
   142 
   142               else Some(selected_sessions.imports_topological_order.filter(set))
   143         Report(info, declared_imports, make_result(extra_imports),
   143 
   144           if (loaded_imports == declared_imports - session_name) None
   144             Report(info, declared_imports, make_result(extra_imports),
   145           else make_result(minimal_imports))
   145               if (loaded_imports == declared_imports - session_name) None
   146       })
   146               else make_result(minimal_imports))
       
   147           })
   147 
   148 
   148       progress.echo("\nPotential session imports:")
   149       progress.echo("\nPotential session imports:")
   149       for {
   150       for {
   150         report <- report_imports.sortBy(_.declared_imports.size)
   151         report <- report_imports.sortBy(_.declared_imports.size)
   151         potential_imports <- report.potential_imports
   152         potential_imports <- report.potential_imports
   170     }
   171     }
   171 
   172 
   172     if (operation_update) {
   173     if (operation_update) {
   173       progress.echo("\nUpdate theory imports" + update_message + ":")
   174       progress.echo("\nUpdate theory imports" + update_message + ":")
   174       val updates =
   175       val updates =
   175         selected.flatMap(session_name =>
   176         selected_sessions.build_topological_order.flatMap(session_name =>
   176         {
   177           {
   177           val info = selected_sessions(session_name)
   178             val info = selected_sessions(session_name)
   178           val session_base = deps(session_name)
   179             val session_base = deps(session_name)
   179           val session_resources = new Resources(session_base)
   180             val session_resources = new Resources(session_base)
   180           val imports_base = session_base.get_imports
   181             val imports_base = session_base.get_imports
   181           val imports_resources = new Resources(imports_base)
   182             val imports_resources = new Resources(imports_base)
   182 
   183 
   183           def standard_import(qualifier: String, dir: String, s: String): String =
   184             def standard_import(qualifier: String, dir: String, s: String): String =
   184             imports_resources.standard_import(session_base, qualifier, dir, s)
   185               imports_resources.standard_import(session_base, qualifier, dir, s)
   185 
   186 
   186           val updates_root =
   187             val updates_root =
   187             for {
   188               for {
   188               (_, pos) <- info.theories.flatMap(_._2)
   189                 (_, pos) <- info.theories.flatMap(_._2)
   189               upd <- update_name(root_keywords, pos, standard_import(info.name, info.dir.implode, _))
   190                 upd <- update_name(root_keywords, pos, standard_import(info.name, info.dir.implode, _))
   190             } yield upd
   191               } yield upd
   191 
   192 
   192           val updates_theories =
   193             val updates_theories =
   193             for {
   194               for {
   194               (_, name) <- session_base.known.theories_local.toList
   195                 (_, name) <- session_base.known.theories_local.toList
   195               if session_base.theory_qualifier(name) == info.name
   196                 if session_base.theory_qualifier(name) == info.name
   196               (_, pos) <- session_resources.check_thy(name, Token.Pos.file(name.node)).imports
   197                 (_, pos) <- session_resources.check_thy(name, Token.Pos.file(name.node)).imports
   197               upd <- update_name(session_base.overall_syntax.keywords, pos,
   198                 upd <- update_name(session_base.overall_syntax.keywords, pos,
   198                 standard_import(session_base.theory_qualifier(name), name.master_dir, _))
   199                   standard_import(session_base.theory_qualifier(name), name.master_dir, _))
   199             } yield upd
   200               } yield upd
   200 
   201 
   201           updates_root ::: updates_theories
   202             updates_root ::: updates_theories
   202         })
   203           })
   203 
   204 
   204       val file_updates = (Multi_Map.empty[JFile, Update] /: updates)(_ + _)
   205       val file_updates = (Multi_Map.empty[JFile, Update] /: updates)(_ + _)
   205       val conflicts =
   206       val conflicts =
   206         file_updates.iterator_list.flatMap({ case (file, upds) =>
   207         file_updates.iterator_list.flatMap({ case (file, upds) =>
   207           Library.duplicates(upds.sortBy(_.range.start),
   208           Library.duplicates(upds.sortBy(_.range.start),
   309           operation_update = operation_update,
   310           operation_update = operation_update,
   310           progress = progress, selection = selection, dirs = dirs, select_dirs = select_dirs,
   311           progress = progress, selection = selection, dirs = dirs, select_dirs = select_dirs,
   311           verbose = verbose)
   312           verbose = verbose)
   312       }
   313       }
   313       else if (operation_update && incremental_update) {
   314       else if (operation_update && incremental_update) {
   314         val (selected, selected_sessions) =
   315         Sessions.load(options, dirs = dirs, select_dirs = select_dirs).selection(selection).
   315           Sessions.load(options, dirs = dirs, select_dirs = select_dirs).selection(selection)
   316           imports_topological_order.foreach(name =>
   316         selected_sessions.imports_topological_order.foreach(name =>
   317             {
   317         {
   318               imports(options, operation_update = operation_update, progress = progress,
   318           imports(options, operation_update = operation_update, progress = progress,
   319                 update_message = " for session " + quote(name),
   319             update_message = " for session " + quote(name),
   320                 selection = Sessions.Selection(sessions = List(name)),
   320             selection = Sessions.Selection(sessions = List(name)),
   321                 dirs = dirs ::: select_dirs, verbose = verbose)
   321             dirs = dirs ::: select_dirs, verbose = verbose)
   322             })
   322         })
       
   323       }
   323       }
   324     })
   324     })
   325 }
   325 }