nitpackage: only work on packages passed as argument
[nit.git] / src / nitpackage.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Helpful features about packages
16 module nitpackage
17
18 import frontend
19
20 redef class ToolContext
21 # --expand
22 var opt_expand = new OptionBool("Move singleton packages to their own directory", "--expand")
23
24 # README handling phase
25 var readme_phase: Phase = new ReadmePhase(self, null)
26
27 redef init do
28 super
29 option_context.add_option(opt_expand)
30 end
31 end
32
33 private class ReadmePhase
34 super Phase
35
36 redef fun process_mainmodule(mainmodule, mmodules) do
37 var expand_packages = toolcontext.opt_expand.value
38 var mpackages = extract_mpackages(mmodules)
39
40 for mpackage in mpackages do
41
42 # Fictive and buggy packages are ignored
43 if not mpackage.has_source then
44 toolcontext.warning(mpackage.location, "no-source",
45 "Warning: `{mpackage}` has no source file")
46 continue
47 end
48
49 # Expand packages
50 if not mpackage.is_expanded then
51 if expand_packages then
52 var path = mpackage.expand
53 toolcontext.info("{mpackage} moved to {path}", 0)
54 else
55 toolcontext.warning(mpackage.location, "no-dir",
56 "Warning: `{mpackage}` has no package directory")
57 continue
58 end
59 end
60 end
61 end
62
63 # Extract the list of packages from the mmodules passed as arguments
64 fun extract_mpackages(mmodules: Collection[MModule]): Collection[MPackage] do
65 var mpackages = new ArraySet[MPackage]
66 for mmodule in mmodules do
67 var mpackage = mmodule.mpackage
68 if mpackage == null then continue
69 mpackages.add mpackage
70 end
71 return mpackages.to_a
72 end
73 end
74
75 redef class MPackage
76
77 # Expand `self` in its own directory
78 private fun expand: String do
79 assert not is_expanded
80
81 var ori_path = package_path.as(not null)
82 var new_path = ori_path.dirname / name
83
84 new_path.mkdir
85 sys.system "mv {ori_path} {new_path / name}.nit"
86
87 var ini_file = "{new_path}.ini"
88 if ini_file.file_exists then
89 sys.system "mv {new_path}.ini {new_path}/package.ini"
90 end
91
92 return new_path
93 end
94 end
95
96 # build toolcontext
97 var toolcontext = new ToolContext
98 var tpl = new Template
99 tpl.add "Usage: nitpackage [OPTION]... <file.nit>...\n"
100 tpl.add "Helpful features about packages."
101 toolcontext.tooldescription = tpl.write_to_string
102
103 # process options
104 toolcontext.process_options(args)
105 var arguments = toolcontext.option_context.rest
106
107 # build model
108 var model = new Model
109 var mbuilder = new ModelBuilder(model, toolcontext)
110 var mmodules = mbuilder.parse_full(arguments)
111
112 # process
113 if mmodules.is_empty then return
114 mbuilder.run_phases
115 toolcontext.run_global_phases(mmodules)