/[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 93173 by zurfluhs, Fri Oct 25 16:09:21 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)                                          l_rules.item.prepare_checking (l_rules_checker)
41                                    end
42                            end
43    
44                            across classes_to_analyze as l_classes loop
45                                    l_rules_checker.run_on_class (l_classes.item)
46    
47                                    rule_violations.extend (create {SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION]}.make, l_classes.item)
48    
49                                    -- TODO: perhaps replace by more elegant and performant solution
50                                    across rules as l_rules loop
51                                            across l_rules.item.violations as l_v loop
52                                                    rule_violations.at (l_classes.item).extend (l_v.item)
53                                            end
54                                            l_rules.item.violations.wipe_out
55                                  end                                  end
56                          end                          end
57    
58    --                      analysis_successful := l_rules_checker.last_run_successful
59    --                      if analysis_successful then
60    --                              rule_violations := l_rules_checker.last_result
61    --                      end
62    
63                            clear_classes_to_analyze
64                    ensure
65                            violation_list_exists: analysis_successful implies rule_violations /= Void
66                    end
67    
68            clear_classes_to_analyze
69                    do
70                            classes_to_analyze.wipe_out
71                    end
72    
73            add_whole_system
74                    local
75                            l_groups: LIST [CONF_GROUP]
76                            l_cluster: CLUSTER_I
77                    do
78                          from                          from
79                                  l_groups := eiffel_universe.groups                                  l_groups := eiffel_universe.groups
80                                  l_groups.start                                  l_groups.start
# Line 48  feature Line 84  feature
84                                  l_cluster ?= l_groups.item_for_iteration                                  l_cluster ?= l_groups.item_for_iteration
85                                          -- Only load top-level clusters, as they are loaded recursively afterwards                                          -- Only load top-level clusters, as they are loaded recursively afterwards
86                                  if l_cluster /= Void and then l_cluster.parent_cluster = Void then                                  if l_cluster /= Void and then l_cluster.parent_cluster = Void then
87                                          analyze_cluster (l_cluster)                                          add_cluster (l_cluster)
88                                  end                                  end
89                                  l_groups.forth                                  l_groups.forth
90                          end                          end
   
                         analysis_successful := rules_checker.last_run_successful  
                         if analysis_successful then  
                                 rule_violations := rules_checker.last_result  
                         end  
                 ensure  
                         violation_list_exists: analysis_successful implies rule_violations /= Void  
91                  end                  end
92    
93          analyze_cluster (a_cluster: CLUSTER_I)          add_cluster (a_cluster: CLUSTER_I)
94                  local                  local
95                          l_conf_class: CONF_CLASS                          l_conf_class: CONF_CLASS
96                          l_class_i: CLASS_I                          l_class_i: CLASS_I
# Line 73  feature Line 102  feature
102                          loop                          loop
103                                  l_conf_class := a_cluster.classes.item_for_iteration                                  l_conf_class := a_cluster.classes.item_for_iteration
104                                  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)
105                                  analyze_class_if_compiled (l_class_i)                                  add_class (l_class_i)
106                                  a_cluster.classes.forth                                  a_cluster.classes.forth
107                          end                          end
108                          if a_cluster.sub_clusters /= Void then                          if a_cluster.sub_clusters /= Void then
# Line 82  feature Line 111  feature
111                                  until                                  until
112                                          a_cluster.sub_clusters.after                                          a_cluster.sub_clusters.after
113                                  loop                                  loop
114                                          analyze_cluster (a_cluster.sub_clusters.item_for_iteration)                                          add_cluster (a_cluster.sub_clusters.item_for_iteration)
115                                          a_cluster.sub_clusters.forth                                          a_cluster.sub_clusters.forth
116                                  end                                  end
117                          end                          end
118                  end                  end
119    
120          analyze_classes (classes: LINKED_LIST[CLASS_AS])          add_classes (a_classes: ITERABLE[CLASS_I])
121                  do                  do
122                            across a_classes as l_classes loop
123                  ensure                                  add_class (l_classes.item)
124                          violation_list_exists: analysis_successful implies rule_violations /= Void                          end
125                  end                  end
126    
127          analyze_class (a_class_to_analyze: CLASS_AS)          add_class (a_class: CLASS_I)
128                    local
129                            l_class_c: CLASS_C
130                  do                  do
131                          create rules_checker.make                          if a_class.is_compiled then
132                          across rules as l_rules loop                                  l_class_c := a_class.compiled_class
133                                  if l_rules.item.is_enabled then -- important: only add enabled rules                                  check l_class_c /= Void end
134                                          rules_checker.add_rule_checker (l_rules.item.rule_checker)                                  print ("Analyzing class " + a_class.name + "...%N")
135                                  end                                  classes_to_analyze.extend (l_class_c)
136                          end                          else
137                                    print ("Class " + a_class.name + " not compiled (skipped).%N")
                         rules_checker.run_on_class (a_class_to_analyze)  
                         analysis_successful := rules_checker.last_run_successful  
                         if analysis_successful then  
                                 rule_violations := rules_checker.last_result  
138                          end                          end
                 ensure  
                         violation_list_exists: analysis_successful implies rule_violations /= Void  
139                  end                  end
140    
141  feature  feature -- Properties
142    
143          analysis_successful: BOOLEAN          analysis_successful: BOOLEAN
144    
145          rules: LINKED_LIST[CA_RULE]          rules: LINKED_LIST[CA_RULE]
146    
147          rule_violations: detachable LINKED_LIST[CA_RULE_VIOLATION]          rule_violations: detachable HASH_TABLE[SORTED_TWO_WAY_LIST[CA_RULE_VIOLATION], CLASS_C]
148    
149  feature {NONE} -- Implementation  feature {NONE} -- Implementation
150    
151          settings: CA_SETTINGS          settings: CA_SETTINGS
152    
153          analyze_class_if_compiled (a_class: CLASS_I)  --      analyze_class_if_compiled (a_class: CLASS_I)
154                  local  --              local
155                          l_class_c: CLASS_C  --                      l_class_c: CLASS_C
156                  do  --              do
157                          if a_class.is_compiled then  --                      if a_class.is_compiled then
158                                  l_class_c := a_class.compiled_class  --                              l_class_c := a_class.compiled_class
159                                  check l_class_c /= Void end  --                              check l_class_c /= Void end
160                                  print ("Analyzing class " + a_class.name + "...%N")  --                              print ("Analyzing class " + a_class.name + "...%N")
161                                  rules_checker.run_on_class (l_class_c.ast)  --                              rules_checker.run_on_class (l_class_c.ast)
162                          else  --                      else
163                                  print ("Class " + a_class.name + " not compiled (skipped).%N")  --                              print ("Class " + a_class.name + " not compiled (skipped).%N")
164                          end  --                      end
165                  end  --              end
166    
167          rules_checker: CA_ALL_RULES_CHECKER          classes_to_analyze: LINKED_SET[CLASS_C]
168    
169  end  end

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

  ViewVC Help
Powered by ViewVC 1.1.23