From 4d0917af15c232f3685774eddc15320a42cc11b0 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Wed, 31 Mar 2021 17:06:57 +0200 Subject: [PATCH 01/28] 1.14.0 --- src/y_code_pal_version.intf.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_code_pal_version.intf.abap b/src/y_code_pal_version.intf.abap index e85bc2fd..c5ff8387 100644 --- a/src/y_code_pal_version.intf.abap +++ b/src/y_code_pal_version.intf.abap @@ -1,3 +1,3 @@ INTERFACE y_code_pal_version PUBLIC. - CONSTANTS abap TYPE string VALUE '1.13.0' ##NO_TEXT. + CONSTANTS abap TYPE string VALUE '1.13.1' ##NO_TEXT. ENDINTERFACE. From 2ca282b07fc018afa0f7adb93ad60d88b7f84a78 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Wed, 31 Mar 2021 18:39:56 +0200 Subject: [PATCH 02/28] fixing version --- src/y_code_pal_version.intf.abap | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/y_code_pal_version.intf.abap b/src/y_code_pal_version.intf.abap index c5ff8387..519f2f01 100644 --- a/src/y_code_pal_version.intf.abap +++ b/src/y_code_pal_version.intf.abap @@ -1,3 +1,6 @@ -INTERFACE y_code_pal_version PUBLIC. - CONSTANTS abap TYPE string VALUE '1.13.1' ##NO_TEXT. -ENDINTERFACE. +interface Y_CODE_PAL_VERSION + public . + + + constants ABAP type STRING value '1.14.0' ##NO_TEXT. +endinterface. From e56422af9f2dda3106a78cc452f3a1f828dfc577 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Thu, 1 Apr 2021 08:15:24 -0300 Subject: [PATCH 03/28] adding missing checks feature (#346) * adding missing checks feature * minor update Co-authored-by: Eugen Guenther --- .../y_profile_admin_classes.prog.abap | 57 +++++++++++++++++++ src/profiles/y_profile_administrator.prog.xml | 6 ++ 2 files changed, 63 insertions(+) diff --git a/src/profiles/y_profile_admin_classes.prog.abap b/src/profiles/y_profile_admin_classes.prog.abap index d234d704..56274f64 100644 --- a/src/profiles/y_profile_admin_classes.prog.abap +++ b/src/profiles/y_profile_admin_classes.prog.abap @@ -269,6 +269,8 @@ CLASS lcl_util DEFINITION. "#EC NUMBER_METHODS RAISING cx_failed. CLASS-METHODS remove_all_checks. + CLASS-METHODS add_missing_checks. + PRIVATE SECTION. CLASS-METHODS request_confirmation IMPORTING @@ -383,6 +385,9 @@ CLASS lcl_check_events IMPLEMENTATION. WHEN 'BTN_REMOVE_ALL'. lcl_util=>remove_all_checks( ). + WHEN 'BTN_MISSING_CK'. + lcl_util=>add_missing_checks( ). + ENDCASE. lcl_util=>refresh_checks( ). @@ -517,6 +522,11 @@ CLASS lcl_util IMPLEMENTATION. butn_type = cntb_btype_button quickinfo = 'Remove All'(059) ). + checks_tree->toolbar_control( )->add_button( fcode = 'BTN_MISSING_CK' + icon = '@A7@' + butn_type = cntb_btype_button + quickinfo = 'Add Missing Checks'(000) ). + checks_tree->set_field_visibility( fieldname = 'START_DATE' is_visible = abap_true ). checks_tree->set_field_visibility( fieldname = 'END_DATE' @@ -1429,4 +1439,51 @@ CLASS lcl_util IMPLEMENTATION. MESSAGE 'Action Executed Successfully!'(056) TYPE 'S'. ENDMETHOD. + METHOD add_missing_checks. + TRY. + DATA(profile) = lcl_util=>get_selected_profile( )-profile. + CATCH ycx_entry_not_found. + MESSAGE 'Please select a profile!'(005) TYPE 'I'. + ENDTRY. + + TRY. + profile_manager->check_delegation_rights( profile ). + CATCH ycx_no_delegation_rights. + MESSAGE 'You are not a delegate of the profile!'(006) TYPE 'W'. + ENDTRY. + + TRY. + DATA(checks_available) = profile_manager->select_checks( profile ). + request_confirmation( | Would you like to add all missing checks? | ). + CATCH ycx_entry_not_found. + add_all_checks( ). + RETURN. + ENDTRY. + + DATA(list_of_all_checks) = profile_manager->get_checks_from_db( ). + + DATA missing_checks TYPE STANDARD TABLE OF ycicc_checkid. + LOOP AT list_of_all_checks ASSIGNING FIELD-SYMBOL(). + IF NOT line_exists( checks_available[ checkid = -obj_name ] ). + APPEND -obj_name TO missing_checks. + ENDIF. + ENDLOOP. + + IF missing_checks IS INITIAL. + MESSAGE 'No checks are missing!'(060) TYPE 'I'. + RETURN. + ENDIF. + + LOOP AT missing_checks ASSIGNING FIELD-SYMBOL(). + io_check_id = . + init_add_check( ). + TRY. + add_check( ). + CATCH cx_failed. + CONTINUE. + ENDTRY. + ENDLOOP. + MESSAGE 'Action Executed Successfully!'(056) TYPE 'S'. + ENDMETHOD. + ENDCLASS. diff --git a/src/profiles/y_profile_administrator.prog.xml b/src/profiles/y_profile_administrator.prog.xml index ff3ff103..c00f32c7 100644 --- a/src/profiles/y_profile_administrator.prog.xml +++ b/src/profiles/y_profile_administrator.prog.xml @@ -1540,6 +1540,12 @@ Remove All 27 + + I + 060 + No checks are missing! + 44 + R Profile Administrator for code pal for ABAP From a2609e3dbafd5fc3ea815b9a1685fa27cea5706b Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Thu, 1 Apr 2021 08:48:34 -0300 Subject: [PATCH 04/28] Update changelog.txt --- changelog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.txt b/changelog.txt index af32dc34..c2193e3a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -12,6 +12,10 @@ Upgrade Note ------------------ Whenever you upgrade code pal for ABAP, it is highly recommended to execute the Y_CI_CHECK_REGISTRATION report to activate/reactivate the Checks (SE38 transaction) and regenerate the respective code inspector variant (SCI transaction) +2021-04-** v.1.14.0 +------------------ +* In the profile feature, you can add all the missing checks (#346) + 2021-03-24 v.1.13.0 ------------------ * y_ref_scan_manager_double From 14dcd67fef9f8ea12d0447cac4affbb2ad16f091 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:29:26 -0300 Subject: [PATCH 05/28] Standard Functions in Prefer IS NOT to NOT IS (#353) * solves #338 * Update changelog.txt * contains_any_not_of and contains_any_of --- changelog.txt | 1 + src/checks/y_check_prefer_is_not.clas.abap | 16 +++- ..._check_prefer_is_not.clas.testclasses.abap | 80 ++++++++++++++++++- 3 files changed, 93 insertions(+), 4 deletions(-) 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. From bdebcfc58bea0e9d3809a4ceb0c9b9d3f829285d Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:52:05 -0300 Subject: [PATCH 06/28] Prefer New to Create Object (#354) * implements #283 * Update check_documentation.md * minor fixes * Create prefer-new-to-create-object.md * Update changelog.txt * Update prefer-new-to-create-object.md * adding example Co-authored-by: estevao-schultz-neto-SAP <63100656+estevao-schultz-neto-SAP@users.noreply.github.com> --- changelog.txt | 1 + docs/check_documentation.md | 1 + docs/checks/prefer-new-to-create-object.md | 44 ++++++++++++ .../y_check_prefer_new_to_crt_obj.clas.abap | 45 ++++++++++++ ...refer_new_to_crt_obj.clas.testclasses.abap | 68 +++++++++++++++++++ .../y_check_prefer_new_to_crt_obj.clas.xml | 17 +++++ src/examples/y_demo_failures.clas.abap | 7 ++ 7 files changed, 183 insertions(+) create mode 100644 docs/checks/prefer-new-to-create-object.md create mode 100644 src/checks/y_check_prefer_new_to_crt_obj.clas.abap create mode 100644 src/checks/y_check_prefer_new_to_crt_obj.clas.testclasses.abap create mode 100644 src/checks/y_check_prefer_new_to_crt_obj.clas.xml diff --git a/changelog.txt b/changelog.txt index f73d2e36..008e42ff 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 ------------------ ++ Prefer NEW to CREATE OBJECT (#283) * Standard functions in Prefer IS NOT to NOT IS (#338) * In the profile feature, you can add all the missing checks (#346) diff --git a/docs/check_documentation.md b/docs/check_documentation.md index 056659b6..7afa1dec 100644 --- a/docs/check_documentation.md +++ b/docs/check_documentation.md @@ -40,6 +40,7 @@ - [Number of Output Parameter](checks/number-output-parameter.md) - [Prefer CASE to ELSEIF](checks/prefer-case-to-elseif.md) - [Prefer IS NOT to NOT IS](checks/prefer-is-not-to-not-is.md) +- [Prefer NEW to CREATE OBJECT](checks/prefer-new-to-create-object.md) - [Pseudo Comment Usage](checks/pseudo-comment-usage.md) - [Omit Optional EXPORTING](checks/omit-optional-exporting.md) - [Optional Parameters](checks/optional-parameters.md) diff --git a/docs/checks/prefer-new-to-create-object.md b/docs/checks/prefer-new-to-create-object.md new file mode 100644 index 00000000..e61e8c20 --- /dev/null +++ b/docs/checks/prefer-new-to-create-object.md @@ -0,0 +1,44 @@ +[code pal for ABAP](../../README.md) > [Documentation](../check_documentation.md) > [Prefer New to Create Object](prefer_new_to_create_object.md) + +## Prefer New to Create Object + +### What is the Intent of the Check? + +Prefer `NEW` over `CREATE OBJECT` as it avoids needlessly longer statements. + +### How to solve the issue? + +Preferably, use `NEW` for creating new objects/instances. + +### What to do in case of exception? + +In exceptional cases, you can suppress this finding by using the pseudo comment `"#EC PREF_NEW`: + +```abap + DATA prefer_new_to_crt_obj TYPE REF TO y_check_prefer_new_to_crt_obj. + CREATE OBJECT prefer_new_to_crt_obj. "#EC PREF_NEW +``` + +### Example + +Before the check: + +```abap + DATA prefer_new_to_create_object TYPE REF TO y_check_prefer_new_to_crt_obj. + CREATE OBJECT prefer_new_to_create_object. +``` + +After the check: + +```abap + DATA(prefer_new_to_create_object) = NEW y_check_prefer_new_to_crt_obj( ). +``` + +```abap + DATA prefer_new_to_create_object TYPE REF TO y_check_prefer_new_to_crt_obj. + prefer_new_to_create_object = NEW #( ). +``` + +### Further Readings & Knowledge + +* [ABAP Styleguides on Clean Code](https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-new-to-create-object) diff --git a/src/checks/y_check_prefer_new_to_crt_obj.clas.abap b/src/checks/y_check_prefer_new_to_crt_obj.clas.abap new file mode 100644 index 00000000..e30d43b2 --- /dev/null +++ b/src/checks/y_check_prefer_new_to_crt_obj.clas.abap @@ -0,0 +1,45 @@ +CLASS y_check_prefer_new_to_crt_obj DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . + PUBLIC SECTION. + METHODS constructor . + + PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. + +ENDCLASS. + + + +CLASS y_check_prefer_new_to_crt_obj IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + settings-pseudo_comment = '"#EC PREF_NEW' ##NO_TEXT. + settings-disable_threshold_selection = abap_true. + settings-threshold = 0. + settings-prio = c_warning. + settings-documentation = |{ c_docs_path-checks }prefer-new-to-create-object.md|. + + set_check_message( 'Prefer NEW to CREATE OBJECT!' ). + ENDMETHOD. + + + METHOD inspect_tokens. + CHECK get_token_abs( statement-from ) = 'CREATE' + AND get_token_abs( statement-from + 1 ) = 'OBJECT'. + + DATA(check_configuration) = detect_check_configuration( statement ). + + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement-level + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio ). + ENDMETHOD. + + +ENDCLASS. diff --git a/src/checks/y_check_prefer_new_to_crt_obj.clas.testclasses.abap b/src/checks/y_check_prefer_new_to_crt_obj.clas.testclasses.abap new file mode 100644 index 00000000..da741938 --- /dev/null +++ b/src/checks/y_check_prefer_new_to_crt_obj.clas.testclasses.abap @@ -0,0 +1,68 @@ +CLASS ltc_create_object DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_cut REDEFINITION. + METHODS get_code_with_issue REDEFINITION. + METHODS get_code_without_issue REDEFINITION. + METHODS get_code_with_exemption REDEFINITION. +ENDCLASS. + +CLASS ltc_create_object IMPLEMENTATION. + + METHOD get_cut. + result ?= NEW y_check_prefer_new_to_crt_obj( ). + ENDMETHOD. + + METHOD get_code_with_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example.' ) + ( ' DATA prefer_new_to_crt_obj TYPE REF TO y_check_prefer_new_to_crt_obj. ' ) + ( ' CREATE OBJECT prefer_new_to_crt_obj. ' ) + ( ' ENDMETHOD.' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example.' ) + ( ' DATA(prefer_new_to_crt_obj) = NEW y_check_prefer_new_to_crt_obj( ). ' ) + ( ' ENDMETHOD.' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_with_exemption. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example.' ) + ( ' DATA prefer_new_to_crt_obj TYPE REF TO y_check_prefer_new_to_crt_obj. ' ) + ( ' CREATE OBJECT prefer_new_to_crt_obj. "#EC PREF_NEW' ) + ( ' ENDMETHOD.' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/checks/y_check_prefer_new_to_crt_obj.clas.xml b/src/checks/y_check_prefer_new_to_crt_obj.clas.xml new file mode 100644 index 00000000..ea4a0e74 --- /dev/null +++ b/src/checks/y_check_prefer_new_to_crt_obj.clas.xml @@ -0,0 +1,17 @@ + + + + + + Y_CHECK_PREFER_NEW_TO_CRT_OBJ + E + Prefer New to Create Object + 1 + X + X + X + X + + + + diff --git a/src/examples/y_demo_failures.clas.abap b/src/examples/y_demo_failures.clas.abap index 2c3d2447..4bb4d4b1 100644 --- a/src/examples/y_demo_failures.clas.abap +++ b/src/examples/y_demo_failures.clas.abap @@ -114,6 +114,7 @@ CLASS y_demo_failures DEFINITION PUBLIC FINAL CREATE PUBLIC. VALUE(age) TYPE i. "#EC RET_NAME #EC BOOL_PARAM "#EC OPTL_PARAM METHODS prefer_is_not_to_not_is. METHODS prefer_case_to_elseif. + METHODS prefer_new_to_create_object. METHODS deprecated_classes. METHODS scope_of_variable. @@ -402,6 +403,12 @@ CLASS Y_DEMO_FAILURES IMPLEMENTATION. ENDMETHOD. + METHOD prefer_new_to_create_object. + DATA demo_failures TYPE REF TO y_demo_failures. + CREATE OBJECT demo_failures. + ENDMETHOD. + + METHOD prefer_is_not_to_not_is. IF NOT attribute_1 IS INITIAL. attribute_1 = attribute_2. From 0b57c2129b8cc188e4667970feafe1c6b41bdcc1 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:53:32 -0300 Subject: [PATCH 07/28] Unit Test Assert Check (#347) * new check * fixing class description * adding demo * comparing token type * Update check_documentation.md * Update check_documentation.md * Create unit_test_assert.md * Update changelog.txt * Update unit_test_assert.md Co-authored-by: estevao-schultz-neto-SAP <63100656+estevao-schultz-neto-SAP@users.noreply.github.com> --- changelog.txt | 1 + docs/check_documentation.md | 1 + docs/checks/unit_test_assert.md | 59 ++++ src/checks/y_check_unit_test_assert.clas.abap | 94 ++++++ ...eck_unit_test_assert.clas.testclasses.abap | 307 ++++++++++++++++++ src/checks/y_check_unit_test_assert.clas.xml | 17 + .../y_demo_failures.clas.testclasses.abap | 15 + 7 files changed, 494 insertions(+) create mode 100644 docs/checks/unit_test_assert.md create mode 100644 src/checks/y_check_unit_test_assert.clas.abap create mode 100644 src/checks/y_check_unit_test_assert.clas.testclasses.abap create mode 100644 src/checks/y_check_unit_test_assert.clas.xml diff --git a/changelog.txt b/changelog.txt index 008e42ff..30782587 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 ------------------ ++ Unit Test Without/With Invalid Assert (#288) + Prefer NEW to CREATE OBJECT (#283) * Standard functions in Prefer IS NOT to NOT IS (#338) * In the profile feature, you can add all the missing checks (#346) diff --git a/docs/check_documentation.md b/docs/check_documentation.md index 7afa1dec..453ffcd9 100644 --- a/docs/check_documentation.md +++ b/docs/check_documentation.md @@ -51,3 +51,4 @@ - [Self-Reference](checks/self-reference.md) - [TEST-SEAM Statement Usage](checks/test-seam-usage.md) - [Unit-Test Coverages (Statement, Branch and Procedure)](checks/unit-test-coverages.md) +- [Unit-Test Assert Validator](checks/unit_test_assert.md) diff --git a/docs/checks/unit_test_assert.md b/docs/checks/unit_test_assert.md new file mode 100644 index 00000000..1eb2aeff --- /dev/null +++ b/docs/checks/unit_test_assert.md @@ -0,0 +1,59 @@ +[code pal for ABAP](../../README.md) > [Documentation](../check_documentation.md) > [Unit-Test Assert Validator](unit_test_assert.md) + +## Unit-Test Assert Validator + +### What is the Intent of the Check? + +This check verifies invalid assertions in unit tests. +It supports the `CL_ABAP_UNIT_ASSERT=>ASSERT*` and `CL_AUNIT_ASSERT=>ASSERT*`. + +### How does the check work? + +It checks for actual (`act`) or expected (`exp`) invalid value(s), for instance: +- When both are using the same variable for the Assertion (which will always return TRUE); +- When both are hardcoded. + +### How to solve the issue? + +Fix the actual (`act`) or expected (`exp`) value(s) in the unit test assertion in order to achieve a meaningful and real Assertion. + +### What to do in case of exception? + +In exceptional cases (if any), you can suppress this finding by using the pseudo comment `"#EC UT_ASSERT` which has to be placed after the assertion statement: + +```abap +cl_abap_unit_assert=>assert_equals( act = sum + exp = sum ). "#EC UT_ASSERT +``` + +### Example + +Before the check: + +```abap +METHOD sum. + " given + DATA(first) = 10. + DATA(second) = 10. + " when + DATA(sum) = first + second. + " then + cl_abap_unit_assert=>assert_equals( act = sum + exp = sum ). +ENDMETHOD. +``` + +After the check: + +```abap +METHOD sum. + " given + DATA(first) = 10. + DATA(second) = 10. + " when + DATA(sum) = first + second. + " then + cl_abap_unit_assert=>assert_equals( act = sum + exp = 20 ). +ENDMETHOD. +``` diff --git a/src/checks/y_check_unit_test_assert.clas.abap b/src/checks/y_check_unit_test_assert.clas.abap new file mode 100644 index 00000000..8c48c9bd --- /dev/null +++ b/src/checks/y_check_unit_test_assert.clas.abap @@ -0,0 +1,94 @@ +CLASS y_check_unit_test_assert DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . + PUBLIC SECTION. + METHODS constructor. + + PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. + + PRIVATE SECTION. + METHODS get_act_and_exp IMPORTING statement TYPE sstmnt + EXPORTING act TYPE stokesx + exp TYPE stokesx. + + METHODS is_variable IMPORTING token TYPE stokesx + RETURNING VALUE(result) TYPE abap_bool. + +ENDCLASS. + + +CLASS y_check_unit_test_assert IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + settings-pseudo_comment = '"#EC UT_ASSERT' ##NO_TEXT. + settings-disable_threshold_selection = abap_true. + settings-apply_on_productive_code = abap_false. + settings-apply_on_test_code = abap_true. + settings-threshold = 0. + settings-documentation = |{ c_docs_path-checks }unit_test_assert.md|. + + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-method ) ). + relevant_structure_types = VALUE #( ). + + set_check_message( 'Invalid Unit Test Assertion!' ). + ENDMETHOD. + + + METHOD inspect_tokens. + CHECK get_token_abs( statement-from ) CP 'CL_ABAP_UNIT_ASSERT=>ASSERT*' + OR get_token_abs( statement-from ) CP 'CL_AUNIT_ASSERT=>ASSERT*'. + + get_act_and_exp( EXPORTING statement = statement + IMPORTING act = DATA(act) + exp = DATA(exp) ). + + IF act IS INITIAL + OR exp IS INITIAL. + RETURN. + ENDIF. + + IF act-str <> exp-str. + IF is_variable( act ) = abap_true + OR is_variable( exp ) = abap_true. + RETURN. + ENDIF. + ENDIF. + + DATA(check_configuration) = detect_check_configuration( statement ). + + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement-level + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio ). + ENDMETHOD. + + + METHOD get_act_and_exp. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to. + DATA(tabix) = sy-tabix. + CASE -str. + WHEN 'ACT'. + act = ref_scan_manager->tokens[ tabix + 2 ]. + WHEN 'EXP'. + exp = ref_scan_manager->tokens[ tabix + 2 ]. + WHEN OTHERS. + CONTINUE. + ENDCASE. + ENDLOOP. + ENDMETHOD. + + + METHOD is_variable. + result = COND #( WHEN token-type = scan_token_type-literal THEN abap_false + WHEN token-type = scan_token_type-identifier THEN xsdbool( token-str CN '0123456789' ) ). + ENDMETHOD. + + +ENDCLASS. diff --git a/src/checks/y_check_unit_test_assert.clas.testclasses.abap b/src/checks/y_check_unit_test_assert.clas.testclasses.abap new file mode 100644 index 00000000..15fd6890 --- /dev/null +++ b/src/checks/y_check_unit_test_assert.clas.testclasses.abap @@ -0,0 +1,307 @@ +CLASS ltc_same_variable DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_cut REDEFINITION. + METHODS get_code_with_issue REDEFINITION. + METHODS get_code_without_issue REDEFINITION. + METHODS get_code_with_exemption REDEFINITION. +ENDCLASS. + +CLASS ltc_same_variable IMPLEMENTATION. + + METHOD get_cut. + result ?= NEW y_check_unit_test_assert( ). + ENDMETHOD. + + METHOD get_code_with_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_abap_unit_assert=>assert_equals( act = sum ' ) + ( ' exp = sum ). ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_abap_unit_assert=>assert_equals( act = sum ' ) + ( ' exp = 20 ). ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_with_exemption. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_abap_unit_assert=>assert_equals( act = sum ' ) + ( ' exp = sum ). "#EC UT_ASSERT ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_hardcoded_number DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_cut REDEFINITION. + METHODS get_code_with_issue REDEFINITION. + METHODS get_code_without_issue REDEFINITION. + METHODS get_code_with_exemption REDEFINITION. +ENDCLASS. + +CLASS ltc_hardcoded_number IMPLEMENTATION. + + METHOD get_cut. + result ?= NEW y_check_unit_test_assert( ). + ENDMETHOD. + + METHOD get_code_with_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_aunit_assert=>assert_differs( act = 10 ' ) + ( ' exp = 20 ). ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_aunit_assert=>assert_differs( act = 10 ' ) + ( ' exp = sum ). ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_with_exemption. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS sum FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD sum. ' ) + ( ' " given ' ) + ( ' DATA(first) = 10. ' ) + ( ' DATA(second) = 10. ' ) + ( ' " when ' ) + ( ' DATA(sum) = first + second. ' ) + ( ' " then ' ) + ( ' cl_aunit_assert=>assert_differs( act = 10 ' ) + ( ' exp = 20 ). "#EC UT_ASSERT ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_hardcoded_string DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_cut REDEFINITION. + METHODS get_code_with_issue REDEFINITION. + METHODS get_code_without_issue REDEFINITION. + METHODS get_code_with_exemption REDEFINITION. +ENDCLASS. + +CLASS ltc_hardcoded_string IMPLEMENTATION. + + METHOD get_cut. + result ?= NEW y_check_unit_test_assert( ). + ENDMETHOD. + + METHOD get_code_with_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( | cl_aunit_assert=>assert_differs( act = 'A' | ) + ( | exp = 'B' ). | ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( ' DATA(system) = sy-sysid. ' ) + ( | cl_aunit_assert=>assert_differs( act = system | ) + ( | exp = 'B' ). | ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_with_exemption. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example FOR TESTING. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( | cl_aunit_assert=>assert_differs( act = 'A' | ) + ( | exp = 'B' ). "#EC UT_ASSERT | ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_public_classdata DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_public_classdata IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example FOR TESTING. ' ) + ( ' CLASS-DATA system TYPE string. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( | cl_aunit_assert=>assert_differs( act = system | ) + ( | exp = 'B' ). | ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_protected_data DEFINITION INHERITING FROM ltc_hardcoded_string FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_protected_data IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example FOR TESTING. ' ) + ( ' PROTECTED SECTION. ' ) + ( ' DATA system TYPE string. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( | cl_aunit_assert=>assert_differs( act = system | ) + ( | exp = 'system' ). | ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/checks/y_check_unit_test_assert.clas.xml b/src/checks/y_check_unit_test_assert.clas.xml new file mode 100644 index 00000000..394c176d --- /dev/null +++ b/src/checks/y_check_unit_test_assert.clas.xml @@ -0,0 +1,17 @@ + + + + + + Y_CHECK_UNIT_TEST_ASSERT + E + Unit Test Assert Validator + 1 + X + X + X + X + + + + diff --git a/src/examples/y_demo_failures.clas.testclasses.abap b/src/examples/y_demo_failures.clas.testclasses.abap index 7bc29e73..e0734b39 100644 --- a/src/examples/y_demo_failures.clas.testclasses.abap +++ b/src/examples/y_demo_failures.clas.testclasses.abap @@ -3,6 +3,7 @@ CLASS local_test_class DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT PRIVATE SECTION. METHODS db_access_in_ut FOR TESTING. METHODS external_call_in_ut FOR TESTING. + METHODS unit_test_assert FOR TESTING. ENDCLASS. CLASS local_test_class IMPLEMENTATION. @@ -10,10 +11,24 @@ CLASS local_test_class IMPLEMENTATION. METHOD db_access_in_ut. SELECT SINGLE * FROM t100 INTO @DATA(entry). + + cl_abap_unit_assert=>assert_not_initial( entry ). ENDMETHOD. METHOD external_call_in_ut. DATA alv TYPE REF TO cl_gui_alv_grid. + cl_abap_unit_assert=>fail( 'No Gui Allowed' ). + ENDMETHOD. + + METHOD unit_test_assert. + "Given + DATA(first) = 10. + DATA(second) = 20. + "When + DATA(sum) = first + second. + "Then + cl_abap_unit_assert=>assert_equals( act = sum + exp = sum ). ENDMETHOD. ENDCLASS. From ebf261ed669ce8a450f2019181d0ee267baa0ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugen=20G=C3=BCnther?= <64586309+eugen-guenther-sap@users.noreply.github.com> Date: Wed, 7 Apr 2021 09:43:18 +0200 Subject: [PATCH 08/28] Update y_check_unit_test_assert.clas.abap --- src/checks/y_check_unit_test_assert.clas.abap | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/checks/y_check_unit_test_assert.clas.abap b/src/checks/y_check_unit_test_assert.clas.abap index 8c48c9bd..8563c673 100644 --- a/src/checks/y_check_unit_test_assert.clas.abap +++ b/src/checks/y_check_unit_test_assert.clas.abap @@ -49,11 +49,10 @@ CLASS y_check_unit_test_assert IMPLEMENTATION. RETURN. ENDIF. - IF act-str <> exp-str. - IF is_variable( act ) = abap_true - OR is_variable( exp ) = abap_true. + IF act-str <> exp-str + AND ( is_variable( act ) = abap_true + OR is_variable( exp ) = abap_true ). RETURN. - ENDIF. ENDIF. DATA(check_configuration) = detect_check_configuration( statement ). From 8b9f804b692814ea39de2fbfbc9f657a49a75c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugen=20G=C3=BCnther?= <64586309+eugen-guenther-sap@users.noreply.github.com> Date: Wed, 7 Apr 2021 09:46:34 +0200 Subject: [PATCH 09/28] Update y_check_unit_test_assert.clas.abap --- src/checks/y_check_unit_test_assert.clas.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checks/y_check_unit_test_assert.clas.abap b/src/checks/y_check_unit_test_assert.clas.abap index 8563c673..4a7146dc 100644 --- a/src/checks/y_check_unit_test_assert.clas.abap +++ b/src/checks/y_check_unit_test_assert.clas.abap @@ -49,7 +49,7 @@ CLASS y_check_unit_test_assert IMPLEMENTATION. RETURN. ENDIF. - IF act-str <> exp-str + IF act-str <> exp-str AND ( is_variable( act ) = abap_true OR is_variable( exp ) = abap_true ). RETURN. From 4da128bbb1a5b569adc6aa88bcfe4f5c3f137bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eugen=20G=C3=BCnther?= <64586309+eugen-guenther-sap@users.noreply.github.com> Date: Wed, 7 Apr 2021 13:55:13 +0200 Subject: [PATCH 10/28] Part 1 - core feature - allow pseudo comment exception #329 (#357) * feature - allow pseudo comment exception * Update y_check_unit_test_assert.clas.abap Co-authored-by: Lucas Borin <5233413+lucasborin@users.noreply.github.com> --- src/foundation/y_check_base.clas.abap | 39 ++++--- src/foundation/y_clean_code_manager.clas.abap | 16 ++- .../y_if_clean_code_manager.intf.abap | 37 ++++--- src/foundation/ycicp_pseudo_comments.dtel.xml | 23 ++++ .../y_profile_admin_classes.prog.abap | 104 ++++++++---------- src/profiles/y_profile_admin_data.prog.abap | 2 + .../y_profile_administrator.prog.abap | 2 +- src/profiles/y_profile_administrator.prog.xml | 47 +++++++- src/profiles/ytab_checks.tabl.xml | 20 +++- 9 files changed, 189 insertions(+), 101 deletions(-) create mode 100644 src/foundation/ycicp_pseudo_comments.dtel.xml diff --git a/src/foundation/y_check_base.clas.abap b/src/foundation/y_check_base.clas.abap index 3b0f3e3b..7fc096af 100644 --- a/src/foundation/y_check_base.clas.abap +++ b/src/foundation/y_check_base.clas.abap @@ -30,6 +30,7 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT apply_on_test_code TYPE ycicc_testcode, documentation TYPE c LENGTH 1000, is_threshold_reversed TYPE abap_bool, + allow_pseudo_comments TYPE abap_bool, END OF settings. METHODS constructor. @@ -104,8 +105,7 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT parameter_04 TYPE csequence OPTIONAL is_include_specific TYPE sci_inclspec DEFAULT ' ' additional_information TYPE xstring OPTIONAL - checksum TYPE int4 OPTIONAL - pseudo_comments TYPE t_comments OPTIONAL. "#EC OPTL_PARAM + checksum TYPE int4 OPTIONAL. "#EC OPTL_PARAM METHODS get_column_abs REDEFINITION. METHODS get_column_rel REDEFINITION. @@ -149,14 +149,14 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT METHODS is_structure_type_relevant IMPORTING structure TYPE sstruc RETURNING VALUE(result) TYPE abap_bool. - METHODS is_app_comp_in_scope IMPORTING level TYPE stmnt_levl - RETURNING value(result) TYPE abap_bool. + METHODS is_app_comp_in_scope IMPORTING level TYPE stmnt_levl + RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. -CLASS y_check_base IMPLEMENTATION. +CLASS Y_CHECK_BASE IMPLEMENTATION. METHOD check_start_conditions. @@ -181,6 +181,7 @@ CLASS y_check_base IMPLEMENTATION. settings-apply_on_productive_code = abap_true. settings-apply_on_test_code = abap_true. settings-documentation = |{ c_docs_path-main }check_documentation.md|. + settings-allow_pseudo_comments = abap_true. has_attributes = do_attributes_exist( ). @@ -298,7 +299,7 @@ CLASS y_check_base IMPLEMENTATION. check_configuration-object_creation_date = settings-object_created_on. check_configuration-prio = settings-prio. check_configuration-threshold = settings-threshold. - + check_configuration-allow_pseudo_comments = settings-allow_pseudo_comments. APPEND check_configuration TO check_configurations. ENDIF. EXPORT @@ -307,6 +308,7 @@ CLASS y_check_base IMPLEMENTATION. threshold = check_configuration-threshold apply_on_productive_code = check_configuration-apply_on_productive_code apply_on_testcode = check_configuration-apply_on_testcode + allow_pseudo_comments = check_configuration-allow_pseudo_comments TO DATA BUFFER p_attributes. ENDMETHOD. @@ -512,6 +514,7 @@ CLASS y_check_base IMPLEMENTATION. check_configuration-apply_on_productive_code = settings-apply_on_productive_code. check_configuration-apply_on_testcode = settings-apply_on_test_code. check_configuration-threshold = settings-threshold. + check_configuration-allow_pseudo_comments = settings-allow_pseudo_comments. ENDIF. INSERT VALUE #( @@ -550,6 +553,14 @@ CLASS y_check_base IMPLEMENTATION. ) INTO TABLE sci_attributes. ENDIF. + IF settings-pseudo_comment IS NOT INITIAL. + INSERT VALUE #( + kind = '' + ref = REF #( check_configuration-allow_pseudo_comments ) + text = |Allow { settings-pseudo_comment }| + ) INTO TABLE sci_attributes. + ENDIF. + title = description. attributes_ok = abap_false. @@ -597,7 +608,7 @@ CLASS y_check_base IMPLEMENTATION. ENDIF. IF clean_code_exemption_handler IS NOT BOUND. - clean_code_exemption_handler = new y_exemption_handler( ). + clean_code_exemption_handler = NEW y_exemption_handler( ). ENDIF. IF test_code_detector IS NOT BOUND. @@ -638,6 +649,7 @@ CLASS y_check_base IMPLEMENTATION. threshold = check_configuration-threshold apply_on_productive_code = check_configuration-apply_on_productive_code apply_on_testcode = check_configuration-apply_on_testcode + allow_pseudo_comments = check_configuration-allow_pseudo_comments FROM DATA BUFFER p_attributes. APPEND check_configuration TO check_configurations. CATCH cx_root. "#EC NEED_CX_ROOT @@ -647,12 +659,15 @@ CLASS y_check_base IMPLEMENTATION. METHOD raise_error. + DATA(pseudo_comment) = COND sci_pcom( WHEN settings-allow_pseudo_comments = abap_false THEN settings-pseudo_comment + ELSE space ). + statistics->collect( kind = error_priority pc = NEW y_pseudo_comment_detector( )->is_pseudo_comment( ref_scan_manager = ref_scan_manager scimessages = scimessages test = myname code = get_code( error_priority ) - suppress = settings-pseudo_comment + suppress = pseudo_comment position = statement_index ) ). IF cl_abap_typedescr=>describe_by_object_ref( ref_scan_manager )->get_relative_name( ) EQ 'Y_REF_SCAN_MANAGER'. @@ -665,17 +680,15 @@ CLASS y_check_base IMPLEMENTATION. p_kind = error_priority p_test = myname p_code = get_code( error_priority ) - p_suppress = settings-pseudo_comment + p_suppress = pseudo_comment p_param_1 = parameter_01 p_param_2 = parameter_02 p_param_3 = parameter_03 p_param_4 = parameter_04 p_inclspec = is_include_specific p_detail = additional_information - p_checksum_1 = checksum - p_comments = pseudo_comments ). + p_checksum_1 = checksum ). ENDIF. - ENDMETHOD. @@ -797,6 +810,4 @@ CLASS y_check_base IMPLEMENTATION. result = abap_true. ENDTRY. ENDMETHOD. - - ENDCLASS. diff --git a/src/foundation/y_clean_code_manager.clas.abap b/src/foundation/y_clean_code_manager.clas.abap index 2cda64ef..05a4ca36 100644 --- a/src/foundation/y_clean_code_manager.clas.abap +++ b/src/foundation/y_clean_code_manager.clas.abap @@ -4,18 +4,20 @@ CLASS y_clean_code_manager DEFINITION PUBLIC CREATE PUBLIC. ALIASES calculate_obj_creation_date FOR y_if_clean_code_manager~calculate_obj_creation_date. ALIASES read_check_customizing FOR y_if_clean_code_manager~read_check_customizing. + PROTECTED SECTION. PRIVATE SECTION. METHODS determine_profiles RETURNING VALUE(result) TYPE string_table - RAISING ycx_no_check_customizing. + RAISING ycx_no_check_customizing. - METHODS determine_checks IMPORTING profile TYPE ycicc_profile - checkid TYPE seoclsname + METHODS determine_checks IMPORTING profile TYPE ycicc_profile + checkid TYPE seoclsname RETURNING VALUE(result) TYPE y_if_clean_code_manager=>check_configurations - RAISING ycx_no_check_customizing . + RAISING ycx_no_check_customizing . ENDCLASS. -CLASS y_clean_code_manager IMPLEMENTATION. + +CLASS Y_CLEAN_CODE_MANAGER IMPLEMENTATION. METHOD determine_checks. @@ -33,7 +35,9 @@ CLASS y_clean_code_manager IMPLEMENTATION. threshold = -threshold prio = -prio apply_on_productive_code = -apply_on_productive_code - apply_on_testcode = -apply_on_testcode ). + apply_on_testcode = -apply_on_testcode + allow_pseudo_comments = -ignore_pseudo_comments + ). result = VALUE #( BASE result ( CORRESPONDING #( check_configuration ) ) ). ENDLOOP. ENDMETHOD. diff --git a/src/foundation/y_if_clean_code_manager.intf.abap b/src/foundation/y_if_clean_code_manager.intf.abap index 845bba56..c3729617 100644 --- a/src/foundation/y_if_clean_code_manager.intf.abap +++ b/src/foundation/y_if_clean_code_manager.intf.abap @@ -1,29 +1,30 @@ -interface Y_IF_CLEAN_CODE_MANAGER - public . +INTERFACE y_if_clean_code_manager + PUBLIC . - types: + TYPES: BEGIN OF check_configuration, object_creation_date TYPE datum, threshold TYPE ycicc_threshold, prio TYPE ycicc_message_kind, apply_on_productive_code TYPE ycicc_productive_code, apply_on_testcode TYPE ycicc_testcode, + allow_pseudo_comments TYPE ycicp_pseudo_comments, END OF check_configuration . - types: + TYPES: check_configurations TYPE STANDARD TABLE OF check_configuration WITH DEFAULT KEY . - methods READ_CHECK_CUSTOMIZING - importing - CHECKID type SEOCLSNAME - returning - value(RESULT) type CHECK_CONFIGURATIONS - raising - YCX_NO_CHECK_CUSTOMIZING . - methods CALCULATE_OBJ_CREATION_DATE - importing - OBJECT_NAME type SOBJ_NAME - OBJECT_TYPE type TROBJTYPE - returning - value(RESULT) type CREATIONDT . -endinterface. + METHODS read_check_customizing + IMPORTING + checkid TYPE seoclsname + RETURNING + VALUE(result) TYPE check_configurations + RAISING + ycx_no_check_customizing . + METHODS calculate_obj_creation_date + IMPORTING + object_name TYPE sobj_name + object_type TYPE trobjtype + RETURNING + VALUE(result) TYPE creationdt . +ENDINTERFACE. diff --git a/src/foundation/ycicp_pseudo_comments.dtel.xml b/src/foundation/ycicp_pseudo_comments.dtel.xml new file mode 100644 index 00000000..271ab2c1 --- /dev/null +++ b/src/foundation/ycicp_pseudo_comments.dtel.xml @@ -0,0 +1,23 @@ + + + + + + YCICP_PSEUDO_COMMENTS + E + BOOLE + 55 + 10 + 20 + 40 + Code Pal - Allow Pseudo Comments + PseudCom + PseudCom + PseudCom + PseudCom + E + D + + + + diff --git a/src/profiles/y_profile_admin_classes.prog.abap b/src/profiles/y_profile_admin_classes.prog.abap index 56274f64..080fa4aa 100644 --- a/src/profiles/y_profile_admin_classes.prog.abap +++ b/src/profiles/y_profile_admin_classes.prog.abap @@ -200,23 +200,19 @@ CLASS lcl_util DEFINITION. "#EC NUMBER_METHODS check_f4help. CLASS-METHODS: - init_check_fields_active - IMPORTING checkid TYPE vseoclass-clsname, - get_disable_threshold_select + init_check_fields_active, + get_check IMPORTING checkid TYPE vseoclass-clsname - RETURNING VALUE(result) TYPE abap_bool, - get_disable_on_prodcode_select - IMPORTING checkid TYPE vseoclass-clsname - RETURNING VALUE(result) TYPE abap_bool, - get_disable_on_testcode_select - IMPORTING checkid TYPE vseoclass-clsname - RETURNING VALUE(result) TYPE abap_bool, + RETURNING VALUE(result) TYPE REF TO y_check_base + RAISING cx_sy_create_object_error, set_threshold_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_on_prodcode_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_on_testcode_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, + set_allow_pcom_active + IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_dynpro_field_active IMPORTING fieldname TYPE string is_active TYPE abap_bool. @@ -541,6 +537,8 @@ CLASS lcl_util IMPLEMENTATION. is_visible = abap_true ). checks_tree->set_field_visibility( fieldname = 'APPLY_ON_TESTCODE' is_visible = abap_true ). + checks_tree->set_field_visibility( fieldname = 'IGNORE_PSEUDO_COMMENTS' + is_visible = abap_true ). checks_tree->set_field_header_text( fieldname = 'PROFILE' header_text = 'Profile'(001) ). @@ -558,6 +556,8 @@ CLASS lcl_util IMPLEMENTATION. header_text = 'Apply on Productive Code'(050) ). checks_tree->set_field_header_text( fieldname = 'APPLY_ON_TESTCODE' header_text = 'Apply on Testcode'(034) ). + checks_tree->set_field_header_text( fieldname = 'IGNORE_PSEUDO_COMMENTS' + header_text = 'Allow Pseudo Comments' ). checks_tree->init_display( ). @@ -818,34 +818,43 @@ CLASS lcl_util IMPLEMENTATION. ENDMETHOD. METHOD init_check_fields_active. - DATA obj TYPE REF TO y_check_base. - TRY. - IF get_disable_threshold_select( checkid ) EQ abap_true. + DATA(obj) = get_check( io_check_id ). + + IF obj->settings-disable_threshold_selection EQ abap_true. set_threshold_active( abap_false ). ELSE. set_threshold_active( abap_true ). ENDIF. - IF get_disable_on_prodcode_select( checkid ) EQ abap_true. + IF obj->settings-disable_on_prodcode_selection EQ abap_true. set_on_prodcode_active( abap_false ). ELSE. set_on_prodcode_active( abap_true ). ENDIF. - IF get_disable_on_testcode_select( checkid ) EQ abap_true. + IF obj->settings-disable_on_testcode_selection EQ abap_true. set_on_testcode_active( abap_false ). ELSE. set_on_testcode_active( abap_true ). ENDIF. - CREATE OBJECT obj TYPE (io_check_id). + IF obj->settings-pseudo_comment IS INITIAL. + set_allow_pcom_active( abap_false ). + ELSE. + set_allow_pcom_active( abap_true ). + ENDIF. + + lbl_pcom_name = obj->settings-pseudo_comment. + IF has_edit_mode_started EQ abap_true. io_threshold = obj->settings-threshold. io_prio = obj->settings-prio. io_creation_date = obj->settings-object_created_on. chbx_on_prodcode = obj->settings-apply_on_productive_code. chbx_on_testcode = obj->settings-apply_on_test_code. + chbx_allow_pcom = obj->settings-allow_pseudo_comments. + lbl_pcom_name = obj->settings-pseudo_comment. has_edit_mode_started = abap_false. ENDIF. @@ -854,40 +863,8 @@ CLASS lcl_util IMPLEMENTATION. ENDTRY. ENDMETHOD. - METHOD get_disable_on_prodcode_select. - DATA obj TYPE REF TO y_check_base. - TRY. - CREATE OBJECT obj TYPE (checkid). - result = obj->settings-disable_on_prodcode_selection. - - CATCH cx_sy_create_object_error. - result = abap_false. - - ENDTRY. - ENDMETHOD. - - METHOD get_disable_on_testcode_select. - DATA obj TYPE REF TO y_check_base. - TRY. - CREATE OBJECT obj TYPE (checkid). - result = obj->settings-disable_on_testcode_selection. - - CATCH cx_sy_create_object_error. - result = abap_false. - - ENDTRY. - ENDMETHOD. - - METHOD get_disable_threshold_select. - DATA obj TYPE REF TO y_check_base. - TRY. - CREATE OBJECT obj TYPE (checkid). - result = obj->settings-disable_threshold_selection. - - CATCH cx_sy_create_object_error. - result = abap_false. - - ENDTRY. + METHOD get_check. + CREATE OBJECT result TYPE (checkid). ENDMETHOD. METHOD set_on_prodcode_active. @@ -911,6 +888,13 @@ CLASS lcl_util IMPLEMENTATION. is_active = is_active ). ENDMETHOD. + METHOD set_allow_pcom_active. + set_dynpro_field_active( fieldname = 'LBL_ALLOW_PCOM' + is_active = is_active ). + set_dynpro_field_active( fieldname = 'CHBX_ALLOW_PCOM' + is_active = is_active ). + ENDMETHOD. + METHOD set_dynpro_field_active. LOOP AT SCREEN INTO DATA(line). @@ -981,11 +965,11 @@ CLASS lcl_util IMPLEMENTATION. DATA(checklist) = profile_manager->select_checks( io_profilename ). profile_manager->insert_profile( VALUE #( username = sy-uname - profile = io_to_profile - is_standard = abap_false - last_changed_by = sy-uname - last_changed_on = sy-datum - last_changed_at = sy-timlo ) ). + profile = io_to_profile + is_standard = abap_false + last_changed_by = sy-uname + last_changed_on = sy-datum + last_changed_at = sy-timlo ) ). profile_manager->check_delegation_rights( io_to_profile ). @@ -1115,6 +1099,7 @@ CLASS lcl_util IMPLEMENTATION. result-last_changed_by = sy-uname. result-last_changed_on = sy-datum. result-last_changed_at = sy-timlo. + result-ignore_pseudo_comments = abap_true. ENDMETHOD. METHOD auto_re_start_delegate. @@ -1183,8 +1168,8 @@ CLASS lcl_util IMPLEMENTATION. CATCH ycx_entry_not_found. MESSAGE 'Please select a profile!'(005) TYPE 'I'. - CATCH ycx_no_delegation_rights. + CATCH ycx_no_delegation_rights. MESSAGE 'You are not a delegate of the profile!'(006) TYPE 'I'. CATCH cx_failed. @@ -1216,6 +1201,8 @@ CLASS lcl_util IMPLEMENTATION. io_threshold = 0. chbx_on_prodcode = abap_true. chbx_on_testcode = abap_true. + chbx_allow_pcom = abap_true. + lbl_pcom_name = space. TRY. CREATE OBJECT obj TYPE (io_check_id). @@ -1224,7 +1211,8 @@ CLASS lcl_util IMPLEMENTATION. io_prio = obj->settings-prio. chbx_on_prodcode = obj->settings-apply_on_productive_code. chbx_on_testcode = obj->settings-apply_on_test_code. - + chbx_allow_pcom = obj->settings-allow_pseudo_comments. + lbl_pcom_name = obj->settings-pseudo_comment. CATCH cx_sy_create_object_error. RETURN. ENDTRY. @@ -1241,6 +1229,7 @@ CLASS lcl_util IMPLEMENTATION. io_prio = check_line-prio. chbx_on_prodcode = check_line-apply_on_productive_code. chbx_on_testcode = check_line-apply_on_testcode. + chbx_allow_pcom = check_line-ignore_pseudo_comments. TRY. io_check_description = profile_manager->get_check_description( check_line-checkid ). @@ -1276,6 +1265,7 @@ CLASS lcl_util IMPLEMENTATION. prio = io_prio apply_on_productive_code = chbx_on_prodcode apply_on_testcode = chbx_on_testcode + ignore_pseudo_comments = chbx_allow_pcom last_changed_by = sy-uname last_changed_on = sy-datum last_changed_at = sy-timlo ). diff --git a/src/profiles/y_profile_admin_data.prog.abap b/src/profiles/y_profile_admin_data.prog.abap index af28ca03..960a50ff 100644 --- a/src/profiles/y_profile_admin_data.prog.abap +++ b/src/profiles/y_profile_admin_data.prog.abap @@ -18,3 +18,5 @@ DATA io_threshold TYPE ytab_checks-threshold. DATA io_prio TYPE ytab_checks-prio. DATA chbx_on_testcode TYPE abap_bool. DATA chbx_on_prodcode TYPE abap_bool. +DATA chbx_allow_pcom TYPE abap_bool. +DATA lbl_pcom_name TYPE sci_pcom. diff --git a/src/profiles/y_profile_administrator.prog.abap b/src/profiles/y_profile_administrator.prog.abap index 1928d3ea..b2282d5f 100644 --- a/src/profiles/y_profile_administrator.prog.abap +++ b/src/profiles/y_profile_administrator.prog.abap @@ -38,7 +38,7 @@ ENDMODULE. MODULE status_0400 OUTPUT. SET PF-STATUS check_customizing_screen. SET TITLEBAR check_customizing_screen. - lcl_util=>init_check_fields_active( io_check_id ). + lcl_util=>init_check_fields_active( ). ENDMODULE. MODULE status_0500 OUTPUT. diff --git a/src/profiles/y_profile_administrator.prog.xml b/src/profiles/y_profile_administrator.prog.xml index c00f32c7..381309e9 100644 --- a/src/profiles/y_profile_administrator.prog.xml +++ b/src/profiles/y_profile_administrator.prog.xml @@ -230,7 +230,7 @@ N 0400 027 - 121 + 122 @@ -537,6 +537,51 @@ X X + + SCREEN + SCREEN + TEXT + LBL_ALLOW_PCOM + Allow_Pseudo-Comment_Exemption:__ + 009 + 001 + 033 + 033 + 001 + CHAR + N + X + + + SCREEN + SCREEN + CHECK + CHBX_ALLOW_PCOM + 009 + 035 + 001 + 001 + 001 + CHAR + X + X + + + SCREEN + SCREEN + TEMPLATE + LBL_PCOM_NAME + ____________________ + 009 + 037 + 020 + 020 + 001 + CHAR + X + X + N + SCREEN SCREEN diff --git a/src/profiles/ytab_checks.tabl.xml b/src/profiles/ytab_checks.tabl.xml index d52c3b56..91da8f1c 100644 --- a/src/profiles/ytab_checks.tabl.xml +++ b/src/profiles/ytab_checks.tabl.xml @@ -111,8 +111,20 @@ YTAB_CHECKS - THRESHOLD + IGNORE_PSEUDO_COMMENTS 0009 + X + YCICP_PSEUDO_COMMENTS + 0 + X + X + F + E + + + YTAB_CHECKS + THRESHOLD + 0010 YCICC_THRESHOLD 0 E @@ -120,7 +132,7 @@ YTAB_CHECKS LAST_CHANGED_BY - 0010 + 0011 AS4USER 0 E @@ -128,7 +140,7 @@ YTAB_CHECKS LAST_CHANGED_ON - 0011 + 0012 AS4DATE 0 T @@ -137,7 +149,7 @@ YTAB_CHECKS LAST_CHANGED_AT - 0012 + 0013 AS4TIME 0 T From 045d31184f1e446f85835582bd69de297f46d803 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Wed, 7 Apr 2021 09:13:41 -0300 Subject: [PATCH 11/28] Revert "Part 1 - core feature - allow pseudo comment exception #329 (#357)" (#358) This reverts commit 4da128bbb1a5b569adc6aa88bcfe4f5c3f137bb6. --- src/foundation/y_check_base.clas.abap | 39 +++---- src/foundation/y_clean_code_manager.clas.abap | 16 +-- .../y_if_clean_code_manager.intf.abap | 37 +++---- src/foundation/ycicp_pseudo_comments.dtel.xml | 23 ---- .../y_profile_admin_classes.prog.abap | 104 ++++++++++-------- src/profiles/y_profile_admin_data.prog.abap | 2 - .../y_profile_administrator.prog.abap | 2 +- src/profiles/y_profile_administrator.prog.xml | 47 +------- src/profiles/ytab_checks.tabl.xml | 20 +--- 9 files changed, 101 insertions(+), 189 deletions(-) delete mode 100644 src/foundation/ycicp_pseudo_comments.dtel.xml diff --git a/src/foundation/y_check_base.clas.abap b/src/foundation/y_check_base.clas.abap index 7fc096af..3b0f3e3b 100644 --- a/src/foundation/y_check_base.clas.abap +++ b/src/foundation/y_check_base.clas.abap @@ -30,7 +30,6 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT apply_on_test_code TYPE ycicc_testcode, documentation TYPE c LENGTH 1000, is_threshold_reversed TYPE abap_bool, - allow_pseudo_comments TYPE abap_bool, END OF settings. METHODS constructor. @@ -105,7 +104,8 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT parameter_04 TYPE csequence OPTIONAL is_include_specific TYPE sci_inclspec DEFAULT ' ' additional_information TYPE xstring OPTIONAL - checksum TYPE int4 OPTIONAL. "#EC OPTL_PARAM + checksum TYPE int4 OPTIONAL + pseudo_comments TYPE t_comments OPTIONAL. "#EC OPTL_PARAM METHODS get_column_abs REDEFINITION. METHODS get_column_rel REDEFINITION. @@ -149,14 +149,14 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT METHODS is_structure_type_relevant IMPORTING structure TYPE sstruc RETURNING VALUE(result) TYPE abap_bool. - METHODS is_app_comp_in_scope IMPORTING level TYPE stmnt_levl - RETURNING VALUE(result) TYPE abap_bool. + METHODS is_app_comp_in_scope IMPORTING level TYPE stmnt_levl + RETURNING value(result) TYPE abap_bool. ENDCLASS. -CLASS Y_CHECK_BASE IMPLEMENTATION. +CLASS y_check_base IMPLEMENTATION. METHOD check_start_conditions. @@ -181,7 +181,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. settings-apply_on_productive_code = abap_true. settings-apply_on_test_code = abap_true. settings-documentation = |{ c_docs_path-main }check_documentation.md|. - settings-allow_pseudo_comments = abap_true. has_attributes = do_attributes_exist( ). @@ -299,7 +298,7 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. check_configuration-object_creation_date = settings-object_created_on. check_configuration-prio = settings-prio. check_configuration-threshold = settings-threshold. - check_configuration-allow_pseudo_comments = settings-allow_pseudo_comments. + APPEND check_configuration TO check_configurations. ENDIF. EXPORT @@ -308,7 +307,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. threshold = check_configuration-threshold apply_on_productive_code = check_configuration-apply_on_productive_code apply_on_testcode = check_configuration-apply_on_testcode - allow_pseudo_comments = check_configuration-allow_pseudo_comments TO DATA BUFFER p_attributes. ENDMETHOD. @@ -514,7 +512,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. check_configuration-apply_on_productive_code = settings-apply_on_productive_code. check_configuration-apply_on_testcode = settings-apply_on_test_code. check_configuration-threshold = settings-threshold. - check_configuration-allow_pseudo_comments = settings-allow_pseudo_comments. ENDIF. INSERT VALUE #( @@ -553,14 +550,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. ) INTO TABLE sci_attributes. ENDIF. - IF settings-pseudo_comment IS NOT INITIAL. - INSERT VALUE #( - kind = '' - ref = REF #( check_configuration-allow_pseudo_comments ) - text = |Allow { settings-pseudo_comment }| - ) INTO TABLE sci_attributes. - ENDIF. - title = description. attributes_ok = abap_false. @@ -608,7 +597,7 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. ENDIF. IF clean_code_exemption_handler IS NOT BOUND. - clean_code_exemption_handler = NEW y_exemption_handler( ). + clean_code_exemption_handler = new y_exemption_handler( ). ENDIF. IF test_code_detector IS NOT BOUND. @@ -649,7 +638,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. threshold = check_configuration-threshold apply_on_productive_code = check_configuration-apply_on_productive_code apply_on_testcode = check_configuration-apply_on_testcode - allow_pseudo_comments = check_configuration-allow_pseudo_comments FROM DATA BUFFER p_attributes. APPEND check_configuration TO check_configurations. CATCH cx_root. "#EC NEED_CX_ROOT @@ -659,15 +647,12 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. METHOD raise_error. - DATA(pseudo_comment) = COND sci_pcom( WHEN settings-allow_pseudo_comments = abap_false THEN settings-pseudo_comment - ELSE space ). - statistics->collect( kind = error_priority pc = NEW y_pseudo_comment_detector( )->is_pseudo_comment( ref_scan_manager = ref_scan_manager scimessages = scimessages test = myname code = get_code( error_priority ) - suppress = pseudo_comment + suppress = settings-pseudo_comment position = statement_index ) ). IF cl_abap_typedescr=>describe_by_object_ref( ref_scan_manager )->get_relative_name( ) EQ 'Y_REF_SCAN_MANAGER'. @@ -680,15 +665,17 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. p_kind = error_priority p_test = myname p_code = get_code( error_priority ) - p_suppress = pseudo_comment + p_suppress = settings-pseudo_comment p_param_1 = parameter_01 p_param_2 = parameter_02 p_param_3 = parameter_03 p_param_4 = parameter_04 p_inclspec = is_include_specific p_detail = additional_information - p_checksum_1 = checksum ). + p_checksum_1 = checksum + p_comments = pseudo_comments ). ENDIF. + ENDMETHOD. @@ -810,4 +797,6 @@ CLASS Y_CHECK_BASE IMPLEMENTATION. result = abap_true. ENDTRY. ENDMETHOD. + + ENDCLASS. diff --git a/src/foundation/y_clean_code_manager.clas.abap b/src/foundation/y_clean_code_manager.clas.abap index 05a4ca36..2cda64ef 100644 --- a/src/foundation/y_clean_code_manager.clas.abap +++ b/src/foundation/y_clean_code_manager.clas.abap @@ -4,20 +4,18 @@ CLASS y_clean_code_manager DEFINITION PUBLIC CREATE PUBLIC. ALIASES calculate_obj_creation_date FOR y_if_clean_code_manager~calculate_obj_creation_date. ALIASES read_check_customizing FOR y_if_clean_code_manager~read_check_customizing. - PROTECTED SECTION. PRIVATE SECTION. METHODS determine_profiles RETURNING VALUE(result) TYPE string_table - RAISING ycx_no_check_customizing. + RAISING ycx_no_check_customizing. - METHODS determine_checks IMPORTING profile TYPE ycicc_profile - checkid TYPE seoclsname + METHODS determine_checks IMPORTING profile TYPE ycicc_profile + checkid TYPE seoclsname RETURNING VALUE(result) TYPE y_if_clean_code_manager=>check_configurations - RAISING ycx_no_check_customizing . + RAISING ycx_no_check_customizing . ENDCLASS. - -CLASS Y_CLEAN_CODE_MANAGER IMPLEMENTATION. +CLASS y_clean_code_manager IMPLEMENTATION. METHOD determine_checks. @@ -35,9 +33,7 @@ CLASS Y_CLEAN_CODE_MANAGER IMPLEMENTATION. threshold = -threshold prio = -prio apply_on_productive_code = -apply_on_productive_code - apply_on_testcode = -apply_on_testcode - allow_pseudo_comments = -ignore_pseudo_comments - ). + apply_on_testcode = -apply_on_testcode ). result = VALUE #( BASE result ( CORRESPONDING #( check_configuration ) ) ). ENDLOOP. ENDMETHOD. diff --git a/src/foundation/y_if_clean_code_manager.intf.abap b/src/foundation/y_if_clean_code_manager.intf.abap index c3729617..845bba56 100644 --- a/src/foundation/y_if_clean_code_manager.intf.abap +++ b/src/foundation/y_if_clean_code_manager.intf.abap @@ -1,30 +1,29 @@ -INTERFACE y_if_clean_code_manager - PUBLIC . +interface Y_IF_CLEAN_CODE_MANAGER + public . - TYPES: + types: BEGIN OF check_configuration, object_creation_date TYPE datum, threshold TYPE ycicc_threshold, prio TYPE ycicc_message_kind, apply_on_productive_code TYPE ycicc_productive_code, apply_on_testcode TYPE ycicc_testcode, - allow_pseudo_comments TYPE ycicp_pseudo_comments, END OF check_configuration . - TYPES: + types: check_configurations TYPE STANDARD TABLE OF check_configuration WITH DEFAULT KEY . - METHODS read_check_customizing - IMPORTING - checkid TYPE seoclsname - RETURNING - VALUE(result) TYPE check_configurations - RAISING - ycx_no_check_customizing . - METHODS calculate_obj_creation_date - IMPORTING - object_name TYPE sobj_name - object_type TYPE trobjtype - RETURNING - VALUE(result) TYPE creationdt . -ENDINTERFACE. + methods READ_CHECK_CUSTOMIZING + importing + CHECKID type SEOCLSNAME + returning + value(RESULT) type CHECK_CONFIGURATIONS + raising + YCX_NO_CHECK_CUSTOMIZING . + methods CALCULATE_OBJ_CREATION_DATE + importing + OBJECT_NAME type SOBJ_NAME + OBJECT_TYPE type TROBJTYPE + returning + value(RESULT) type CREATIONDT . +endinterface. diff --git a/src/foundation/ycicp_pseudo_comments.dtel.xml b/src/foundation/ycicp_pseudo_comments.dtel.xml deleted file mode 100644 index 271ab2c1..00000000 --- a/src/foundation/ycicp_pseudo_comments.dtel.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - YCICP_PSEUDO_COMMENTS - E - BOOLE - 55 - 10 - 20 - 40 - Code Pal - Allow Pseudo Comments - PseudCom - PseudCom - PseudCom - PseudCom - E - D - - - - diff --git a/src/profiles/y_profile_admin_classes.prog.abap b/src/profiles/y_profile_admin_classes.prog.abap index 080fa4aa..56274f64 100644 --- a/src/profiles/y_profile_admin_classes.prog.abap +++ b/src/profiles/y_profile_admin_classes.prog.abap @@ -200,19 +200,23 @@ CLASS lcl_util DEFINITION. "#EC NUMBER_METHODS check_f4help. CLASS-METHODS: - init_check_fields_active, - get_check + init_check_fields_active + IMPORTING checkid TYPE vseoclass-clsname, + get_disable_threshold_select IMPORTING checkid TYPE vseoclass-clsname - RETURNING VALUE(result) TYPE REF TO y_check_base - RAISING cx_sy_create_object_error, + RETURNING VALUE(result) TYPE abap_bool, + get_disable_on_prodcode_select + IMPORTING checkid TYPE vseoclass-clsname + RETURNING VALUE(result) TYPE abap_bool, + get_disable_on_testcode_select + IMPORTING checkid TYPE vseoclass-clsname + RETURNING VALUE(result) TYPE abap_bool, set_threshold_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_on_prodcode_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_on_testcode_active IMPORTING is_active TYPE abap_bool DEFAULT abap_true, - set_allow_pcom_active - IMPORTING is_active TYPE abap_bool DEFAULT abap_true, set_dynpro_field_active IMPORTING fieldname TYPE string is_active TYPE abap_bool. @@ -537,8 +541,6 @@ CLASS lcl_util IMPLEMENTATION. is_visible = abap_true ). checks_tree->set_field_visibility( fieldname = 'APPLY_ON_TESTCODE' is_visible = abap_true ). - checks_tree->set_field_visibility( fieldname = 'IGNORE_PSEUDO_COMMENTS' - is_visible = abap_true ). checks_tree->set_field_header_text( fieldname = 'PROFILE' header_text = 'Profile'(001) ). @@ -556,8 +558,6 @@ CLASS lcl_util IMPLEMENTATION. header_text = 'Apply on Productive Code'(050) ). checks_tree->set_field_header_text( fieldname = 'APPLY_ON_TESTCODE' header_text = 'Apply on Testcode'(034) ). - checks_tree->set_field_header_text( fieldname = 'IGNORE_PSEUDO_COMMENTS' - header_text = 'Allow Pseudo Comments' ). checks_tree->init_display( ). @@ -818,43 +818,34 @@ CLASS lcl_util IMPLEMENTATION. ENDMETHOD. METHOD init_check_fields_active. - TRY. - DATA(obj) = get_check( io_check_id ). + DATA obj TYPE REF TO y_check_base. - IF obj->settings-disable_threshold_selection EQ abap_true. + TRY. + IF get_disable_threshold_select( checkid ) EQ abap_true. set_threshold_active( abap_false ). ELSE. set_threshold_active( abap_true ). ENDIF. - IF obj->settings-disable_on_prodcode_selection EQ abap_true. + IF get_disable_on_prodcode_select( checkid ) EQ abap_true. set_on_prodcode_active( abap_false ). ELSE. set_on_prodcode_active( abap_true ). ENDIF. - IF obj->settings-disable_on_testcode_selection EQ abap_true. + IF get_disable_on_testcode_select( checkid ) EQ abap_true. set_on_testcode_active( abap_false ). ELSE. set_on_testcode_active( abap_true ). ENDIF. - IF obj->settings-pseudo_comment IS INITIAL. - set_allow_pcom_active( abap_false ). - ELSE. - set_allow_pcom_active( abap_true ). - ENDIF. - - lbl_pcom_name = obj->settings-pseudo_comment. - + CREATE OBJECT obj TYPE (io_check_id). IF has_edit_mode_started EQ abap_true. io_threshold = obj->settings-threshold. io_prio = obj->settings-prio. io_creation_date = obj->settings-object_created_on. chbx_on_prodcode = obj->settings-apply_on_productive_code. chbx_on_testcode = obj->settings-apply_on_test_code. - chbx_allow_pcom = obj->settings-allow_pseudo_comments. - lbl_pcom_name = obj->settings-pseudo_comment. has_edit_mode_started = abap_false. ENDIF. @@ -863,8 +854,40 @@ CLASS lcl_util IMPLEMENTATION. ENDTRY. ENDMETHOD. - METHOD get_check. - CREATE OBJECT result TYPE (checkid). + METHOD get_disable_on_prodcode_select. + DATA obj TYPE REF TO y_check_base. + TRY. + CREATE OBJECT obj TYPE (checkid). + result = obj->settings-disable_on_prodcode_selection. + + CATCH cx_sy_create_object_error. + result = abap_false. + + ENDTRY. + ENDMETHOD. + + METHOD get_disable_on_testcode_select. + DATA obj TYPE REF TO y_check_base. + TRY. + CREATE OBJECT obj TYPE (checkid). + result = obj->settings-disable_on_testcode_selection. + + CATCH cx_sy_create_object_error. + result = abap_false. + + ENDTRY. + ENDMETHOD. + + METHOD get_disable_threshold_select. + DATA obj TYPE REF TO y_check_base. + TRY. + CREATE OBJECT obj TYPE (checkid). + result = obj->settings-disable_threshold_selection. + + CATCH cx_sy_create_object_error. + result = abap_false. + + ENDTRY. ENDMETHOD. METHOD set_on_prodcode_active. @@ -888,13 +911,6 @@ CLASS lcl_util IMPLEMENTATION. is_active = is_active ). ENDMETHOD. - METHOD set_allow_pcom_active. - set_dynpro_field_active( fieldname = 'LBL_ALLOW_PCOM' - is_active = is_active ). - set_dynpro_field_active( fieldname = 'CHBX_ALLOW_PCOM' - is_active = is_active ). - ENDMETHOD. - METHOD set_dynpro_field_active. LOOP AT SCREEN INTO DATA(line). @@ -965,11 +981,11 @@ CLASS lcl_util IMPLEMENTATION. DATA(checklist) = profile_manager->select_checks( io_profilename ). profile_manager->insert_profile( VALUE #( username = sy-uname - profile = io_to_profile - is_standard = abap_false - last_changed_by = sy-uname - last_changed_on = sy-datum - last_changed_at = sy-timlo ) ). + profile = io_to_profile + is_standard = abap_false + last_changed_by = sy-uname + last_changed_on = sy-datum + last_changed_at = sy-timlo ) ). profile_manager->check_delegation_rights( io_to_profile ). @@ -1099,7 +1115,6 @@ CLASS lcl_util IMPLEMENTATION. result-last_changed_by = sy-uname. result-last_changed_on = sy-datum. result-last_changed_at = sy-timlo. - result-ignore_pseudo_comments = abap_true. ENDMETHOD. METHOD auto_re_start_delegate. @@ -1168,8 +1183,8 @@ CLASS lcl_util IMPLEMENTATION. CATCH ycx_entry_not_found. MESSAGE 'Please select a profile!'(005) TYPE 'I'. - CATCH ycx_no_delegation_rights. + MESSAGE 'You are not a delegate of the profile!'(006) TYPE 'I'. CATCH cx_failed. @@ -1201,8 +1216,6 @@ CLASS lcl_util IMPLEMENTATION. io_threshold = 0. chbx_on_prodcode = abap_true. chbx_on_testcode = abap_true. - chbx_allow_pcom = abap_true. - lbl_pcom_name = space. TRY. CREATE OBJECT obj TYPE (io_check_id). @@ -1211,8 +1224,7 @@ CLASS lcl_util IMPLEMENTATION. io_prio = obj->settings-prio. chbx_on_prodcode = obj->settings-apply_on_productive_code. chbx_on_testcode = obj->settings-apply_on_test_code. - chbx_allow_pcom = obj->settings-allow_pseudo_comments. - lbl_pcom_name = obj->settings-pseudo_comment. + CATCH cx_sy_create_object_error. RETURN. ENDTRY. @@ -1229,7 +1241,6 @@ CLASS lcl_util IMPLEMENTATION. io_prio = check_line-prio. chbx_on_prodcode = check_line-apply_on_productive_code. chbx_on_testcode = check_line-apply_on_testcode. - chbx_allow_pcom = check_line-ignore_pseudo_comments. TRY. io_check_description = profile_manager->get_check_description( check_line-checkid ). @@ -1265,7 +1276,6 @@ CLASS lcl_util IMPLEMENTATION. prio = io_prio apply_on_productive_code = chbx_on_prodcode apply_on_testcode = chbx_on_testcode - ignore_pseudo_comments = chbx_allow_pcom last_changed_by = sy-uname last_changed_on = sy-datum last_changed_at = sy-timlo ). diff --git a/src/profiles/y_profile_admin_data.prog.abap b/src/profiles/y_profile_admin_data.prog.abap index 960a50ff..af28ca03 100644 --- a/src/profiles/y_profile_admin_data.prog.abap +++ b/src/profiles/y_profile_admin_data.prog.abap @@ -18,5 +18,3 @@ DATA io_threshold TYPE ytab_checks-threshold. DATA io_prio TYPE ytab_checks-prio. DATA chbx_on_testcode TYPE abap_bool. DATA chbx_on_prodcode TYPE abap_bool. -DATA chbx_allow_pcom TYPE abap_bool. -DATA lbl_pcom_name TYPE sci_pcom. diff --git a/src/profiles/y_profile_administrator.prog.abap b/src/profiles/y_profile_administrator.prog.abap index b2282d5f..1928d3ea 100644 --- a/src/profiles/y_profile_administrator.prog.abap +++ b/src/profiles/y_profile_administrator.prog.abap @@ -38,7 +38,7 @@ ENDMODULE. MODULE status_0400 OUTPUT. SET PF-STATUS check_customizing_screen. SET TITLEBAR check_customizing_screen. - lcl_util=>init_check_fields_active( ). + lcl_util=>init_check_fields_active( io_check_id ). ENDMODULE. MODULE status_0500 OUTPUT. diff --git a/src/profiles/y_profile_administrator.prog.xml b/src/profiles/y_profile_administrator.prog.xml index 381309e9..c00f32c7 100644 --- a/src/profiles/y_profile_administrator.prog.xml +++ b/src/profiles/y_profile_administrator.prog.xml @@ -230,7 +230,7 @@ N 0400 027 - 122 + 121 @@ -537,51 +537,6 @@ X X - - SCREEN - SCREEN - TEXT - LBL_ALLOW_PCOM - Allow_Pseudo-Comment_Exemption:__ - 009 - 001 - 033 - 033 - 001 - CHAR - N - X - - - SCREEN - SCREEN - CHECK - CHBX_ALLOW_PCOM - 009 - 035 - 001 - 001 - 001 - CHAR - X - X - - - SCREEN - SCREEN - TEMPLATE - LBL_PCOM_NAME - ____________________ - 009 - 037 - 020 - 020 - 001 - CHAR - X - X - N - SCREEN SCREEN diff --git a/src/profiles/ytab_checks.tabl.xml b/src/profiles/ytab_checks.tabl.xml index 91da8f1c..d52c3b56 100644 --- a/src/profiles/ytab_checks.tabl.xml +++ b/src/profiles/ytab_checks.tabl.xml @@ -109,22 +109,10 @@ F E - - YTAB_CHECKS - IGNORE_PSEUDO_COMMENTS - 0009 - X - YCICP_PSEUDO_COMMENTS - 0 - X - X - F - E - YTAB_CHECKS THRESHOLD - 0010 + 0009 YCICC_THRESHOLD 0 E @@ -132,7 +120,7 @@ YTAB_CHECKS LAST_CHANGED_BY - 0011 + 0010 AS4USER 0 E @@ -140,7 +128,7 @@ YTAB_CHECKS LAST_CHANGED_ON - 0012 + 0011 AS4DATE 0 T @@ -149,7 +137,7 @@ YTAB_CHECKS LAST_CHANGED_AT - 0013 + 0012 AS4TIME 0 T From 88b01826d1ae60d2961c5e755981dced03978791 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:24:47 -0300 Subject: [PATCH 12/28] fixes #359 (#366) --- src/profiles/ytab_checks.tabl.xml | 24 ------------------------ src/profiles/ytab_delegates.tabl.xml | 4 ---- src/profiles/ytab_profiles.tabl.xml | 12 ------------ 3 files changed, 40 deletions(-) diff --git a/src/profiles/ytab_checks.tabl.xml b/src/profiles/ytab_checks.tabl.xml index d52c3b56..5c54f3e4 100644 --- a/src/profiles/ytab_checks.tabl.xml +++ b/src/profiles/ytab_checks.tabl.xml @@ -21,9 +21,7 @@ - YTAB_CHECKS PROFILE - 0001 X YCICC_PROFILE 0 @@ -31,9 +29,7 @@ E - YTAB_CHECKS CHECKID - 0002 X YCICC_CHECKID 0 @@ -41,9 +37,7 @@ E - YTAB_CHECKS START_DATE - 0003 X DATUM 0 @@ -52,9 +46,7 @@ E - YTAB_CHECKS END_DATE - 0004 X DATUM 0 @@ -63,9 +55,7 @@ E - YTAB_CHECKS OBJECTS_CREATED_ON - 0005 X CREATIONDT 0 @@ -74,9 +64,7 @@ E - YTAB_CHECKS PRIO - 0006 X YCICC_MESSAGE_KIND 0 @@ -86,9 +74,7 @@ E - YTAB_CHECKS APPLY_ON_PRODUCTIVE_CODE - 0007 X BOOLE_D 0 @@ -98,9 +84,7 @@ E - YTAB_CHECKS APPLY_ON_TESTCODE - 0008 X BOOLE_D 0 @@ -110,34 +94,26 @@ E - YTAB_CHECKS THRESHOLD - 0009 YCICC_THRESHOLD 0 E - YTAB_CHECKS LAST_CHANGED_BY - 0010 AS4USER 0 E - YTAB_CHECKS LAST_CHANGED_ON - 0011 AS4DATE 0 T E - YTAB_CHECKS LAST_CHANGED_AT - 0012 AS4TIME 0 T diff --git a/src/profiles/ytab_delegates.tabl.xml b/src/profiles/ytab_delegates.tabl.xml index a4ffa6f5..7524b52c 100644 --- a/src/profiles/ytab_delegates.tabl.xml +++ b/src/profiles/ytab_delegates.tabl.xml @@ -21,9 +21,7 @@ - YTAB_DELEGATES PROFILE - 0001 X YCICC_PROFILE 0 @@ -31,9 +29,7 @@ E - YTAB_DELEGATES DELEGATE - 0002 X XUBNAME 0 diff --git a/src/profiles/ytab_profiles.tabl.xml b/src/profiles/ytab_profiles.tabl.xml index f25050b5..7cd03e52 100644 --- a/src/profiles/ytab_profiles.tabl.xml +++ b/src/profiles/ytab_profiles.tabl.xml @@ -21,9 +21,7 @@ - YTAB_PROFILES USERNAME - 0001 X XUBNAME 0 @@ -31,9 +29,7 @@ E - YTAB_PROFILES PROFILE - 0002 X YCICC_PROFILE 0 @@ -41,9 +37,7 @@ E - YTAB_PROFILES IS_STANDARD - 0003 BOOLE_D 0 X @@ -51,26 +45,20 @@ E - YTAB_PROFILES LAST_CHANGED_BY - 0004 AS4USER 0 E - YTAB_PROFILES LAST_CHANGED_ON - 0005 AS4DATE 0 T E - YTAB_PROFILES LAST_CHANGED_AT - 0006 AS4TIME 0 T From 16d634913a6fb720fe10456f7a900892aeba49bb Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:26:56 -0300 Subject: [PATCH 13/28] Update changelog.txt --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index c757e804..e4ce2c23 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 ------------------ +* Diffs for TABL (#359) + Unit Test Without/With Invalid Assert (#288) + Prefer NEW to CREATE OBJECT (#283) * Standard functions in Prefer IS NOT to NOT IS (#338) From 732f8b5854ec2d07e8ed3f8b6cc1dd35ff7abfc5 Mon Sep 17 00:00:00 2001 From: Lucas Borin <5233413+lucasborin@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:37:33 -0300 Subject: [PATCH 14/28] New abapLint Rules (#304) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update abaplint.json * Update abaplint.json * Update abaplint.json * Update abaplint.json * disabling empty_line_in_statement * Remove double space * disabling exit_or_check * disabling line_only_punc Reporting false-positives: https://github.com/abaplint/abaplint/issues/1888 * Update abaplint.json * Update abaplint.json * Compare operator "EQ" not preferred * Disabling no_yoda_conditions https://github.com/abaplint/abaplint/issues/1891 * Method "get_first_character" not used * Compare operator "EQ" not preferred * Keep single parameter on one line * Statement "ADD" is obsolete * Compare operator "GE" not preferred Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com> * Compare operator "GE" not preferred Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com> * Compare operator "EQ" not preferred * Avoid use of SELECT * * Uncaught exception cx_sy_itab_line_not_found * Compare operator "EQ", "LT, "GT" not preferred * Reorder definitions to top of routine * Too many parenthesis, simple * Prefer Inline Declarations, CHECK_CONFIGURATION * Missing space between string or character literal * wrongly commited object * Some fixes Compare operator "EQ" not preferred Prefer Inline Declarations, FM_NAME Reorder definitions to top of routine * Statement "ADD" is obsolete * Compare operator "EQ" not preferred * Some fixes Compare operator "EQ" not preferred Statement "ADD" is obsolete Statement "SUBTRACT" is obsolete Line break multiple parameters * Some fixes Compare operator "EQ" not preferred Method "check_token_content" not used Statement "ADD" is obsolete * Some fixes Line break multiple parameters Compare operator "GE" not preferred Compare operator "EQ" not preferred * ops, fixing bug * Compare operator "EQ" not preferred * Statement "ADD" is obsolete * Some fixes Statement "ADD" is obsolete Statement "SUBTRACT" is obsolete Too many parenthesis, complex * Some fixes Omit default parameter name "FIRST_TOKEN" Statement "SUBTRACT" is obsolete Statement "ADD" is obsolete * several fixes * Update y_check_unit_test_assert.clas.abap * Update abaplint.json * Update abaplint.json * Update abaplint.json * Several fixes * several fixes * SEVERAL FIXES * Update abaplint.json * Update abaplint.json * several fixes * Update abaplint.json * Update abaplint.json * Update abaplint.json * Update abaplint.json * a few fixes * Update abaplint.json * several fixes * Update abaplint.json * several fixes * Update abaplint.json * a few fixes * Update abaplint.json * Update y_exemption_general.clas.abap * Update y_test_code_detector.clas.abap * Update y_check_empty_catches.clas.abap * Don't mix RETURNING and EXPORTING/CHANGING paramet * Update abaplint.json * Update abaplint.json * Update abaplint.json Co-authored-by: Eugen Günther <64586309+eugen-guenther-sap@users.noreply.github.com> Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com> --- abaplint.json | 207 ++++++------------ src/categories/y_category_code_pal.clas.abap | 2 +- .../y_check_check_stmnt_position.clas.abap | 18 +- src/checks/y_check_comment_position.clas.abap | 12 - src/checks/y_check_comment_usage.clas.abap | 26 +-- src/checks/y_check_cx_root_usage.clas.abap | 4 +- .../y_check_cyclomatic_complexity.clas.abap | 26 ++- src/checks/y_check_db_access_in_ut.clas.abap | 50 +++-- src/checks/y_check_empty_catches.clas.abap | 8 +- .../y_check_empty_if_branches.clas.abap | 14 +- src/checks/y_check_empty_procedures.clas.abap | 2 +- .../y_check_equals_sign_chaining.clas.abap | 4 +- .../y_check_external_call_in_ut.clas.abap | 31 ++- src/checks/y_check_function.clas.abap | 5 +- .../y_check_function.clas.locals_imp.abap | 12 +- .../y_check_is_interface_in_class.clas.abap | 2 +- src/checks/y_check_magic_number.clas.abap | 8 +- .../y_check_max_nesting_depth.clas.abap | 28 ++- .../y_check_method_output_param.clas.abap | 22 +- .../y_check_method_return_bool.clas.abap | 18 +- .../y_check_non_class_exception.clas.abap | 2 +- .../y_check_num_exec_statements.clas.abap | 2 +- .../y_check_num_public_attributes.clas.abap | 12 +- .../y_check_number_attributes.clas.abap | 14 +- src/checks/y_check_number_events.clas.abap | 2 +- .../y_check_number_interfaces.clas.abap | 2 +- src/checks/y_check_number_methods.clas.abap | 2 +- .../y_check_optional_parameters.clas.abap | 2 +- .../y_check_prefer_case_to_elseif.clas.abap | 2 +- src/checks/y_check_prefer_is_not.clas.abap | 2 +- .../y_check_pseudo_comment_usage.clas.abap | 24 +- src/checks/y_check_receiving_usage.clas.abap | 10 +- .../y_check_scope_of_variable.clas.abap | 2 +- src/checks/y_check_self_reference.clas.abap | 2 +- src/checks/y_check_test_seam_usage.clas.abap | 10 +- src/checks/y_check_unit_test_assert.clas.abap | 5 +- src/foundation/y_check_base.clas.abap | 55 ++--- .../y_ci_check_registration.prog.abap | 30 ++- src/foundation/y_clean_code_manager.clas.abap | 16 +- src/foundation/y_code_pal_service.clas.abap | 3 +- src/foundation/y_exemption_general.clas.abap | 9 +- src/foundation/y_exemption_of_class.clas.abap | 125 +++-------- .../y_exemption_of_function_group.clas.abap | 53 +++-- .../y_exemption_of_program.clas.abap | 42 ++-- .../y_object_creation_date.clas.abap | 9 +- .../y_pseudo_comment_detector.clas.abap | 6 +- src/foundation/y_test_code_detector.clas.abap | 28 +-- ...y_test_code_detector.clas.testclasses.abap | 14 +- src/profiles/y_alv_events.clas.abap | 4 +- src/profiles/y_alv_tree_control.clas.abap | 23 +- .../y_alv_tree_control.clas.testclasses.abap | 1 - src/profiles/y_if_list.intf.abap | 2 +- src/profiles/y_list.clas.abap | 6 +- src/profiles/y_list.clas.testclasses.abap | 20 +- .../y_profile_admin_classes.prog.abap | 136 ++++++------ src/profiles/y_profile_manager.clas.abap | 137 ++++++------ 56 files changed, 602 insertions(+), 711 deletions(-) diff --git a/abaplint.json b/abaplint.json index 0c8cbe25..88966229 100644 --- a/abaplint.json +++ b/abaplint.json @@ -12,16 +12,11 @@ "url": "https://github.com/abaplint/deps", "folder": "/deps1", "files": "/src/**/*.*" - }, - { - "url": "https://github.com/abapGit/abapGit", - "folder": "/deps2", - "files": "/src/**/*.*" } ], "syntax": { "version": "v740sp08", - "errorNamespace": "^(Z|Y|LCL_|TY_|LIF_)", + "errorNamespace": "^(Y)", "globalConstants": ["cntb_btype_button", "scan_struc_stmnt_type", "scan_stmnt_type", "scan_struc_type", "scan_token_type"], "globalMacros": [] }, @@ -29,114 +24,64 @@ "7bit_ascii": true, "abapdoc": false, "allowed_object_naming": true, - "allowed_object_types": { - "exclude": [], - "severity": "Error", - "allowed": [] - }, + "allowed_object_types": false, "ambiguous_statement": false, - "avoid_use": { - "exclude": [], - "severity": "Error", - "define": true, - "endselect": true, - "execSQL": true, - "kernelCall": true, - "communication": true, - "statics": true, - "systemCall": true, - "defaultKey": false, - "break": false, - "describeLines": false - }, + "avoid_use": false, "begin_end_names": true, "begin_single_include": true, - "call_transaction_authority_check": true, - "chain_mainly_declarations": { - "exclude": [], - "severity": "Error", - "definitions": true, - "write": true, - "move": true, - "refresh": true, - "unassign": true, - "clear": true, - "hide": true, - "free": true, - "include": true, - "check": true - }, + "call_transaction_authority_check": false, + "chain_mainly_declarations": true, "check_abstract": true, "check_comments": false, - "check_ddic": true, + "check_ddic": false, "check_include": true, "check_no_handler_pragma": true, "check_subrc": false, "check_syntax": true, "check_text_elements": false, - "check_transformation_exists": true, + "check_transformation_exists": false, "class_attribute_names": false, "cloud_types": true, "colon_missing_space": true, - "commented_code": false, + "commented_code": true, "constructor_visibility_public": true, "contains_tab": false, - "cyclomatic_complexity": { - "exclude": [], - "severity": "Error", - "max": 20 - }, - "definitions_top": false, + "cyclomatic_complexity": true, + "dangerous_statement": true, + "db_operation_in_loop": false, + "definitions_top": true, "description_empty": true, - "double_space": false, + "double_space": { + "startParen": false + }, "downport": true, "empty_line_in_statement": false, "empty_statement": true, - "empty_structure": false, + "empty_structure": true, "exit_or_check": false, - "exporting": false, - "forbidden_identifier": { - "exclude": [], - "severity": "Error", - "check": [] - }, - "forbidden_pseudo_and_pragma": { - "exclude": [], - "severity": "Error", - "pseudo": [], - "pragmas": [], - "ignoreGlobalClassDefinition": false, - "ignoreGlobalInterface": false - }, - "forbidden_void_type": { - "exclude": [], - "severity": "Error", - "check": [] - }, + "exporting": true, + "forbidden_identifier": false, + "forbidden_pseudo_and_pragma": false, + "forbidden_void_type": false, "form_tables_obsolete": true, - "fully_type_constants": { - "exclude": [], - "severity": "Error", - "checkData": true - }, + "fully_type_constants": false, "function_module_recommendations": true, - "functional_writing": { - "exclude": [], - "severity": "Error", - "ignoreExceptions": true - }, + "functional_writing": true, "global_class": true, "identical_conditions": true, "identical_contents": true, "identical_form_names": true, + "identical_descriptions": false, "if_in_if": true, "implement_methods": true, "in_statement_indentation": false, "indentation": false, "inline_data_old_versions": true, - "keep_single_parameter_on_one_line": false, - "keyword_case": false, - "line_break_multiple_parameters": false, + "intf_referencing_clas": { + "severity": "Warning" + }, + "keep_single_parameter_on_one_line": true, + "line_break_multiple_parameters": true, "line_break_style": true, "line_length": false, "line_only_punc": false, @@ -144,98 +89,76 @@ "local_testclass_location": true, "local_variable_names": false, "main_file_contents": true, - "many_parenthesis": false, + "many_parenthesis": true, + "max_one_method_parameter_per_line": true, + "method_implemented_twice": true, "max_one_statement": true, "message_exists": true, "method_length": false, - "method_overwrites_builtin": false, + "method_overwrites_builtin": true, "method_parameter_names": false, - "mix_returning": false, + "mix_returning": true, + "modify_only_own_db_tables": false, "msag_consistency": true, - "nesting": false, + "nesting": true, "names_no_dash": true, - "newline_between_methods": { - "exclude": [], - "severity": "Error", - "count": 3, - "logic": "less" - }, + "newline_between_methods": true, "no_public_attributes": false, + "no_yoda_conditions": false, "object_naming": false, - "obsolete_statement": { - "exclude": [], - "severity": "Error", - "refresh": true, - "compute": true, - "add": false, - "subtract": false, - "multiply": true, - "move": true, - "divide": true, - "requested": true, - "occurs": true, - "setExtended": true, - "withHeaderLine": true, - "fieldSymbolStructure": true, - "typePools": true, - "load": true - }, - "omit_parameter_name": false, + "obsolete_statement": true, + "omit_parameter_name": true, "omit_receiving": true, + "parser_702_chaining": false, "parser_error": true, "parser_missing_space": true, "prefer_inline": false, - "prefer_is_not": false, + "prefer_is_not": true, + "prefer_raise_exception_new": true, "prefer_returning_to_exporting": true, "prefer_xsdbool": true, - "preferred_compare_operator": false, - "prefix_is_current_class": false, + "preferred_compare_operator": true, + "prefix_is_current_class": true, "reduce_string_templates": true, "release_idoc": true, "remove_descriptions": false, - "rfc_error_handling": false, - "selection_screen_naming": { - "exclude": [], - "severity": "Error", - "patternKind": "required", - "ignoreNames": [], - "ignorePatterns": [], - "parameter": "^P_.+$", - "selectOption": "^S_.+$" - }, - "sequential_blank": false, - "short_case": { - "exclude": [], - "severity": "Error", - "length": 1, - "allow": [] + "rfc_error_handling": true, + "select_add_order_by": false, + "select_performance": { + "severity": "Warning" }, + "selection_screen_naming": false, + "sequential_blank": true, + "short_case": true, "sicf_consistency": true, "space_before_colon": true, - "space_before_dot": { - "exclude": [], - "severity": "Error", - "ignoreGlobalDefinition": true, - "ignoreExceptions": true + "space_before_dot": true, + "sql_escape_host_variables": { + "severity": "Warning" }, - "sql_escape_host_variables": false, - "start_at_tab": false, + "start_at_tab": true, "superclass_final": true, "sy_modification": true, "tabl_enhancement_category": true, "try_without_catch": true, "type_form_parameters": true, "types_naming": false, + "uncaught_exception": false, "unknown_types": true, "unreachable_code": true, - "unused_methods": false, + "unsecure_fae": false, + "unused_methods": true, "unused_types": true, - "unused_variables": false, + "unused_variables": { + "severity": "Warning" + }, "use_bool_expression": true, - "use_line_exists": false, + "use_class_based_exceptions": true, + "use_line_exists": true, "use_new": true, "when_others_last": true, "whitespace_end": true, - "xml_consistency": true + "xml_consistency": true, + "keyword_case": false } } diff --git a/src/categories/y_category_code_pal.clas.abap b/src/categories/y_category_code_pal.clas.abap index 1206d627..850b3614 100644 --- a/src/categories/y_category_code_pal.clas.abap +++ b/src/categories/y_category_code_pal.clas.abap @@ -22,7 +22,7 @@ CLASS Y_CATEGORY_CODE_PAL IMPLEMENTATION. METHOD constructor. super->constructor( ). - description = get_class_description( ). + description = get_class_description( ). category = 'CL_CI_CATEGORY_TOP'. position = '001'. ENDMETHOD. diff --git a/src/checks/y_check_check_stmnt_position.clas.abap b/src/checks/y_check_check_stmnt_position.clas.abap index dc3713c7..1d9bfbbe 100644 --- a/src/checks/y_check_check_stmnt_position.clas.abap +++ b/src/checks/y_check_check_stmnt_position.clas.abap @@ -59,15 +59,15 @@ CLASS y_check_check_stmnt_position IMPLEMENTATION. METHOD is_not_relevant_token. - result = xsdbool( token EQ 'METHOD' - OR token EQ 'FORM' - OR token EQ 'FUNCTION' - OR token EQ 'MODULE' - OR token EQ 'DATA' - OR token EQ 'TYPES' - OR token EQ 'CHECK' - OR token EQ 'FIELD-SYMBOLS' - OR token EQ 'CONSTANTS' ). + result = xsdbool( token = 'METHOD' + OR token = 'FORM' + OR token = 'FUNCTION' + OR token = 'MODULE' + OR token = 'DATA' + OR token = 'TYPES' + OR token = 'CHECK' + OR token = 'FIELD-SYMBOLS' + OR token = 'CONSTANTS' ). ENDMETHOD. diff --git a/src/checks/y_check_comment_position.clas.abap b/src/checks/y_check_comment_position.clas.abap index a3e57e3f..b4564d45 100644 --- a/src/checks/y_check_comment_position.clas.abap +++ b/src/checks/y_check_comment_position.clas.abap @@ -9,9 +9,6 @@ CLASS y_check_comment_position DEFINITION PUBLIC INHERITING FROM y_check_base CR METHODS has_wrong_position IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. - METHODS get_first_character IMPORTING token TYPE stokesx - RETURNING VALUE(result) TYPE char1. - METHODS is_pseudo_comment IMPORTING token TYPE stokesx RETURNING VALUE(result) TYPE abap_bool. @@ -102,15 +99,6 @@ CLASS Y_CHECK_COMMENT_POSITION IMPLEMENTATION. ENDMETHOD. - METHOD get_first_character. - TRY. - result = token-str(1). - CATCH cx_sy_range_out_of_bounds. - CLEAR result. - ENDTRY. - ENDMETHOD. - - METHOD is_pseudo_comment. TRY. result = xsdbool( token-str(4) = '"#EC' ). diff --git a/src/checks/y_check_comment_usage.clas.abap b/src/checks/y_check_comment_usage.clas.abap index ab4472be..4cbbfbef 100644 --- a/src/checks/y_check_comment_usage.clas.abap +++ b/src/checks/y_check_comment_usage.clas.abap @@ -62,7 +62,7 @@ CLASS y_check_comment_usage IMPLEMENTATION. RETURN. ENDIF. - IF statement-to EQ statement-from. + IF statement-to = statement-from. abs_statement_number = abs_statement_number + 1. ELSE. abs_statement_number = abs_statement_number + ( statement-to - statement-from ). @@ -70,14 +70,14 @@ CLASS y_check_comment_usage IMPLEMENTATION. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to - WHERE type EQ scan_token_type-comment. - IF strlen( -str ) GE 2 AND NOT - ( -str+0(2) EQ |*"| OR - -str+0(2) EQ |"!| OR - -str+0(2) EQ |##| OR - -str+0(2) EQ |*?| OR - -str+0(2) EQ |"?| OR - ( strlen( -str ) GE 3 AND -str+0(3) EQ |"#E| ) OR + WHERE type = scan_token_type-comment. + IF strlen( -str ) >= 2 AND NOT + ( -str+0(2) = |*"| OR + -str+0(2) = |"!| OR + -str+0(2) = |##| OR + -str+0(2) = |*?| OR + -str+0(2) = |"?| OR + ( strlen( -str ) >= 3 AND -str+0(3) = |"#E| ) OR -str CP '"' && object_name && '*.' ). "#EC CI_MAGIC comment_number = comment_number + 1. ENDIF. @@ -119,15 +119,15 @@ CLASS y_check_comment_usage IMPLEMENTATION. METHOD is_code_disabled. - CHECK structure-stmnt_type EQ scan_struc_stmnt_type-function. + CHECK structure-stmnt_type = scan_struc_stmnt_type-function. - IF get_token_abs( statement-from ) EQ if_kaizen_keywords_c=>gc_function. + IF get_token_abs( statement-from ) = if_kaizen_keywords_c=>gc_function. is_function_module = abap_true. - ELSEIF get_token_abs( statement-from ) EQ if_kaizen_keywords_c=>gc_endfunction. + ELSEIF get_token_abs( statement-from ) = if_kaizen_keywords_c=>gc_endfunction. is_function_module = abap_false. ENDIF. - result = xsdbool( is_function_module EQ abap_false ). + result = xsdbool( is_function_module = abap_false ). ENDMETHOD. diff --git a/src/checks/y_check_cx_root_usage.clas.abap b/src/checks/y_check_cx_root_usage.clas.abap index 81b5cb8e..44dfebad 100644 --- a/src/checks/y_check_cx_root_usage.clas.abap +++ b/src/checks/y_check_cx_root_usage.clas.abap @@ -46,9 +46,9 @@ CLASS y_check_cx_root_usage IMPLEMENTATION. METHOD has_cx_root. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to - WHERE str EQ 'CX_ROOT'. + WHERE str = 'CX_ROOT'. result = abap_true. ENDLOOP. ENDMETHOD. diff --git a/src/checks/y_check_cyclomatic_complexity.clas.abap b/src/checks/y_check_cyclomatic_complexity.clas.abap index 4bf92e31..978b0490 100644 --- a/src/checks/y_check_cyclomatic_complexity.clas.abap +++ b/src/checks/y_check_cyclomatic_complexity.clas.abap @@ -1,7 +1,6 @@ CLASS y_check_cyclomatic_complexity DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. CONSTANTS second_token TYPE i VALUE 2. - CONSTANTS third_token TYPE i VALUE 3. METHODS constructor. @@ -26,18 +25,27 @@ CLASS Y_CHECK_CYCLOMATIC_COMPLEXITY IMPLEMENTATION. METHOD compute_cyclomatic_complexity. CASE keyword( ). - WHEN 'IF' OR 'ELSEIF' OR 'WHILE' OR 'CHECK' OR - 'CATCH' OR 'CLEANUP' OR 'ASSERT' OR 'ENDAT' OR 'ENDSELECT' OR - 'LOOP' OR 'ON' OR 'PROVIDE'. - ADD 1 TO c_cyclo_comp. + WHEN 'IF' + OR 'ELSEIF' + OR 'WHILE' + OR 'CHECK' + OR 'CATCH' + OR 'CLEANUP' + OR 'ASSERT' + OR 'ENDAT' + OR 'ENDSELECT' + OR 'LOOP' + OR 'ON' + OR 'PROVIDE'. + c_cyclo_comp = c_cyclo_comp + 1. WHEN 'WHEN'. IF get_token_rel( second_token ) <> 'OTHERS'. - ADD 1 TO c_cyclo_comp. + c_cyclo_comp = c_cyclo_comp + 1. ENDIF. WHEN 'DO'. READ TABLE ref_scan_manager->tokens INDEX statement_wa-to INTO DATA(token). IF token-str = 'TIMES'. - ADD 1 TO c_cyclo_comp. + c_cyclo_comp = c_cyclo_comp + 1. ENDIF. ENDCASE. ENDMETHOD. @@ -70,9 +78,7 @@ CLASS Y_CHECK_CYCLOMATIC_COMPLEXITY IMPLEMENTATION. cyclo_comp = 0. ENDIF. - compute_cyclomatic_complexity( - CHANGING - c_cyclo_comp = cyclo_comp ). + compute_cyclomatic_complexity( CHANGING c_cyclo_comp = cyclo_comp ). IF index = structure-stmnt_to. DATA(check_configuration) = detect_check_configuration( error_count = cyclo_comp diff --git a/src/checks/y_check_db_access_in_ut.clas.abap b/src/checks/y_check_db_access_in_ut.clas.abap index 63b498f3..ff2bd5b3 100644 --- a/src/checks/y_check_db_access_in_ut.clas.abap +++ b/src/checks/y_check_db_access_in_ut.clas.abap @@ -54,6 +54,7 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE METHODS add_line_to_defined_classes IMPORTING statement TYPE sstmnt structure TYPE sstruc. + METHODS check_class IMPORTING index TYPE i statement TYPE sstmnt structure TYPE sstruc. @@ -117,13 +118,13 @@ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION. METHOD is_persistent_object. DATA(upper_name) = to_upper( obj_name ). - SELECT * FROM tadir - WHERE obj_name = @upper_name - AND object = @keys-table - AND delflag = @space - INTO TABLE @DATA(tmp). - result = xsdbool( sy-subrc = 0 ). + SELECT SINGLE @abap_true + FROM tadir + INTO @result + WHERE obj_name = @upper_name + AND object = @keys-table + AND delflag = @space. ENDMETHOD. @@ -149,7 +150,11 @@ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION. METHOD add_line_to_defined_classes. - DATA(class_config) = VALUE properties( name = get_class_name( structure ) ). + TRY. + DATA(class_config) = VALUE properties( name = get_class_name( structure ) ). + CATCH cx_sy_itab_line_not_found. + RETURN. + ENDTRY. IF line_exists( defined_classes[ name = class_config-name ] ). RETURN. @@ -164,7 +169,12 @@ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION. METHOD check_class. - DATA(class_name) = get_class_name( structure ). + TRY. + DATA(class_name) = get_class_name( structure ). + CATCH cx_sy_itab_line_not_found. + RETURN. + ENDTRY. + IF NOT line_exists( defined_classes[ name = class_name ] ). RETURN. ENDIF. @@ -228,18 +238,16 @@ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION. METHOD is_part_of_framework. LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() - FROM structure-stmnt_from TO structure-stmnt_to. - - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() - FROM -from TO -to - WHERE str = framework-qsql_if OR - str = framework-qsql_cl OR - str = framework-cds_if OR - str = framework-cds_cl. + FROM structure-stmnt_from TO structure-stmnt_to. + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS + FROM -from TO -to + WHERE str = framework-qsql_if + OR str = framework-qsql_cl + OR str = framework-cds_if + OR str = framework-cds_cl. result = abap_true. RETURN. ENDLOOP. - ENDLOOP. ENDMETHOD. @@ -254,10 +262,10 @@ CLASS Y_CHECK_DB_ACCESS_IN_UT IMPLEMENTATION. METHOD get_risk_level. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() - FROM statement-from TO statement-to - WHERE str = risk_level-harmless - OR str = risk_level-dangerous - OR str = risk_level-critical. + FROM statement-from TO statement-to + WHERE str = risk_level-harmless + OR str = risk_level-dangerous + OR str = risk_level-critical. result = -str. ENDLOOP. ENDMETHOD. diff --git a/src/checks/y_check_empty_catches.clas.abap b/src/checks/y_check_empty_catches.clas.abap index 33694ed9..6d42844b 100644 --- a/src/checks/y_check_empty_catches.clas.abap +++ b/src/checks/y_check_empty_catches.clas.abap @@ -31,7 +31,7 @@ CLASS Y_CHECK_EMPTY_CATCHES IMPLEMENTATION. METHOD get_next_token_from_index. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() - FROM index WHERE type EQ 'I'. + FROM index WHERE type = 'I'. IF result IS INITIAL. result = . EXIT. @@ -41,9 +41,9 @@ CLASS Y_CHECK_EMPTY_CATCHES IMPLEMENTATION. METHOD inspect_tokens. - CHECK get_next_token_from_index( statement-from )-str EQ 'CATCH' AND - ( get_next_token_from_index( statement-to + 1 )-str EQ 'ENDTRY' OR - get_next_token_from_index( statement-to + 1 )-str EQ 'ENDCATCH' ). + CHECK get_next_token_from_index( statement-from )-str = 'CATCH' + AND ( get_next_token_from_index( statement-to + 1 )-str = 'ENDTRY' + OR get_next_token_from_index( statement-to + 1 )-str = 'ENDCATCH' ). DATA(check_configuration) = detect_check_configuration( statement ). diff --git a/src/checks/y_check_empty_if_branches.clas.abap b/src/checks/y_check_empty_if_branches.clas.abap index 43f38de5..fe2fe16b 100644 --- a/src/checks/y_check_empty_if_branches.clas.abap +++ b/src/checks/y_check_empty_if_branches.clas.abap @@ -94,7 +94,7 @@ CLASS y_check_empty_if_branches IMPLEMENTATION. METHOD get_first_token_from_index. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM index - WHERE type EQ 'I'. + WHERE type = 'I'. IF result IS INITIAL. result = . EXIT. @@ -116,22 +116,22 @@ CLASS y_check_empty_if_branches IMPLEMENTATION. METHOD is_statement_type_excluded. - result = xsdbool( statement-type EQ scan_stmnt_type-empty OR - statement-type EQ scan_stmnt_type-comment OR - statement-type EQ scan_stmnt_type-comment_in_stmnt OR - statement-type EQ scan_stmnt_type-pragma ). + result = xsdbool( statement-type = scan_stmnt_type-empty OR + statement-type = scan_stmnt_type-comment OR + statement-type = scan_stmnt_type-comment_in_stmnt OR + statement-type = scan_stmnt_type-pragma ). ENDMETHOD. METHOD set_found_statement_to_false. - IF branch_counter LT first_if. + IF branch_counter < first_if. found_statement = abap_false. ENDIF. ENDMETHOD. METHOD set_found_statement_to_true. - IF branch_counter GT first_if. + IF branch_counter > first_if. found_statement = abap_true. ENDIF. ENDMETHOD. diff --git a/src/checks/y_check_empty_procedures.clas.abap b/src/checks/y_check_empty_procedures.clas.abap index f05a9800..7d617a64 100644 --- a/src/checks/y_check_empty_procedures.clas.abap +++ b/src/checks/y_check_empty_procedures.clas.abap @@ -37,7 +37,7 @@ CLASS y_check_empty_procedures IMPLEMENTATION. METHOD get_next_token_from_index. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() - FROM index WHERE type EQ 'I'. + FROM index WHERE type = 'I'. IF result IS INITIAL. result = . EXIT. diff --git a/src/checks/y_check_equals_sign_chaining.clas.abap b/src/checks/y_check_equals_sign_chaining.clas.abap index bcd06ece..ea137ae7 100644 --- a/src/checks/y_check_equals_sign_chaining.clas.abap +++ b/src/checks/y_check_equals_sign_chaining.clas.abap @@ -33,8 +33,8 @@ CLASS y_check_equals_sign_chaining IMPLEMENTATION. METHOD inspect_tokens. - CHECK get_second_token( statement ) EQ '='. - CHECK get_fourth_token( statement ) EQ '='. + CHECK get_second_token( statement ) = '='. + CHECK get_fourth_token( statement ) = '='. DATA(check_configuration) = detect_check_configuration( statement ). diff --git a/src/checks/y_check_external_call_in_ut.clas.abap b/src/checks/y_check_external_call_in_ut.clas.abap index f32545cc..da6c59b4 100644 --- a/src/checks/y_check_external_call_in_ut.clas.abap +++ b/src/checks/y_check_external_call_in_ut.clas.abap @@ -17,20 +17,17 @@ CLASS y_check_external_call_in_ut IMPLEMENTATION. METHOD check_if_error. - DATA check_configuration TYPE y_if_clean_code_manager=>check_configuration. - DATA(key_word) = get_token_abs( statement-from ). - - check_configuration = detect_check_configuration( statement ). + DATA(check_configuration) = detect_check_configuration( statement ). IF check_configuration IS INITIAL. RETURN. ENDIF. - raise_error( statement_level = statement-level - statement_index = index - statement_from = statement-from - error_priority = check_configuration-prio - parameter_01 = |{ key_word }| ). + raise_error( statement_level = statement-level + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio + parameter_01 = get_token_abs( statement-from ) ). ENDMETHOD. @@ -54,6 +51,8 @@ CLASS y_check_external_call_in_ut IMPLEMENTATION. METHOD inspect_tokens. + DATA has_redirection TYPE abap_bool VALUE abap_false. + DATA(token1) = get_token_abs( statement-from ). DATA(token2) = get_token_abs( statement-from + 1 ). DATA(token3) = get_token_abs( statement-from + 2 ). @@ -62,19 +61,17 @@ CLASS y_check_external_call_in_ut IMPLEMENTATION. DATA(token6) = get_token_abs( statement-from + 5 ). DATA(token4to6) = |{ token4 } { token5 } { token6 }|. - DATA has_redirection TYPE abap_bool VALUE abap_false. - CASE token1. WHEN 'SUBMIT'. has_redirection = abap_true. WHEN 'CALL'. - IF ( token2 = 'FUNCTION' ) AND - ( ( token4 = 'DESTINATION' ) OR - ( ( token4to6 = 'STARTING NEW TASK' ) ) OR - ( ( token4to6 = 'IN UPDATE TASK' ) ) ). + IF token2 = 'FUNCTION' + AND ( token4 = 'DESTINATION' + OR token4to6 = 'STARTING NEW TASK' + OR token4to6 = 'IN UPDATE TASK' ). has_redirection = abap_true. - ELSEIF ( token2 = 'METHOD' ) AND - ( token3 CS 'CL_GUI_' ). + ELSEIF token2 = 'METHOD' + AND token3 CS 'CL_GUI_'. has_redirection = abap_true. ENDIF. WHEN OTHERS. diff --git a/src/checks/y_check_function.clas.abap b/src/checks/y_check_function.clas.abap index eb1d9792..e0908de2 100644 --- a/src/checks/y_check_function.clas.abap +++ b/src/checks/y_check_function.clas.abap @@ -41,10 +41,9 @@ CLASS Y_CHECK_FUNCTION IMPLEMENTATION. CHECK get_token_abs( statement-from ) = 'FUNCTION'. - DATA fm_name TYPE c LENGTH 30. - fm_name = get_token_abs( statement-from + 1 ). + DATA(fm_name) = get_token_abs( statement-from + 1 ). - IF db_reader->is_fm_rfc_enabled( fm_name ) EQ abap_false. + IF db_reader->is_fm_rfc_enabled( CONV #( fm_name ) ) = abap_false. DATA(check_configuration) = detect_check_configuration( statement ). diff --git a/src/checks/y_check_function.clas.locals_imp.abap b/src/checks/y_check_function.clas.locals_imp.abap index e93b11a9..be7d319e 100644 --- a/src/checks/y_check_function.clas.locals_imp.abap +++ b/src/checks/y_check_function.clas.locals_imp.abap @@ -1,9 +1,11 @@ CLASS lcl_db_reader IMPLEMENTATION. + METHOD lif_db_reader~is_fm_rfc_enabled. - SELECT SINGLE fmode FROM tfdir - WHERE funcname = @function - AND fmode EQ 'R' - INTO @DATA(mode). - result = xsdbool( sy-subrc EQ 0 ). + SELECT SINGLE @abap_true + FROM tfdir + INTO @result + WHERE funcname = @function + AND fmode = 'R'. ENDMETHOD. + ENDCLASS. diff --git a/src/checks/y_check_is_interface_in_class.clas.abap b/src/checks/y_check_is_interface_in_class.clas.abap index 0c3ba1b1..8a165633 100644 --- a/src/checks/y_check_is_interface_in_class.clas.abap +++ b/src/checks/y_check_is_interface_in_class.clas.abap @@ -66,7 +66,7 @@ CLASS Y_CHECK_IS_INTERFACE_IN_CLASS IMPLEMENTATION. AND get_second_token( statement ) <> 'FOR' AND get_third_token( statement ) <> 'TESTING'. - ADD 1 TO public_method_counter. + public_method_counter = public_method_counter + 1. ENDMETHOD. diff --git a/src/checks/y_check_magic_number.clas.abap b/src/checks/y_check_magic_number.clas.abap index 5b0420b1..9783861f 100644 --- a/src/checks/y_check_magic_number.clas.abap +++ b/src/checks/y_check_magic_number.clas.abap @@ -39,13 +39,13 @@ CLASS Y_CHECK_MAGIC_NUMBER IMPLEMENTATION. METHOD is_exception. - IF token EQ 'ENDCASE' AND has_case_with_subrc EQ abap_true. + IF token = 'ENDCASE' AND has_case_with_subrc = abap_true. has_case_with_subrc = abap_false. ENDIF. - IF token EQ 'SY-SUBRC' OR has_case_with_subrc EQ abap_true. + IF token = 'SY-SUBRC' OR has_case_with_subrc = abap_true. result = abap_true. - ELSEIF token EQ 'CASE' AND get_token_rel( second_token ) = 'SY-SUBRC'. + ELSEIF token = 'CASE' AND get_token_rel( second_token ) = 'SY-SUBRC'. has_case_with_subrc = abap_true. ENDIF. ENDMETHOD. @@ -93,7 +93,7 @@ CLASS Y_CHECK_MAGIC_NUMBER IMPLEMENTATION. ENDIF. FIND REGEX `^(?!'?[01]'?$)'?\d+'?$` IN token_string. - IF sy-subrc EQ 0. + IF sy-subrc = 0. magic_number = token_string. result = abap_true. ENDIF. diff --git a/src/checks/y_check_max_nesting_depth.clas.abap b/src/checks/y_check_max_nesting_depth.clas.abap index 5df7b45b..d045c83f 100644 --- a/src/checks/y_check_max_nesting_depth.clas.abap +++ b/src/checks/y_check_max_nesting_depth.clas.abap @@ -25,14 +25,26 @@ CLASS y_check_max_nesting_depth IMPLEMENTATION. METHOD compute_nesting_level. CASE token_str. - WHEN 'IF' OR 'WHILE' OR 'LOOP' OR - 'DO' OR 'PROVIDE' OR 'TRY' OR 'CASE'. - ADD 1 TO curr_nesting. - WHEN 'ENDIF' OR 'ENDWHILE' OR 'ENDLOOP' OR - 'ENDDO' OR 'ENDPROVIDE' OR 'ENDTRY' OR 'ENDCASE'. - max_nesting = nmax( val1 = max_nesting val2 = curr_nesting ). - SUBTRACT 1 FROM curr_nesting. - WHEN 'ENDAT' OR 'ENDSELECT'. + WHEN 'IF' + OR 'WHILE' + OR 'LOOP' + OR 'DO' + OR 'PROVIDE' + OR 'TRY' + OR 'CASE'. + curr_nesting = curr_nesting + 1. + WHEN 'ENDIF' + OR 'ENDWHILE' + OR 'ENDLOOP' + OR 'ENDDO' + OR 'ENDPROVIDE' + OR 'ENDTRY' + OR 'ENDCASE'. + max_nesting = nmax( val1 = max_nesting + val2 = curr_nesting ). + curr_nesting = curr_nesting - 1. + WHEN 'ENDAT' + OR 'ENDSELECT'. IF curr_nesting >= max_nesting. max_nesting = curr_nesting + 1. ENDIF. diff --git a/src/checks/y_check_method_output_param.clas.abap b/src/checks/y_check_method_output_param.clas.abap index f9247080..7f9c3c1a 100644 --- a/src/checks/y_check_method_output_param.clas.abap +++ b/src/checks/y_check_method_output_param.clas.abap @@ -6,13 +6,10 @@ CLASS y_check_method_output_param DEFINITION PUBLIC INHERITING FROM y_check_bas METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. - DATA has_found_methods TYPE abap_bool. DATA has_exporting_parameter TYPE abap_bool. DATA has_changing_parameter TYPE abap_bool. DATA has_returning_parameter TYPE abap_bool. - DATA has_pseudo_comment TYPE abap_bool. - METHODS check_token_content IMPORTING token TYPE stokesx. METHODS has_error RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -25,13 +22,13 @@ CLASS Y_CHECK_METHOD_OUTPUT_PARAM IMPLEMENTATION. METHOD has_error. DATA(sum) = 0. IF has_exporting_parameter = abap_true. - ADD 1 TO sum. + sum = sum + 1. ENDIF. IF has_changing_parameter = abap_true. - ADD 1 TO sum. + sum = sum + 1. ENDIF. IF has_returning_parameter = abap_true. - ADD 1 TO sum. + sum = sum + 1. ENDIF. IF sum > 1. result = abap_true. @@ -39,19 +36,6 @@ CLASS Y_CHECK_METHOD_OUTPUT_PARAM IMPLEMENTATION. ENDMETHOD. - METHOD check_token_content. - IF token-str EQ 'EXPORTING'. - has_exporting_parameter = abap_true. - ENDIF. - IF token-str EQ 'CHANGING'. - has_changing_parameter = abap_true. - ENDIF. - IF token-str EQ 'RETURNING'. - has_returning_parameter = abap_true. - ENDIF. - ENDMETHOD. - - METHOD constructor. super->constructor( ). diff --git a/src/checks/y_check_method_return_bool.clas.abap b/src/checks/y_check_method_return_bool.clas.abap index 1dacd995..18fe583a 100644 --- a/src/checks/y_check_method_return_bool.clas.abap +++ b/src/checks/y_check_method_return_bool.clas.abap @@ -59,15 +59,19 @@ CLASS Y_CHECK_METHOD_RETURN_BOOL IMPLEMENTATION. method_name = get_token_abs( stmnt_index + 1 ). LOOP AT good_method_names_beginning ASSIGNING FIELD-SYMBOL(). - IF strlen( method_name ) GE strlen( ) - AND substring( val = method_name len = strlen( ) ) EQ . - result = abap_true. - RETURN. + IF strlen( method_name ) >= strlen( ). + DATA(prefix) = substring( val = method_name + len = strlen( ) ). + + IF prefix = . + result = abap_true. + RETURN. + ENDIF. ENDIF. ENDLOOP. LOOP AT good_method_names_containing ASSIGNING FIELD-SYMBOL(). - IF strlen( method_name ) GE strlen( ) + IF strlen( method_name ) >= strlen( ) AND method_name CS . result = abap_true. RETURN. @@ -84,8 +88,8 @@ CLASS Y_CHECK_METHOD_RETURN_BOOL IMPLEMENTATION. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. - IF -str EQ 'ABAP_BOOL' - AND get_token_abs( token_index - 3 ) EQ 'RETURNING'. "#EC CI_MAGIC + IF -str = 'ABAP_BOOL' + AND get_token_abs( token_index - 3 ) = 'RETURNING'. "#EC CI_MAGIC has_found_bool = abap_true. ENDIF. token_index = token_index + 1. diff --git a/src/checks/y_check_non_class_exception.clas.abap b/src/checks/y_check_non_class_exception.clas.abap index 2c5e42ca..422ca134 100644 --- a/src/checks/y_check_non_class_exception.clas.abap +++ b/src/checks/y_check_non_class_exception.clas.abap @@ -61,7 +61,7 @@ CLASS Y_CHECK_NON_CLASS_EXCEPTION IMPLEMENTATION. LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to - WHERE str = 'RAISING' AND type EQ 'I'. + WHERE str = 'RAISING' AND type = 'I'. checkif_error( index = index statement = statement ). diff --git a/src/checks/y_check_num_exec_statements.clas.abap b/src/checks/y_check_num_exec_statements.clas.abap index 04612c0a..8573a831 100644 --- a/src/checks/y_check_num_exec_statements.clas.abap +++ b/src/checks/y_check_num_exec_statements.clas.abap @@ -48,7 +48,7 @@ CLASS Y_CHECK_NUM_EXEC_STATEMENTS IMPLEMENTATION. RETURN. ENDIF. IF token_wa-type <> scan_token_type-comment AND token_wa-type <> scan_token_type-pragma. - ADD 1 TO no_exec_statements. + no_exec_statements = no_exec_statements + 1. ENDIF. ENDMETHOD. diff --git a/src/checks/y_check_num_public_attributes.clas.abap b/src/checks/y_check_num_public_attributes.clas.abap index cf29fd1f..7be75f4b 100644 --- a/src/checks/y_check_num_public_attributes.clas.abap +++ b/src/checks/y_check_num_public_attributes.clas.abap @@ -62,10 +62,12 @@ CLASS y_check_num_public_attributes IMPLEMENTATION. METHOD checkif_attribute_in_structure. - IF ( second_token = 'BEGIN' AND third_token = 'OF' ). - ADD 1 TO structure_depth. - ELSEIF ( second_token = 'END' AND third_token = 'OF' ). - SUBTRACT 1 FROM structure_depth. + IF second_token = 'BEGIN' + AND third_token = 'OF'. + structure_depth = structure_depth + 1. + ELSEIF second_token = 'END' + AND third_token = 'OF'. + structure_depth = structure_depth - 1. ENDIF. ENDMETHOD. @@ -78,7 +80,7 @@ CLASS y_check_num_public_attributes IMPLEMENTATION. CHECK last_token <> 'READ-ONLY'. - ADD 1 TO public_attribute_counter. + public_attribute_counter = public_attribute_counter + 1. ENDMETHOD. diff --git a/src/checks/y_check_number_attributes.clas.abap b/src/checks/y_check_number_attributes.clas.abap index ac7dadcf..cd3c6fa4 100644 --- a/src/checks/y_check_number_attributes.clas.abap +++ b/src/checks/y_check_number_attributes.clas.abap @@ -52,7 +52,7 @@ CLASS y_check_number_attributes IMPLEMENTATION. METHOD inspect_tokens. - checkif_attribute_found( first_token = get_token_abs( statement-from ) ). + checkif_attribute_found( get_token_abs( statement-from ) ). checkif_attribute_in_structure( second_token = get_token_abs( statement-from + 1 ) third_token = get_token_abs( statement-from + 2 ) ). @@ -63,17 +63,19 @@ CLASS y_check_number_attributes IMPLEMENTATION. CASE first_token. WHEN 'DATA' OR 'CLASS-DATA'. IF structure_depth <= structure_depth_threshold. - ADD 1 TO attribute_counter. + attribute_counter = attribute_counter + 1. ENDIF. ENDCASE. ENDMETHOD. METHOD checkif_attribute_in_structure. - IF ( second_token = 'BEGIN' AND third_token = 'OF' ). - ADD 1 TO structure_depth. - ELSEIF ( second_token = 'END' AND third_token = 'OF' ). - SUBTRACT 1 FROM structure_depth. + IF second_token = 'BEGIN' + AND third_token = 'OF'. + structure_depth = structure_depth + 1. + ELSEIF second_token = 'END' + AND third_token = 'OF'. + structure_depth = structure_depth - 1. ENDIF. ENDMETHOD. diff --git a/src/checks/y_check_number_events.clas.abap b/src/checks/y_check_number_events.clas.abap index f49cf36d..b1bac668 100644 --- a/src/checks/y_check_number_events.clas.abap +++ b/src/checks/y_check_number_events.clas.abap @@ -45,7 +45,7 @@ CLASS Y_CHECK_NUMBER_EVENTS IMPLEMENTATION. METHOD inspect_tokens. CASE get_token_abs( statement-from ). WHEN 'EVENTS' OR 'CLASS-EVENTS'. - ADD 1 TO event_counter. + event_counter = event_counter + 1. ENDCASE. ENDMETHOD. diff --git a/src/checks/y_check_number_interfaces.clas.abap b/src/checks/y_check_number_interfaces.clas.abap index adc4ea60..eb15e635 100644 --- a/src/checks/y_check_number_interfaces.clas.abap +++ b/src/checks/y_check_number_interfaces.clas.abap @@ -45,7 +45,7 @@ CLASS y_check_number_interfaces IMPLEMENTATION. METHOD inspect_tokens. IF get_token_abs( statement-from ) = 'INTERFACES'. - ADD 1 TO interface_counter. + interface_counter = interface_counter + 1. ENDIF. ENDMETHOD. diff --git a/src/checks/y_check_number_methods.clas.abap b/src/checks/y_check_number_methods.clas.abap index e8d8eca3..141181b3 100644 --- a/src/checks/y_check_number_methods.clas.abap +++ b/src/checks/y_check_number_methods.clas.abap @@ -47,7 +47,7 @@ CLASS Y_CHECK_NUMBER_METHODS IMPLEMENTATION. METHOD inspect_tokens. CASE get_token_abs( statement-from ). WHEN 'METHODS' OR 'CLASS-METHODS'. - ADD 1 TO method_counter. + method_counter = method_counter + 1. ENDCASE. ENDMETHOD. diff --git a/src/checks/y_check_optional_parameters.clas.abap b/src/checks/y_check_optional_parameters.clas.abap index 6a8d352e..3d8f15e1 100644 --- a/src/checks/y_check_optional_parameters.clas.abap +++ b/src/checks/y_check_optional_parameters.clas.abap @@ -46,7 +46,7 @@ CLASS Y_CHECK_OPTIONAL_PARAMETERS IMPLEMENTATION. ENDMETHOD. METHOD has_optional_parameter. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str = 'OPTIONAL'. result = abap_true. diff --git a/src/checks/y_check_prefer_case_to_elseif.clas.abap b/src/checks/y_check_prefer_case_to_elseif.clas.abap index 34ce8b4f..4ef1e23e 100644 --- a/src/checks/y_check_prefer_case_to_elseif.clas.abap +++ b/src/checks/y_check_prefer_case_to_elseif.clas.abap @@ -109,7 +109,7 @@ CLASS y_check_prefer_case_to_elseif IMPLEMENTATION. METHOD has_multiple_conditions. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str = 'AND' OR str = 'OR'. result = abap_true. diff --git a/src/checks/y_check_prefer_is_not.clas.abap b/src/checks/y_check_prefer_is_not.clas.abap index 163a8fa8..f0ab421f 100644 --- a/src/checks/y_check_prefer_is_not.clas.abap +++ b/src/checks/y_check_prefer_is_not.clas.abap @@ -31,7 +31,7 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. METHOD inspect_tokens. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str = 'IF' OR str = 'ELSEIF' diff --git a/src/checks/y_check_pseudo_comment_usage.clas.abap b/src/checks/y_check_pseudo_comment_usage.clas.abap index b645a7ea..54b9aa82 100644 --- a/src/checks/y_check_pseudo_comment_usage.clas.abap +++ b/src/checks/y_check_pseudo_comment_usage.clas.abap @@ -72,7 +72,7 @@ CLASS y_check_pseudo_comment_usage IMPLEMENTATION. LOOP AT class_names ASSIGNING FIELD-SYMBOL(). TRY. IF token-str CS call_get_pseudo_comment( ). - ADD 1 TO pseudo_comment_counter. + pseudo_comment_counter = pseudo_comment_counter + 1. ENDIF. CATCH cx_sy_create_object_error. CONTINUE. @@ -93,8 +93,8 @@ CLASS y_check_pseudo_comment_usage IMPLEMENTATION. METHOD inspect_tokens. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to - WHERE type EQ 'C' - OR type EQ 'P'. + WHERE type = 'C' + OR type = 'P'. count_cc_pseudo_comments( ). ENDLOOP. ENDMETHOD. @@ -118,17 +118,21 @@ CLASS y_check_pseudo_comment_usage IMPLEMENTATION. METHOD select_object_list. - SELECT SINGLE devclass FROM tadir - WHERE obj_name EQ @myname - INTO @DATA(packagename). + SELECT SINGLE devclass + FROM tadir + WHERE obj_name = @myname + INTO @DATA(packagename). + IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. ENDIF. - SELECT obj_name FROM tadir - WHERE devclass EQ @packagename AND - obj_name NE @check_base_name - INTO TABLE @result. + SELECT obj_name + FROM tadir + WHERE devclass = @packagename + AND obj_name <> @check_base_name + INTO TABLE @result. + IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. ENDIF. diff --git a/src/checks/y_check_receiving_usage.clas.abap b/src/checks/y_check_receiving_usage.clas.abap index 2cde6c6c..9d7a7b30 100644 --- a/src/checks/y_check_receiving_usage.clas.abap +++ b/src/checks/y_check_receiving_usage.clas.abap @@ -25,7 +25,7 @@ CLASS Y_CHECK_RECEIVING_USAGE IMPLEMENTATION. METHOD inspect_tokens. CHECK get_token_abs( statement-from ) CP '*(*'. - CHECK get_token_abs( statement-from ) NE 'BADI'. + CHECK get_token_abs( statement-from ) <> 'BADI'. DATA(has_receiving) = abap_false. DATA(has_classic_exception) = abap_false. @@ -35,12 +35,12 @@ CLASS Y_CHECK_RECEIVING_USAGE IMPLEMENTATION. LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF has_receiving = abap_false. - has_receiving = xsdbool( -str EQ 'RECEIVING' AND - get_token_abs( statement-from + token_index + 1 ) NE '=' ). + has_receiving = xsdbool( -str = 'RECEIVING' AND + get_token_abs( statement-from + token_index + 1 ) <> '=' ). ENDIF. IF has_classic_exception = abap_false. - has_classic_exception = xsdbool( -str EQ 'EXCEPTIONS' AND - get_token_abs( statement-from + token_index + 1 ) NE '=' ). + has_classic_exception = xsdbool( -str = 'EXCEPTIONS' AND + get_token_abs( statement-from + token_index + 1 ) <> '=' ). ENDIF. token_index = token_index + 1. diff --git a/src/checks/y_check_scope_of_variable.clas.abap b/src/checks/y_check_scope_of_variable.clas.abap index b6b3a600..2b509635 100644 --- a/src/checks/y_check_scope_of_variable.clas.abap +++ b/src/checks/y_check_scope_of_variable.clas.abap @@ -62,7 +62,7 @@ CLASS y_check_scope_of_variable IMPLEMENTATION. CONTINUE. ENDIF. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM -from TO -to WHERE str = variable. diff --git a/src/checks/y_check_self_reference.clas.abap b/src/checks/y_check_self_reference.clas.abap index b546b3d0..e59603ef 100644 --- a/src/checks/y_check_self_reference.clas.abap +++ b/src/checks/y_check_self_reference.clas.abap @@ -49,7 +49,7 @@ CLASS y_check_self_reference IMPLEMENTATION. METHOD has_self_reference. - LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str CP 'ME->*'. result = abap_true. diff --git a/src/checks/y_check_test_seam_usage.clas.abap b/src/checks/y_check_test_seam_usage.clas.abap index aef9e4b1..2bbae65c 100644 --- a/src/checks/y_check_test_seam_usage.clas.abap +++ b/src/checks/y_check_test_seam_usage.clas.abap @@ -25,7 +25,7 @@ CLASS Y_CHECK_TEST_SEAM_USAGE IMPLEMENTATION. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) EQ 'TEST-SEAM'. + CHECK get_token_abs( statement-from ) = 'TEST-SEAM'. DATA(check_configuration) = detect_check_configuration( statement ). @@ -33,9 +33,9 @@ CLASS Y_CHECK_TEST_SEAM_USAGE IMPLEMENTATION. RETURN. ENDIF. - raise_error( statement_level = statement-level - statement_index = index - statement_from = statement-from - error_priority = check_configuration-prio ). + raise_error( statement_level = statement-level + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio ). ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_unit_test_assert.clas.abap b/src/checks/y_check_unit_test_assert.clas.abap index 4a7146dc..cd6b6134 100644 --- a/src/checks/y_check_unit_test_assert.clas.abap +++ b/src/checks/y_check_unit_test_assert.clas.abap @@ -50,9 +50,8 @@ CLASS y_check_unit_test_assert IMPLEMENTATION. ENDIF. IF act-str <> exp-str - AND ( is_variable( act ) = abap_true - OR is_variable( exp ) = abap_true ). - RETURN. + AND ( is_variable( act ) = abap_true OR is_variable( exp ) = abap_true ). + RETURN. ENDIF. DATA(check_configuration) = detect_check_configuration( statement ). diff --git a/src/foundation/y_check_base.clas.abap b/src/foundation/y_check_base.clas.abap index 3b0f3e3b..a51d5d36 100644 --- a/src/foundation/y_check_base.clas.abap +++ b/src/foundation/y_check_base.clas.abap @@ -44,7 +44,6 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT CONSTANTS initial_date TYPE datum VALUE '19000101'. DATA check_configurations TYPE y_if_clean_code_manager=>check_configurations. - DATA check_name TYPE seoclsname. DATA clean_code_exemption_handler TYPE REF TO y_if_exemption. DATA clean_code_manager TYPE REF TO y_if_clean_code_manager. DATA is_testcode TYPE abap_bool. @@ -290,8 +289,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_attributes. - DATA check_configuration TYPE y_if_clean_code_manager=>check_configuration. - READ TABLE check_configurations INTO check_configuration INDEX 1. + READ TABLE check_configurations INTO DATA(check_configuration) INDEX 1. IF sy-subrc <> 0. check_configuration-apply_on_productive_code = settings-apply_on_productive_code. check_configuration-apply_on_testcode = settings-apply_on_test_code. @@ -333,11 +331,11 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX p_n ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_result = -col. RETURN. ENDIF. - SUBTRACT 1 FROM p_n. + p_n = p_n - 1. ENDDO. ENDMETHOD. @@ -353,27 +351,22 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX index ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_result = -col. RETURN. ENDIF. - SUBTRACT 1 FROM index. + index = index - 1. ENDDO. ENDMETHOD. METHOD get_include. - DATA l_levels_wa LIKE LINE OF ref_scan->levels. - DATA l_level TYPE i. + DATA(l_level) = COND #( WHEN p_level IS SUPPLIED THEN p_level + ELSE statement_wa-level ). - IF p_level IS SUPPLIED. - l_level = p_level. - ELSE. - l_level = statement_wa-level. - ENDIF. DO. - READ TABLE ref_scan_manager->levels INDEX l_level INTO l_levels_wa. - IF sy-subrc NE 0. + READ TABLE ref_scan_manager->levels INDEX l_level INTO DATA(l_levels_wa). + IF sy-subrc <> 0. RETURN. ENDIF. IF l_levels_wa-type = 'P'. @@ -393,11 +386,11 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX p_n ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_result = -row. RETURN. ENDIF. - SUBTRACT 1 FROM p_n. + p_n = p_n - 1. ENDDO. ENDMETHOD. @@ -410,12 +403,12 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX p_n ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_column = -col. p_line = -row. RETURN. ENDIF. - SUBTRACT 1 FROM p_n. + p_n = p_n - 1. ENDDO. ENDMETHOD. @@ -430,12 +423,12 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX p_n ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_column = -col. p_line = -row. RETURN. ENDIF. - SUBTRACT 1 FROM p_n. + p_n = p_n - 1. ENDDO. ENDMETHOD. @@ -451,27 +444,25 @@ CLASS y_check_base IMPLEMENTATION. DO. READ TABLE tokens INDEX index ASSIGNING FIELD-SYMBOL(). - IF sy-subrc EQ 0 AND -row <> 0. + IF sy-subrc = 0 AND -row <> 0. p_result = -row. RETURN. ENDIF. - SUBTRACT 1 FROM index. + index = index - 1. ENDDO. ENDMETHOD. METHOD get_token_abs. READ TABLE ref_scan_manager->tokens INDEX p_n INTO token_wa. - IF sy-subrc EQ 0. + IF sy-subrc = 0. p_result = token_wa-str. ENDIF. ENDMETHOD. METHOD get_token_rel. - DATA l_index TYPE i. - - l_index = statement_wa-from + p_n - 1. + DATA(l_index) = statement_wa-from + p_n - 1. IF l_index > statement_wa-to. RETURN. ENDIF. @@ -655,7 +646,7 @@ CLASS y_check_base IMPLEMENTATION. suppress = settings-pseudo_comment position = statement_index ) ). - IF cl_abap_typedescr=>describe_by_object_ref( ref_scan_manager )->get_relative_name( ) EQ 'Y_REF_SCAN_MANAGER'. + IF cl_abap_typedescr=>describe_by_object_ref( ref_scan_manager )->get_relative_name( ) = 'Y_REF_SCAN_MANAGER'. inform( p_sub_obj_type = object_type p_sub_obj_name = get_include( p_level = statement_level ) p_position = statement_index @@ -680,6 +671,8 @@ CLASS y_check_base IMPLEMENTATION. METHOD run. + DATA profile_configurations TYPE y_if_clean_code_manager=>check_configurations. + instantiate_objects( ). IF attributes_maintained = abap_false AND has_attributes = abap_true. @@ -691,13 +684,11 @@ CLASS y_check_base IMPLEMENTATION. RETURN. ENDIF. - DATA profile_configurations TYPE y_if_clean_code_manager=>check_configurations. - TRY. check_start_conditions( ). profile_configurations = clean_code_manager->read_check_customizing( myname ). CATCH ycx_no_check_customizing. - IF profile_configurations IS INITIAL AND attributes_ok = abap_false. + IF profile_configurations IS INITIAL AND attributes_ok = abap_false. FREE ref_scan_manager. RETURN. ELSEIF attributes_ok = abap_true. diff --git a/src/foundation/y_ci_check_registration.prog.abap b/src/foundation/y_ci_check_registration.prog.abap index b097c24e..d112f962 100644 --- a/src/foundation/y_ci_check_registration.prog.abap +++ b/src/foundation/y_ci_check_registration.prog.abap @@ -59,17 +59,17 @@ CLASS lcl_check_registration IMPLEMENTATION. ENDMETHOD. METHOD is_check_compatible. - IF name NE get_category_name( ). - DATA code_pal_check TYPE REF TO y_check_base. "#EC DECL_IN_IF + DATA code_pal_check TYPE REF TO y_check_base. + IF name <> get_category_name( ). CREATE OBJECT code_pal_check TYPE (name). ENDIF. ENDMETHOD. METHOD select_object_list. SELECT SINGLE devclass FROM tadir - WHERE obj_name EQ @reference-check_base - AND object EQ @reference-class - AND delflag EQ @abap_false + WHERE obj_name = @reference-check_base + AND object = @reference-class + AND delflag = @abap_false INTO @DATA(packagename). IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. @@ -78,9 +78,9 @@ CLASS lcl_check_registration IMPLEMENTATION. REPLACE reference-foundation IN packagename WITH reference-checks. SELECT obj_name FROM tadir - WHERE devclass EQ @packagename - AND object EQ @reference-class - AND delflag EQ @abap_false + WHERE devclass = @packagename + AND object = @reference-class + AND delflag = @abap_false INTO TABLE @result. IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. @@ -93,7 +93,7 @@ CLASS lcl_check_registration IMPLEMENTATION. METHOD activate_check. is_check_compatible( name ). - INSERT scitests FROM name. + INSERT scitests FROM @name. IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. ENDIF. @@ -102,7 +102,7 @@ CLASS lcl_check_registration IMPLEMENTATION. METHOD deactivate_check. is_check_compatible( name ). - DELETE FROM scitests WHERE name = name. + DELETE FROM scitests WHERE name = @name. IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. ENDIF. @@ -140,12 +140,9 @@ CLASS lcl_util IMPLEMENTATION. TRY. lcl_check_registration=>activate_check( ). count_successes = count_successes + 1. - CATCH cx_failed. + CATCH cx_failed + cx_sy_create_object_error. count_errors = count_errors + 1. - - - DATA dta TYPE REF TO cl_ci_tests. - ENDTRY. ENDLOOP. WRITE: / |{ count_successes } { messages-successfully_activated }|. @@ -159,7 +156,8 @@ CLASS lcl_util IMPLEMENTATION. TRY. lcl_check_registration=>deactivate_check( ). count_successes = count_successes + 1. - CATCH cx_failed. + CATCH cx_failed + cx_sy_create_object_error. count_faults = count_faults + 1. ENDTRY. ENDLOOP. diff --git a/src/foundation/y_clean_code_manager.clas.abap b/src/foundation/y_clean_code_manager.clas.abap index 2cda64ef..6c735437 100644 --- a/src/foundation/y_clean_code_manager.clas.abap +++ b/src/foundation/y_clean_code_manager.clas.abap @@ -50,12 +50,18 @@ CLASS y_clean_code_manager IMPLEMENTATION. FIND FIRST OCCURRENCE OF `Y_CLEAN_CODE_REPORTING` IN TABLE callstack. IF sy-subrc = 0. - SELECT SINGLE obj_name FROM tadir INTO obj_name - WHERE pgmid = 'R3TR' AND - object = 'TABL' AND - obj_name = profile_db. + SELECT SINGLE obj_name + FROM tadir + INTO @obj_name + WHERE pgmid = 'R3TR' + AND object = 'TABL' + AND obj_name = @profile_db. + IF sy-subrc = 0. - SELECT profile FROM (profile_db) INTO TABLE result. + SELECT profile + FROM (profile_db) + INTO TABLE @result. + IF sy-subrc = 0. RETURN. ENDIF. diff --git a/src/foundation/y_code_pal_service.clas.abap b/src/foundation/y_code_pal_service.clas.abap index caab0bae..0eebbcd4 100644 --- a/src/foundation/y_code_pal_service.clas.abap +++ b/src/foundation/y_code_pal_service.clas.abap @@ -195,8 +195,7 @@ CLASS y_code_pal_service IMPLEMENTATION. ENDTRY. TRY. - result_access->get_findings( IMPORTING e_findings = DATA(findings) - e_findings_extension = DATA(findings_extension) ). + result_access->get_findings( IMPORTING e_findings = DATA(findings) ). CATCH cx_satc_failure. raise_internal_server_error( ). response->set_cdata( 'Result access failed (no authorization, etc.)' ). diff --git a/src/foundation/y_exemption_general.clas.abap b/src/foundation/y_exemption_general.clas.abap index 0f737f35..d569f503 100644 --- a/src/foundation/y_exemption_general.clas.abap +++ b/src/foundation/y_exemption_general.clas.abap @@ -19,8 +19,13 @@ CLASS y_exemption_general IMPLEMENTATION. METHOD y_if_exemption~is_object_exempted. - result = xsdbool( ( is_object_existing( object_type = object_type object_name = object_name ) = abap_true ) OR - ( is_tadir_generated( object_type = object_type object_name = object_name ) = abap_true ) ). + DATA(object_exists) = is_object_existing( object_type = object_type + object_name = object_name ). + + DATA(tadir_generated) = is_tadir_generated( object_type = object_type + object_name = object_name ). + + result = xsdbool( object_exists = abap_true OR tadir_generated = abap_true ). ENDMETHOD. diff --git a/src/foundation/y_exemption_of_class.clas.abap b/src/foundation/y_exemption_of_class.clas.abap index 8765fd6a..ffdaaebd 100644 --- a/src/foundation/y_exemption_of_class.clas.abap +++ b/src/foundation/y_exemption_of_class.clas.abap @@ -10,14 +10,12 @@ CLASS y_exemption_of_class DEFINITION PUBLIC CREATE PUBLIC. CLASS-METHODS is_odata_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_ecatt_odata_test_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_fin_infotype_generate RETURNING VALUE(result) TYPE abap_bool. - CLASS-METHODS is_amdp_class RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_extensibility_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_shma_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_proxy_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_sadl_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_exit_class RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_exception_class RETURNING VALUE(result) TYPE abap_bool. - CLASS-METHODS is_xlca_generate RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS is_bcp_application RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -51,34 +49,6 @@ CLASS y_exemption_of_class IMPLEMENTATION. ENDMETHOD. - METHOD is_amdp_class. - DATA: lt_interfaces TYPE seor_implementing_keys. - DATA: lv_seoclskey TYPE seoclskey. - - lv_seoclskey = class_header_data-clsname. - - CALL FUNCTION 'SEO_CLASS_ALL_IMPLEMENTG_GET' - EXPORTING - clskey = lv_seoclskey - IMPORTING - set = lt_interfaces - EXCEPTIONS - not_existing = 1 - is_interface = 2 - model_only = 3 - OTHERS = 4. - IF sy-subrc <> 0. - RETURN. - ENDIF. - - LOOP AT lt_interfaces TRANSPORTING NO FIELDS - WHERE refclsname = 'IF_AMDP_MARKER_HDB'. - result = abap_true. - RETURN. - ENDLOOP. - ENDMETHOD. - - METHOD is_bcp_application. DATA it_bsp_classes TYPE STANDARD TABLE OF seoclsname. @@ -94,7 +64,7 @@ CLASS y_exemption_of_class IMPLEMENTATION. SELECT SINGLE refclsname FROM seometarel WHERE clsname = @class_header_data-clsname AND refclsname IS NOT NULL INTO @DATA(inherited_by). - IF sy-subrc NE 0. + IF sy-subrc <> 0. RETURN. ENDIF. @@ -116,11 +86,11 @@ CLASS y_exemption_of_class IMPLEMENTATION. METHOD is_ecatt_odata_test_generate. - SELECT SINGLE s~clsname FROM seoclassdf AS s INTO @DATA(lv_odata_class) - WHERE clsname = @class_header_data-clsname AND s~author = 'eCATTClassGe'. - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM seoclassdf + INTO @result + WHERE clsname = @class_header_data-clsname + AND author = 'eCATTClassGe'. ENDMETHOD. @@ -169,32 +139,22 @@ CLASS y_exemption_of_class IMPLEMENTATION. METHOD is_fin_infotype_generate. - SELECT SINGLE idclass FROM t777ditclass INTO @DATA(lv_inftype_cl) WHERE idclass = @class_header_data-clsname. - IF sy-subrc = 0. - result = abap_true. - RETURN. - ENDIF. - - SELECT SINGLE cont_db FROM t777ditclass INTO @DATA(lv_inftype1_cl) WHERE cont_db = @class_header_data-clsname. - IF sy-subrc = 0. - result = abap_true. - RETURN. - ENDIF. - - SELECT SINGLE bl_class FROM t777ditclass INTO @DATA(lv_inftype2_cl) WHERE bl_class = @class_header_data-clsname. - IF sy-subrc = 0. - result = abap_true. - RETURN. - ENDIF. + SELECT SINGLE @abap_true + FROM t777ditclass + INTO @result + WHERE idclass = @class_header_data-clsname + OR cont_db = @class_header_data-clsname + OR bl_class = @class_header_data-clsname. ENDMETHOD. METHOD is_odata_generate. - SELECT SINGLE trobj_name FROM /iwbep/i_sbd_ga INTO @DATA(l_name) - WHERE ( gen_art_type = 'DPCB' OR gen_art_type = 'MPCB' ) AND trobj_type = 'CLAS' AND trobj_name = @class_header_data-clsname. "#EC CI_NOFIELD - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM /iwbep/i_sbd_ga + INTO @result + WHERE ( gen_art_type = 'DPCB' OR gen_art_type = 'MPCB' ) + AND trobj_type = 'CLAS' + AND trobj_name = @class_header_data-clsname. "#EC CI_NOFIELD ENDMETHOD. @@ -204,20 +164,21 @@ CLASS y_exemption_of_class IMPLEMENTATION. METHOD is_sadl_generate. - SELECT SINGLE langu FROM seoclasstx INTO @DATA(l_category) - WHERE clsname = @class_header_data-clsname AND descript = 'Generated by SADL Generation Toolkit' ##NO_TEXT. - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM seoclasstx + INTO @result + WHERE clsname = @class_header_data-clsname + AND descript = 'Generated by SADL Generation Toolkit' ##NO_TEXT. ENDMETHOD. METHOD is_shma_generate. - SELECT SINGLE obj_name FROM tadir INTO @DATA(shma_clas) - WHERE pgmid = 'R3TR' AND object = 'SHMA' AND obj_name = @class_header_data-clsname. - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM tadir + INTO @result + WHERE pgmid = 'R3TR' + AND object = 'SHMA' + AND obj_name = @class_header_data-clsname. ENDMETHOD. @@ -247,32 +208,4 @@ CLASS y_exemption_of_class IMPLEMENTATION. ENDMETHOD. - METHOD is_xlca_generate. - DATA: lt_interfaces TYPE seor_implementing_keys. - DATA: lv_seoclskey TYPE seoclskey. - - lv_seoclskey = class_header_data-clsname. - - CALL FUNCTION 'SEO_CLASS_ALL_IMPLEMENTG_GET' - EXPORTING - clskey = lv_seoclskey - IMPORTING - set = lt_interfaces - EXCEPTIONS - not_existing = 1 - is_interface = 2 - model_only = 3 - OTHERS = 4. - IF sy-subrc <> 0. - RETURN. - ENDIF. - - LOOP AT lt_interfaces TRANSPORTING NO FIELDS - WHERE refclsname = 'IF_CTS_TABLE_CONVERSION'. - result = abap_true. - RETURN. - ENDLOOP. - ENDMETHOD. - - ENDCLASS. diff --git a/src/foundation/y_exemption_of_function_group.clas.abap b/src/foundation/y_exemption_of_function_group.clas.abap index 43f274d6..d1b27004 100644 --- a/src/foundation/y_exemption_of_function_group.clas.abap +++ b/src/foundation/y_exemption_of_function_group.clas.abap @@ -35,21 +35,32 @@ CLASS y_exemption_of_function_group IMPLEMENTATION. IF name(1) = '/'. FIND FIRST OCCURRENCE OF '/' IN name+1 MATCH OFFSET DATA(l_offset). l_offset = l_offset + 2. - fugr_name = insert( val = name sub = 'SAPL' off = l_offset ). + fugr_name = insert( val = name + sub = 'SAPL' + off = l_offset ). ELSE. fugr_name = 'SAPL' && name. ENDIF. - SELECT SINGLE COUNT(*) FROM tfdir INTO fugr_func_viewframe - WHERE pname = fugr_name AND ( funcname LIKE 'VIEWFRAME%' OR funcname LIKE 'VIEWPROC%' OR funcname LIKE 'TABLEPROC%' OR funcname LIKE 'TABLEFRAME%' ). "#EC CI_BYPASS "#EC CI_GENBUFF + SELECT SINGLE COUNT(*) + FROM tfdir + INTO @fugr_func_viewframe + WHERE pname = @fugr_name + AND ( funcname LIKE 'VIEWFRAME%' + OR funcname LIKE 'VIEWPROC%' + OR funcname LIKE 'TABLEPROC%' + OR funcname LIKE 'TABLEFRAME%' ). "#EC CI_BYPASS "#EC CI_GENBUFF IF fugr_func_viewframe = 0 OR sy-subrc = 4. RETURN. ENDIF. - SELECT SINGLE COUNT(*) FROM tfdir INTO fugr_func - WHERE pname = fugr_name. "#EC CI_BYPASS. "#EC CI_GENBUFF - IF ( fugr_func = fugr_func_viewframe ). + SELECT SINGLE COUNT(*) + FROM tfdir + INTO @fugr_func + WHERE pname = @fugr_name. "#EC CI_BYPASS. "#EC CI_GENBUFF + + IF fugr_func = fugr_func_viewframe. result = abap_true. ENDIF. ENDMETHOD. @@ -60,24 +71,30 @@ CLASS y_exemption_of_function_group IMPLEMENTATION. FIND FIRST OCCURRENCE OF '/' IN name+1 MATCH OFFSET DATA(l_offset). l_offset = l_offset + 2. - DATA(fugr_name) = insert( val = name sub = 'SAPL' off = l_offset ). - - SELECT SINGLE funcname FROM tfdir INTO @DATA(rai_fugr_func) - WHERE pname = @fugr_name - AND NOT ( ( funcname LIKE '%_UPDATE' ) OR ( funcname LIKE '%_INSERT' ) OR ( funcname LIKE '%_RAI_CREATE_API' ) ). "#EC CI_GENBUFF. - - IF sy-subrc = 4. + DATA(fugr_name) = insert( val = name + sub = 'SAPL' + off = l_offset ). + + SELECT SINGLE funcname + FROM tfdir + INTO @DATA(rai_fugr_func) + WHERE pname = @fugr_name + AND NOT ( ( funcname LIKE '%_UPDATE' ) + OR ( funcname LIKE '%_INSERT' ) + OR ( funcname LIKE '%_RAI_CREATE_API' ) ). "#EC CI_GENBUFF. + + IF rai_fugr_func IS INITIAL. result = abap_true. ENDIF. ENDMETHOD. METHOD is_table_maintenance_generate. - SELECT SINGLE area AS object FROM tlibt INTO @DATA(l_area) - WHERE area = @name AND ( areat = 'Extended Table Maintenance (Generated)' ) ##NO_TEXT. "#EC CI_GENBUFF - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM tlibt + INTO @result + WHERE area = @name + AND areat = 'Extended Table Maintenance (Generated)' ##NO_TEXT. "#EC CI_GENBUFF ENDMETHOD. diff --git a/src/foundation/y_exemption_of_program.clas.abap b/src/foundation/y_exemption_of_program.clas.abap index 593b952b..8640570b 100644 --- a/src/foundation/y_exemption_of_program.clas.abap +++ b/src/foundation/y_exemption_of_program.clas.abap @@ -43,31 +43,22 @@ CLASS y_exemption_of_program IMPLEMENTATION. METHOD is_enterprise_search_generate. - SELECT * FROM trdir INTO TABLE @DATA(genprog) - WHERE name LIKE '%\_001' ESCAPE '\' - AND ( secu = 'ESH' OR name LIKE 'ESHS%' ) - AND ( subc = 'S' OR subc = '1' ) "include programs ('I') are not supported - AND name = @name. - IF sy-subrc EQ 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM trdir + INTO @result + WHERE name LIKE '%\_001' ESCAPE '\' + AND ( secu = 'ESH' OR name LIKE 'ESHS%' ) + AND ( subc = 'S' OR subc = '1' ) "include programs ('I') are not supported + AND name = @name. ENDMETHOD. METHOD is_fin_infotyp_generate. - SELECT SINGLE repid FROM t777d INTO @DATA(lv_inftype1_progs) - WHERE repid = @name. - IF sy-subrc = 0. - result = abap_true. - RETURN. - ENDIF. - - SELECT SINGLE btci_prog FROM t777d INTO @DATA(lv_inftype2_progs) - WHERE btci_prog = @name. - IF sy-subrc = 0. - result = abap_true. - RETURN. - ENDIF. + SELECT SINGLE @abap_true + FROM t777d + INTO @result + WHERE repid = @name + OR btci_prog = @name. ENDMETHOD. @@ -113,11 +104,10 @@ CLASS y_exemption_of_program IMPLEMENTATION. METHOD is_object_sw01_generate. - SELECT SINGLE progname FROM tojtb INTO @DATA(l_prog) - WHERE progname = @name. "#EC CI_GENBUFF - IF sy-subrc = 0. - result = abap_true. - ENDIF. + SELECT SINGLE @abap_true + FROM tojtb + INTO @result + WHERE progname = @name. "#EC CI_GENBUFF ENDMETHOD. diff --git a/src/foundation/y_object_creation_date.clas.abap b/src/foundation/y_object_creation_date.clas.abap index 88e4c128..754d9d88 100644 --- a/src/foundation/y_object_creation_date.clas.abap +++ b/src/foundation/y_object_creation_date.clas.abap @@ -86,7 +86,10 @@ CLASS y_object_creation_date IMPLEMENTATION. DELETE buffer FROM 1 TO max_entries / 2. ENDIF. - APPEND get_db_tadir_data( object_type = object_type object_name = object_name ) TO created_on_dates. + DATA(taidr) = get_db_tadir_data( object_type = object_type + object_name = object_name ). + + APPEND taidr TO created_on_dates. DATA(repo_access) = COND #( WHEN object_type = 'FUGR' THEN convert_fugr_for_db_access( object_name ) WHEN object_type = 'CLAS' THEN convert_class_for_repos_access( object_name ) @@ -178,7 +181,7 @@ CLASS y_object_creation_date IMPLEMENTATION. DATA(search_pattern) = convert_fugr_for_db_access( fugr_name ). SELECT funcname INTO TABLE @DATA(functions) FROM tfdir WHERE pname = @search_pattern. "#EC CI_GENBUFF - IF sy-subrc NE 0. + IF sy-subrc <> 0. RETURN. ENDIF. @@ -193,7 +196,7 @@ CLASS y_object_creation_date IMPLEMENTATION. objtype = 'FUNC' AND objname IN @function_search_table AND datum IS NOT NULL AND "only in HRI - datum NE '00000000' + datum <> '00000000' INTO @result. ENDMETHOD. diff --git a/src/foundation/y_pseudo_comment_detector.clas.abap b/src/foundation/y_pseudo_comment_detector.clas.abap index 31ad1b55..f65fbe8f 100644 --- a/src/foundation/y_pseudo_comment_detector.clas.abap +++ b/src/foundation/y_pseudo_comment_detector.clas.abap @@ -135,10 +135,12 @@ CLASS y_pseudo_comment_detector IMPLEMENTATION. RETURN. ENDIF. - result = has_comment( ref_scan_manager = ref_scan_manager position = position ). + result = has_comment( ref_scan_manager = ref_scan_manager + position = position ). IF result <> cl_ci_test_root=>c_pc_exceptn_exists. - result = has_inline_comment( ref_scan_manager = ref_scan_manager position = position ). + result = has_inline_comment( ref_scan_manager = ref_scan_manager + position = position ). ENDIF. ENDMETHOD. diff --git a/src/foundation/y_test_code_detector.clas.abap b/src/foundation/y_test_code_detector.clas.abap index ee11cc3f..cafc2ae2 100644 --- a/src/foundation/y_test_code_detector.clas.abap +++ b/src/foundation/y_test_code_detector.clas.abap @@ -18,7 +18,6 @@ CLASS y_test_code_detector DEFINITION PUBLIC CREATE PUBLIC. IMPORTING token TYPE stokesx RETURNING VALUE(result) TYPE abap_bool, try_testmethod - IMPORTING token TYPE stokesx RETURNING VALUE(result) TYPE abap_bool, keyword RETURNING VALUE(result) TYPE string, @@ -41,7 +40,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. ENDIF. LOOP AT ref_scan_manager->structures ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + WHERE stmnt_type = scan_struc_stmnt_type-class_definition. process_statements( ). ENDLOOP. @@ -61,10 +60,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. METHOD is_test_class. IF keyword( ) = 'CLASS'. DATA(class) = get_token_rel( 2 ). "#EC DECL_IN_IF - READ TABLE test_codes TRANSPORTING NO FIELDS WITH KEY class = class. - IF sy-subrc EQ 0. - result = abap_true. - ENDIF. + result = xsdbool( line_exists( test_codes[ class = class ] ) ). ENDIF. ENDMETHOD. @@ -99,7 +95,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. EXIT. ENDIF. - IF try_testmethod( ). + IF try_testmethod( ). EXIT. ENDIF. ENDLOOP. @@ -107,7 +103,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. METHOD try_testclass. - IF token-str EQ 'TESTING' AND + IF token-str = 'TESTING' AND keyword( ) = 'CLASS'. test_code-class = get_token_rel( 2 ). result = abap_true. @@ -116,18 +112,16 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. METHOD try_testmethod. - IF test_code-class IS NOT INITIAL AND ( - keyword( ) = 'METHODS' OR - keyword( ) = 'CLASS-METHODS' ). - + IF test_code-class IS NOT INITIAL + AND ( keyword( ) = 'METHODS' OR keyword( ) = 'CLASS-METHODS' ). test_code-method = get_token_rel( 2 ). APPEND test_code TO test_codes. result = abap_true. ENDIF. - IF test_code-class IS NOT INITIAL AND - test_code-method IS INITIAL AND - keyword( ) = 'ENDCLASS'. + IF test_code-class IS NOT INITIAL + AND test_code-method IS INITIAL + AND keyword( ) = 'ENDCLASS'. APPEND test_code TO test_codes. result = abap_true. ENDIF. @@ -158,7 +152,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. DO. DATA(low_level_structure) = high_level_structure. "#EC DECL_IN_IF READ TABLE ref_scan_manager->structures INTO high_level_structure INDEX low_level_structure-back. - IF sy-subrc NE 0. + IF sy-subrc <> 0. EXIT. ENDIF. @@ -167,7 +161,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. result = abap_true. EXIT. ENDIF. - IF low_level_structure-back EQ 0. + IF low_level_structure-back = 0. EXIT. ENDIF. ENDDO. diff --git a/src/foundation/y_test_code_detector.clas.testclasses.abap b/src/foundation/y_test_code_detector.clas.testclasses.abap index 5a3f47e5..06776146 100644 --- a/src/foundation/y_test_code_detector.clas.testclasses.abap +++ b/src/foundation/y_test_code_detector.clas.testclasses.abap @@ -76,7 +76,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_without_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-class_definition. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -89,7 +89,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_with_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-class_definition. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -102,7 +102,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_without_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-method. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-method. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -115,7 +115,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_with_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-method. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-method. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -128,7 +128,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_with_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-class_definition. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -141,7 +141,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_without_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-class_definition. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) @@ -154,7 +154,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. ref_scan_manager_double->set_data_with_test( ). LOOP AT ref_scan_manager_double->y_if_scan_manager~structures ASSIGNING FIELD-SYMBOL() - FROM 2 WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + FROM 2 WHERE stmnt_type = scan_struc_stmnt_type-class_definition. cl_abap_unit_assert=>assert_equals( act = cut->y_if_testcode_detector~is_testcode( ) diff --git a/src/profiles/y_alv_events.clas.abap b/src/profiles/y_alv_events.clas.abap index c97f3eef..35651613 100644 --- a/src/profiles/y_alv_events.clas.abap +++ b/src/profiles/y_alv_events.clas.abap @@ -15,10 +15,10 @@ CLASS y_alv_events IMPLEMENTATION. METHOD y_if_alv_events~get_events. - IF mode EQ y_if_alv_events~mode_double_click. + IF mode = y_if_alv_events~mode_double_click. result = VALUE y_if_alv_events=>simple_events( ( eventid = cl_gui_column_tree=>eventid_node_double_click appl_event = abap_true ) ). - ELSEIF mode EQ y_if_alv_events~mode_selection_changed. + ELSEIF mode = y_if_alv_events~mode_selection_changed. result = VALUE y_if_alv_events=>simple_events( ( eventid = cl_gui_column_tree=>eventid_selection_changed appl_event = abap_true ) ). ENDIF. diff --git a/src/profiles/y_alv_tree_control.clas.abap b/src/profiles/y_alv_tree_control.clas.abap index c8872987..727162be 100644 --- a/src/profiles/y_alv_tree_control.clas.abap +++ b/src/profiles/y_alv_tree_control.clas.abap @@ -25,7 +25,6 @@ CLASS y_alv_tree_control DEFINITION PUBLIC CREATE PUBLIC. IMPORTING type_name TYPE string sort_table TYPE lvc_t_sort - events TYPE REF TO y_if_alv_events alv_tree TYPE REF TO cl_gui_alv_tree_simple alv_header TYPE slis_t_listheader RAISING @@ -55,7 +54,7 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD autosize_all_fields. DATA filler TYPE i VALUE 7. LOOP AT fieldcats ASSIGNING FIELD-SYMBOL(). - IF -dd_outlen GE strlen( -coltext ). + IF -dd_outlen >= strlen( -coltext ). -outputlen = -dd_outlen + filler. ELSE. -outputlen = strlen( -coltext ) + filler. @@ -95,7 +94,6 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. result = NEW y_alv_tree_control( type_name = type_name sort_table = sort_table - events = events alv_tree = alv_tree alv_header = alv_header ). ENDMETHOD. @@ -130,7 +128,7 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD y_if_alv_tree_control~get_selected_index. DATA index_table TYPE lvc_t_indx. CHECK y_if_alv_tree_control~list_control( )->get_line_at( 1 ) IS NOT INITIAL. - IF sy-subrc EQ 0. + IF sy-subrc = 0. alv_tree->get_selected_nodes( CHANGING ct_index_outtab = index_table ). TRY. result = index_table[ 1 ]. @@ -142,9 +140,12 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD y_if_alv_tree_control~set_selected_index. - CHECK y_if_alv_tree_control~list_control( )->get_line_at( 1 ) IS NOT INITIAL. DATA index_table TYPE lvc_t_indx. + + CHECK y_if_alv_tree_control~list_control( )->get_line_at( 1 ) IS NOT INITIAL. + APPEND index TO index_table. + alv_tree->set_selected_nodes( EXPORTING it_index_outtab = index_table @@ -196,7 +197,7 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD y_if_alv_tree_control~set_field_header_text. - LOOP AT fieldcats ASSIGNING FIELD-SYMBOL() WHERE fieldname EQ to_upper( fieldname ). + LOOP AT fieldcats ASSIGNING FIELD-SYMBOL() WHERE fieldname = to_upper( fieldname ). -coltext = header_text. ENDLOOP. UNASSIGN . @@ -204,8 +205,8 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD y_if_alv_tree_control~set_field_visibility. - LOOP AT fieldcats ASSIGNING FIELD-SYMBOL() WHERE fieldname EQ to_upper( fieldname ). - -no_out = xsdbool( is_visible EQ abap_false ). + LOOP AT fieldcats ASSIGNING FIELD-SYMBOL() WHERE fieldname = to_upper( fieldname ). + -no_out = xsdbool( is_visible = abap_false ). ENDLOOP. UNASSIGN . ENDMETHOD. @@ -213,7 +214,7 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. METHOD y_if_alv_tree_control~toolbar_control. alv_tree->get_toolbar_object( IMPORTING er_toolbar = result EXCEPTIONS OTHERS = 4 ). - IF sy-subrc NE 0. + IF sy-subrc <> 0. RAISE EXCEPTION TYPE cx_failed. ENDIF. ENDMETHOD. @@ -229,7 +230,7 @@ CLASS Y_ALV_TREE_CONTROL IMPLEMENTATION. y_if_alv_tree_control~toolbar_control( )->set_button_state( EXPORTING enabled = abap_true fcode =