/[eiffelstudio]/branches/eth/eve/Src/framework/code_analysis/ca_code_analyzer.e
ViewVC logotype

Diff of /branches/eth/eve/Src/framework/code_analysis/ca_code_analyzer.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 93425 by zurfluhs, Fri Nov 15 17:19:03 2013 UTC revision 93426 by zurfluhs, Tue Nov 19 08:45:14 2013 UTC
# Line 36  feature {NONE} -- Initialization Line 36  feature {NONE} -- Initialization
36                          create classes_to_analyze.make                          create classes_to_analyze.make
37                          create rule_violations.make (100)                          create rule_violations.make (100)
38                          create completed_actions                          create completed_actions
39    
40                            create ignoredby.make (25)
41                            create library_class.make (25)
42                            create nonlibrary_class.make (25)
43                  end                  end
44    
45  feature -- Analysis interface  feature -- Analysis interface
# Line 63  feature -- Analysis interface Line 67  feature -- Analysis interface
67                                          if system_wide_check or else (not l_rules.item.is_system_wide) then                                          if system_wide_check or else (not l_rules.item.is_system_wide) then
68                                                          -- do not add system wide rules if we check only parts of the system                                                          -- do not add system wide rules if we check only parts of the system
69                                                  if attached {CA_STANDARD_RULE} l_rules.item as l_std_rule then                                                  if attached {CA_STANDARD_RULE} l_rules.item as l_std_rule then
70    
71                                                          l_std_rule.prepare_checking (l_rules_checker)                                                          l_std_rule.prepare_checking (l_rules_checker)
72                                                                  -- TODO: prepare rules of other types?                                                                  -- TODO: prepare rules of other types?
73                                                  end                                                  end
# Line 70  feature -- Analysis interface Line 75  feature -- Analysis interface
75                                  end                                  end
76                          end                          end
77    
                                 -- TODO: call rule checker  
78                          create l_task.make (l_rules_checker, rules, classes_to_analyze, agent analysis_completed)                          create l_task.make (l_rules_checker, rules, classes_to_analyze, agent analysis_completed)
79                          rota.run_task (l_task)                          rota.run_task (l_task)
80                  end                  end
# Line 169  feature -- Analysis interface Line 173  feature -- Analysis interface
173                                  l_class_c := a_class.compiled_class                                  l_class_c := a_class.compiled_class
174                                  check l_class_c /= Void end                                  check l_class_c /= Void end
175                                  classes_to_analyze.extend (l_class_c)                                  classes_to_analyze.extend (l_class_c)
176    
177                                    extract_indexes (l_class_c)
178                          else                          else
179                                  print ("Class " + a_class.name + " not compiled (skipped).%N")                                  print ("Class " + a_class.name + " not compiled (skipped).%N")
180                          end                          end
# Line 194  feature {NONE} -- Implementation Line 200  feature {NONE} -- Implementation
200    
201                          across rules as l_rules loop                          across rules as l_rules loop
202                                  across l_rules.item.violations as l_v loop                                  across l_rules.item.violations as l_v loop
203                                          rule_violations.at (l_v.item.affected_class).extend (l_v.item)                                                  -- check the ignore list
204                                            if is_violation_valid (l_v.item) then
205                                                    rule_violations.at (l_v.item.affected_class).extend (l_v.item)
206                                            end
207                                  end                                  end
208                          end                          end
209    
# Line 205  feature {NONE} -- Implementation Line 214  feature {NONE} -- Implementation
214                          completed_actions.wipe_out                          completed_actions.wipe_out
215                  end                  end
216    
217            is_violation_valid (a_viol: CA_RULE_VIOLATION): BOOLEAN
218                    local
219                            l_affected_class: CLASS_C
220                            l_rule: CA_RULE
221                    do
222                            l_affected_class := a_viol.affected_class
223                            l_rule := a_viol.rule
224    
225                            Result := True
226    
227                            if (ignoredby.has (l_affected_class))
228                                                            and then (ignoredby.at (l_affected_class)).has (l_rule.id) then
229                                    Result := False
230                            end
231    
232                            if (not l_rule.checks_library_classes) and then library_class.at (l_affected_class) = True then
233                                    Result := False
234                            end
235    
236                            if (not l_rule.checks_nonlibrary_classes) and then nonlibrary_class.at (l_affected_class) = True then
237                                    Result := False
238                            end
239                    end
240    
241          settings: CA_SETTINGS          settings: CA_SETTINGS
242    
243          classes_to_analyze: LINKED_SET [CLASS_C]          classes_to_analyze: LINKED_SET [CLASS_C]
# Line 224  feature {NONE} -- Implementation Line 257  feature {NONE} -- Implementation
257                          end                          end
258                  end                  end
259    
260    
261    feature {NONE} -- Class-wide Options (From Indexing Clauses)
262    
263            extract_indexes (a_class: CLASS_C)
264                    local
265                            l_ast: CLASS_AS
266                            l_item: STRING
267                            l_ignoredby: LINKED_LIST [STRING]
268                    do
269                            create l_ignoredby.make
270                            l_ignoredby.compare_objects
271                            library_class.force (False, a_class)
272                            nonlibrary_class.force (False, a_class)
273                            l_ast := a_class.ast
274    
275                            across l_ast.internal_top_indexes as l_indexes loop
276    
277                                    if l_indexes.item.tag.name_8.is_equal ("ca_ignoredby") then
278                                            across l_indexes.item.index_list as l_list loop
279                                                    l_item := l_list.item.string_value_32
280                                                    l_item.prune_all ('%"')
281                                                    l_ignoredby.extend (l_item)
282                                            end
283                                    elseif l_indexes.item.tag.name_8.is_equal ("ca_library") then
284                                            if not l_indexes.item.index_list.is_empty then
285                                                    l_item := l_indexes.item.index_list.first.string_value_32
286                                                    l_item.to_lower
287                                                    l_item.prune_all ('%"')
288                                                    if l_item.is_equal ("true") then
289                                                            library_class.force (True, a_class)
290                                                    elseif l_item.is_equal ("false") then
291                                                            nonlibrary_class.force (True, a_class)
292                                                    end
293                                            end
294                                    end
295                            end
296    
297                            ignoredby.force (l_ignoredby, a_class)
298                    end
299    
300            ignoredby: HASH_TABLE [LINKED_LIST [STRING], CLASS_C]
301    
302            library_class, nonlibrary_class: HASH_TABLE [BOOLEAN, CLASS_C]
303    
304    invariant
305    --      law_of_non_contradiction: one class must not be both a library_class and a nonlibrary_class
306    
307  end  end

Legend:
Removed from v.93425  
changed lines
  Added in v.93426

  ViewVC Help
Powered by ViewVC 1.1.23