Skip to content

Commit 90828da

Browse files
author
Lucas Borin
committed
fix #475
1 parent 16c9f4e commit 90828da

File tree

2 files changed

+197
-50
lines changed

2 files changed

+197
-50
lines changed

src/checks/y_check_magic_number.clas.abap

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,10 @@ CLASS y_check_magic_number DEFINITION PUBLIC INHERITING FROM y_check_base CREATE
66
METHODS inspect_tokens REDEFINITION.
77

88
PRIVATE SECTION.
9-
CONSTANTS second_token TYPE i VALUE 2 ##NO_TEXT.
9+
METHODS is_magic_number RETURNING VALUE(result) TYPE abap_bool.
10+
METHODS is_index RETURNING VALUE(result) TYPE abap_bool.
11+
METHODS is_lines RETURNING VALUE(result) TYPE abap_bool.
1012

11-
DATA magic_number TYPE string.
12-
DATA has_case_with_subrc TYPE abap_bool.
13-
14-
METHODS is_exception IMPORTING token TYPE string
15-
RETURNING VALUE(result) TYPE abap_bool.
16-
17-
METHODS is_keyword_valid RETURNING VALUE(result) TYPE abap_bool.
18-
19-
METHODS is_magic_number IMPORTING token_string TYPE string
20-
RETURNING VALUE(result) TYPE abap_bool.
2113
ENDCLASS.
2214

2315

@@ -38,62 +30,68 @@ CLASS Y_CHECK_MAGIC_NUMBER IMPLEMENTATION.
3830
ENDMETHOD.
3931

4032

41-
METHOD is_exception.
42-
IF token = 'ENDCASE' AND has_case_with_subrc = abap_true.
43-
has_case_with_subrc = abap_false.
44-
ENDIF.
33+
METHOD inspect_tokens.
34+
DATA(keyword) = keyword( ).
4535

46-
IF token = 'SY-SUBRC' OR has_case_with_subrc = abap_true.
47-
result = abap_true.
48-
ELSEIF token = 'CASE' AND get_token_rel( second_token ) = 'SY-SUBRC'.
49-
has_case_with_subrc = abap_true.
36+
IF keyword <> if_kaizen_keywords_c=>gc_do
37+
AND keyword <> if_kaizen_keywords_c=>gc_if
38+
AND keyword <> if_kaizen_keywords_c=>gc_elseif
39+
AND keyword <> if_kaizen_keywords_c=>gc_when
40+
AND keyword <> if_kaizen_keywords_c=>gc_check.
41+
RETURN.
5042
ENDIF.
51-
ENDMETHOD.
52-
5343

54-
METHOD inspect_tokens.
55-
statement_wa = statement.
44+
IF keyword = if_kaizen_keywords_c=>gc_when
45+
AND get_token_abs( ref_scan->statements[ index - 1 ]-to ) = 'SY-SUBRC'.
46+
RETURN.
47+
ELSEIF next1( 'SY-SUBRC' ) IS NOT INITIAL
48+
OR next1( 'SY-TABIX' ) IS NOT INITIAL.
49+
RETURN.
50+
ENDIF.
5651

57-
LOOP AT ref_scan->tokens ASSIGNING FIELD-SYMBOL(<token>)
52+
LOOP AT ref_scan->tokens INTO token_wa
5853
FROM statement-from TO statement-to.
54+
DATA(tabix) = sy-tabix.
5955

60-
IF is_exception( <token>-str ) = abap_true.
61-
EXIT.
56+
IF is_magic_number( ) = abap_false
57+
OR is_index( ) = abap_true
58+
OR is_lines( ) = abap_true.
59+
CONTINUE.
6260
ENDIF.
6361

64-
IF is_magic_number( <token>-str ).
65-
DATA(check_configuration) = detect_check_configuration( statement_wa ).
62+
DATA(check_configuration) = detect_check_configuration( statement ).
6663

67-
raise_error( statement_level = statement_wa-level
68-
statement_index = index
69-
statement_from = statement_wa-from
70-
check_configuration = check_configuration
71-
parameter_01 = |{ magic_number }| ).
72-
ENDIF.
64+
raise_error( statement_level = statement-level
65+
statement_index = index
66+
statement_from = statement-from
67+
check_configuration = check_configuration
68+
parameter_01 = |{ token_wa-str }| ).
7369
ENDLOOP.
7470
ENDMETHOD.
7571

7672

77-
METHOD is_keyword_valid.
78-
DATA(keyword) = keyword( ).
79-
result = xsdbool( keyword = 'DO' OR
80-
keyword = 'IF' OR
81-
keyword = 'ELSEIF' OR
82-
keyword = 'WHEN' OR
83-
keyword = 'CHECK' ).
73+
METHOD is_magic_number.
74+
DATA(string) = token_wa-str.
75+
REPLACE ALL OCCURRENCES OF |'| IN string WITH ||.
76+
result = xsdbool( string IS NOT INITIAL
77+
AND string CO '0123456789'
78+
AND string <> '0'
79+
AND string <> '1' ).
8480
ENDMETHOD.
8581

8682

87-
METHOD is_magic_number.
88-
IF is_keyword_valid( ) = abap_false.
89-
RETURN.
90-
ENDIF.
83+
METHOD is_index.
84+
DATA(current) = line_index( ref_scan->tokens[ table_line = token_wa ] ).
85+
DATA(last) = VALUE #( ref_scan->tokens[ current - 1 ] OPTIONAL ).
86+
DATA(next) = VALUE #( ref_scan->tokens[ current + 1 ] OPTIONAL ).
9187

92-
FIND REGEX `^(?!'?[01]'?$)'?\d+'?$` IN token_string.
93-
IF sy-subrc = 0.
94-
magic_number = token_string.
95-
result = abap_true.
96-
ENDIF.
88+
result = xsdbool( last-str CA '[('
89+
OR next-str CA '])' ).
90+
ENDMETHOD.
91+
92+
93+
METHOD is_lines.
94+
result = xsdbool( next1( 'LINES(' ) ).
9795
ENDMETHOD.
9896

9997

src/checks/y_check_magic_number.clas.testclasses.abap

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ CLASS ltc_if IMPLEMENTATION.
5050

5151
ENDCLASS.
5252

53+
5354
CLASS ltc_do DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
5455
PROTECTED SECTION.
5556
METHODS get_cut REDEFINITION.
@@ -97,6 +98,7 @@ CLASS ltc_do IMPLEMENTATION.
9798

9899
ENDCLASS.
99100

101+
100102
CLASS ltc_check DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
101103
PROTECTED SECTION.
102104
METHODS get_cut REDEFINITION.
@@ -183,3 +185,150 @@ CLASS ltc_numeric_string IMPLEMENTATION.
183185
ENDMETHOD.
184186

185187
ENDCLASS.
188+
189+
190+
CLASS ltc_case DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
191+
PROTECTED SECTION.
192+
METHODS get_cut REDEFINITION.
193+
METHODS get_code_with_issue REDEFINITION.
194+
METHODS get_code_without_issue REDEFINITION.
195+
METHODS get_code_with_exemption REDEFINITION.
196+
ENDCLASS.
197+
198+
CLASS ltc_case IMPLEMENTATION.
199+
200+
METHOD get_cut.
201+
result ?= NEW y_check_magic_number( ).
202+
ENDMETHOD.
203+
204+
METHOD get_code_with_issue.
205+
result = VALUE #(
206+
( ' REPORT ut_test.' )
207+
( ' START-OF-SELECTION.' )
208+
( | DATA(position) = 10. | )
209+
( | CASE position. | )
210+
( | WHEN 8. | )
211+
( | WRITE 'ok'. | )
212+
( | ENDCASE. | )
213+
).
214+
ENDMETHOD.
215+
216+
METHOD get_code_without_issue.
217+
result = VALUE #(
218+
( ' REPORT ut_test.' )
219+
( ' START-OF-SELECTION.' )
220+
( | CONSTANTS first TYPE i VALUE 1. | )
221+
( | DATA(position) = 10. | )
222+
( | CASE position. | )
223+
( | WHEN first. | )
224+
( | WRITE 'ok'. | )
225+
( | ENDCASE. | )
226+
).
227+
ENDMETHOD.
228+
229+
METHOD get_code_with_exemption.
230+
result = VALUE #(
231+
( ' REPORT ut_test.' )
232+
( ' START-OF-SELECTION.' )
233+
( | DATA(position) = 10. | )
234+
( | CASE position. | )
235+
( | WHEN 8. "#EC CI_MAGIC | )
236+
( | WRITE 'ok'. | )
237+
( | ENDCASE. | )
238+
).
239+
ENDMETHOD.
240+
241+
ENDCLASS.
242+
243+
244+
CLASS ltc_sy_subrc DEFINITION INHERITING FROM ltc_if FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
245+
PROTECTED SECTION.
246+
METHODS get_code_without_issue REDEFINITION.
247+
ENDCLASS.
248+
249+
CLASS ltc_sy_subrc IMPLEMENTATION.
250+
251+
METHOD get_code_without_issue.
252+
result = VALUE #(
253+
( ' REPORT ut_test.' )
254+
( ' START-OF-SELECTION.' )
255+
( ' CHECK sy-subrc = 4. ' )
256+
257+
( ' IF sy-subrc = 0. ' )
258+
( ' ENDIF. ' )
259+
260+
( | CASE sy-subrc. | )
261+
( | WHEN 8. | )
262+
( | WRITE 'ok'. | )
263+
( | ENDCASE. | )
264+
).
265+
ENDMETHOD.
266+
267+
ENDCLASS.
268+
269+
270+
CLASS ltc_index DEFINITION INHERITING FROM ltc_if FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
271+
PROTECTED SECTION.
272+
METHODS get_code_without_issue REDEFINITION.
273+
ENDCLASS.
274+
275+
CLASS ltc_index IMPLEMENTATION.
276+
277+
METHOD get_code_without_issue.
278+
result = VALUE #(
279+
( ' REPORT ut_test.' )
280+
( ' START-OF-SELECTION.' )
281+
( ' DATA tokens TYPE stokesx_tab. ' )
282+
283+
( ' IF tokens[ 3 + 5 ] IS INITIAL. ' )
284+
( ' ENDIF. ' )
285+
286+
( ' DATA(first) = tokens[ 4 ]. ' )
287+
( ' IF tokens[ line_index( tokens[ table_line = first ] ) + 1 ] IS INITIAL. ' )
288+
( ' ENDIF. ' )
289+
290+
( ' IF sy-tabix = 10. ' )
291+
( ' ENDIF. ' )
292+
).
293+
ENDMETHOD.
294+
295+
ENDCLASS.
296+
297+
298+
CLASS ltc_lines DEFINITION INHERITING FROM ltc_if FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
299+
PROTECTED SECTION.
300+
METHODS get_code_without_issue REDEFINITION.
301+
ENDCLASS.
302+
303+
CLASS ltc_lines IMPLEMENTATION.
304+
305+
METHOD get_code_without_issue.
306+
result = VALUE #(
307+
( ' REPORT ut_test.' )
308+
( ' START-OF-SELECTION.' )
309+
( ' DATA tokens TYPE stokesx_tab. ' )
310+
( ' IF lines( tokens ) = 10. ' )
311+
( ' ENDIF. ' )
312+
).
313+
ENDMETHOD.
314+
315+
ENDCLASS.
316+
317+
318+
CLASS ltc_empty_string DEFINITION INHERITING FROM ltc_if FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
319+
PROTECTED SECTION.
320+
METHODS get_code_without_issue REDEFINITION.
321+
ENDCLASS.
322+
323+
CLASS ltc_empty_string IMPLEMENTATION.
324+
325+
METHOD get_code_without_issue.
326+
result = VALUE #(
327+
( ' REPORT ut_test.' )
328+
( ' START-OF-SELECTION.' )
329+
( | IF '' = ''. | )
330+
( ' ENDIF. ' )
331+
).
332+
ENDMETHOD.
333+
334+
ENDCLASS.

0 commit comments

Comments
 (0)