/[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 95330 by jasonw, Fri Jun 13 08:20:35 2014 UTC revision 95331 by jasonw, Fri Jun 27 08:57:34 2014 UTC
# Line 19  feature {NONE} -- Initialization Line 19  feature {NONE} -- Initialization
19    
20          make          make
21                          -- Initialization for `Current'.                          -- Initialization for `Current'.
                 local  
                         l_rule_sorter: QUICK_SORTER [CA_RULE]  
                         l_rule_comparator: AGENT_EQUALITY_TESTER [CA_RULE]  
22                  do                  do
23                          create settings.make                          create settings.make
24                          create rules.make (80)                          create rules.make_caseless (100) -- Rule IDs should be case insensitive.
25    
26                                  -- Adding the rules.                                  -- Adding the rules.
27                          rules.extend (create {CA_SELF_ASSIGNMENT_RULE}.make)                          add_rule (create {CA_SELF_ASSIGNMENT_RULE}.make)
28                          rules.extend (create {CA_UNUSED_ARGUMENT_RULE}.make)                          add_rule (create {CA_UNUSED_ARGUMENT_RULE}.make)
29                          rules.extend (create {CA_NPATH_RULE}.make (settings.preference_manager))                          add_rule (create {CA_NPATH_RULE}.make (settings.preference_manager))
30                          rules.extend (create {CA_EMPTY_IF_RULE}.make)                          add_rule (create {CA_EMPTY_IF_RULE}.make)
31                          rules.extend (create {CA_FEATURE_NEVER_CALLED_RULE}.make)                          add_rule (create {CA_FEATURE_NEVER_CALLED_RULE}.make)
32                          rules.extend (create {CA_CQ_SEPARATION_RULE}.make)                          add_rule (create {CA_CQ_SEPARATION_RULE}.make)
33                          rules.extend (create {CA_UNNEEDED_OT_LOCAL_RULE}.make)                          add_rule (create {CA_UNNEEDED_OT_LOCAL_RULE}.make)
34                          rules.extend (create {CA_UNNEEDED_OBJECT_TEST_RULE}.make) -- Needs type info.                          add_rule (create {CA_UNNEEDED_OBJECT_TEST_RULE}.make) -- Needs type info.
35                          rules.extend (create {CA_NESTED_COMPLEXITY_RULE}.make (settings.preference_manager))                          add_rule (create {CA_NESTED_COMPLEXITY_RULE}.make (settings.preference_manager))
36                          rules.extend (create {CA_MANY_ARGUMENTS_RULE}.make (settings.preference_manager))                          add_rule (create {CA_MANY_ARGUMENTS_RULE}.make (settings.preference_manager))
37                          rules.extend (create {CA_CREATION_PROC_EXPORTED_RULE}.make)                          add_rule (create {CA_CREATION_PROC_EXPORTED_RULE}.make)
38                          rules.extend (create {CA_VARIABLE_NOT_READ_RULE}.make)                          add_rule (create {CA_VARIABLE_NOT_READ_RULE}.make)
39                          rules.extend (create {CA_SEMICOLON_ARGUMENTS_RULE}.make)                          add_rule (create {CA_SEMICOLON_ARGUMENTS_RULE}.make)
40                          rules.extend (create {CA_VERY_LONG_ROUTINE_RULE}.make (settings.preference_manager))                          add_rule (create {CA_VERY_LONG_ROUTINE_RULE}.make (settings.preference_manager))
41                          rules.extend (create {CA_VERY_BIG_CLASS_RULE}.make (settings.preference_manager))                          add_rule (create {CA_VERY_BIG_CLASS_RULE}.make (settings.preference_manager))
42                          rules.extend (create {CA_FEATURE_SECTION_COMMENT_RULE}.make)                          add_rule (create {CA_FEATURE_SECTION_COMMENT_RULE}.make)
43                          rules.extend (create {CA_FEATURE_NOT_COMMENTED_RULE}.make)                          add_rule (create {CA_FEATURE_NOT_COMMENTED_RULE}.make)
44                          rules.extend (create {CA_BOOLEAN_RESULT_RULE}.make)                          add_rule (create {CA_BOOLEAN_RESULT_RULE}.make)
45                          rules.extend (create {CA_BOOLEAN_COMPARISON_RULE}.make)                          add_rule (create {CA_BOOLEAN_COMPARISON_RULE}.make)
46                          rules.extend (create {CA_VERY_SHORT_IDENTIFIER_RULE}.make (settings.preference_manager))                          add_rule (create {CA_VERY_SHORT_IDENTIFIER_RULE}.make (settings.preference_manager))
47                          rules.extend (create {CA_VERY_LONG_IDENTIFIER_RULE}.make (settings.preference_manager))                          add_rule (create {CA_VERY_LONG_IDENTIFIER_RULE}.make (settings.preference_manager))
48                          rules.extend (create {CA_MISSING_IS_EQUAL_RULE}.make)                          add_rule (create {CA_MISSING_IS_EQUAL_RULE}.make)
49                          rules.extend (create {CA_SIMPLIFIABLE_BOOLEAN_RULE}.make)                          add_rule (create {CA_SIMPLIFIABLE_BOOLEAN_RULE}.make)
50                          rules.extend (create {CA_SELF_COMPARISON_RULE}.make)                          add_rule (create {CA_SELF_COMPARISON_RULE}.make)
51                          rules.extend (create {CA_TODO_RULE}.make)                          add_rule (create {CA_TODO_RULE}.make)
52                          rules.extend (create {CA_WRONG_LOOP_ITERATION_RULE}.make)                          add_rule (create {CA_WRONG_LOOP_ITERATION_RULE}.make)
53                          rules.extend (create {CA_INSPECT_INSTRUCTIONS_RULE}.make (settings.preference_manager))                          add_rule (create {CA_INSPECT_INSTRUCTIONS_RULE}.make (settings.preference_manager))
54                          rules.extend (create {CA_ATTRIBUTE_TO_LOCAL_RULE}.make)                          add_rule (create {CA_ATTRIBUTE_TO_LOCAL_RULE}.make)
55                          rules.extend (create {CA_EMPTY_EFFECTIVE_ROUTINE_RULE}.make)                          add_rule (create {CA_EMPTY_EFFECTIVE_ROUTINE_RULE}.make)
56                          rules.extend (create {CA_IF_ELSE_NOT_EQUAL_RULE}.make)                          add_rule (create {CA_IF_ELSE_NOT_EQUAL_RULE}.make)
57                          rules.extend (create {CA_SHORT_CIRCUIT_IF_RULE}.make)                          add_rule (create {CA_SHORT_CIRCUIT_IF_RULE}.make)
58                          rules.extend (create {CA_ITERABLE_LOOP_RULE}.make) -- Needs type info.                          add_rule (create {CA_ITERABLE_LOOP_RULE}.make) -- Needs type info.
59                          rules.extend (create {CA_COUNT_EQUALS_ZERO_RULE}.make) -- Needs type info.                          add_rule (create {CA_COUNT_EQUALS_ZERO_RULE}.make) -- Needs type info.
60                          rules.extend (create {CA_DEEPLY_NESTED_IF_RULE}.make (settings.preference_manager))                          add_rule (create {CA_DEEPLY_NESTED_IF_RULE}.make (settings.preference_manager))
61                          rules.extend (create {CA_UNNEEDED_HELPER_VARIABLE_RULE}.make (settings.preference_manager))                          add_rule (create {CA_UNNEEDED_HELPER_VARIABLE_RULE}.make (settings.preference_manager))
62                          rules.extend (create {CA_UNNEEDED_PARENTHESES_RULE}.make)                          add_rule (create {CA_UNNEEDED_PARENTHESES_RULE}.make)
63                          rules.extend (create {CA_CLASS_NAMING_CONVENTION_RULE}.make)                          add_rule (create {CA_CLASS_NAMING_CONVENTION_RULE}.make)
64                          rules.extend (create {CA_FEATURE_NAMING_CONVENTION_RULE}.make)                          add_rule (create {CA_FEATURE_NAMING_CONVENTION_RULE}.make)
65                          rules.extend (create {CA_LOCAL_NAMING_CONVENTION_RULE}.make (settings.preference_manager))                          add_rule (create {CA_LOCAL_NAMING_CONVENTION_RULE}.make (settings.preference_manager))
66                          rules.extend (create {CA_ARGUMENT_NAMING_CONVENTION_RULE}.make (settings.preference_manager))                          add_rule (create {CA_ARGUMENT_NAMING_CONVENTION_RULE}.make (settings.preference_manager))
67                          rules.extend (create {CA_UNNECESSARY_SIGN_OPERATOR_RULE}.make)                          add_rule (create {CA_UNNECESSARY_SIGN_OPERATOR_RULE}.make)
68                          rules.extend (create {CA_EMPTY_UNCOMMENTED_ROUTINE_RULE}.make)                          add_rule (create {CA_EMPTY_UNCOMMENTED_ROUTINE_RULE}.make)
69                          rules.extend (create {CA_UNNEEDED_ACCESSOR_FUNCTION_RULE}.make)                          add_rule (create {CA_UNNEEDED_ACCESSOR_FUNCTION_RULE}.make)
70                          rules.extend (create {CA_MERGEABLE_FEATURE_CLAUSES_RULE}.make)                          add_rule (create {CA_MERGEABLE_FEATURE_CLAUSES_RULE}.make)
71                          rules.extend (create {CA_EMPTY_RESCUE_CLAUSE_RULE}.make)                          add_rule (create {CA_EMPTY_RESCUE_CLAUSE_RULE}.make)
72                          rules.extend (create {CA_INSPECT_NO_WHEN_RULE}.make)                          add_rule (create {CA_INSPECT_NO_WHEN_RULE}.make)
73                          rules.extend (create {CA_EXPLICIT_REDUNDANT_INHERITANCE_RULE}.make)                          add_rule (create {CA_EXPLICIT_REDUNDANT_INHERITANCE_RULE}.make)
   
                                 -- Sort rules by ID.  
                         create l_rule_comparator.make (  
                                 agent (u, v: CA_RULE): BOOLEAN  
                                         do  
                                                 Result := u.id < v.id  
                                         end  
                         )  
                         create l_rule_sorter.make (l_rule_comparator)  
                         l_rule_sorter.sort (rules)  
74    
75                          settings.initialize_rule_settings (rules)                          settings.initialize_rule_settings (rules)
76    
# Line 241  feature -- Analysis interface Line 229  feature -- Analysis interface
229                          end                          end
230                  end                  end
231    
232          force_enable_rules (a_rule_list: LIST [STRING_32])  
233            force_preferences (a_preferences: LIST [TUPLE [rule_id: READABLE_STRING_GENERAL; preference_name: STRING; preference_value: READABLE_STRING_GENERAL]])
234                            -- Forcefully set the preferences in `a_preferences' to the specified values,
235                            -- overwriting the current ones.
236                  local                  local
237                          l_sorter: QUICK_SORTER [READABLE_STRING_GENERAL]                          l_full_preference_name: STRING
238                            l_preference: PREFERENCE
239                  do                  do
                         create l_sorter.make (create {STRING_COMPARATOR}.make_caseless)  
                         l_sorter.sort (a_rule_list)  
   
240                                  -- Disable all rules.                                  -- Disable all rules.
241                          across rules as ic loop                          across rules as ic loop
242                                  ic.item.is_enabled.set_value (False)                                  ic.item.is_enabled.set_value (False)
243                          end                          end
244    
245                                  -- The `rules' list is always ordered by ID.                          across a_preferences as ic loop
246                                    if rules.has_key (ic.item.rule_id) then
247                                            l_full_preference_name := rules.found_item.full_preference_name (ic.item.preference_name)
248                                            l_preference := preferences.get_preference (l_full_preference_name)
249    
250                                            if attached l_preference then
251                                                    l_preference.set_value_from_string (ic.item.preference_value)
252                                            else
253                                                    output_actions.call ([ca_messages.preference_not_found (l_full_preference_name)])
254                                            end
255    
                         from  
                                 a_rule_list.start  
                                 rules.start  
                         until  
                                 a_rule_list.after  
                         loop  
                                 if rules.after then  
                                         -- We have passed the end of the rules list and we still have some rules in the force-enabled list  
                                         -- which we haven't found.  
                                         output_actions.call ([ca_messages.rule_not_found (a_rule_list.item)])  
                                         a_rule_list.forth  
                                 elseif a_rule_list.item > rules.item.id then  
                                                 -- We haven't yet reached the current-rule-to-be-enabled  
                                         rules.item.is_enabled.set_value (False)  
                                         rules.forth  
                                 elseif a_rule_list.item ~ rules.item.id then  
                                                 -- Here we are!  
                                         rules.item.is_enabled.set_value (True)  
                                         rules.forth  
                                         a_rule_list.forth  
256                                  else                                  else
257                                          check a_rule_list.item < rules.item.id then end                                          output_actions.call ([ca_messages.rule_not_found (ic.item.rule_id)])
                                                 -- We have passed the right location in the rule list without finding the specified rule.  
                                         output_actions.call ([ca_messages.rule_not_found (a_rule_list.item)])  
                                         a_rule_list.forth  
258                                  end                                  end
   
259                          end                          end
260                  end                  end
261    
262    
263  feature -- Properties  feature -- Properties
264    
265          is_running: BOOLEAN          is_running: BOOLEAN
266                          -- Is code analysis running?                          -- Is code analysis running?
267    
268          rules: ARRAYED_LIST [CA_RULE]          rules: STRING_TABLE [CA_RULE]
269                          -- List of rules that will be used for analysis. Rules are ordered by ID.                  -- Table containing the rules that will be used for analysis. Rules are indexed by ID.
270    
271            add_rule (a_rule: CA_RULE)
272                            -- Adds `a_rule' to the rules list.
273                    require
274                            not_added_yet: not rules.has (a_rule.id)
275                    do
276                            rules.extend (a_rule, a_rule.id)
277                    ensure
278                            added: rules.has (a_rule.id)
279                    end
280    
281          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]
282                          -- All found violations from the last analysis.                          -- All found violations from the last analysis.

Legend:
Removed from v.95330  
changed lines
  Added in v.95331

  ViewVC Help
Powered by ViewVC 1.1.23