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 } |