1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Simple vavious processing on a AST
18 # The analysis warns on :
19 # * superfluous parentheses
20 # * nested "once" expressions
21 # * use of "while true" instead of "loop"
22 package simple_misc_analysis
28 # Visit the module to detect easy warnings that does not need the metamodel or the importation
29 # Warnings are displayed on the toolcontext
30 fun do_simple_misc_analysis
(toolcontext
: ToolContext)
32 var v
= new SimpleMiscVisitor(toolcontext
)
37 private class SimpleMiscVisitor
41 if n
!= null then n
.accept_simple_misc
(self)
44 # Number of nested once
45 var once_count
: Int = 0
47 var toolcontext
: ToolContext
49 fun warning
(node
: ANode, msg
: String)
51 toolcontext
.warning
(node
.hot_location
, msg
)
54 init(toolcontext
: ToolContext)
56 self.toolcontext
= toolcontext
61 ###############################################################################
64 private fun accept_simple_misc
(v
: SimpleMiscVisitor)
69 private fun after_simple_misc
(v
: SimpleMiscVisitor) do end
72 redef class ASignature
73 redef fun after_simple_misc
(v
)
75 if self.n_opar
!= null and self.n_params
.is_empty
then
76 v
.warning
(self, "Warning: superfluous parentheses.")
82 # Warn in case of superfluous parentheses
83 private fun warn_parentheses
(v
: SimpleMiscVisitor) do end
87 redef fun warn_parentheses
(v
)
89 v
.warning
(self, "Warning: superfluous parentheses.")
94 redef fun after_simple_misc
(v
)
96 if n_exprs
.is_empty
then
97 v
.warning
(self, "Warning: superfluous parentheses.")
102 redef class AReturnExpr
103 redef fun after_simple_misc
(v
)
107 e
.warn_parentheses
(v
)
112 redef class AContinueExpr
113 redef fun after_simple_misc
(v
)
117 e
.warn_parentheses
(v
)
122 redef class ABreakExpr
123 redef fun after_simple_misc
(v
)
127 e
.warn_parentheses
(v
)
132 redef class AWhileExpr
133 redef fun after_simple_misc
(v
)
135 if n_expr
isa ATrueExpr then
136 v
.warning
(self, "Warning: use 'loop' instead of 'while true do'.")
138 n_expr
.warn_parentheses
(v
)
144 redef fun after_simple_misc
(v
)
146 n_expr
.warn_parentheses
(v
)
151 redef fun after_simple_misc
(v
)
153 n_expr
.warn_parentheses
(v
)
157 redef class AIfexprExpr
158 redef fun after_simple_misc
(v
)
160 n_expr
.warn_parentheses
(v
)
164 redef class AOnceExpr
165 redef fun accept_simple_misc
(v
)
167 if v
.once_count
> 0 then
168 v
.warning
(self, "Useless once in a once expression.")
170 v
.once_count
= v
.once_count
+ 1
174 v
.once_count
= v
.once_count
- 1