adlint 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +0 -1
- data/ChangeLog +185 -1
- data/MANIFEST +3 -0
- data/NEWS +28 -5
- data/bin/adlintize +70 -7
- data/etc/conf.d/fallback/traits.erb +12 -3
- data/etc/conf.d/i686-cygwin/traits-gcc_4.3.4.erb +12 -3
- data/etc/conf.d/i686-devkit/traits-gcc_4.5.2.erb +12 -3
- data/etc/conf.d/i686-linux/traits-gcc_4.5.1.erb +12 -3
- data/etc/conf.d/i686-mingw/traits-gcc_4.6.1.erb +12 -3
- data/etc/conf.d/x86_64-ubuntu_12.04/traits-gcc_4.6.3.erb +12 -4
- data/etc/mesg.d/c_builtin/en_US/messages.yml +1 -1
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +1 -1
- data/etc/mesg.d/core/en_US/messages.yml +1 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
- data/features/code_check/W0070.feature +51 -0
- data/features/code_check/W0071.feature +51 -0
- data/features/code_check/W0425.feature +279 -0
- data/features/code_check/W0692.feature +14 -1
- data/features/code_check/W0834.feature +7 -5
- data/features/code_check/W1073.feature +0 -1
- data/features/code_check/W1074.feature +6 -0
- data/features/code_check/W9003.feature +54 -0
- data/features/support/env.rb +15 -3
- data/lib/adlint/c/expr.rb +30 -6
- data/lib/adlint/c/interp.rb +4 -0
- data/lib/adlint/cpp/eval.rb +24 -14
- data/lib/adlint/cpp/macro.rb +52 -40
- data/lib/adlint/exam/c_builtin/c_check.rb +76 -42
- data/lib/adlint/exam/c_builtin/cpp_check.rb +4 -2
- data/lib/adlint/traits.rb +37 -23
- data/lib/adlint/util.rb +6 -0
- data/lib/adlint/version.rb +3 -3
- data/share/doc/developers_guide_ja.html +3 -3
- data/share/doc/developers_guide_ja.texi +1 -1
- data/share/doc/users_guide_en.html +1679 -1651
- data/share/doc/users_guide_en.texi +56 -24
- data/share/doc/users_guide_ja.html +1697 -1669
- data/share/doc/users_guide_ja.texi +57 -24
- data/share/sample/bison-2.5/adlint/adlint_traits.yml +13 -4
- data/share/sample/bison-2.5/adlint/lib/adlint_traits.yml +13 -4
- data/share/sample/bison-2.5/adlint/src/adlint_traits.yml +13 -4
- data/share/sample/ctags-5.8/adlint/adlint_traits.yml +13 -4
- data/share/sample/flex-2.5.35/adlint/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/core/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/enc/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/enc-trans/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-bigdecimal/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-continuation/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-coverage/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-curses/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-date/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dbm/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-bubblebabble/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-md5/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-rmd160/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha1/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-digest-sha2/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-dl-callback/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-etc/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fcntl/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiber/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-fiddle/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-gdbm/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-iconv/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-console/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-nonblock/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-io-wait/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-generator/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-json-parser/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-complex/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-mathn-rational/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-nkf/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-openssl/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pathname/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-psych/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-pty/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-racc-cparse/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-readline/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-ripper/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-sdbm/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-socket/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-stringio/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-strscan/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syck/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-syslog/adlint_traits.yml +13 -4
- data/share/sample/ruby-1.9.3-p0/adlint/ext-zlib/adlint_traits.yml +13 -4
- data/share/sample/screen-4.0.3/adlint/adlint_traits.yml +13 -4
- data/share/sample/vim-7.3/adlint/vim/adlint_traits.yml +13 -4
- data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +13 -4
- data/share/sample/zsh-4.3.15/adlint/adlint_traits.yml +13 -4
- data/share/sample/zsh-4.3.15/adlint/builtins/adlint_traits.yml +13 -4
- data/share/sample/zsh-4.3.15/adlint/core/adlint_traits.yml +13 -4
- data/share/sample/zsh-4.3.15/adlint/modules/adlint_traits.yml +13 -4
- data/share/sample/zsh-4.3.15/adlint/zle/adlint_traits.yml +13 -4
- data/spec/conf.d/default_traits.yml +12 -4
- metadata +5 -2
data/lib/adlint/cpp/macro.rb
CHANGED
|
@@ -109,18 +109,28 @@ module Cpp #:nodoc:
|
|
|
109
109
|
def replaceable_size(tokens)
|
|
110
110
|
return 0 unless name.value == tokens.first.value
|
|
111
111
|
args, index = parse_arguments(tokens, 1)
|
|
112
|
-
|
|
112
|
+
case
|
|
113
|
+
when args && @parameter_names.empty?
|
|
114
|
+
index + 1
|
|
115
|
+
when args && @parameter_names.size >= args.size
|
|
116
|
+
index + 1
|
|
117
|
+
else
|
|
118
|
+
0
|
|
119
|
+
end
|
|
113
120
|
end
|
|
114
121
|
|
|
115
122
|
def expand(tokens, macro_table, context)
|
|
116
123
|
super
|
|
117
124
|
|
|
118
125
|
args, * = parse_arguments(tokens, 1)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
args = [] if @parameter_names.empty?
|
|
127
|
+
args_hash =
|
|
128
|
+
@parameter_names.zip(args).each_with_object({}) { |(name, arg), hash|
|
|
129
|
+
hash[name] = arg
|
|
130
|
+
}
|
|
123
131
|
|
|
132
|
+
result = expand_replacement_list(args_hash, tokens.first.location,
|
|
133
|
+
macro_table, context)
|
|
124
134
|
macro_table.notify_function_like_macro_replacement(self, tokens, args,
|
|
125
135
|
result)
|
|
126
136
|
result
|
|
@@ -144,15 +154,10 @@ module Cpp #:nodoc:
|
|
|
144
154
|
return nil, index unless token
|
|
145
155
|
|
|
146
156
|
args = []
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
else
|
|
152
|
-
arg, index = parse_one_argument(tokens, index)
|
|
153
|
-
break unless arg
|
|
154
|
-
args.push(arg)
|
|
155
|
-
end
|
|
157
|
+
loop do
|
|
158
|
+
arg, index, last = parse_one_argument(tokens, index)
|
|
159
|
+
args.push(arg)
|
|
160
|
+
break if last
|
|
156
161
|
end
|
|
157
162
|
return args, index
|
|
158
163
|
end
|
|
@@ -163,30 +168,29 @@ module Cpp #:nodoc:
|
|
|
163
168
|
while token = tokens[index]
|
|
164
169
|
case token.value
|
|
165
170
|
when "("
|
|
166
|
-
arg
|
|
171
|
+
arg.push(token)
|
|
167
172
|
paren_depth += 1
|
|
168
173
|
when ")"
|
|
169
174
|
paren_depth -= 1
|
|
170
175
|
if paren_depth >= 0
|
|
171
|
-
arg
|
|
176
|
+
arg.push(token)
|
|
172
177
|
else
|
|
173
|
-
|
|
178
|
+
return arg, index, true
|
|
174
179
|
end
|
|
175
180
|
when ","
|
|
176
181
|
if paren_depth > 0
|
|
177
|
-
arg
|
|
182
|
+
arg.push(token)
|
|
178
183
|
else
|
|
179
|
-
index
|
|
180
|
-
break
|
|
184
|
+
return arg, index + 1, false
|
|
181
185
|
end
|
|
182
186
|
when "\n"
|
|
183
187
|
;
|
|
184
188
|
else
|
|
185
|
-
arg
|
|
189
|
+
arg.push(token)
|
|
186
190
|
end
|
|
187
191
|
index += 1
|
|
188
192
|
end
|
|
189
|
-
return
|
|
193
|
+
return arg, index, true # NOTREACHED
|
|
190
194
|
end
|
|
191
195
|
|
|
192
196
|
def expand_replacement_list(args, location, macro_table, context)
|
|
@@ -202,15 +206,16 @@ module Cpp #:nodoc:
|
|
|
202
206
|
substitute_argument(curr_token, next_token, arg, location, result,
|
|
203
207
|
macro_table, context)
|
|
204
208
|
when curr_token.value == "#"
|
|
205
|
-
if next_token
|
|
206
|
-
stringized = stringize_argument(
|
|
209
|
+
if next_token
|
|
210
|
+
stringized = stringize_argument(args[next_token.value], location,
|
|
211
|
+
macro_table)
|
|
207
212
|
result.push(stringized)
|
|
208
213
|
index += 1
|
|
209
214
|
end
|
|
210
215
|
when curr_token.value == "##" && next_token.value == "#"
|
|
211
|
-
if next_next_token = replacement_list.tokens[index + 2]
|
|
212
|
-
|
|
213
|
-
|
|
216
|
+
if next_next_token = replacement_list.tokens[index + 2]
|
|
217
|
+
stringized = stringize_argument(args[next_next_token.value],
|
|
218
|
+
location, macro_table)
|
|
214
219
|
concat_with_last_token([stringized], location, result, macro_table)
|
|
215
220
|
index += 2
|
|
216
221
|
end
|
|
@@ -336,21 +341,28 @@ module Cpp #:nodoc:
|
|
|
336
341
|
# The resulting token is available for further macro replacement. The
|
|
337
342
|
# order of evaluation of ## operators is unspecified.
|
|
338
343
|
|
|
339
|
-
if lhs = result_tokens.pop
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
344
|
+
if lhs = result_tokens.pop
|
|
345
|
+
if rhs = arg_tokens.first
|
|
346
|
+
# NOTE: To avoid syntax error when the concatenated token can be
|
|
347
|
+
# retokenize to two or more tokens.
|
|
348
|
+
new_tokens = StringToPPTokensLexer.new(lhs.value + rhs.value).execute
|
|
349
|
+
new_tokens.map! do |token|
|
|
350
|
+
ReplacedToken.new(token.type, token.value, expansion_location,
|
|
351
|
+
token.type_hint, false)
|
|
352
|
+
end
|
|
353
|
+
result_tokens.concat(new_tokens)
|
|
354
|
+
result_tokens.concat(arg_tokens[1..-1].map { |token|
|
|
355
|
+
ReplacedToken.new(token.type, token.value, expansion_location,
|
|
356
|
+
token.type_hint, false)
|
|
357
|
+
})
|
|
358
|
+
else
|
|
359
|
+
new_tokens = [ReplacedToken.new(lhs.type, lhs.value,
|
|
360
|
+
expansion_location, lhs.type_hint,
|
|
361
|
+
false)]
|
|
362
|
+
result_tokens.concat(new_tokens)
|
|
346
363
|
end
|
|
347
|
-
macro_table.notify_sharpsharp_operator_evaled(lhs, rhs, new_tokens)
|
|
348
364
|
|
|
349
|
-
|
|
350
|
-
result_tokens.concat(arg_tokens[1..-1].map { |token|
|
|
351
|
-
ReplacedToken.new(token.type, token.value, expansion_location,
|
|
352
|
-
token.type_hint, false)
|
|
353
|
-
})
|
|
365
|
+
macro_table.notify_sharpsharp_operator_evaled(lhs, rhs, new_tokens)
|
|
354
366
|
end
|
|
355
367
|
end
|
|
356
368
|
end
|
|
@@ -1926,7 +1926,16 @@ module CBuiltin #:nodoc:
|
|
|
1926
1926
|
interp.on_variable_value_updated += method(:write_variable)
|
|
1927
1927
|
interp.on_block_started += method(:enter_block)
|
|
1928
1928
|
interp.on_block_ended += method(:leave_block)
|
|
1929
|
+
interp.on_while_stmt_started += method(:enter_iteration)
|
|
1930
|
+
interp.on_while_stmt_ended += method(:leave_iteration)
|
|
1931
|
+
interp.on_do_stmt_started += method(:enter_iteration)
|
|
1932
|
+
interp.on_do_stmt_ended += method(:leave_iteration)
|
|
1933
|
+
interp.on_for_stmt_started += method(:enter_iteration)
|
|
1934
|
+
interp.on_for_stmt_ended += method(:leave_iteration)
|
|
1935
|
+
interp.on_c99_for_stmt_started += method(:enter_iteration)
|
|
1936
|
+
interp.on_c99_for_stmt_ended += method(:leave_iteration)
|
|
1929
1937
|
@variable_stack = [{}]
|
|
1938
|
+
@iteration_stmt_stack = []
|
|
1930
1939
|
end
|
|
1931
1940
|
|
|
1932
1941
|
private
|
|
@@ -1957,11 +1966,26 @@ module CBuiltin #:nodoc:
|
|
|
1957
1966
|
|
|
1958
1967
|
@variable_stack.reverse_each do |variables|
|
|
1959
1968
|
if record = variables[variable]
|
|
1960
|
-
|
|
1969
|
+
if @iteration_stmt_stack.empty?
|
|
1970
|
+
record[1] += 1
|
|
1971
|
+
else
|
|
1972
|
+
# NOTE: Update twice in order not to over-warn about this variable,
|
|
1973
|
+
# because an iteration is treated as a normal selection by
|
|
1974
|
+
# the abstract interpreter.
|
|
1975
|
+
record[1] += 2
|
|
1976
|
+
end
|
|
1961
1977
|
end
|
|
1962
1978
|
end
|
|
1963
1979
|
end
|
|
1964
1980
|
|
|
1981
|
+
def enter_iteration(iteration_stmt)
|
|
1982
|
+
@iteration_stmt_stack.push(iteration_stmt)
|
|
1983
|
+
end
|
|
1984
|
+
|
|
1985
|
+
def leave_iteration(iteration_stmt)
|
|
1986
|
+
@iteration_stmt_stack.pop
|
|
1987
|
+
end
|
|
1988
|
+
|
|
1965
1989
|
def check_constant_variables(variables)
|
|
1966
1990
|
variables.each do |variable, (location, assign_count)|
|
|
1967
1991
|
case
|
|
@@ -6948,122 +6972,132 @@ module CBuiltin #:nodoc:
|
|
|
6948
6972
|
|
|
6949
6973
|
def initialize(context)
|
|
6950
6974
|
@context = context
|
|
6951
|
-
@
|
|
6952
|
-
@
|
|
6975
|
+
@last_decl_or_stmt_location = Location.new
|
|
6976
|
+
@last_memb_decl_location = Location.new
|
|
6953
6977
|
end
|
|
6954
6978
|
|
|
6955
6979
|
def visit_function_declaration(node)
|
|
6956
|
-
|
|
6980
|
+
check_decl_or_stmt(node)
|
|
6981
|
+
@last_decl_or_stmt_location = node.location
|
|
6957
6982
|
end
|
|
6958
6983
|
|
|
6959
6984
|
def visit_variable_declaration(node)
|
|
6960
|
-
|
|
6985
|
+
check_decl_or_stmt(node)
|
|
6986
|
+
@last_decl_or_stmt_location = node.location
|
|
6961
6987
|
end
|
|
6962
6988
|
|
|
6963
6989
|
def visit_variable_definition(node)
|
|
6964
|
-
|
|
6990
|
+
check_decl_or_stmt(node)
|
|
6991
|
+
@last_decl_or_stmt_location = node.location
|
|
6965
6992
|
end
|
|
6966
6993
|
|
|
6967
6994
|
def visit_typedef_declaration(node)
|
|
6968
|
-
|
|
6995
|
+
check_decl_or_stmt(node)
|
|
6996
|
+
@last_decl_or_stmt_location = node.location
|
|
6969
6997
|
end
|
|
6970
6998
|
|
|
6971
|
-
def
|
|
6972
|
-
|
|
6973
|
-
|
|
6974
|
-
|
|
6975
|
-
def visit_union_type_declaration(node)
|
|
6976
|
-
check_declaration(node)
|
|
6977
|
-
end
|
|
6978
|
-
|
|
6979
|
-
def visit_enum_type_declaration(node)
|
|
6980
|
-
check_declaration(node)
|
|
6999
|
+
def visit_member_declaration(node)
|
|
7000
|
+
check_member_decl(node)
|
|
7001
|
+
@last_memb_decl_location = node.location
|
|
6981
7002
|
end
|
|
6982
7003
|
|
|
6983
7004
|
def visit_generic_labeled_statement(node)
|
|
6984
|
-
|
|
7005
|
+
check_decl_or_stmt(node)
|
|
7006
|
+
@last_decl_or_stmt_location = node.location
|
|
6985
7007
|
end
|
|
6986
7008
|
|
|
6987
7009
|
def visit_case_labeled_statement(node)
|
|
6988
|
-
|
|
7010
|
+
check_decl_or_stmt(node)
|
|
7011
|
+
@last_decl_or_stmt_location = node.location
|
|
6989
7012
|
end
|
|
6990
7013
|
|
|
6991
7014
|
def visit_default_labeled_statement(node)
|
|
6992
|
-
|
|
7015
|
+
check_decl_or_stmt(node)
|
|
7016
|
+
@last_decl_or_stmt_location = node.location
|
|
6993
7017
|
end
|
|
6994
7018
|
|
|
6995
7019
|
def visit_expression_statement(node)
|
|
6996
|
-
|
|
7020
|
+
check_decl_or_stmt(node)
|
|
7021
|
+
@last_decl_or_stmt_location = node.location
|
|
6997
7022
|
end
|
|
6998
7023
|
|
|
6999
7024
|
def visit_if_statement(node)
|
|
7000
|
-
|
|
7025
|
+
check_decl_or_stmt(node)
|
|
7001
7026
|
node.statement.accept(self)
|
|
7027
|
+
@last_decl_or_stmt_location = node.location
|
|
7002
7028
|
end
|
|
7003
7029
|
|
|
7004
7030
|
def visit_if_else_statement(node)
|
|
7005
|
-
|
|
7031
|
+
check_decl_or_stmt(node)
|
|
7032
|
+
orig_location = @last_decl_or_stmt_location
|
|
7006
7033
|
node.then_statement.accept(self)
|
|
7034
|
+
@last_decl_or_stmt_location = orig_location
|
|
7007
7035
|
node.else_statement.accept(self)
|
|
7036
|
+
@last_decl_or_stmt_location = node.location
|
|
7008
7037
|
end
|
|
7009
7038
|
|
|
7010
7039
|
def visit_switch_statement(node)
|
|
7011
|
-
|
|
7040
|
+
check_decl_or_stmt(node)
|
|
7012
7041
|
node.statement.accept(self)
|
|
7042
|
+
@last_decl_or_stmt_location = node.location
|
|
7013
7043
|
end
|
|
7014
7044
|
|
|
7015
7045
|
def visit_while_statement(node)
|
|
7016
|
-
|
|
7046
|
+
check_decl_or_stmt(node)
|
|
7017
7047
|
node.statement.accept(self)
|
|
7048
|
+
@last_decl_or_stmt_location = node.location
|
|
7018
7049
|
end
|
|
7019
7050
|
|
|
7020
7051
|
def visit_do_statement(node)
|
|
7021
|
-
|
|
7052
|
+
check_decl_or_stmt(node)
|
|
7022
7053
|
node.statement.accept(self)
|
|
7054
|
+
@last_decl_or_stmt_location = node.location
|
|
7023
7055
|
end
|
|
7024
7056
|
|
|
7025
7057
|
def visit_for_statement(node)
|
|
7026
|
-
|
|
7058
|
+
check_decl_or_stmt(node)
|
|
7027
7059
|
node.body_statement.accept(self)
|
|
7060
|
+
@last_decl_or_stmt_location = node.location
|
|
7028
7061
|
end
|
|
7029
7062
|
|
|
7030
7063
|
def visit_c99_for_statement(node)
|
|
7031
|
-
|
|
7064
|
+
check_decl_or_stmt(node)
|
|
7032
7065
|
node.body_statement.accept(self)
|
|
7066
|
+
@last_decl_or_stmt_location = node.location
|
|
7033
7067
|
end
|
|
7034
7068
|
|
|
7035
7069
|
def visit_goto_statement(node)
|
|
7036
|
-
|
|
7070
|
+
check_decl_or_stmt(node)
|
|
7071
|
+
@last_decl_or_stmt_location = node.location
|
|
7037
7072
|
end
|
|
7038
7073
|
|
|
7039
7074
|
def visit_continue_statement(node)
|
|
7040
|
-
|
|
7075
|
+
check_decl_or_stmt(node)
|
|
7076
|
+
@last_decl_or_stmt_location = node.location
|
|
7041
7077
|
end
|
|
7042
7078
|
|
|
7043
7079
|
def visit_break_statement(node)
|
|
7044
|
-
|
|
7080
|
+
check_decl_or_stmt(node)
|
|
7081
|
+
@last_decl_or_stmt_location = node.location
|
|
7045
7082
|
end
|
|
7046
7083
|
|
|
7047
7084
|
def visit_return_statement(node)
|
|
7048
|
-
|
|
7085
|
+
check_decl_or_stmt(node)
|
|
7086
|
+
@last_decl_or_stmt_location = node.location
|
|
7049
7087
|
end
|
|
7050
7088
|
|
|
7051
7089
|
private
|
|
7052
|
-
def
|
|
7053
|
-
if @
|
|
7054
|
-
@
|
|
7090
|
+
def check_decl_or_stmt(node)
|
|
7091
|
+
if @last_decl_or_stmt_location.fpath == node.location.fpath &&
|
|
7092
|
+
@last_decl_or_stmt_location.line_no == node.location.line_no
|
|
7055
7093
|
W(:W0425, node.location)
|
|
7056
|
-
else
|
|
7057
|
-
@decl_location = node.location
|
|
7058
7094
|
end
|
|
7059
7095
|
end
|
|
7060
7096
|
|
|
7061
|
-
def
|
|
7062
|
-
if @
|
|
7063
|
-
@
|
|
7097
|
+
def check_member_decl(node)
|
|
7098
|
+
if @last_memb_decl_location.fpath == node.location.fpath &&
|
|
7099
|
+
@last_memb_decl_location.line_no == node.location.line_no
|
|
7064
7100
|
W(:W0425, node.location)
|
|
7065
|
-
else
|
|
7066
|
-
@stmt_location = node.location
|
|
7067
7101
|
end
|
|
7068
7102
|
end
|
|
7069
7103
|
|
|
@@ -1153,8 +1153,10 @@ module CBuiltin #:nodoc:
|
|
|
1153
1153
|
|
|
1154
1154
|
private
|
|
1155
1155
|
def check(macro, replacing_tokens, args, *)
|
|
1156
|
-
|
|
1157
|
-
|
|
1156
|
+
unless macro.parameter_names.empty?
|
|
1157
|
+
if args.any? { |arg| arg.empty? }
|
|
1158
|
+
W(:W0692, replacing_tokens.first.location, macro.name.value)
|
|
1159
|
+
end
|
|
1158
1160
|
end
|
|
1159
1161
|
end
|
|
1160
1162
|
end
|
data/lib/adlint/traits.rb
CHANGED
|
@@ -90,7 +90,7 @@ module AdLint #:nodoc:
|
|
|
90
90
|
end
|
|
91
91
|
validate_version(doc["version"])
|
|
92
92
|
|
|
93
|
-
@exam_packages = doc["exam_packages"].uniq.map { |name|
|
|
93
|
+
@exam_packages = (doc["exam_packages"] || []).uniq.map { |name|
|
|
94
94
|
ExaminationPackage.new(name)
|
|
95
95
|
}.freeze
|
|
96
96
|
|
|
@@ -105,7 +105,7 @@ module AdLint #:nodoc:
|
|
|
105
105
|
def validate_version(version)
|
|
106
106
|
version == TRAITS_SCHEMA_VERSION or
|
|
107
107
|
raise "invalid version of the trailts file.\n" +
|
|
108
|
-
"
|
|
108
|
+
"regenerate or migrate traits file by new `adlintize' command."
|
|
109
109
|
end
|
|
110
110
|
end
|
|
111
111
|
|
|
@@ -114,13 +114,11 @@ module AdLint #:nodoc:
|
|
|
114
114
|
|
|
115
115
|
def initialize(doc)
|
|
116
116
|
@project_name = doc["project_name"]
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
end
|
|
123
|
-
|
|
117
|
+
@project_root = Pathname.new(doc["project_root"])
|
|
118
|
+
@include_path =
|
|
119
|
+
(doc["include_path"] || []).compact.map { |compound_path_str|
|
|
120
|
+
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
|
121
|
+
}.flatten
|
|
124
122
|
@initial_header = doc["initial_header"]
|
|
125
123
|
@coding_style = CodingStyle.new(doc["coding_style"])
|
|
126
124
|
@file_encoding = doc["file_encoding"]
|
|
@@ -133,6 +131,9 @@ module AdLint #:nodoc:
|
|
|
133
131
|
attr_reader :project_name
|
|
134
132
|
ensure_presence_of :project_name
|
|
135
133
|
|
|
134
|
+
attr_reader :project_root
|
|
135
|
+
ensure_dir_presence_of :project_root
|
|
136
|
+
|
|
136
137
|
attr_reader :include_path
|
|
137
138
|
ensure_dirs_presence_of :include_path
|
|
138
139
|
|
|
@@ -197,13 +198,10 @@ module AdLint #:nodoc:
|
|
|
197
198
|
|
|
198
199
|
def initialize(doc)
|
|
199
200
|
@standard_type = StandardType.new(doc["standard_type"])
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
@include_path = []
|
|
205
|
-
end
|
|
206
|
-
|
|
201
|
+
@include_path =
|
|
202
|
+
(doc["include_path"] || []).compact.map { |compound_path_str|
|
|
203
|
+
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
|
204
|
+
}.flatten
|
|
207
205
|
@initial_header = doc["initial_header"]
|
|
208
206
|
@arithmetic = Arithmetic.new(doc["arithmetic"])
|
|
209
207
|
@extension_substitution = doc["extension_substitution"] || {}
|
|
@@ -491,14 +489,21 @@ module AdLint #:nodoc:
|
|
|
491
489
|
def initialize(doc)
|
|
492
490
|
@language = doc["language"]
|
|
493
491
|
@message_with_class = doc["message_with_class"]
|
|
494
|
-
@
|
|
492
|
+
@warn_files_in =
|
|
493
|
+
(doc["warn_files_in"] || []).compact.map { |compound_path_str|
|
|
494
|
+
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
|
495
|
+
}.flatten
|
|
496
|
+
@warn_files_not_in =
|
|
497
|
+
(doc["warn_files_not_in"] || []).compact.map { |compound_path_str|
|
|
498
|
+
compound_path_str.split(":").map { |str| Pathname.new(str) }
|
|
499
|
+
}.flatten
|
|
495
500
|
@individual_selection = doc["individual_selection"]
|
|
496
501
|
@exclusion = Exclusion.new(doc["exclusion"])
|
|
497
502
|
@inclusion = Inclusion.new(doc["inclusion"])
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
503
|
+
@change_list =
|
|
504
|
+
(doc["change_list"] || []).each_with_object({}) { |(id, content), hash|
|
|
505
|
+
hash[[content["package"], id.intern]] = content
|
|
506
|
+
}
|
|
502
507
|
end
|
|
503
508
|
|
|
504
509
|
def name
|
|
@@ -511,8 +516,11 @@ module AdLint #:nodoc:
|
|
|
511
516
|
attr_reader :message_with_class
|
|
512
517
|
ensure_true_or_false_of :message_with_class
|
|
513
518
|
|
|
514
|
-
attr_reader :
|
|
515
|
-
|
|
519
|
+
attr_reader :warn_files_in
|
|
520
|
+
ensure_dirs_presence_of :warn_files_in
|
|
521
|
+
|
|
522
|
+
attr_reader :warn_files_not_in
|
|
523
|
+
ensure_dirs_presence_of :warn_files_not_in
|
|
516
524
|
|
|
517
525
|
attr_reader :individual_selection
|
|
518
526
|
ensure_true_or_false_of :individual_selection
|
|
@@ -589,6 +597,12 @@ module AdLint #:nodoc:
|
|
|
589
597
|
|
|
590
598
|
def freeze
|
|
591
599
|
@language.freeze
|
|
600
|
+
@message_with_class.freeze
|
|
601
|
+
@warn_files_in.freeze
|
|
602
|
+
@warn_files_not_in.freeze
|
|
603
|
+
@individual_selection.freeze
|
|
604
|
+
@exclusion.freeze
|
|
605
|
+
@inclusion.freeze
|
|
592
606
|
@change_list.freeze
|
|
593
607
|
super
|
|
594
608
|
end
|
data/lib/adlint/util.rb
CHANGED
|
@@ -367,6 +367,12 @@ module AdLint #:nodoc:
|
|
|
367
367
|
def execute(attr_owner)
|
|
368
368
|
value = target_value(attr_owner)
|
|
369
369
|
|
|
370
|
+
if value.empty?
|
|
371
|
+
@errors.push("`#{qualified_attr_name(attr_owner)}' " +
|
|
372
|
+
"is not specified.")
|
|
373
|
+
return false
|
|
374
|
+
end
|
|
375
|
+
|
|
370
376
|
bad_exams = value.reject { |exam_package| exam_package.load }
|
|
371
377
|
|
|
372
378
|
unless bad_exams.empty?
|
data/lib/adlint/version.rb
CHANGED
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
module AdLint #:nodoc:
|
|
33
33
|
|
|
34
34
|
MAJOR_VERSION = 2
|
|
35
|
-
MINOR_VERSION =
|
|
35
|
+
MINOR_VERSION = 4
|
|
36
36
|
PATCH_VERSION = 0
|
|
37
|
-
RELEASE_DATE = "2012-09-
|
|
37
|
+
RELEASE_DATE = "2012-09-21"
|
|
38
38
|
|
|
39
|
-
TRAITS_SCHEMA_VERSION = "2.
|
|
39
|
+
TRAITS_SCHEMA_VERSION = "2.4.0"
|
|
40
40
|
|
|
41
41
|
SHORT_VERSION = "#{MAJOR_VERSION}.#{MINOR_VERSION}.#{PATCH_VERSION}"
|
|
42
42
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<html lang="ja">
|
|
2
2
|
<head>
|
|
3
|
-
<title>AdLint 2.
|
|
3
|
+
<title>AdLint 2.4.0 開発者ガイド</title>
|
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
5
|
-
<meta name="description" content="AdLint 2.
|
|
5
|
+
<meta name="description" content="AdLint 2.4.0 開発者ガイド">
|
|
6
6
|
<meta name="generator" content="makeinfo 4.13">
|
|
7
7
|
<link title="Top" rel="top" href="#Top">
|
|
8
8
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
|
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
|
|
|
44
44
|
--></style>
|
|
45
45
|
</head>
|
|
46
46
|
<body>
|
|
47
|
-
<h1 class="settitle">AdLint 2.
|
|
47
|
+
<h1 class="settitle">AdLint 2.4.0 開発者ガイド</h1>
|
|
48
48
|
<div class="contents">
|
|
49
49
|
<h2>Table of Contents</h2>
|
|
50
50
|
<ul>
|