1 # This file is part of NIT ( http://www.nitlanguage.org ).
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
15 # Helpful features about packages
20 redef class ToolContext
22 var opt_expand
= new OptionBool("Move singleton packages to their own directory", "--expand")
24 # README handling phase
25 var readme_phase
: Phase = new ReadmePhase(self, null)
29 option_context
.add_option
(opt_expand
)
33 private class ReadmePhase
36 redef fun process_mainmodule
(mainmodule
, mmodules
) do
37 var mpackages
= extract_mpackages
(mmodules
)
39 for mpackage
in mpackages
do
41 # Fictive and buggy packages are ignored
42 if not mpackage
.has_source
then
43 toolcontext
.warning
(mpackage
.location
, "no-source",
44 "Warning: `{mpackage}` has no source file")
49 if toolcontext
.opt_expand
.value
and not mpackage
.is_expanded
then
50 var path
= mpackage
.expand
51 toolcontext
.info
("{mpackage} moved to {path}", 0)
53 if not mpackage
.is_expanded
then
54 toolcontext
.warning
(mpackage
.location
, "no-dir",
55 "Warning: `{mpackage}` has no package directory")
61 # Extract the list of packages from the mmodules passed as arguments
62 fun extract_mpackages
(mmodules
: Collection[MModule]): Collection[MPackage] do
63 var mpackages
= new ArraySet[MPackage]
64 for mmodule
in mmodules
do
65 var mpackage
= mmodule
.mpackage
66 if mpackage
== null then continue
67 mpackages
.add mpackage
75 # Expand `self` in its own directory
76 private fun expand
: String do
77 assert not is_expanded
79 var ori_path
= package_path
.as(not null)
80 var new_path
= ori_path
.dirname
/ name
83 sys
.system
"mv {ori_path} {new_path / name}.nit"
85 var ini_file
= "{new_path}.ini"
86 if ini_file
.file_exists
then
87 sys
.system
"mv {new_path}.ini {new_path}/package.ini"
95 var toolcontext
= new ToolContext
96 var tpl
= new Template
97 tpl
.add
"Usage: nitpackage [OPTION]... <file.nit>...\n"
98 tpl
.add
"Helpful features about packages."
99 toolcontext
.tooldescription
= tpl
.write_to_string
102 toolcontext
.process_options
(args
)
103 var arguments
= toolcontext
.option_context
.rest
106 var model
= new Model
107 var mbuilder
= new ModelBuilder(model
, toolcontext
)
108 var mmodules
= mbuilder
.parse_full
(arguments
)
111 if mmodules
.is_empty
then return
113 toolcontext
.run_global_phases
(mmodules
)