/
zcl_aoc_check_01.clas.abap
151 lines (111 loc) · 3.85 KB
/
zcl_aoc_check_01.clas.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
CLASS zcl_aoc_check_01 DEFINITION
PUBLIC
INHERITING FROM zcl_aoc_super
CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor.
METHODS check
REDEFINITION.
PROTECTED SECTION.
METHODS contains_else
IMPORTING
!io_structure TYPE REF TO zcl_aoc_structure
RETURNING
VALUE(rv_bool) TYPE abap_bool.
METHODS run_check
IMPORTING
!io_structure TYPE REF TO zcl_aoc_structure
!io_scan TYPE REF TO zcl_aoc_scan.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_aoc_check_01 IMPLEMENTATION.
METHOD check.
* abapOpenChecks
* https://github.com/larshp/abapOpenChecks
* MIT License
DATA: lo_structure TYPE REF TO zcl_aoc_structure.
lo_structure = zcl_aoc_structure=>build(
it_tokens = io_scan->tokens
it_statements = io_scan->statements
it_structures = io_scan->structures ).
run_check(
io_structure = lo_structure
io_scan = io_scan ).
ENDMETHOD.
METHOD constructor.
super->constructor( ).
version = '001'.
position = '001'.
has_attributes = abap_true.
attributes_ok = abap_true.
enable_rfc( ).
enable_checksum( ).
insert_scimessage(
iv_code = '001'
iv_text = 'IF in IF, can easily be reduced'(m01) ).
ENDMETHOD.
METHOD contains_else.
DATA: lo_structure TYPE REF TO zcl_aoc_structure.
LOOP AT io_structure->get_structure( ) INTO lo_structure.
IF lo_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-else
OR lo_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-elseif.
rv_bool = abap_true.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD run_check.
DATA: lo_structure TYPE REF TO zcl_aoc_structure,
lo_then TYPE REF TO zcl_aoc_structure,
lv_include TYPE program,
lv_if TYPE i,
lv_other TYPE i,
lv_row TYPE token_row,
lv_position LIKE sy-tabix.
IF io_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-if
OR io_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-else.
IF io_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-if.
READ TABLE io_structure->get_structure( ) INDEX 1 INTO lo_then.
ASSERT sy-subrc = 0.
LOOP AT io_structure->get_structure( ) INTO lo_structure.
CASE lo_structure->get_type( ).
WHEN zcl_aoc_scan=>gc_structure_statement-elseif
OR zcl_aoc_scan=>gc_structure_statement-else.
lv_if = lv_if + 2.
ENDCASE.
ENDLOOP.
ELSE.
lo_then = io_structure.
ENDIF.
LOOP AT lo_then->get_structure( ) INTO lo_structure.
CASE lo_structure->get_type( ).
WHEN zcl_aoc_scan=>gc_structure_statement-if.
IF contains_else( lo_structure ) = abap_true
AND io_structure->get_type( ) = zcl_aoc_scan=>gc_structure_statement-if.
lv_if = lv_if + 1.
ENDIF.
lv_if = lv_if + 1.
WHEN OTHERS.
lv_other = lv_other + 1.
ENDCASE.
ENDLOOP.
ENDIF.
IF lv_if = 1 AND lv_other = 0.
lv_include = io_scan->get_include( io_structure->get_statement( )-level ).
lv_row = io_structure->get_statement( )-row.
READ TABLE io_scan->statements WITH KEY trow = lv_row TRANSPORTING NO FIELDS.
lv_position = sy-tabix.
inform( p_sub_obj_name = lv_include
p_position = lv_position
p_line = lv_row
p_kind = mv_errty
p_test = myname
p_code = '001' ).
ELSE.
LOOP AT io_structure->get_structure( ) INTO lo_structure.
run_check( io_structure = lo_structure
io_scan = io_scan ).
ENDLOOP.
ENDIF.
ENDMETHOD.
ENDCLASS.