diff --git a/changelog.txt b/changelog.txt index 0b020966..f73d2e36 100644 --- a/changelog.txt +++ b/changelog.txt @@ -14,6 +14,7 @@ Whenever you upgrade code pal for ABAP, it is highly recommended to execute the 2021-04-** v.1.14.0 ------------------ +* Standard functions in Prefer IS NOT to NOT IS (#338) * In the profile feature, you can add all the missing checks (#346) 2021-04-05 v.1.13.1 diff --git a/src/checks/y_check_prefer_is_not.clas.abap b/src/checks/y_check_prefer_is_not.clas.abap index ea4b6bf9..163a8fa8 100644 --- a/src/checks/y_check_prefer_is_not.clas.abap +++ b/src/checks/y_check_prefer_is_not.clas.abap @@ -5,6 +5,9 @@ CLASS y_check_prefer_is_not DEFINITION PUBLIC INHERITING FROM y_check_base CREAT PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + METHODS is_standard_function IMPORTING token TYPE stokesx + RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -33,7 +36,8 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. WHERE str = 'IF' OR str = 'ELSEIF' OR str = 'AND' - OR str = 'OR'. + OR str = 'OR' + OR str = 'ASSERT'. DATA(position) = sy-tabix. @@ -46,7 +50,7 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. ENDTRY. TRY. - IF ref_scan_manager->tokens[ position + 2 ]-str = 'LINE_EXISTS('. + IF is_standard_function( ref_scan_manager->tokens[ position + 2 ] ) = abap_true. CONTINUE. ENDIF. CATCH cx_sy_itab_line_not_found. @@ -67,4 +71,12 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. ENDLOOP. ENDMETHOD. + + METHOD is_standard_function. + result = xsdbool( token-str CP 'CONTAINS*' + OR token-str CP 'LINE_EXISTS*' + OR token-str CP 'MATCHES*' ). + ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_prefer_is_not.clas.testclasses.abap b/src/checks/y_check_prefer_is_not.clas.testclasses.abap index f9bdb0aa..4b1e42eb 100644 --- a/src/checks/y_check_prefer_is_not.clas.testclasses.abap +++ b/src/checks/y_check_prefer_is_not.clas.testclasses.abap @@ -342,8 +342,84 @@ CLASS ltc_line_exists IMPLEMENTATION. ( ' START-OF-SELECTION. ' ) ( ' DATA itab TYPE TABLE OF tadir. ' ) - ( ' IF NOT line_exists( itab[ 0 ] ). ' ) - ( ' ENDIF. ' ) + ( ' ASSERT NOT line_exists( itab[ 0 ] ). ' ) + ). + ENDMETHOD. + +ENDCLASS. + + + +CLASS ltc_contains DEFINITION INHERITING FROM ltc_not_value FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_contains IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( 'REPORT y_example. ' ) + + ( ' START-OF-SELECTION. ' ) + ( | ASSERT NOT contains( val = 'code pal for ABAP' sub = 'ABAP' ). | ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_matches DEFINITION INHERITING FROM ltc_not_value FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_matches IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' START-OF-SELECTION. ' ) + ( | ASSERT NOT matches( val = 'a123e' regex = '[[:alpha:]]*' ). | ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_contains_any_not_of DEFINITION INHERITING FROM ltc_not_value FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_contains_any_not_of IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' START-OF-SELECTION. ' ) + ( | ASSERT NOT contains_any_not_of( val = 'a123e' sub = '123' ). | ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_contains_any_of DEFINITION INHERITING FROM ltc_not_value FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_contains_any_of IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' START-OF-SELECTION. ' ) + ( | ASSERT NOT contains_any_of( val = 'a123e' sub = '123' ). | ) ). ENDMETHOD.