/[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 93951 by zurfluhs, Fri Jan 10 12:48:38 2014 UTC revision 93963 by zurfluhs, Sun Jan 12 19:50:44 2014 UTC
# Line 1  Line 1 
1  note  note
2          description: "Summary description for {CA_CODE_ANALYZER}."          description: "THE Code Analyzer."
3          author: "Stefan Zurfluh"          author: "Stefan Zurfluh"
4          date: "$Date$"          date: "$Date$"
5          revision: "$Revision$"          revision: "$Revision$"
# Line 21  feature {NONE} -- Initialization Line 21  feature {NONE} -- Initialization
21                  do                  do
22                          create settings.make                          create settings.make
23                          create rules.make                          create rules.make
24                                  -- Adding example rules.                                  -- Adding the rules.
25                          rules.extend (create {CA_SELF_ASSIGNMENT_RULE}.make)                          rules.extend (create {CA_SELF_ASSIGNMENT_RULE}.make)
26                          rules.extend (create {CA_UNUSED_ARGUMENT_RULE}.make)                          rules.extend (create {CA_UNUSED_ARGUMENT_RULE}.make)
27                          rules.extend (create {CA_NPATH_RULE}.make (settings.preference_manager))                          rules.extend (create {CA_NPATH_RULE}.make (settings.preference_manager))
# Line 73  feature {NONE} -- Initialization Line 73  feature {NONE} -- Initialization
73  feature -- Analysis interface  feature -- Analysis interface
74    
75          add_completed_action (a_action: PROCEDURE [ANY, TUPLE [BOOLEAN]])          add_completed_action (a_action: PROCEDURE [ANY, TUPLE [BOOLEAN]])
76                            -- Adds `a_action' to the list of procedures that will be
77                            -- called when analysis has completed.
78                  do                  do
79                          completed_actions.extend (a_action)                          completed_actions.extend (a_action)
80                  end                  end
81    
82          analyze          analyze
83                            -- Analyze all the classes that have been added.
84                  require                  require
85                          not is_running                          not is_running
86                  local                  local
# Line 106  feature -- Analysis interface Line 109  feature -- Analysis interface
109                  end                  end
110    
111          clear_classes_to_analyze          clear_classes_to_analyze
112                            -- Remove all classes that have been added to the list of classes
113                            -- to analyze.
114                  do                  do
115                          classes_to_analyze.wipe_out                          classes_to_analyze.wipe_out
116                  end                  end
117    
118          add_whole_system          add_whole_system
119                            -- Add all the classes that are part of the current system. Classes of references libraries
120                            -- will not be added.
121                  local                  local
122                          l_groups: LIST [CONF_GROUP]                          l_groups: LIST [CONF_GROUP]
123                          l_cluster: CLUSTER_I                          l_cluster: CLUSTER_I
# Line 133  feature -- Analysis interface Line 140  feature -- Analysis interface
140                  end                  end
141    
142          add_cluster (a_cluster: CLUSTER_I)          add_cluster (a_cluster: CLUSTER_I)
143                            -- Add all classes of cluster `a_cluster'.
144                  local                  local
145                          l_conf_class: CONF_CLASS                          l_conf_class: CONF_CLASS
146                          l_class_i: CLASS_I                          l_class_i: CLASS_I
# Line 162  feature -- Analysis interface Line 170  feature -- Analysis interface
170                  end                  end
171    
172          add_group (a_group: CONF_GROUP)          add_group (a_group: CONF_GROUP)
173                            -- Add all classes of the configuration group `a_group'.
174                  require                  require
175                          a_group_not_void: a_group /= Void                          a_group_not_void: a_group /= Void
176                  local                  local
# Line 181  feature -- Analysis interface Line 190  feature -- Analysis interface
190                  end                  end
191    
192          add_classes (a_classes: ITERABLE [CLASS_I])          add_classes (a_classes: ITERABLE [CLASS_I])
193                            -- Add the classes `a_classes'.
194                  do                  do
195                          system_wide_check := False                          system_wide_check := False
196    
# Line 190  feature -- Analysis interface Line 200  feature -- Analysis interface
200                  end                  end
201    
202          add_class (a_class: CLASS_I)          add_class (a_class: CLASS_I)
203                            -- Adds class `a_class'.
204                  local                  local
205                          l_class_c: CLASS_C                          l_class_c: CLASS_C
206                  do                  do
# Line 209  feature -- Analysis interface Line 220  feature -- Analysis interface
220  feature -- Properties  feature -- Properties
221    
222          is_running: BOOLEAN          is_running: BOOLEAN
223                            -- Is code analysis running?
         analysis_successful: BOOLEAN  
224    
225          rules: LINKED_LIST [CA_RULE]          rules: LINKED_LIST [CA_RULE]
226                            -- List of rules that will be used for analysis.
227    
228          rule_violations: detachable HASH_TABLE [SORTED_TWO_WAY_LIST [CA_RULE_VIOLATION], CLASS_C]          rule_violations: detachable HASH_TABLE [SORTED_TWO_WAY_LIST [CA_RULE_VIOLATION], CLASS_C]
229                            -- All found violations from the last analysis.
230    
231          preferences: PREFERENCES          preferences: PREFERENCES
232                            -- Code Analysis preferences.
233                  do Result := settings.preferences end                  do Result := settings.preferences end
234    
235          class_list: ITERABLE [CLASS_C]          class_list: ITERABLE [CLASS_C]
236                            -- List of classes that have been added.
237                  do Result := classes_to_analyze end                  do Result := classes_to_analyze end
238    
239  feature {NONE} -- Implementation  feature {NONE} -- Implementation
240    
241          analysis_completed          analysis_completed
242                            -- Will be called when the analysis task has finished.
243                  do                  do
 --                      across classes_to_analyze as l_classes loop  
 --                              rule_violations.extend (create {SORTED_TWO_WAY_LIST [CA_RULE_VIOLATION]}.make, l_classes.item)  
 --                      end  
   
244                          across rules as l_rules loop                          across rules as l_rules loop
245                                  across l_rules.item.violations as l_v loop                                  across l_rules.item.violations as l_v loop
246                                                  -- Check the ignore list.                                                  -- Check the ignore list.
# Line 250  feature {NONE} -- Implementation Line 261  feature {NONE} -- Implementation
261                  end                  end
262    
263          is_violation_valid (a_viol: CA_RULE_VIOLATION): BOOLEAN          is_violation_valid (a_viol: CA_RULE_VIOLATION): BOOLEAN
264                            -- Is the violation `a_viol' valid under the current settings
265                            -- such as the rule ignore list of a class, or the library or
266                            -- non-library status of a class?
267                  local                  local
268                          l_affected_class: CLASS_C                          l_affected_class: CLASS_C
269                          l_rule: CA_RULE                          l_rule: CA_RULE
# Line 274  feature {NONE} -- Implementation Line 288  feature {NONE} -- Implementation
288                  end                  end
289    
290          settings: CA_SETTINGS          settings: CA_SETTINGS
291                            -- The settings manager for Code Analysis.
292    
293          classes_to_analyze: LINKED_SET [CLASS_C]          classes_to_analyze: LINKED_SET [CLASS_C]
294                            -- List of classes that shall be analyzed.
295    
296          system_wide_check: BOOLEAN          system_wide_check: BOOLEAN
297                            -- Shall the whole system be analyzed?
298    
299          completed_actions: ACTION_SEQUENCE [TUPLE [BOOLEAN]]          completed_actions: ACTION_SEQUENCE [TUPLE [BOOLEAN]]
300                            -- List of procedure to call when analysis has completed.
301    
302          frozen rota: detachable ROTA_S          frozen rota: detachable ROTA_S
303                          -- Accesses the rota service.                          -- Accesses the rota service.
# Line 296  feature {NONE} -- Implementation Line 314  feature {NONE} -- Implementation
314  feature {NONE} -- Class-wide Options (From Indexing Clauses)  feature {NONE} -- Class-wide Options (From Indexing Clauses)
315    
316          extract_indexes (a_class: CLASS_C)          extract_indexes (a_class: CLASS_C)
317                            -- Extracts options from the indexing clause of class `a_class'.
318                  local                  local
319                          l_ast: CLASS_AS                          l_ast: CLASS_AS
320                          l_item: STRING_32                          l_item: STRING_32
321                          l_ignoredby: LINKED_LIST [STRING_32]                          l_ignoredby: LINKED_LIST [STRING_32]
322                  do                  do
323                          create l_ignoredby.make                          create l_ignoredby.make
324                          l_ignoredby.compare_objects                          l_ignoredby.compare_objects -- We want to compare the actual strings.
325                                    -- Reset the class flags.
326                          library_class.force (False, a_class)                          library_class.force (False, a_class)
327                          nonlibrary_class.force (False, a_class)                          nonlibrary_class.force (False, a_class)
328                          l_ast := a_class.ast                          l_ast := a_class.ast
# Line 311  feature {NONE} -- Class-wide Options (Fr Line 331  feature {NONE} -- Class-wide Options (Fr
331                                  across l_ast.internal_top_indexes as l_indexes loop                                  across l_ast.internal_top_indexes as l_indexes loop
332    
333                                          if l_indexes.item.tag.name_32.is_equal ("ca_ignoredby") then                                          if l_indexes.item.tag.name_32.is_equal ("ca_ignoredby") then
334                                                            -- Class wants to ignore certain rules.
335                                                  across l_indexes.item.index_list as l_list loop                                                  across l_indexes.item.index_list as l_list loop
336                                                          l_item := l_list.item.string_value_32                                                          l_item := l_list.item.string_value_32
337                                                          l_item.prune_all ('%"')                                                          l_item.prune_all ('%"')
338                                                          l_ignoredby.extend (l_item)                                                          l_ignoredby.extend (l_item)
339                                                  end                                                  end
340                                          elseif l_indexes.item.tag.name_32.is_equal ("ca_library") then                                          elseif l_indexes.item.tag.name_32.is_equal ("ca_library") then
341                                                            -- Class has information on whether it is a library class.
342                                                  if not l_indexes.item.index_list.is_empty then                                                  if not l_indexes.item.index_list.is_empty then
343                                                          l_item := l_indexes.item.index_list.first.string_value_32                                                          l_item := l_indexes.item.index_list.first.string_value_32
344                                                          l_item.to_lower                                                          l_item.to_lower
# Line 335  feature {NONE} -- Class-wide Options (Fr Line 357  feature {NONE} -- Class-wide Options (Fr
357                  end                  end
358    
359          ignoredby: HASH_TABLE [LINKED_LIST [STRING_32], CLASS_C]          ignoredby: HASH_TABLE [LINKED_LIST [STRING_32], CLASS_C]
360                            -- Maps classes to lists of rules (rule IDs) the class wants to be ignored by.
361    
362          library_class, nonlibrary_class: HASH_TABLE [BOOLEAN, CLASS_C]          library_class, nonlibrary_class: HASH_TABLE [BOOLEAN, CLASS_C]
363                            -- Stores classes that are marked as library or non-library classes.
364    
365  invariant  invariant
366  --      law_of_non_contradiction: one class must not be both a library_class and a nonlibrary_class  --      law_of_non_contradiction: one class must not be both a library_class and a nonlibrary_class

Legend:
Removed from v.93951  
changed lines
  Added in v.93963

  ViewVC Help
Powered by ViewVC 1.1.23