/[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 93168 by zurfluhs, Thu Oct 24 19:43:13 2013 UTC revision 93177 by zurfluhs, Mon Oct 28 22:16:38 2013 UTC
# Line 23  feature {NONE} -- Initialization Line 23  feature {NONE} -- Initialization
23                          -- Adding example rules                          -- Adding example rules
24                          rules.extend (create {CA_SELF_ASSIGNMENT_RULE}.make)                          rules.extend (create {CA_SELF_ASSIGNMENT_RULE}.make)
25                          rules.extend (create {CA_UNUSED_ARGUMENT_RULE}.make)                          rules.extend (create {CA_UNUSED_ARGUMENT_RULE}.make)
26    
27                            create classes_to_analyze.make
28                            create rule_violations.make (100)
29                  end                  end
30    
31  feature  feature -- Analysis interface
32    
33          analyze_system          analyze
34                  local                  local
35                          l_groups: LIST [CONF_GROUP]                          l_rules_checker: CA_ALL_RULES_CHECKER
                         l_cluster: CLUSTER_I  
36                  do                  do
37                          create rules_checker.make                          create l_rules_checker.make
38                          across rules as l_rules loop                          across rules as l_rules loop
39                                  if l_rules.item.is_enabled then -- important: only add enabled rules                                  if l_rules.item.is_enabled then -- important: only add enabled rules
40                                          rules_checker.add_rule_checker (l_rules.item.rule_checker)                                          if system_wide_check or else (not l_rules.item.is_system_wide) then
41                                                    -- do not add system wide rules if we check only parts of the system
42                                                    l_rules.item.prepare_checking (l_rules_checker)
43                                            end
44                                    end
45                            end
46    
47                            across classes_to_analyze as l_classes loop
48    
49                                    -- TODO: more elegant and performant solution?
50                                    across rules as l_rules loop
51                                            l_rules.item.set_checking_class (l_classes.item)
52                                  end                                  end
53    
54                                    l_rules_checker.run_on_class (l_classes.item)
55    
56                                    rule_violations.extend (create {SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION]}.make, l_classes.item)
57                          end                          end
58    
59                            across rules as l_rules loop
60                                    across l_rules.item.violations as l_v loop
61                                            rule_violations.at (l_v.item.affected_class).extend (l_v.item)
62                                    end
63                            end
64    
65                            clear_classes_to_analyze
66                    ensure
67                            violation_list_exists: analysis_successful implies rule_violations /= Void
68                    end
69    
70            clear_classes_to_analyze
71                    do
72                            classes_to_analyze.wipe_out
73                    end
74    
75            add_whole_system
76                    local
77                            l_groups: LIST [CONF_GROUP]
78                            l_cluster: CLUSTER_I
79                    do
80                          from                          from
81                                  l_groups := eiffel_universe.groups                                  l_groups := eiffel_universe.groups
82                                  l_groups.start                                  l_groups.start
# Line 48  feature Line 86  feature
86                                  l_cluster ?= l_groups.item_for_iteration                                  l_cluster ?= l_groups.item_for_iteration
87                                          -- Only load top-level clusters, as they are loaded recursively afterwards                                          -- Only load top-level clusters, as they are loaded recursively afterwards
88                                  if l_cluster /= Void and then l_cluster.parent_cluster = Void then                                  if l_cluster /= Void and then l_cluster.parent_cluster = Void then
89                                          analyze_cluster (l_cluster)                                          add_cluster (l_cluster)
90                                  end                                  end
91                                  l_groups.forth                                  l_groups.forth
92                          end                          end
93    
94                          analysis_successful := rules_checker.last_run_successful                          system_wide_check := True
                         if analysis_successful then  
                                 rule_violations := rules_checker.last_result  
                         end  
                 ensure  
                         violation_list_exists: analysis_successful implies rule_violations /= Void  
95                  end                  end
96    
97          analyze_cluster (a_cluster: CLUSTER_I)          add_cluster (a_cluster: CLUSTER_I)
98                  local                  local
99                          l_conf_class: CONF_CLASS                          l_conf_class: CONF_CLASS
100                          l_class_i: CLASS_I                          l_class_i: CLASS_I
101                  do                  do
102                            system_wide_check := False
103    
104                          from                          from
105                                  a_cluster.classes.start                                  a_cluster.classes.start
106                          until                          until
# Line 73  feature Line 108  feature
108                          loop                          loop
109                                  l_conf_class := a_cluster.classes.item_for_iteration                                  l_conf_class := a_cluster.classes.item_for_iteration
110                                  l_class_i := eiffel_universe.class_named (l_conf_class.name, a_cluster)                                  l_class_i := eiffel_universe.class_named (l_conf_class.name, a_cluster)
111                                  analyze_class_if_compiled (l_class_i)                                  add_class (l_class_i)
112                                  a_cluster.classes.forth                                  a_cluster.classes.forth
113                          end                          end
114                          if a_cluster.sub_clusters /= Void then                          if a_cluster.sub_clusters /= Void then
# Line 82  feature Line 117  feature
117                                  until                                  until
118                                          a_cluster.sub_clusters.after                                          a_cluster.sub_clusters.after
119                                  loop                                  loop
120                                          analyze_cluster (a_cluster.sub_clusters.item_for_iteration)                                          add_cluster (a_cluster.sub_clusters.item_for_iteration)
121                                          a_cluster.sub_clusters.forth                                          a_cluster.sub_clusters.forth
122                                  end                                  end
123                          end                          end
124                  end                  end
125    
126          analyze_classes (classes: LINKED_LIST[CLASS_AS])          add_classes (a_classes: ITERABLE[CLASS_I])
127                  do                  do
128                            system_wide_check := False
129    
130                  ensure                          across a_classes as l_classes loop
131                          violation_list_exists: analysis_successful implies rule_violations /= Void                                  add_class (l_classes.item)
132                            end
133                  end                  end
134    
135          analyze_class (a_class_to_analyze: CLASS_AS)          add_class (a_class: CLASS_I)
136                    local
137                            l_class_c: CLASS_C
138                  do                  do
139                          create rules_checker.make                          system_wide_check := False
                         across rules as l_rules loop  
                                 if l_rules.item.is_enabled then -- important: only add enabled rules  
                                         rules_checker.add_rule_checker (l_rules.item.rule_checker)  
                                 end  
                         end  
140    
141                          rules_checker.run_on_class (a_class_to_analyze)                          if a_class.is_compiled then
142                          analysis_successful := rules_checker.last_run_successful                                  l_class_c := a_class.compiled_class
143                          if analysis_successful then                                  check l_class_c /= Void end
144                                  rule_violations := rules_checker.last_result                                  print ("Analyzing class " + a_class.name + "...%N")
145                                    classes_to_analyze.extend (l_class_c)
146                            else
147                                    print ("Class " + a_class.name + " not compiled (skipped).%N")
148                          end                          end
                 ensure  
                         violation_list_exists: analysis_successful implies rule_violations /= Void  
149                  end                  end
150    
151  feature  feature -- Properties
152    
153          analysis_successful: BOOLEAN          analysis_successful: BOOLEAN
154    
155          rules: LINKED_LIST[CA_RULE]          rules: LINKED_LIST[CA_RULE]
156    
157          rule_violations: detachable LINKED_LIST[CA_RULE_VIOLATION]          rule_violations: detachable HASH_TABLE[SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION], CLASS_C]
158    
159  feature {NONE} -- Implementation  feature {NONE} -- Implementation
160    
161          settings: CA_SETTINGS          settings: CA_SETTINGS
162    
163          analyze_class_if_compiled (a_class: CLASS_I)          classes_to_analyze: LINKED_SET[CLASS_C]
                 local  
                         l_class_c: CLASS_C  
                 do  
                         if a_class.is_compiled then  
                                 l_class_c := a_class.compiled_class  
                                 check l_class_c /= Void end  
                                 print ("Analyzing class " + a_class.name + "...%N")  
                                 rules_checker.run_on_class (l_class_c.ast)  
                         else  
                                 print ("Class " + a_class.name + " not compiled (skipped).%N")  
                         end  
                 end  
164    
165          rules_checker: CA_ALL_RULES_CHECKER          system_wide_check: BOOLEAN
166    
167  end  end

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

  ViewVC Help
Powered by ViewVC 1.1.23