/
zcl_aoc_check_07.clas.abap
135 lines (104 loc) · 3.61 KB
/
zcl_aoc_check_07.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
CLASS zcl_aoc_check_07 DEFINITION
PUBLIC
INHERITING FROM zcl_aoc_super
CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor.
METHODS check
REDEFINITION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_aoc_check_07 IMPLEMENTATION.
METHOD check.
* abapOpenChecks
* https://github.com/larshp/abapOpenChecks
* MIT License
DATA: lv_position TYPE i,
lv_token LIKE sy-tabix,
lv_include TYPE sobj_name.
FIELD-SYMBOLS: <ls_token> LIKE LINE OF io_scan->tokens,
<ls_token1> LIKE LINE OF io_scan->tokens,
<ls_token2> LIKE LINE OF io_scan->tokens,
<ls_token3> LIKE LINE OF io_scan->tokens,
<ls_statement> LIKE LINE OF io_scan->statements.
LOOP AT io_scan->statements ASSIGNING <ls_statement>
WHERE type = io_scan->gc_statement-standard
OR type = io_scan->gc_statement-method_direct.
lv_position = sy-tabix.
lv_token = <ls_statement>-from.
READ TABLE io_scan->tokens ASSIGNING <ls_token1> INDEX lv_token.
IF sy-subrc <> 0.
CONTINUE. " current loop
ENDIF.
lv_token = lv_token + 1.
READ TABLE io_scan->tokens ASSIGNING <ls_token2> INDEX lv_token.
IF sy-subrc <> 0.
CONTINUE. " current loop
ENDIF.
lv_token = lv_token + 1.
READ TABLE io_scan->tokens ASSIGNING <ls_token3> INDEX lv_token.
IF sy-subrc <> 0.
CONTINUE. " current loop
ENDIF.
IF <ls_token3>-str CP '*>(*'
OR <ls_token3>-str CP '*)=>*'
OR <ls_token3>-str CP '*)->*'
OR <ls_token3>-str CP '(*'
OR <ls_token3>-str = 'OF'.
* allow dynamic calls and OLE interaction
CONTINUE.
ENDIF.
LOOP AT io_scan->tokens ASSIGNING <ls_token>
FROM <ls_statement>-from TO <ls_statement>-to
WHERE str = 'RECEIVING'
AND type = io_scan->gc_token-identifier.
IF <ls_token1>-str = 'CALL' OR <ls_token2>-str = 'BADI'.
EXIT.
ENDIF.
* allow if old style exceptions are part of method
LOOP AT io_scan->tokens TRANSPORTING NO FIELDS
FROM <ls_statement>-from TO <ls_statement>-to
WHERE str = 'EXCEPTIONS'
AND type = io_scan->gc_token-identifier.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
EXIT. " current loop
ENDIF.
lv_include = io_scan->get_include( <ls_statement>-level ).
inform( p_sub_obj_name = lv_include
p_position = lv_position
p_line = <ls_token>-row
p_kind = mv_errty
p_test = myname
p_code = '002' ).
ENDLOOP.
IF <ls_token1>-str <> 'CALL' OR <ls_token2>-str <> 'METHOD'.
CONTINUE. " current loop
ENDIF.
lv_include = io_scan->get_include( <ls_statement>-level ).
inform( p_sub_obj_name = lv_include
p_position = lv_position
p_line = <ls_token1>-row
p_kind = mv_errty
p_test = myname
p_code = '001' ).
ENDLOOP.
ENDMETHOD.
METHOD constructor.
super->constructor( ).
version = '001'.
position = '007'.
has_attributes = abap_true.
attributes_ok = abap_true.
enable_rfc( ).
enable_checksum( ).
insert_scimessage(
iv_code = '001'
iv_text = 'Use functional writing style'(m01) ).
insert_scimessage(
iv_code = '002'
iv_text = 'Use functional writing style instead of RECEIVING'(m02) ).
ENDMETHOD.
ENDCLASS.