@@ -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
1131ENDCLASS .
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