/[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 93177 by zurfluhs, Mon Oct 28 22:16:38 2013 UTC revision 93389 by zurfluhs, Fri Nov 15 17:19:03 2013 UTC
# Line 9  class Line 9  class
9    
10  inherit {NONE}  inherit {NONE}
11          SHARED_EIFFEL_PROJECT          SHARED_EIFFEL_PROJECT
12            CA_SHARED_NAMES
13    
14  create  create
15          make          make
# Line 23  feature {NONE} -- Initialization Line 24  feature {NONE} -- Initialization
24                          -- Adding example rules                          -- Adding example 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)
28                            rules.extend (create {CA_EMPTY_IF_RULE}.make)
29                            rules.extend (create {CA_FEATURE_NEVER_CALLED_RULE}.make)
30                            rules.extend (create {CA_CQ_SEPARATION_RULE}.make)
31    
32                            -- Issues (contract violations, exceptions) with {EPA_CFG_BUILDER} and
33                            -- classes from library 'program_analysis' in general.
34    --                      rules.extend (create {CA_VARIABLE_NOT_READ_RULE}.make)
35    
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
39                  end                  end
40    
41  feature -- Analysis interface  feature -- Analysis interface
42    
43            add_completed_action (a_action: PROCEDURE [ANY, TUPLE [BOOLEAN] ])
44                    do
45                            completed_actions.extend (a_action)
46                    end
47    
48          analyze          analyze
49                    require
50                            not is_running
51                  local                  local
52                          l_rules_checker: CA_ALL_RULES_CHECKER                          l_rules_checker: CA_ALL_RULES_CHECKER
53                            l_task: CA_RULE_CHECKING_TASK
54                  do                  do
55                            is_running := True
56                                    -- TODO: caching
57                            rule_violations.wipe_out
58    
59                          create l_rules_checker.make                          create l_rules_checker.make
60                          across rules as l_rules loop                          across rules as l_rules loop
61                                    l_rules.item.clear_violations
62                                  if l_rules.item.is_enabled then -- important: only add enabled rules                                  if l_rules.item.is_enabled then -- important: only add enabled rules
63                                          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
64                                                  -- 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
65                                                  l_rules.item.prepare_checking (l_rules_checker)                                                  if attached {CA_STANDARD_RULE} l_rules.item as l_std_rule then
66                                                            l_std_rule.prepare_checking (l_rules_checker)
67                                                                    -- TODO: prepare rules of other types?
68                                                    end
69                                          end                                          end
70                                  end                                  end
71                          end                          end
72    
73                          across classes_to_analyze as l_classes loop                                  -- TODO: call rule checker
74                            create l_task.make (l_rules_checker, rules, classes_to_analyze, agent analysis_completed)
75                                  -- TODO: more elegant and performant solution?                          rota.run_task (l_task)
                                 across rules as l_rules loop  
                                         l_rules.item.set_checking_class (l_classes.item)  
                                 end  
   
                                 l_rules_checker.run_on_class (l_classes.item)  
   
                                 rule_violations.extend (create {SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION]}.make, l_classes.item)  
                         end  
   
                         across rules as l_rules loop  
                                 across l_rules.item.violations as l_v loop  
                                         rule_violations.at (l_v.item.affected_class).extend (l_v.item)  
                                 end  
                         end  
   
                         clear_classes_to_analyze  
                 ensure  
                         violation_list_exists: analysis_successful implies rule_violations /= Void  
76                  end                  end
77    
78          clear_classes_to_analyze          clear_classes_to_analyze
# Line 123  feature -- Analysis interface Line 131  feature -- Analysis interface
131                          end                          end
132                  end                  end
133    
134            add_group (a_group: CONF_GROUP)
135                    require
136                            a_group_not_void: a_group /= Void
137                    local
138                            l_conf_class: CONF_CLASS
139                            l_class_i: CLASS_I
140                    do
141                            from
142                                    a_group.classes.start
143                            until
144                                    a_group.classes.after
145                            loop
146                                    l_conf_class := a_group.classes.item_for_iteration
147                                    l_class_i := eiffel_universe.class_named (l_conf_class.name, a_group)
148                                    add_class (l_class_i)
149                                    a_group.classes.forth
150                            end
151                    end
152    
153          add_classes (a_classes: ITERABLE[CLASS_I])          add_classes (a_classes: ITERABLE[CLASS_I])
154                  do                  do
155                          system_wide_check := False                          system_wide_check := False
# Line 141  feature -- Analysis interface Line 168  feature -- Analysis interface
168                          if a_class.is_compiled then                          if a_class.is_compiled then
169                                  l_class_c := a_class.compiled_class                                  l_class_c := a_class.compiled_class
170                                  check l_class_c /= Void end                                  check l_class_c /= Void end
                                 print ("Analyzing class " + a_class.name + "...%N")  
171                                  classes_to_analyze.extend (l_class_c)                                  classes_to_analyze.extend (l_class_c)
172                          else                          else
173                                  print ("Class " + a_class.name + " not compiled (skipped).%N")                                  print ("Class " + a_class.name + " not compiled (skipped).%N")
# Line 150  feature -- Analysis interface Line 176  feature -- Analysis interface
176    
177  feature -- Properties  feature -- Properties
178    
179            is_running: BOOLEAN
180    
181          analysis_successful: BOOLEAN          analysis_successful: BOOLEAN
182    
183          rules: LINKED_LIST[CA_RULE]          rules: LINKED_LIST[CA_RULE]
# Line 158  feature -- Properties Line 186  feature -- Properties
186    
187  feature {NONE} -- Implementation  feature {NONE} -- Implementation
188    
189            analysis_completed
190                    do
191                            across classes_to_analyze as l_classes loop
192                                    rule_violations.extend (create {SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION]}.make, l_classes.item)
193                            end
194    
195                            across rules as l_rules loop
196                                    across l_rules.item.violations as l_v loop
197                                            rule_violations.at (l_v.item.affected_class).extend (l_v.item)
198                                    end
199                            end
200    
201                            clear_classes_to_analyze
202    
203                            is_running := False
204                            completed_actions.call ([True])
205                            completed_actions.wipe_out
206                    end
207    
208          settings: CA_SETTINGS          settings: CA_SETTINGS
209    
210          classes_to_analyze: LINKED_SET[CLASS_C]          classes_to_analyze: LINKED_SET [CLASS_C]
211    
212          system_wide_check: BOOLEAN          system_wide_check: BOOLEAN
213    
214            completed_actions: ACTION_SEQUENCE [TUPLE [BOOLEAN]]
215    
216            frozen rota: detachable ROTA_S
217                            -- Access to rota service
218                    local
219                            l_service_consumer: SERVICE_CONSUMER [ROTA_S]
220                    do
221                            create l_service_consumer
222                            if l_service_consumer.is_service_available and then l_service_consumer.service.is_interface_usable then
223                                    Result := l_service_consumer.service
224                            end
225                    end
226    
227  end  end

Legend:
Removed from v.93177  
changed lines
  Added in v.93389

  ViewVC Help
Powered by ViewVC 1.1.23