Skip to content

Commit b45a99b

Browse files
CHECK_PREFER_IS_NOT: Exempt predicative method calls (#599)
1 parent eee11ee commit b45a99b

File tree

2 files changed

+363
-16
lines changed

2 files changed

+363
-16
lines changed

src/checks/y_check_prefer_is_not.clas.abap

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,28 @@ CLASS y_check_prefer_is_not DEFINITION PUBLIC INHERITING FROM y_check_base CREAT
55
PROTECTED SECTION.
66
METHODS inspect_tokens REDEFINITION.
77

8-
METHODS is_standard_function IMPORTING token TYPE stokesx
9-
RETURNING VALUE(result) TYPE abap_bool.
8+
METHODS is_standard_function
9+
IMPORTING
10+
token TYPE stokesx
11+
RETURNING
12+
VALUE(result) TYPE abap_bool.
13+
14+
METHODS is_predicative_method
15+
IMPORTING
16+
!tokens TYPE stokesx_tab
17+
!statement TYPE sstmnt
18+
position_of_not TYPE syst_tabix
19+
RETURNING
20+
VALUE(result) TYPE abap_bool.
21+
22+
PRIVATE SECTION.
23+
METHODS get_position_closing_bracket
24+
IMPORTING
25+
tokens TYPE stokesx_tab
26+
statement TYPE sstmnt
27+
position_of_open_bracket TYPE syst_tabix
28+
RETURNING
29+
VALUE(result) TYPE i.
1030

1131
ENDCLASS.
1232

@@ -29,15 +49,14 @@ CLASS y_check_prefer_is_not IMPLEMENTATION.
2949
set_check_message( 'Prefer IS NOT to NOT IS!' ).
3050
ENDMETHOD.
3151

32-
3352
METHOD inspect_tokens.
3453
LOOP AT ref_scan->tokens TRANSPORTING NO FIELDS
35-
FROM statement-from TO statement-to
36-
WHERE str = 'IF'
37-
OR str = 'ELSEIF'
38-
OR str = 'AND'
39-
OR str = 'OR'
40-
OR str = 'ASSERT'.
54+
FROM statement-from TO statement-to
55+
WHERE str = 'IF'
56+
OR str = 'ELSEIF'
57+
OR str = 'AND'
58+
OR str = 'OR'
59+
OR str = 'ASSERT'.
4160

4261
DATA(position) = sy-tabix.
4362

@@ -50,29 +69,82 @@ CLASS y_check_prefer_is_not IMPLEMENTATION.
5069
ENDTRY.
5170

5271
TRY.
53-
IF is_standard_function( ref_scan->tokens[ position + 2 ] ) = abap_true.
72+
IF is_standard_function( ref_scan->tokens[ position + 2 ] ).
5473
CONTINUE.
5574
ENDIF.
5675
CATCH cx_sy_itab_line_not_found.
5776
CONTINUE.
5877
ENDTRY.
5978

79+
IF is_predicative_method( tokens = ref_scan->tokens
80+
statement = statement
81+
position_of_not = position + 1 ).
82+
CONTINUE.
83+
ENDIF.
84+
6085
DATA(check_configuration) = detect_check_configuration( statement ).
6186

62-
raise_error( statement_level = statement-level
63-
statement_index = index
64-
statement_from = statement-from
87+
raise_error( statement_level = statement-level
88+
statement_index = index
89+
statement_from = statement-from
6590
check_configuration = check_configuration ).
66-
6791
ENDLOOP.
6892
ENDMETHOD.
6993

70-
7194
METHOD is_standard_function.
7295
result = xsdbool( token-str CP 'CONTAINS*'
7396
OR token-str CP 'LINE_EXISTS*'
7497
OR token-str CP 'MATCHES*' ).
7598
ENDMETHOD.
7699

100+
METHOD is_predicative_method.
101+
DATA(position_to_check) = position_of_not + 1.
77102

78-
ENDCLASS.
103+
IF tokens[ position_to_check ]-str = 'NEW'.
104+
position_to_check = position_to_check + 1.
105+
ENDIF.
106+
107+
IF tokens[ position_to_check ]-str NP '*('.
108+
" This is not the start of a method call
109+
RETURN.
110+
ENDIF.
111+
112+
DATA(position_closing_bracket) = get_position_closing_bracket(
113+
tokens = tokens
114+
statement = statement
115+
position_of_open_bracket = position_to_check ).
116+
117+
IF position_closing_bracket = statement-to.
118+
" Nothing follows the closing bracket
119+
result = abap_true.
120+
RETURN.
121+
ENDIF.
122+
123+
DATA(next_string) = tokens[ position_closing_bracket + 1 ]-str.
124+
125+
IF next_string = 'AND' OR next_string = 'OR'.
126+
" Nothing follows until the next condition starts
127+
result = abap_true.
128+
RETURN.
129+
ENDIF.
130+
ENDMETHOD.
131+
132+
METHOD get_position_closing_bracket.
133+
DATA(open_brackets) = 1.
134+
result = position_of_open_bracket.
135+
136+
WHILE open_brackets <> 0 AND result <= statement-to.
137+
result = result + 1.
138+
DATA(current_string) = tokens[ result ]-str.
139+
140+
IF current_string CP '*('.
141+
open_brackets = open_brackets + 1.
142+
ENDIF.
143+
144+
IF current_string CP ')*'.
145+
open_brackets = open_brackets - 1.
146+
ENDIF.
147+
ENDWHILE.
148+
ENDMETHOD.
149+
150+
ENDCLASS.

0 commit comments

Comments
 (0)