diff --git a/changelog.txt b/changelog.txt index 52d4c14f..646c74a3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -12,6 +12,16 @@ 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-01-18 v1.11.0 +------------------ +* CHECK position after comments (#301) +* Modify an Internal Table is no DB Access (#300) ++ Enhancing coverage to run for multiple objects (#294) +! Disabling profiles when the API executes the regression (#293) +* DELETE from internal table gives a "Database access" prio 1 error (#290) +! The pseudo comment position of the Form Routine Check was moved from the 'ENDFORM' to 'FORM' statement +! The pseudo comment position of the Number of Public Attributes was moved from the 'CLASS DEFINITION.' to 'PUBLIC SECTION' statement + 2020-12-14 v1.10.0 ------------------ + New Check: Scope of the Variable (#276) diff --git a/docs/checks/form-routine.md b/docs/checks/form-routine.md index 5e1fe9bb..08760bbf 100644 --- a/docs/checks/form-routine.md +++ b/docs/checks/form-routine.md @@ -23,12 +23,12 @@ Use classes and methods instead. Methods are similar to subroutines and can be u ### What to do in case of exception? You can suppress Code Inspector findings generated by this check using the pseudo comment `"#EC CI_FORM`. -The pseudo comment must be placed right after the `ENDFORM`. +The pseudo comment must be placed right after the `FORM` declaration. ```abap -FORM my_form. +FORM my_form. "#EC CI_FORM " Form content -ENDFORM. "#EC CI_FORM +ENDFORM. ``` ### Further Readings & Knowledge diff --git a/docs/checks/number-public-attributes.md b/docs/checks/number-public-attributes.md index f2bbaa63..7702ca10 100644 --- a/docs/checks/number-public-attributes.md +++ b/docs/checks/number-public-attributes.md @@ -23,11 +23,11 @@ Make those attributes `PRIVATE` or `PROTECTED`. You can grant the read access wi ### What to do in case of exception? You can suppress Code Inspector findings generated by this check using the pseudo comment `"#EC NUM_PUBLIC_ATTR`. -The pseudo comment must be placed right after the class definition header. +The pseudo comment must be placed right after the `PUBLIC SECTION` statement. ```abap -CLASS class_name DEFINITION. "#EC NUM_PUBLIC_ATTR - PUBLIC SECTION. +CLASS class_name DEFINITION. + PUBLIC SECTION. "#EC NUM_PUBLIC_ATTR DATA attribute1 TYPE i. DATA attribute2 TYPE i. ENDCLASS. diff --git a/src/checks/y_check_boolean_input_param.clas.abap b/src/checks/y_check_boolean_input_param.clas.abap index 86c2efc1..22399146 100644 --- a/src/checks/y_check_boolean_input_param.clas.abap +++ b/src/checks/y_check_boolean_input_param.clas.abap @@ -1,12 +1,14 @@ CLASS y_check_boolean_input_param DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS is_setter_method IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + METHODS has_boolean_input_param IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -14,6 +16,7 @@ ENDCLASS. CLASS y_check_boolean_input_param IMPLEMENTATION. + METHOD constructor. super->constructor( ). @@ -22,35 +25,12 @@ CLASS y_check_boolean_input_param IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }boolean-input-parameter.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) ). + relevant_structure_types = VALUE #( ). + set_check_message( 'Split method instead of Boolean input parameter!' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type = scan_struc_stmnt_type-class_definition. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. - ENDMETHOD. METHOD inspect_tokens. @@ -71,14 +51,16 @@ CLASS y_check_boolean_input_param IMPLEMENTATION. ENDMETHOD. + METHOD is_setter_method. DATA(method_name) = get_token_abs( statement-from + 1 ). result = COND #( WHEN method_name CS 'SET_' THEN abap_true ). ENDMETHOD. + METHOD has_boolean_input_param. DATA(skip) = abap_true. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF -str = 'IMPORTING'. @@ -101,4 +83,5 @@ CLASS y_check_boolean_input_param IMPLEMENTATION. ENDLOOP. ENDMETHOD. + ENDCLASS. diff --git a/src/checks/y_check_branch_coverage.clas.abap b/src/checks/y_check_branch_coverage.clas.abap index f4818885..fd4148c8 100644 --- a/src/checks/y_check_branch_coverage.clas.abap +++ b/src/checks/y_check_branch_coverage.clas.abap @@ -1,9 +1,11 @@ CLASS y_check_branch_coverage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + ENDCLASS. @@ -34,11 +36,14 @@ CLASS y_check_branch_coverage IMPLEMENTATION. DATA(coverage) = y_unit_test_coverage=>get( program_name = program_name object = VALUE #( object = object_type obj_name = object_name ) coverage_type = ce_scv_coverage_type=>branch ). + + DATA(branch) = round( val = coverage->get_percentage( ) + dec = 2 ). CATCH cx_scv_execution_error. RETURN. ENDTRY. - DATA(check_configuration) = detect_check_configuration( error_count = CONV #( coverage ) + DATA(check_configuration) = detect_check_configuration( error_count = CONV #( branch ) statement = VALUE #( level = 1 ) ). IF check_configuration IS INITIAL. @@ -49,8 +54,10 @@ CLASS y_check_branch_coverage IMPLEMENTATION. statement_index = 1 statement_from = 1 error_priority = check_configuration-prio - parameter_01 = |{ coverage }| - parameter_02 = |{ check_configuration-threshold }| ). + parameter_01 = |{ branch }| + parameter_02 = |{ check_configuration-threshold }| + parameter_03 = |{ coverage->get_total( ) }| + parameter_04 = |{ coverage->get_executed( ) }| ). ENDMETHOD. diff --git a/src/checks/y_check_call_method_usage.clas.abap b/src/checks/y_check_call_method_usage.clas.abap index ca1eb8b8..b00a6e8d 100644 --- a/src/checks/y_check_call_method_usage.clas.abap +++ b/src/checks/y_check_call_method_usage.clas.abap @@ -1,13 +1,10 @@ -CLASS y_check_call_method_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_call_method_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor . + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. - PRIVATE SECTION. + ENDCLASS. @@ -49,4 +46,6 @@ CLASS y_check_call_method_usage IMPLEMENTATION. error_priority = check_configuration-prio ). ENDIF. ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_chain_decl_usage.clas.abap b/src/checks/y_check_chain_decl_usage.clas.abap index 8bf4218d..62da2178 100644 --- a/src/checks/y_check_chain_decl_usage.clas.abap +++ b/src/checks/y_check_chain_decl_usage.clas.abap @@ -1,11 +1,15 @@ -CLASS y_check_chain_decl_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . +CLASS y_check_chain_decl_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. DATA rows_with_colon TYPE STANDARD TABLE OF stmnt_crow. + METHODS has_error_not_raised_yet IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. diff --git a/src/checks/y_check_check_in_loop.clas.abap b/src/checks/y_check_check_in_loop.clas.abap index 506c0946..908fcf5b 100644 --- a/src/checks/y_check_check_in_loop.clas.abap +++ b/src/checks/y_check_check_in_loop.clas.abap @@ -3,7 +3,6 @@ CLASS y_check_check_in_loop DEFINITION PUBLIC INHERITING FROM y_check_base CREAT METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. @@ -25,35 +24,10 @@ CLASS y_check_check_in_loop IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }check-in-loop.md|. - set_check_message( 'Use an IF statement in combination with CONTINUE instead CHECK!' ). - ENDMETHOD. - - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-check. - - is_testcode = test_code_detector->is_testcode( ). + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-check ) ). + relevant_structure_types = VALUE #( ). - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'Use an IF statement in combination with CONTINUE instead CHECK!' ). ENDMETHOD. @@ -75,12 +49,9 @@ CLASS y_check_check_in_loop IMPLEMENTATION. METHOD get_back_statement. - DATA(structures) = ref_scan_manager->get_structures( ). - DATA(statements) = ref_scan_manager->get_statements( ). - TRY. - DATA(back_structure) = structures[ structure-back ]. - result = statements[ back_structure-stmnt_from ]. + DATA(back_structure) = ref_scan_manager->structures[ structure-back ]. + result = ref_scan_manager->statements[ back_structure-stmnt_from ]. CATCH cx_sy_itab_line_not_found. CLEAR result. ENDTRY. diff --git a/src/checks/y_check_check_stmnt_position.clas.abap b/src/checks/y_check_check_stmnt_position.clas.abap index d7ac3449..dc3713c7 100644 --- a/src/checks/y_check_check_stmnt_position.clas.abap +++ b/src/checks/y_check_check_stmnt_position.clas.abap @@ -66,18 +66,24 @@ CLASS y_check_check_stmnt_position IMPLEMENTATION. OR token EQ 'DATA' OR token EQ 'TYPES' OR token EQ 'CHECK' - OR token EQ 'FIELD-SYMBOLS' ). + OR token EQ 'FIELD-SYMBOLS' + OR token EQ 'CONSTANTS' ). ENDMETHOD. METHOD has_wrong_position. - DATA(statements) = ref_scan_manager->get_statements( ). - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() FROM structure-stmnt_from TO structure-stmnt_to. + IF -type = scan_stmnt_type-empty + OR -type = scan_stmnt_type-comment + OR -type = scan_stmnt_type-comment_in_stmnt. + CONTINUE. + ENDIF. + IF -number = check-number. RETURN. ENDIF. + IF is_not_relevant_token( get_token_abs( -from ) ) = abap_false. result = abap_true. RETURN. @@ -87,7 +93,7 @@ CLASS y_check_check_stmnt_position IMPLEMENTATION. METHOD is_check_in_loop. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM structure-stmnt_from TO check-from WHERE str = 'LOOP' OR str = 'ENDLOOP'. diff --git a/src/checks/y_check_check_stmnt_position.clas.testclasses.abap b/src/checks/y_check_check_stmnt_position.clas.testclasses.abap index 258a8727..ad6f2705 100644 --- a/src/checks/y_check_check_stmnt_position.clas.testclasses.abap +++ b/src/checks/y_check_check_stmnt_position.clas.testclasses.abap @@ -435,3 +435,107 @@ CLASS ltc_form IMPLEMENTATION. ENDMETHOD. ENDCLASS. + + +CLASS ltc_constants DEFINITION INHERITING FROM ltc_inline_data_declaration FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_constants IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example_class DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example_class IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( ' CONSTANTS main_company TYPE i VALUE 100. ' ) + ( ' CHECK sy-mandt = main_company. ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_comments DEFINITION INHERITING FROM ltc_inline_data_declaration FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_comments IMPLEMENTATION. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example_class DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example_class IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( ' " Comment ' ) + ( '* Before ' ) + ( ' CHECK sy-mandt = 100. ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_pseudo_comment DEFINITION INHERITING FROM ltc_inline_data_declaration FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PROTECTED SECTION. + METHODS get_code_with_issue REDEFINITION. + METHODS get_code_without_issue REDEFINITION. +ENDCLASS. + +CLASS ltc_pseudo_comment IMPLEMENTATION. + + METHOD get_code_with_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example_class DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example_class IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( ' me->example( ). "#EC SELF_REF ' ) + ( ' CHECK sy-mandt = 100. ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_without_issue. + result = VALUE #( + ( ' REPORT y_example. ' ) + + ( ' CLASS y_example_class DEFINITION. ' ) + ( ' PUBLIC SECTION. ' ) + ( ' METHODS example. ' ) + ( ' ENDCLASS. ' ) + + ( ' CLASS y_example_class IMPLEMENTATION. ' ) + ( ' METHOD example. ' ) + ( ' CHECK sy-mandt = 100. "#EC CHECK_POSITION ' ) + ( ' CHECK sy-mandt = 100. ' ) + ( ' ENDMETHOD. ' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/checks/y_check_comment_position.clas.abap b/src/checks/y_check_comment_position.clas.abap index d0598b42..a3e57e3f 100644 --- a/src/checks/y_check_comment_position.clas.abap +++ b/src/checks/y_check_comment_position.clas.abap @@ -63,11 +63,9 @@ CLASS Y_CHECK_COMMENT_POSITION IMPLEMENTATION. METHOD has_wrong_position. - DATA(tokens) = ref_scan_manager->get_tokens( ). - TRY. - DATA(previous_token) = tokens[ statement-to - 1 ]. - DATA(current_token) = tokens[ statement-to ]. + DATA(previous_token) = ref_scan_manager->tokens[ statement-to - 1 ]. + DATA(current_token) = ref_scan_manager->tokens[ statement-to ]. CATCH cx_sy_itab_line_not_found. RETURN. ENDTRY. @@ -132,9 +130,8 @@ CLASS Y_CHECK_COMMENT_POSITION IMPLEMENTATION. METHOD get_next_token. - DATA(tokens) = ref_scan_manager->get_tokens( ). DATA(next_position) = current_position + 1. - result = tokens[ next_position ]. + result = ref_scan_manager->tokens[ next_position ]. IF is_pragma( result ) = abap_true. result = get_next_token( next_position ). ENDIF. diff --git a/src/checks/y_check_comment_type.clas.abap b/src/checks/y_check_comment_type.clas.abap index 3d9d2f6a..012dfd7b 100644 --- a/src/checks/y_check_comment_type.clas.abap +++ b/src/checks/y_check_comment_type.clas.abap @@ -40,7 +40,7 @@ CLASS y_check_comment_type IMPLEMENTATION. ENDMETHOD. METHOD has_wrong_comment_type. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF get_first_character( ) = '*' AND get_second_character( ) <> '&'. diff --git a/src/checks/y_check_comment_usage.clas.abap b/src/checks/y_check_comment_usage.clas.abap index c4e5f3b4..ab4472be 100644 --- a/src/checks/y_check_comment_usage.clas.abap +++ b/src/checks/y_check_comment_usage.clas.abap @@ -1,65 +1,29 @@ -CLASS y_check_comment_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_comment_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. - DATA abs_statement_number TYPE i VALUE 0. DATA comment_number TYPE i VALUE 0. - DATA percentage_of_comments TYPE decfloat16 VALUE 0. DATA is_function_module TYPE abap_bool. - DATA statement_for_message TYPE sstmnt. - METHODS calc_percentage_of_comments . - METHODS checkif_error - IMPORTING - !index TYPE i . - - METHODS is_code_disabled - IMPORTING structure TYPE sstruc - statement TYPE sstmnt - RETURNING VALUE(result) TYPE abap_bool. -ENDCLASS. + METHODS get_percentage_of_comments RETURNING VALUE(result) TYPE int4. + METHODS check_result IMPORTING structure TYPE sstruc. + METHODS is_code_disabled IMPORTING structure TYPE sstruc + statement TYPE sstmnt + RETURNING VALUE(result) TYPE abap_bool. -CLASS Y_CHECK_COMMENT_USAGE IMPLEMENTATION. - - - METHOD calc_percentage_of_comments. - percentage_of_comments = ( comment_number / abs_statement_number ) * 100. - percentage_of_comments = round( val = percentage_of_comments dec = 2 ). - ENDMETHOD. +ENDCLASS. - METHOD checkif_error. - DATA(check_configuration) = detect_check_configuration( error_count = round( val = percentage_of_comments - dec = 0 - mode = cl_abap_math=>round_down ) - statement = statement_for_message ). - - IF check_configuration IS INITIAL. - RETURN. - ENDIF. - - raise_error( statement_level = statement_for_message-level - statement_index = index - statement_from = statement_for_message-from - error_priority = check_configuration-prio - parameter_01 = |{ comment_number }| - parameter_02 = |{ percentage_of_comments }| - parameter_03 = |{ check_configuration-threshold }| ). - - ENDMETHOD. +CLASS y_check_comment_usage IMPLEMENTATION. METHOD constructor. @@ -69,52 +33,34 @@ CLASS Y_CHECK_COMMENT_USAGE IMPLEMENTATION. settings-threshold = 10. settings-documentation = |{ c_docs_path-checks }comment-usage.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-class_implementation ) + ( scan_struc_stmnt_type-interface ) + ( scan_struc_stmnt_type-form ) + ( scan_struc_stmnt_type-function ) + ( scan_struc_stmnt_type-module ) ). + set_check_message( 'Percentage of comments must be lower than &3% of the productive code! (&2%>=&3%) (&1 lines found)' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition - OR stmnt_type EQ scan_struc_stmnt_type-class_implementation - OR stmnt_type EQ scan_struc_stmnt_type-interface - OR stmnt_type EQ scan_struc_stmnt_type-form - OR stmnt_type EQ scan_struc_stmnt_type-function - OR stmnt_type EQ scan_struc_stmnt_type-module - OR type EQ scan_struc_type-event. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - abs_statement_number = 0. - comment_number = 0. - percentage_of_comments = 0. - - READ TABLE ref_scan_manager->get_statements( ) INTO statement_for_message - INDEX -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - inspect_tokens( statement = - structure = ). - ENDLOOP. - - calc_percentage_of_comments( ). - checkif_error( -stmnt_from ). - ENDLOOP. + METHOD inspect_statements. + abs_statement_number = 0. + comment_number = 0. + + super->inspect_statements( structure ). + + check_result( structure ). ENDMETHOD. METHOD inspect_tokens. - CHECK is_code_disabled( statement = statement - structure = structure ) EQ abap_false. + DATA(code_disabled) = is_code_disabled( statement = statement + structure = structure ). + + IF code_disabled = abap_true. + RETURN. + ENDIF. IF statement-to EQ statement-from. abs_statement_number = abs_statement_number + 1. @@ -122,10 +68,9 @@ CLASS Y_CHECK_COMMENT_USAGE IMPLEMENTATION. abs_statement_number = abs_statement_number + ( statement-to - statement-from ). ENDIF. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM statement-from TO statement-to - WHERE type EQ scan_token_type-comment. - + 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 @@ -133,11 +78,43 @@ CLASS Y_CHECK_COMMENT_USAGE IMPLEMENTATION. -str+0(2) EQ |*?| OR -str+0(2) EQ |"?| OR ( strlen( -str ) GE 3 AND -str+0(3) EQ |"#E| ) OR - -str CP '"' && object_name && '*.' ). "#EC CI_MAGIC + -str CP '"' && object_name && '*.' ). "#EC CI_MAGIC comment_number = comment_number + 1. ENDIF. ENDLOOP. - UNASSIGN . + ENDMETHOD. + + + METHOD check_result. + DATA(percentage_of_comments) = get_percentage_of_comments( ). + + DATA(statement_for_message) = ref_scan_manager->statements[ structure-stmnt_from ]. + + DATA(check_configuration) = detect_check_configuration( error_count = percentage_of_comments + statement = statement_for_message ). + + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement_for_message-level + statement_index = structure-stmnt_from + statement_from = statement_for_message-from + error_priority = check_configuration-prio + parameter_01 = |{ comment_number }| + parameter_02 = |{ percentage_of_comments }| + parameter_03 = |{ check_configuration-threshold }| ). + ENDMETHOD. + + + METHOD get_percentage_of_comments. + DATA percentage TYPE decfloat16. + + percentage = ( comment_number / abs_statement_number ) * 100. + + result = round( val = percentage + dec = 0 + mode = cl_abap_math=>round_down ). ENDMETHOD. @@ -152,4 +129,6 @@ CLASS Y_CHECK_COMMENT_USAGE IMPLEMENTATION. result = xsdbool( is_function_module EQ abap_false ). ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_comment_usage.clas.testclasses.abap b/src/checks/y_check_comment_usage.clas.testclasses.abap index 43a017d0..84b49369 100644 --- a/src/checks/y_check_comment_usage.clas.testclasses.abap +++ b/src/checks/y_check_comment_usage.clas.testclasses.abap @@ -1,4 +1,4 @@ -CLASS local_test_class DEFINITION INHERITING FROM y_unit_test_base FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. +CLASS ltc_report 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. @@ -6,7 +6,7 @@ CLASS local_test_class DEFINITION INHERITING FROM y_unit_test_base FOR TESTING R METHODS get_code_with_exemption REDEFINITION. ENDCLASS. -CLASS local_test_class IMPLEMENTATION. +CLASS ltc_report IMPLEMENTATION. METHOD get_cut. result ?= NEW y_check_comment_usage( ). @@ -40,7 +40,70 @@ CLASS local_test_class IMPLEMENTATION. ENDMETHOD. METHOD get_code_with_exemption. - result = VALUE #( ). + RETURN. + ENDMETHOD. + +ENDCLASS. + + +CLASS ltc_class 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_class IMPLEMENTATION. + + METHOD get_cut. + result ?= NEW y_check_comment_usage( ). + 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.' ) + ( '* COMMENT ' ) + ( ' "do something ' ) + ( ' "do more ' ) + ( ' "do much more ' ) + ( ' "but not any time soon ' ) + ( ' 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 name3 TYPE string. ' ) + ( ' "? ' ) + ( '*"*COMMENT ' ) + ( '*" ' ) + ( ' "! docu ' ) + ( ' ENDMETHOD.' ) + ( ' ENDCLASS. ' ) + ). + ENDMETHOD. + + METHOD get_code_with_exemption. + RETURN. ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_constants_interface.clas.abap b/src/checks/y_check_constants_interface.clas.abap index 13557896..feb38896 100644 --- a/src/checks/y_check_constants_interface.clas.abap +++ b/src/checks/y_check_constants_interface.clas.abap @@ -3,36 +3,22 @@ CLASS y_check_constants_interface DEFINITION PUBLIC INHERITING FROM y_check_base METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. DATA has_something_else TYPE abap_bool VALUE abap_false. - DATA statement_for_message TYPE sstmnt. - METHODS checkif_error IMPORTING index TYPE i. - METHODS is_structure_empty IMPORTING structure TYPE sstruc RETURNING VALUE(result) TYPE abap_bool. - -ENDCLASS. + METHODS is_structure_empty IMPORTING structure TYPE sstruc + RETURNING VALUE(result) TYPE abap_bool. + METHODS check_result IMPORTING structure TYPE sstruc. -CLASS Y_CHECK_CONSTANTS_INTERFACE IMPLEMENTATION. - +ENDCLASS. - METHOD checkif_error. - DATA(check_configuration) = detect_check_configuration( statement_for_message ). - IF check_configuration IS INITIAL. - RETURN. - ENDIF. - IF has_something_else EQ abap_false. - raise_error( statement_level = statement_for_message-level - statement_index = index - statement_from = statement_for_message-from - error_priority = check_configuration-prio ). - ENDIF. - ENDMETHOD. +CLASS Y_CHECK_CONSTANTS_INTERFACE IMPLEMENTATION. METHOD constructor. @@ -43,57 +29,63 @@ CLASS Y_CHECK_CONSTANTS_INTERFACE IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }constants-interface.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-interface ) ). + relevant_structure_types = VALUE #( ). + set_check_message( 'There are only constants in this interface!' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-interface. - - IF is_structure_empty( ) = abap_true. - CONTINUE. - ENDIF. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + METHOD inspect_statements. + CHECK is_structure_empty( structure ) = abap_false. - READ TABLE ref_scan_manager->get_statements( ) INTO statement_for_message - INDEX -stmnt_from. + has_something_else = abap_false. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to WHERE type NE scan_stmnt_type-comment AND - type NE scan_stmnt_type-comment_in_stmnt AND - type NE scan_stmnt_type-pragma. - inspect_tokens( statement = ). - ENDLOOP. + super->inspect_statements( structure ). - checkif_error( -stmnt_from ). - ENDLOOP. + check_result( structure ). ENDMETHOD. METHOD inspect_tokens. + CHECK statement-type <> scan_stmnt_type-comment. + CHECK statement-type <> scan_stmnt_type-comment_in_stmnt. + CHECK statement-type <> scan_stmnt_type-pragma. + DATA(token) = get_token_abs( statement-from ). - IF token NE 'CONSTANTS' AND - token NE 'INTERFACE' AND - token NE 'ENDINTERFACE' AND - token NE 'BEGIN' AND - token NE 'END' AND - token NE 'OF'. + + IF token <> 'CONSTANTS' + AND token <> 'INTERFACE' + AND token <> 'ENDINTERFACE' + AND token <> 'BEGIN' + AND token <> 'END' + AND token <> 'OF'. has_something_else = abap_true. ENDIF. ENDMETHOD. + METHOD check_result. + CHECK has_something_else = abap_false. + + DATA(statement_for_message) = ref_scan_manager->statements[ structure-stmnt_from ]. + + DATA(check_configuration) = detect_check_configuration( statement_for_message ). + + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement_for_message-level + statement_index = structure-stmnt_from + statement_from = statement_for_message-from + error_priority = check_configuration-prio ). + ENDMETHOD. + + METHOD is_structure_empty. result = xsdbool( structure-stmnt_from = structure-stmnt_to - 1 ). ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_cx_root_usage.clas.abap b/src/checks/y_check_cx_root_usage.clas.abap index 34a8f10f..81b5cb8e 100644 --- a/src/checks/y_check_cx_root_usage.clas.abap +++ b/src/checks/y_check_cx_root_usage.clas.abap @@ -1,17 +1,14 @@ -CLASS y_check_cx_root_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_cx_root_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor . + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. - METHODS has_cx_root - IMPORTING statement TYPE sstmnt - RETURNING VALUE(result) TYPE abap_bool. + METHODS has_cx_root IMPORTING statement TYPE sstmnt + RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -32,8 +29,8 @@ CLASS y_check_cx_root_usage IMPLEMENTATION. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) EQ 'CATCH' - AND has_cx_root( statement ) EQ abap_true. + CHECK get_token_abs( statement-from ) = 'CATCH'. + CHECK has_cx_root( statement ) = abap_true. DATA(check_configuration) = detect_check_configuration( statement ). @@ -49,9 +46,12 @@ CLASS y_check_cx_root_usage IMPLEMENTATION. METHOD has_cx_root. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM statement-from TO statement-to WHERE str EQ 'CX_ROOT'. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to + WHERE str EQ 'CX_ROOT'. result = abap_true. ENDLOOP. ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_cyclomatic_complexity.clas.abap b/src/checks/y_check_cyclomatic_complexity.clas.abap index 6978c996..4bf92e31 100644 --- a/src/checks/y_check_cyclomatic_complexity.clas.abap +++ b/src/checks/y_check_cyclomatic_complexity.clas.abap @@ -1,32 +1,22 @@ -CLASS y_check_cyclomatic_complexity DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +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 . + METHODS constructor. + PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. - METHODS inspect_tokens - REDEFINITION . PRIVATE SECTION. - - DATA cyclo_comp TYPE i . + DATA cyclo_comp TYPE i. DATA statement_for_message TYPE sstmnt. - METHODS compute_cyclomatic_complexity - CHANGING - !c_cyclo_comp TYPE i . - METHODS determine_position - IMPORTING - !type TYPE flag - !index TYPE i - RETURNING - VALUE(result) TYPE int4 . + METHODS compute_cyclomatic_complexity CHANGING c_cyclo_comp TYPE i. + + METHODS determine_position IMPORTING type TYPE flag + index TYPE i + RETURNING VALUE(result) TYPE int4. ENDCLASS. @@ -45,7 +35,7 @@ CLASS Y_CHECK_CYCLOMATIC_COMPLEXITY IMPLEMENTATION. ADD 1 TO c_cyclo_comp. ENDIF. WHEN 'DO'. - READ TABLE ref_scan_manager->get_tokens( ) INDEX statement_wa-to INTO DATA(token). + READ TABLE ref_scan_manager->tokens INDEX statement_wa-to INTO DATA(token). IF token-str = 'TIMES'. ADD 1 TO c_cyclo_comp. ENDIF. 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 bde696e4..6a839a86 100644 --- a/src/checks/y_check_db_access_in_ut.clas.abap +++ b/src/checks/y_check_db_access_in_ut.clas.abap @@ -3,7 +3,7 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE METHODS constructor. PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. @@ -13,9 +13,9 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE CONSTANTS risk_level_not_set TYPE string VALUE 'NOT_SET'. DATA tokens_not_allowed TYPE y_char255_tab. + DATA has_framework TYPE abap_bool. - METHODS has_osql_or_cds_framework IMPORTING method TYPE sstruc - RETURNING VALUE(result) TYPE abap_bool. + METHODS inspect_class_definition IMPORTING class_implementation TYPE sstruc. METHODS is_persistent_object IMPORTING obj_name TYPE string RETURNING VALUE(result) TYPE abap_bool. @@ -23,15 +23,6 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE METHODS consolidade_tokens IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE string. - METHODS get_class_definition IMPORTING method TYPE sstruc - RETURNING VALUE(result) TYPE sstruc - RAISING cx_sy_itab_line_not_found. - - METHODS get_test_risk_level IMPORTING method TYPE sstruc - RETURNING VALUE(result) TYPE string. - - METHODS determine_tokens_not_allowed IMPORTING method TYPE sstruc. - METHODS has_ddic_itab_same_syntax IMPORTING token TYPE char255 RETURNING VALUE(result) TYPE abap_bool. @@ -41,6 +32,7 @@ CLASS y_check_db_access_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base CRE ENDCLASS. + CLASS y_check_db_access_in_ut IMPLEMENTATION. @@ -56,38 +48,21 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION. settings-apply_on_test_code = abap_true. settings-documentation = |{ c_docs_path-checks }db-access-in-ut.md|. - set_check_message( 'Database access(es) within a Unit-Test should be removed!' ). - ENDMETHOD. "CONSTRUCTOR - - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-method. - - is_testcode = test_code_detector->is_testcode( ). - - IF is_testcode = abap_false. - CONTINUE. - ENDIF. - - IF has_osql_or_cds_framework( ) = abap_true. - CONTINUE. - ENDIF. - - determine_tokens_not_allowed( ). + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_implementation ) ). + relevant_structure_types = VALUE #( ). - DATA(index) = -stmnt_from. + set_check_message( 'Database access(es) within a Unit-Test should be removed!' ). + ENDMETHOD. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - inspect_tokens( index = index - statement = ). + METHOD inspect_statements. + inspect_class_definition( structure ). - index = index + 1. + IF has_framework = abap_true. + RETURN. + ENDIF. - ENDLOOP. - ENDLOOP. + super->inspect_statements( structure ). ENDMETHOD. @@ -111,9 +86,10 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION. ENDIF. raise_error( statement_level = statement-level - statement_index = index - statement_from = statement-from - error_priority = check_configuration-prio ). + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio ). + ENDLOOP. ENDMETHOD. @@ -125,69 +101,40 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION. ENDMETHOD. - METHOD has_osql_or_cds_framework. + METHOD inspect_class_definition. + DATA test_risk_level TYPE string. + TRY. - DATA(class_definition) = get_class_definition( method ). + DATA(class_definition) = ref_scan_manager->structures[ class_implementation-back ]. CATCH cx_sy_itab_line_not_found. RETURN. ENDTRY. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM class_definition-stmnt_from TO class_definition-stmnt_to. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM -from TO -to - WHERE str = 'IF_OSQL_TEST_ENVIRONMENT' - OR str = 'CL_OSQL_TEST_ENVIRONMENT' - OR str = 'IF_CDS_TEST_ENVIRONMENT' - OR str = 'CL_CDS_TEST_ENVIRONMENT'. - result = abap_true. - RETURN. - ENDLOOP. - ENDLOOP. - ENDMETHOD. - - - METHOD consolidade_tokens. - LOOP AT ref_scan_manager->get_tokens( ) INTO DATA(token) - FROM statement-from TO statement-to. - token-str = condense( token-str ). - result = COND #( WHEN result IS INITIAL THEN token-str - ELSE |{ result } { token-str }| ). - ENDLOOP. - ENDMETHOD. - - - METHOD get_class_definition. - DATA(structures) = ref_scan_manager->get_structures( ). - DATA(class_implementation) = structures[ method-back ]. - result = structures[ class_implementation-back ]. - ENDMETHOD. + has_framework = abap_false. + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() + FROM class_definition-stmnt_from TO class_definition-stmnt_to. - METHOD get_test_risk_level. - TRY. - DATA(class_definition) = get_class_definition( method ). - CATCH cx_sy_itab_line_not_found. - RETURN. - ENDTRY. + IF is_in_scope( ) = abap_false. + CONTINUE. + ENDIF. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM class_definition-stmnt_from TO class_definition-stmnt_to. DATA(tokens) = consolidade_tokens( ). - result = COND #( WHEN tokens CS 'RISK LEVEL HARMLESS' THEN risk_level_harmless - WHEN tokens CS 'RISK LEVEL DANGEROUS' THEN risk_level_dangerous - WHEN tokens CS 'RISK LEVEL CRITICAL' THEN risk_level_critical ). - IF result IS NOT INITIAL. - RETURN. - ENDIF. - ENDLOOP. - result = risk_level_not_set. - ENDMETHOD. + test_risk_level = COND #( WHEN tokens CS 'RISK LEVEL HARMLESS' THEN risk_level_harmless + WHEN tokens CS 'RISK LEVEL DANGEROUS' THEN risk_level_dangerous + WHEN tokens CS 'RISK LEVEL CRITICAL' THEN risk_level_critical + ELSE test_risk_level ). + has_framework = COND #( WHEN tokens CS 'IF_OSQL_TEST_ENVIRONMENT' THEN abap_true + WHEN tokens CS 'CL_OSQL_TEST_ENVIRONMENT' THEN abap_true + WHEN tokens CS 'IF_CDS_TEST_ENVIRONMENT' THEN abap_true + WHEN tokens CS 'CL_CDS_TEST_ENVIRONMENT' THEN abap_true + ELSE has_framework ). + ENDLOOP. - METHOD determine_tokens_not_allowed. - DATA(test_risk_level) = get_test_risk_level( method ). + test_risk_level = COND #( WHEN test_risk_level IS INITIAL THEN risk_level_not_set + ELSE test_risk_level ). tokens_not_allowed = COND #( WHEN test_risk_level = risk_level_harmless THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) ( 'INSERT INTO *' ) ( 'SELECT *' ) ( 'COMMIT*' ) ( 'ROLLBACK*' ) ) WHEN test_risk_level = risk_level_not_set THEN VALUE #( ( 'ALTER *' ) ( 'DELETE *' ) ( 'UPDATE *' ) ( 'MODIFY *' ) ( 'INSERT INTO *' ) ( 'SELECT *' ) ( 'COMMIT*' ) ( 'ROLLBACK*' ) ) @@ -196,6 +143,15 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION. ENDMETHOD. + METHOD consolidade_tokens. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to. + result = COND #( WHEN result IS INITIAL THEN condense( -str ) + ELSE |{ result } { condense( -str ) }| ). + ENDLOOP. + ENDMETHOD. + + METHOD has_ddic_itab_same_syntax. result = xsdbool( token CS 'MODIFY' OR token CS 'UPDATE' @@ -204,9 +160,12 @@ CLASS y_check_db_access_in_ut IMPLEMENTATION. METHOD is_internal_table. - " Might have 'FROM' - result = xsdbool( is_persistent_object( get_token_abs( statement-from + 1 ) ) = abap_false - AND is_persistent_object( get_token_abs( statement-from + 2 ) ) = abap_false ). - ENDMETHOD. + DATA(second_token) = get_token_abs( statement-from + 1 ). + DATA(third_token) = get_token_abs( statement-from + 2 ). + + DATA(table) = COND #( WHEN second_token = 'FROM' THEN third_token + ELSE second_token ). + result = xsdbool( is_persistent_object( table ) = abap_false ). + ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_db_access_in_ut.clas.testclasses.abap b/src/checks/y_check_db_access_in_ut.clas.testclasses.abap index b2e7330f..2ade5533 100644 --- a/src/checks/y_check_db_access_in_ut.clas.testclasses.abap +++ b/src/checks/y_check_db_access_in_ut.clas.testclasses.abap @@ -166,6 +166,9 @@ CLASS ltc_risk_harmless IMPLEMENTATION. ( ' INSERT profile INTO TABLE profiles. ' ) ( ' MODIFY profiles FROM profile INDEX 1. ' ) ( ' DELETE profiles FROM profile. ' ) + ( ' DELETE profiles INDEX lines( profiles ). ' ) + + ( ' MODIFY profiles FROM VALUE #( ) TRANSPORTING profile WHERE username = sy-uname. ' ) ( ' ENDMETHOD. ' ) ( ' ENDCLASS. ' ) ). diff --git a/src/checks/y_check_deprecated_classes.clas.abap b/src/checks/y_check_deprecated_classes.clas.abap index 4d11c14a..a7ec5a6e 100644 --- a/src/checks/y_check_deprecated_classes.clas.abap +++ b/src/checks/y_check_deprecated_classes.clas.abap @@ -3,7 +3,6 @@ CLASS y_check_deprecated_classes DEFINITION PUBLIC INHERITING FROM y_check_base METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. @@ -34,49 +33,19 @@ CLASS y_check_deprecated_classes IMPLEMENTATION. set_check_message( '&1 was deprecated and replaced by &2!' ). + relevant_statement_types = VALUE #( BASE relevant_statement_types + ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). + deprecated_classes = VALUE #( ( original = 'CL_AUNIT_ASSERT' replacement = 'CL_ABAP_UNIT_ASSERT' ) ( original = 'IF_AUNIT_CONSTANTS' replacement = 'IF_ABAP_UNIT_CONSTANT' ) ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-form - OR stmnt_type EQ scan_struc_stmnt_type-method - OR stmnt_type EQ scan_struc_stmnt_type-function - OR stmnt_type EQ scan_struc_stmnt_type-module - OR stmnt_type EQ scan_struc_stmnt_type-class_definition - OR stmnt_type EQ scan_struc_stmnt_type-interface - OR type EQ scan_struc_type-event. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. - ENDMETHOD. - - METHOD inspect_tokens. CONSTANTS skip_ref_to TYPE i VALUE 2. - LOOP AT ref_scan_manager->get_tokens( ) TRANSPORTING NO FIELDS + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str = 'TYPE'. @@ -113,9 +82,8 @@ CLASS y_check_deprecated_classes IMPLEMENTATION. METHOD get_refereced_type. - DATA(tokens) = ref_scan_manager->get_tokens( ). TRY. - result = tokens[ position + 1 ]-str. + result = ref_scan_manager->tokens[ position + 1 ]-str. CATCH cx_sy_itab_line_not_found. RETURN. ENDTRY. diff --git a/src/checks/y_check_deprecated_key_words.clas.abap b/src/checks/y_check_deprecated_key_words.clas.abap index 55a0b5a9..ecf77d34 100644 --- a/src/checks/y_check_deprecated_key_words.clas.abap +++ b/src/checks/y_check_deprecated_key_words.clas.abap @@ -1,18 +1,14 @@ -CLASS y_check_deprecated_key_words DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_deprecated_key_words DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. - METHODS constructor . + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. - METHODS check_if_error - IMPORTING index TYPE i - keyword TYPE string - statement TYPE sstmnt. + METHODS check_if_error IMPORTING index TYPE i + keyword TYPE string + statement TYPE sstmnt. ENDCLASS. diff --git a/src/checks/y_check_empty_catches.clas.abap b/src/checks/y_check_empty_catches.clas.abap index 80885e46..33694ed9 100644 --- a/src/checks/y_check_empty_catches.clas.abap +++ b/src/checks/y_check_empty_catches.clas.abap @@ -1,18 +1,13 @@ -CLASS y_check_empty_catches DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_empty_catches DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. - METHODS constructor . - PROTECTED SECTION. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION . + PRIVATE SECTION. - METHODS get_next_token_from_index - IMPORTING index TYPE i - RETURNING VALUE(result) TYPE stokesx. + METHODS get_next_token_from_index IMPORTING index TYPE i + RETURNING VALUE(result) TYPE stokesx. ENDCLASS. @@ -35,7 +30,7 @@ CLASS Y_CHECK_EMPTY_CATCHES IMPLEMENTATION. METHOD get_next_token_from_index. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM index WHERE type EQ 'I'. IF result IS INITIAL. result = . diff --git a/src/checks/y_check_empty_if_branches.clas.abap b/src/checks/y_check_empty_if_branches.clas.abap index 75000f4f..43f38de5 100644 --- a/src/checks/y_check_empty_if_branches.clas.abap +++ b/src/checks/y_check_empty_if_branches.clas.abap @@ -4,10 +4,9 @@ CLASS y_check_empty_if_branches DEFINITION CREATE PUBLIC . PUBLIC SECTION. - METHODS constructor . + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. @@ -36,7 +35,7 @@ ENDCLASS. -CLASS Y_CHECK_EMPTY_IF_BRANCHES IMPLEMENTATION. +CLASS y_check_empty_if_branches IMPLEMENTATION. METHOD begin_of_statement. @@ -85,41 +84,17 @@ CLASS Y_CHECK_EMPTY_IF_BRANCHES IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }empty-if-branches.md|. - set_check_message( 'Empty IF-Branch should be removed!' ). - ENDMETHOD. - - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-if. - - is_testcode = test_code_detector->is_testcode( ). + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-if ) ). + relevant_structure_types = VALUE #( ( ) ). - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - statement = ). - - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'Empty IF-Branch should be removed!' ). ENDMETHOD. METHOD get_first_token_from_index. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM index WHERE type EQ 'I'. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM index + WHERE type EQ 'I'. IF result IS INITIAL. result = . EXIT. diff --git a/src/checks/y_check_empty_procedures.clas.abap b/src/checks/y_check_empty_procedures.clas.abap index 8d7eb874..f05a9800 100644 --- a/src/checks/y_check_empty_procedures.clas.abap +++ b/src/checks/y_check_empty_procedures.clas.abap @@ -1,32 +1,25 @@ -CLASS y_check_empty_procedures DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_empty_procedures DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. - METHODS inspect_tokens REDEFINITION . PRIVATE SECTION. + METHODS get_next_token_from_index IMPORTING index TYPE i + RETURNING VALUE(result) TYPE stokesx. - METHODS get_next_token_from_index - IMPORTING index TYPE i - RETURNING VALUE(result) TYPE stokesx. + METHODS has_found_start_procedure IMPORTING statement TYPE sstmnt + RETURNING VALUE(result) TYPE abap_bool. - METHODS has_found_start_procedure - IMPORTING statement TYPE sstmnt - RETURNING VALUE(result) TYPE abap_bool. + METHODS is_next_statement_end_proc IMPORTING statement TYPE sstmnt + RETURNING VALUE(result) TYPE abap_bool. - METHODS is_next_statement_end_proc - IMPORTING statement TYPE sstmnt - RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. -CLASS Y_CHECK_EMPTY_PROCEDURES IMPLEMENTATION. +CLASS y_check_empty_procedures IMPLEMENTATION. METHOD constructor. @@ -43,8 +36,8 @@ CLASS Y_CHECK_EMPTY_PROCEDURES IMPLEMENTATION. METHOD get_next_token_from_index. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM index WHERE type EQ 'I'. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM index WHERE type EQ 'I'. IF result IS INITIAL. result = . EXIT. @@ -84,9 +77,9 @@ CLASS Y_CHECK_EMPTY_PROCEDURES IMPLEMENTATION. METHOD is_next_statement_end_proc. result = abap_false. CASE get_next_token_from_index( statement-to + 1 )-str. - WHEN 'ENDFORM' OR - 'ENDMETHOD' OR - 'ENDMODULE'. + WHEN 'ENDFORM' + OR 'ENDMETHOD' + OR 'ENDMODULE'. result = abap_true. ENDCASE. ENDMETHOD. diff --git a/src/checks/y_check_equals_sign_chaining.clas.abap b/src/checks/y_check_equals_sign_chaining.clas.abap index 11d15d64..bcd06ece 100644 --- a/src/checks/y_check_equals_sign_chaining.clas.abap +++ b/src/checks/y_check_equals_sign_chaining.clas.abap @@ -1,13 +1,17 @@ CLASS y_check_equals_sign_chaining DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. METHODS constructor . + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS get_second_token IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE string. + METHODS get_fourth_token IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE string. + ENDCLASS. 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 5265c714..f32545cc 100644 --- a/src/checks/y_check_external_call_in_ut.clas.abap +++ b/src/checks/y_check_external_call_in_ut.clas.abap @@ -3,20 +3,17 @@ CLASS y_check_external_call_in_ut DEFINITION PUBLIC INHERITING FROM y_check_base METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. - METHODS check_if_error - IMPORTING - !index TYPE i - !statement TYPE sstmnt . + METHODS check_if_error IMPORTING index TYPE i + statement TYPE sstmnt . ENDCLASS. -CLASS Y_CHECK_EXTERNAL_CALL_IN_UT IMPLEMENTATION. +CLASS y_check_external_call_in_ut IMPLEMENTATION. METHOD check_if_error. @@ -34,7 +31,6 @@ CLASS Y_CHECK_EXTERNAL_CALL_IN_UT IMPLEMENTATION. statement_from = statement-from error_priority = check_configuration-prio parameter_01 = |{ key_word }| ). - ENDMETHOD. @@ -49,30 +45,11 @@ CLASS Y_CHECK_EXTERNAL_CALL_IN_UT IMPLEMENTATION. settings-apply_on_productive_code = abap_false. settings-apply_on_test_code = abap_true. settings-documentation = |{ c_docs_path-checks }external-call-in-ut.md|. - set_check_message( 'External Call from an Unit-Test should be removed!' ). - - ENDMETHOD. "CONSTRUCTOR - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-method. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-method ) ). + relevant_structure_types = VALUE #( ). - is_testcode = test_code_detector->is_testcode( ). - IF is_testcode EQ abap_false. - CONTINUE. - ENDIF. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - inspect_tokens( index = index - statement = ). - - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'External Call from an Unit-Test should be removed!' ). ENDMETHOD. @@ -101,10 +78,11 @@ CLASS Y_CHECK_EXTERNAL_CALL_IN_UT IMPLEMENTATION. has_redirection = abap_true. ENDIF. WHEN OTHERS. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM statement-from TO statement-to - WHERE type = 'I'. - IF ( -str CS 'CL_GUI_' ). + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to + WHERE type = 'I'. + IF -str CS 'CL_GUI_' + AND -str NS '=>'. has_redirection = abap_true. ENDIF. ENDLOOP. diff --git a/src/checks/y_check_external_call_in_ut.clas.testclasses.abap b/src/checks/y_check_external_call_in_ut.clas.testclasses.abap index 9f9f8f05..865c4020 100644 --- a/src/checks/y_check_external_call_in_ut.clas.testclasses.abap +++ b/src/checks/y_check_external_call_in_ut.clas.testclasses.abap @@ -357,8 +357,8 @@ CLASS ltc_cl_gui_usage IMPLEMENTATION. ( ' CLASS lcl_classname IMPLEMENTATION. ' ) ( ' METHOD example. ' ) - ( ' RETURN. ' ) - ( ' "no instance of CL_GUI_* classes ' ) + ( ' DATA exp TYPE ui_functions. ' ) + ( ' APPEND cl_gui_alv_tree_simple=>mc_fc_calculate TO exp.' ) ( ' ENDMETHOD. ' ) ( ' ENDCLASS. ' ) ). diff --git a/src/checks/y_check_form.clas.abap b/src/checks/y_check_form.clas.abap index 7d49cce4..850f55cf 100644 --- a/src/checks/y_check_form.clas.abap +++ b/src/checks/y_check_form.clas.abap @@ -1,18 +1,10 @@ -CLASS y_check_form DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_form DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - - METHODS constructor . + METHODS constructor. PROTECTED SECTION. - - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. - PRIVATE SECTION. ENDCLASS. @@ -28,41 +20,27 @@ CLASS Y_CHECK_FORM IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }form-routine.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-form ) ). + relevant_structure_types = VALUE #( ). + set_check_message( '"FORM" Routine should not be used!' ). ENDMETHOD. METHOD inspect_tokens. - RETURN. - ENDMETHOD. + CHECK get_token_abs( statement-from ) = 'FORM'. + DATA(check_configuration) = detect_check_configuration( statement ). - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-form. + IF check_configuration IS INITIAL. + RETURN. + ENDIF. - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_config) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - READ TABLE ref_scan_manager->get_statements( ) INDEX -stmnt_to INTO DATA(statement_for_message). - - DATA(check_configuration) = detect_check_configuration( statement_for_message ). + raise_error( statement_level = statement-level + statement_index = index + statement_from = statement-from + error_priority = check_configuration-prio ). + ENDMETHOD. - IF check_configuration IS INITIAL. - CONTINUE. - ENDIF. - raise_error( statement_level = statement_for_message-level - statement_index = -stmnt_to - statement_from = statement_for_message-from - error_priority = check_configuration-prio ). - ENDLOOP. - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_form.clas.testclasses.abap b/src/checks/y_check_form.clas.testclasses.abap index 7c0b857d..0d548232 100644 --- a/src/checks/y_check_form.clas.testclasses.abap +++ b/src/checks/y_check_form.clas.testclasses.abap @@ -50,9 +50,9 @@ CLASS local_test_class IMPLEMENTATION. ( ' START-OF-SELECTION. ' ) ( ' PERFORM example. ' ) - ( ' FORM example. ' ) + ( ' FORM example. "#EC CI_FORM ' ) ( ' DATA class TYPE REF TO cl_oo_class.' ) - ( ' ENDFORM. "#EC CI_FORM' ) + ( ' ENDFORM. ' ) ). ENDMETHOD. diff --git a/src/checks/y_check_function.clas.abap b/src/checks/y_check_function.clas.abap index 7c983b8c..eb1d9792 100644 --- a/src/checks/y_check_function.clas.abap +++ b/src/checks/y_check_function.clas.abap @@ -1,19 +1,13 @@ -CLASS y_check_function DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_function DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. - - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. + DATA db_reader TYPE REF TO lif_db_reader. - DATA db_reader TYPE REF TO lif_db_reader . ENDCLASS. @@ -29,57 +23,41 @@ CLASS Y_CHECK_FUNCTION IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }function-routine.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-function ) ). + relevant_structure_types = VALUE #( ). + set_check_message( 'Function-Module should not be created!' ). + + IF db_reader IS NOT BOUND. + db_reader = NEW lcl_db_reader( ). + ENDIF. ENDMETHOD. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) EQ 'FUNCTION'. + CHECK statement-type <> scan_stmnt_type-comment. + CHECK statement-type <> scan_stmnt_type-comment_in_stmnt. + CHECK statement-type <> scan_stmnt_type-pragma. + + CHECK get_token_abs( statement-from ) = 'FUNCTION'. DATA fm_name TYPE c LENGTH 30. fm_name = get_token_abs( statement-from + 1 ). IF db_reader->is_fm_rfc_enabled( fm_name ) EQ abap_false. - DATA(check_configuration) = detect_check_configuration( statement ). "#EC DECL_IN_IF + DATA(check_configuration) = detect_check_configuration( statement ). IF check_configuration IS INITIAL. RETURN. ENDIF. raise_error( statement_level = statement-level - statement_index = structure-stmnt_from + statement_index = index statement_from = statement-from error_priority = check_configuration-prio ). ENDIF. ENDMETHOD. - - METHOD execute_check. - IF db_reader IS NOT BOUND. - db_reader = NEW lcl_db_reader( ). - ENDIF. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-function. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_config) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to WHERE type NE scan_stmnt_type-comment AND - type NE scan_stmnt_type-comment_in_stmnt AND - type NE scan_stmnt_type-pragma. - inspect_tokens( structure = statement = ). - ENDLOOP. - - ENDLOOP. - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_function.clas.testclasses.abap b/src/checks/y_check_function.clas.testclasses.abap index e905ed66..5ea2ce08 100644 --- a/src/checks/y_check_function.clas.testclasses.abap +++ b/src/checks/y_check_function.clas.testclasses.abap @@ -7,33 +7,10 @@ CLASS ltd_ref_scan_manager DEFINITION FOR TESTING. "#EC INTF_IN_CLASS set_data_for_error, set_pseudo_comment_ok. - PRIVATE SECTION. - DATA: - levels TYPE slevel_tab, - structures TYPE sstruc_tab, - statements TYPE sstmnt_tab, - tokens TYPE stokesx_tab. ENDCLASS. CLASS ltd_ref_scan_manager IMPLEMENTATION. - METHOD y_if_scan_manager~get_structures. - result = structures. - ENDMETHOD. - - METHOD y_if_scan_manager~get_statements. - result = statements. - ENDMETHOD. - - METHOD y_if_scan_manager~get_tokens. - result = tokens. - ENDMETHOD. - - METHOD y_if_scan_manager~get_levels. - result = levels. - ENDMETHOD. - METHOD y_if_scan_manager~set_ref_scan. - "Empty for test case RETURN. ENDMETHOD. @@ -42,51 +19,51 @@ CLASS ltd_ref_scan_manager IMPLEMENTATION. ENDMETHOD. METHOD set_data_for_ok. - levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 2 name = 'ZTEST' type = 'P' ) ). + y_if_scan_manager~levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 2 name = 'ZTEST' type = 'P' ) ). - structures = VALUE #( ( stmnt_from = 1 stmnt_to = 2 stmnt_type = scan_struc_stmnt_type-method ) ). + y_if_scan_manager~structures = VALUE #( ( stmnt_from = 1 stmnt_to = 2 stmnt_type = scan_struc_stmnt_type-method ) ). - statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) - ( level = 1 from = '3' to = '3' type = 'K' ) ). + y_if_scan_manager~statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) + ( level = 1 from = '3' to = '3' type = 'K' ) ). - tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) - ( str = 'F1' type = 'I' row = 1 ) - ( str = 'ENDFUNCTION' type = 'I' row = 2 ) ). + y_if_scan_manager~tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) + ( str = 'F1' type = 'I' row = 1 ) + ( str = 'ENDFUNCTION' type = 'I' row = 2 ) ). ENDMETHOD. METHOD set_data_for_error. - levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 4 name = 'ZTEST' type = 'P' ) ). - - structures = VALUE #( ( stmnt_from = 1 stmnt_to = 2 stmnt_type = scan_struc_stmnt_type-function ) - ( stmnt_from = 3 stmnt_to = 4 stmnt_type = scan_struc_stmnt_type-function ) ). - - statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) - ( level = 1 from = '3' to = '3' type = 'K' ) - ( level = 1 from = '4' to = '5' type = 'K' ) - ( level = 1 from = '6' to = '6' type = 'K' ) ). - - tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) - ( str = 'F1' type = 'I' row = 1 ) - ( str = 'ENDFUNCTION' type = 'I' row = 2 ) - ( str = 'FUNCTION' type = 'I' row = 3 ) - ( str = 'F2' type = 'I' row = 3 ) - ( str = 'ENDFUNCTION' type = 'I' row = 4 ) ). + y_if_scan_manager~levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 4 name = 'ZTEST' type = 'P' ) ). + + y_if_scan_manager~structures = VALUE #( ( stmnt_from = 1 stmnt_to = 2 stmnt_type = scan_struc_stmnt_type-function ) + ( stmnt_from = 3 stmnt_to = 4 stmnt_type = scan_struc_stmnt_type-function ) ). + + y_if_scan_manager~statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) + ( level = 1 from = '3' to = '3' type = 'K' ) + ( level = 1 from = '4' to = '5' type = 'K' ) + ( level = 1 from = '6' to = '6' type = 'K' ) ). + + y_if_scan_manager~tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) + ( str = 'F1' type = 'I' row = 1 ) + ( str = 'ENDFUNCTION' type = 'I' row = 2 ) + ( str = 'FUNCTION' type = 'I' row = 3 ) + ( str = 'F2' type = 'I' row = 3 ) + ( str = 'ENDFUNCTION' type = 'I' row = 4 ) ). ENDMETHOD. METHOD set_pseudo_comment_ok. - levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 3 name = 'ZTEST' type = 'P' ) ). + y_if_scan_manager~levels = VALUE #( ( depth = 1 level = 0 stmnt = 0 from = 1 to = 3 name = 'ZTEST' type = 'P' ) ). - structures = VALUE #( ( stmnt_from = 1 stmnt_to = 3 stmnt_type = scan_struc_stmnt_type-function ) ). + y_if_scan_manager~structures = VALUE #( ( stmnt_from = 1 stmnt_to = 3 stmnt_type = scan_struc_stmnt_type-function ) ). - statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) - ( level = 1 from = '3' to = '4' type = 'P' ) - ( level = 1 from = '5' to = '5' type = 'K' ) ). + y_if_scan_manager~statements = VALUE #( ( level = 1 from = '1' to = '2' type = 'K' ) + ( level = 1 from = '3' to = '4' type = 'P' ) + ( level = 1 from = '5' to = '5' type = 'K' ) ). - tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) - ( str = 'F1' type = 'I' row = 1 ) - ( str = '"#EC CI_FUNCTION' type = 'C' row = 1 ) - ( str = '*SOME COMMENT' type = 'C' row = 2 ) - ( str = 'ENDFUNCTION' type = 'I' row = 3 ) ). + y_if_scan_manager~tokens = VALUE #( ( str = 'FUNCTION' type = 'I' row = 1 ) + ( str = 'F1' type = 'I' row = 1 ) + ( str = '"#EC CI_FUNCTION' type = 'C' row = 1 ) + ( str = '*SOME COMMENT' type = 'C' row = 2 ) + ( str = 'ENDFUNCTION' type = 'I' row = 3 ) ). 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 ada7a891..0c3ba1b1 100644 --- a/src/checks/y_check_is_interface_in_class.clas.abap +++ b/src/checks/y_check_is_interface_in_class.clas.abap @@ -1,19 +1,28 @@ -CLASS y_check_is_interface_in_class DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . +CLASS y_check_is_interface_in_class DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor . + METHODS constructor. + PROTECTED SECTION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. - METHODS execute_check REDEFINITION. + PRIVATE SECTION. DATA public_method_counter TYPE i VALUE 0. + METHODS get_first_token IMPORTING statement TYPE sstmnt RETURNING value(result) TYPE string. + METHODS get_second_token IMPORTING statement TYPE sstmnt RETURNING value(result) TYPE string. + METHODS get_third_token IMPORTING statement TYPE sstmnt RETURNING value(result) TYPE string. + METHODS get_last_token IMPORTING statement TYPE sstmnt RETURNING value(result) TYPE string. + + METHODS check_result IMPORTING structure TYPE sstruc. + ENDCLASS. @@ -31,52 +40,19 @@ CLASS Y_CHECK_IS_INTERFACE_IN_CLASS IMPLEMENTATION. settings-apply_on_test_code = abap_false. settings-documentation = |{ c_docs_path-checks }interface-in-class.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-public_section ) ). + relevant_structure_types = VALUE #( ). + set_check_message( '&1 public methods without interface!' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_config) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - public_method_counter = 0. + METHOD inspect_statements. + public_method_counter = 0. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. + super->inspect_statements( structure ). - IF get_token_abs( -from ) EQ 'PROTECTED' OR - get_token_abs( -from ) EQ 'PRIVATE'. - EXIT. - ENDIF. - - inspect_tokens( statement = ). - ENDLOOP. - - DATA(check_configuration) = detect_check_configuration( error_count = public_method_counter - statement = statement_for_message ). - - IF check_configuration IS INITIAL. - CONTINUE. - ENDIF. - - raise_error( statement_level = statement_for_message-level - statement_index = -stmnt_from - statement_from = statement_for_message-from - error_priority = check_configuration-prio - parameter_01 = |{ public_method_counter }| ). - ENDLOOP. + check_result( structure ). ENDMETHOD. @@ -112,4 +88,24 @@ CLASS Y_CHECK_IS_INTERFACE_IN_CLASS IMPLEMENTATION. METHOD get_first_token. result = get_token_abs( statement-from ). ENDMETHOD. + + + METHOD check_result. + DATA(statement_for_message) = ref_scan_manager->statements[ structure-stmnt_from ]. + + DATA(check_configuration) = detect_check_configuration( error_count = public_method_counter + statement = statement_for_message ). + + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement_for_message-level + statement_index = structure-stmnt_from + statement_from = statement_for_message-from + error_priority = check_configuration-prio + parameter_01 = |{ public_method_counter }| ). + ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_is_interface_in_class.clas.testclasses.abap b/src/checks/y_check_is_interface_in_class.clas.testclasses.abap index 197b3c50..d596acd5 100644 --- a/src/checks/y_check_is_interface_in_class.clas.testclasses.abap +++ b/src/checks/y_check_is_interface_in_class.clas.testclasses.abap @@ -76,8 +76,8 @@ CLASS ltc_class IMPLEMENTATION. result = VALUE #( ( 'REPORT ut_repo.' ) - ( 'CLASS lcl_classname DEFINITION. "#EC INTF_IN_CLASS' ) - ( ' PUBLIC SECTION.' ) + ( 'CLASS lcl_classname DEFINITION. ' ) + ( ' PUBLIC SECTION. "#EC INTF_IN_CLASS' ) ( ' METHODS publ_method.' ) ( ' PROTECTED SECTION.' ) ( ' PRIVATE SECTION.' ) diff --git a/src/checks/y_check_magic_number.clas.abap b/src/checks/y_check_magic_number.clas.abap index 8e2d5a0b..5b0420b1 100644 --- a/src/checks/y_check_magic_number.clas.abap +++ b/src/checks/y_check_magic_number.clas.abap @@ -1,34 +1,23 @@ -CLASS y_check_magic_number DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_magic_number DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - CONSTANTS second_token TYPE i VALUE 2 ##NO_TEXT. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. - METHODS inspect_tokens - REDEFINITION . PRIVATE SECTION. + CONSTANTS second_token TYPE i VALUE 2 ##NO_TEXT. + + DATA magic_number TYPE string. + DATA has_case_with_subrc TYPE abap_bool. - DATA magic_number TYPE string . - DATA has_case_with_subrc TYPE abap_bool . - - METHODS is_exception - IMPORTING - !token TYPE string - RETURNING - VALUE(result) TYPE abap_bool . - METHODS is_keyword_valid - RETURNING - VALUE(result) TYPE abap_bool . - METHODS is_magic_number - IMPORTING - !token_string TYPE string - RETURNING - VALUE(result) TYPE abap_bool . + METHODS is_exception IMPORTING token TYPE string + RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_keyword_valid RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_magic_number IMPORTING token_string TYPE string + RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -65,8 +54,8 @@ CLASS Y_CHECK_MAGIC_NUMBER IMPLEMENTATION. METHOD inspect_tokens. statement_wa = statement. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - FROM statement-from TO statement-to. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to. IF is_exception( -str ) = abap_true. EXIT. @@ -109,4 +98,6 @@ CLASS Y_CHECK_MAGIC_NUMBER IMPLEMENTATION. result = abap_true. ENDIF. ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_max_nesting_depth.clas.abap b/src/checks/y_check_max_nesting_depth.clas.abap index a17fa4be..5df7b45b 100644 --- a/src/checks/y_check_max_nesting_depth.clas.abap +++ b/src/checks/y_check_max_nesting_depth.clas.abap @@ -1,34 +1,26 @@ -CLASS y_check_max_nesting_depth DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_max_nesting_depth DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. - METHODS inspect_tokens - REDEFINITION . PRIVATE SECTION. DATA statement_for_message TYPE sstmnt. - DATA curr_nesting TYPE i . - DATA max_nesting TYPE i . - - METHODS compute_nesting_level - IMPORTING - !token_str TYPE string . - METHODS determine_position - IMPORTING - !type TYPE flag - !index TYPE i - RETURNING - VALUE(result) TYPE int4 . + DATA curr_nesting TYPE i. + DATA max_nesting TYPE i. + + METHODS compute_nesting_level IMPORTING token_str TYPE string. + + METHODS determine_position IMPORTING type TYPE flag + index TYPE i + RETURNING VALUE(result) TYPE int4. + ENDCLASS. -CLASS Y_CHECK_MAX_NESTING_DEPTH IMPLEMENTATION. +CLASS y_check_max_nesting_depth IMPLEMENTATION. METHOD compute_nesting_level. @@ -73,7 +65,7 @@ CLASS Y_CHECK_MAX_NESTING_DEPTH IMPLEMENTATION. max_nesting = 0. ENDIF. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. compute_nesting_level( -str ). diff --git a/src/checks/y_check_method_output_param.clas.abap b/src/checks/y_check_method_output_param.clas.abap index 4c7e3da4..f9247080 100644 --- a/src/checks/y_check_method_output_param.clas.abap +++ b/src/checks/y_check_method_output_param.clas.abap @@ -1,14 +1,9 @@ -CLASS y_check_method_output_param DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_method_output_param DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. - METHODS execute_check REDEFINITION. PRIVATE SECTION. DATA has_found_methods TYPE abap_bool. @@ -17,10 +12,9 @@ CLASS y_check_method_output_param DEFINITION DATA has_returning_parameter TYPE abap_bool. DATA has_pseudo_comment TYPE abap_bool. - METHODS check_token_content - IMPORTING token TYPE stokesx. - + METHODS check_token_content IMPORTING token TYPE stokesx. METHODS has_error RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -66,46 +60,24 @@ CLASS Y_CHECK_METHOD_OUTPUT_PARAM IMPLEMENTATION. settings-threshold = 1. settings-documentation = |{ c_docs_path-checks }method-output-parameter.md|. - set_check_message( 'Combination of parameters(RETURNING/EXPORTING) should not be used!' ). - ENDMETHOD. - + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition OR - stmnt_type EQ scan_struc_stmnt_type-interface. + relevant_structure_types = VALUE #( ). - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - inspect_tokens( index = index - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'Combination of parameters(RETURNING/EXPORTING) should not be used!' ). ENDMETHOD. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) = 'METHODS' OR - get_token_abs( statement-from ) = 'CLASS-METHODS'. + CHECK get_token_abs( statement-from ) = 'METHODS' + OR get_token_abs( statement-from ) = 'CLASS-METHODS'. has_exporting_parameter = abap_false. has_changing_parameter = abap_false. has_returning_parameter = abap_false. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. CASE -str. @@ -133,6 +105,5 @@ CLASS Y_CHECK_METHOD_OUTPUT_PARAM IMPLEMENTATION. statement_index = index statement_from = statement-from error_priority = check_configuration-prio ). - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_method_return_bool.clas.abap b/src/checks/y_check_method_return_bool.clas.abap index 74ebaf76..1dacd995 100644 --- a/src/checks/y_check_method_return_bool.clas.abap +++ b/src/checks/y_check_method_return_bool.clas.abap @@ -1,11 +1,11 @@ CLASS y_check_method_return_bool DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. DATA method_name TYPE string. METHODS inspect_tokens REDEFINITION. - METHODS execute_check REDEFINITION. PRIVATE SECTION. DATA good_method_names_beginning TYPE TABLE OF string. @@ -29,6 +29,11 @@ CLASS Y_CHECK_METHOD_RETURN_BOOL IMPLEMENTATION. settings-prio = c_warning. settings-documentation = |{ c_docs_path-checks }method-return-bool.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). + + relevant_structure_types = VALUE #( ). + set_check_message( 'Method &1 has a misleading name for boolean return type!' ). APPEND 'IS_' TO good_method_names_beginning. @@ -54,16 +59,16 @@ 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 . + IF strlen( method_name ) GE strlen( ) + AND substring( val = method_name len = strlen( ) ) EQ . result = abap_true. RETURN. ENDIF. ENDLOOP. LOOP AT good_method_names_containing ASSIGNING FIELD-SYMBOL(). - IF strlen( method_name ) GE strlen( ) AND - method_name CS . + IF strlen( method_name ) GE strlen( ) + AND method_name CS . result = abap_true. RETURN. ENDIF. @@ -71,42 +76,16 @@ CLASS Y_CHECK_METHOD_RETURN_BOOL IMPLEMENTATION. ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition - OR stmnt_type EQ scan_struc_stmnt_type-interface. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. - ENDMETHOD. - - METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) EQ 'METHODS'. + CHECK get_token_abs( statement-from ) = 'METHODS'. DATA(has_found_bool) = abap_false. DATA(token_index) = statement-from. - LOOP AT ref_scan_manager->get_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 + 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 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 4b05871b..2c5e42ca 100644 --- a/src/checks/y_check_non_class_exception.clas.abap +++ b/src/checks/y_check_non_class_exception.clas.abap @@ -1,15 +1,20 @@ -CLASS y_check_non_class_exception DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . +CLASS y_check_non_class_exception DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor . + METHODS constructor. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + METHODS inspect_message IMPORTING statement TYPE sstmnt index TYPE i. + METHODS inspect_raise IMPORTING statement TYPE sstmnt index TYPE i. + PRIVATE SECTION. METHODS checkif_error IMPORTING index TYPE i statement TYPE sstmnt. + ENDCLASS. @@ -18,6 +23,7 @@ CLASS Y_CHECK_NON_CLASS_EXCEPTION IMPLEMENTATION. METHOD checkif_error. DATA(check_configuration) = detect_check_configuration( statement ). + IF check_configuration IS INITIAL. RETURN. ENDIF. @@ -26,7 +32,6 @@ CLASS Y_CHECK_NON_CLASS_EXCEPTION IMPLEMENTATION. statement_index = index statement_from = statement-from error_priority = check_configuration-prio ). - ENDMETHOD. @@ -54,10 +59,9 @@ CLASS Y_CHECK_NON_CLASS_EXCEPTION IMPLEMENTATION. METHOD inspect_message. CHECK get_token_abs( statement-from ) = 'MESSAGE'. - LOOP AT ref_scan_manager->get_tokens( ) TRANSPORTING NO FIELDS + LOOP AT ref_scan_manager->tokens TRANSPORTING NO FIELDS FROM statement-from TO statement-to WHERE str = 'RAISING' AND type EQ '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 633e77d4..04612c0a 100644 --- a/src/checks/y_check_num_exec_statements.clas.abap +++ b/src/checks/y_check_num_exec_statements.clas.abap @@ -1,41 +1,25 @@ -CLASS y_check_num_exec_statements DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_num_exec_statements DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. - - METHODS inspect_tokens - REDEFINITION . + METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. - - DATA no_exec_statements TYPE i . + DATA no_exec_statements TYPE i. DATA statement_for_message TYPE sstmnt. - METHODS count_statements - CHANGING - !no_exec_statements TYPE i . - - METHODS determine_position - IMPORTING - !type TYPE flag - !index TYPE i - RETURNING - VALUE(result) TYPE int4 . - - METHODS is_keyword_exempt - RETURNING - VALUE(result) TYPE abap_bool . - - METHODS is_statement_exempt - IMPORTING - !type TYPE stmnt_type - RETURNING - VALUE(result) TYPE abap_bool . + METHODS count_statements CHANGING no_exec_statements TYPE i. + + METHODS determine_position IMPORTING type TYPE flag + index TYPE i + RETURNING VALUE(result) TYPE int4. + + METHODS is_keyword_exempt RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_statement_exempt IMPORTING type TYPE stmnt_type + RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -85,9 +69,7 @@ CLASS Y_CHECK_NUM_EXEC_STATEMENTS IMPLEMENTATION. no_exec_statements = 0. ENDIF. - count_statements( - CHANGING - no_exec_statements = no_exec_statements ). + count_statements( CHANGING no_exec_statements = no_exec_statements ). IF index = structure-stmnt_to. DATA(check_configuration) = detect_check_configuration( error_count = no_exec_statements diff --git a/src/checks/y_check_num_output_parameter.clas.abap b/src/checks/y_check_num_output_parameter.clas.abap index 0a90dace..dd551890 100644 --- a/src/checks/y_check_num_output_parameter.clas.abap +++ b/src/checks/y_check_num_output_parameter.clas.abap @@ -1,16 +1,18 @@ CLASS y_check_num_output_parameter DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. - METHODS constructor . + METHODS constructor. + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS count_outputs_of_statement IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE i. + ENDCLASS. -CLASS Y_CHECK_NUM_OUTPUT_PARAMETER IMPLEMENTATION. +CLASS y_check_num_output_parameter IMPLEMENTATION. METHOD constructor. @@ -21,37 +23,16 @@ CLASS Y_CHECK_NUM_OUTPUT_PARAMETER IMPLEMENTATION. settings-threshold = 2. settings-documentation = |{ c_docs_path-checks }number-output-parameter.md|. - set_check_message( 'Number of output parameters must be lower than &2! (&1>=&2)' ). - ENDMETHOD. - + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition - OR stmnt_type EQ scan_struc_stmnt_type-interface. + relevant_structure_types = VALUE #( ). - TRY. - DATA(apply_on_testcode) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF test_code_detector->is_testcode( ) EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - DATA(index) = sy-tabix. - inspect_tokens( index = index - structure = - statement = ). - ENDLOOP. - - ENDLOOP. + set_check_message( 'Number of output parameters must be lower than &2! (&1>=&2)' ). ENDMETHOD. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) = 'METHODS' OR get_token_abs( statement-from ) = 'CLASS-METHODS'. @@ -70,14 +51,13 @@ CLASS Y_CHECK_NUM_OUTPUT_PARAMETER IMPLEMENTATION. error_priority = configuration-prio parameter_01 = |{ outputs_of_statement }| parameter_02 = |{ configuration-threshold }| ). - ENDMETHOD. METHOD count_outputs_of_statement. DATA(skip) = abap_false. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. diff --git a/src/checks/y_check_num_public_attributes.clas.abap b/src/checks/y_check_num_public_attributes.clas.abap index 3de6aed1..cf29fd1f 100644 --- a/src/checks/y_check_num_public_attributes.clas.abap +++ b/src/checks/y_check_num_public_attributes.clas.abap @@ -1,135 +1,103 @@ -CLASS y_check_num_public_attributes DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_num_public_attributes DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor . PROTECTED SECTION. - METHODS inspect_tokens - REDEFINITION. - - METHODS execute_check - REDEFINITION. + METHODS inspect_statements REDEFINITION. + METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. + CONSTANTS structure_depth_threshold TYPE i VALUE 0. DATA public_attribute_counter TYPE i VALUE 0. DATA structure_depth TYPE i VALUE 0. - CONSTANTS structure_depth_threshold TYPE i VALUE 0. - METHODS checkif_attribute_in_structure - IMPORTING - second_token TYPE string - third_token TYPE string. + METHODS checkif_attribute_in_structure IMPORTING second_token TYPE string + third_token TYPE string. + + METHODS checkif_public_attribute_found IMPORTING first_token TYPE string + last_token TYPE string. - METHODS checkif_public_attribute_found - IMPORTING - first_token TYPE string - last_token TYPE string. + METHODS check_result IMPORTING structure TYPE sstruc. - METHODS checkif_error - IMPORTING index TYPE i - statement TYPE sstmnt. ENDCLASS. -CLASS Y_CHECK_NUM_PUBLIC_ATTRIBUTES IMPLEMENTATION. +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. - ENDIF. - ENDMETHOD. + METHOD constructor. + super->constructor( ). + settings-pseudo_comment = '"#EC NUM_PUBLIC_ATTR' ##NO_TEXT. + settings-disable_threshold_selection = abap_true. + settings-threshold = 1. + settings-documentation = |{ c_docs_path-checks }number-public-attributes.md|. - METHOD checkif_error. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-public_section ) ). - DATA(check_configuration) = detect_check_configuration( statement = statement - error_count = public_attribute_counter ). - IF check_configuration IS INITIAL. - RETURN. - ENDIF. + relevant_structure_types = VALUE #( ). - raise_error( statement_level = statement-level - statement_index = index - statement_from = statement-from - error_priority = check_configuration-prio - parameter_01 = |{ public_attribute_counter }| - parameter_02 = |{ check_configuration-threshold }| ). + set_check_message( '&1 public attributes. All attributes should be private/protected by default!' ). ENDMETHOD. - METHOD checkif_public_attribute_found. - CHECK first_token = 'DATA' - OR first_token = 'CLASS-DATA'. - - CHECK structure_depth <= structure_depth_threshold. + METHOD inspect_statements. + public_attribute_counter = 0. - CHECK last_token <> 'READ-ONLY'. + super->inspect_statements( structure ). - ADD 1 TO public_attribute_counter. + check_result( structure ). ENDMETHOD. - METHOD constructor. - super->constructor( ). + METHOD inspect_tokens. + checkif_public_attribute_found( first_token = get_token_abs( statement-from ) + last_token = get_token_abs( statement-to ) ). - settings-pseudo_comment = '"#EC NUM_PUBLIC_ATTR' ##NO_TEXT. - settings-disable_threshold_selection = abap_true. - settings-threshold = 1. - settings-documentation = |{ c_docs_path-checks }number-public-attributes.md|. + checkif_attribute_in_structure( second_token = get_token_abs( statement-from + 1 ) + third_token = get_token_abs( statement-from + 2 ) ). + ENDMETHOD. - set_check_message( '&1 public attributes. All attributes should be private/protected by default!' ). + + 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. + ENDIF. ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. + METHOD checkif_public_attribute_found. + CHECK first_token = 'DATA' + OR first_token = 'CLASS-DATA'. - is_testcode = test_code_detector->is_testcode( ). + CHECK structure_depth <= structure_depth_threshold. - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + CHECK last_token <> 'READ-ONLY'. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - public_attribute_counter = 0. + ADD 1 TO public_attribute_counter. + ENDMETHOD. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - IF get_token_abs( -from ) EQ 'PROTECTED' OR - get_token_abs( -from ) EQ 'PRIVATE'. - EXIT. - ENDIF. + METHOD check_result. + DATA(statement) = ref_scan_manager->statements[ structure-stmnt_from ]. - inspect_tokens( statement = ). - ENDLOOP. + DATA(check_configuration) = detect_check_configuration( statement = statement + error_count = public_attribute_counter ). + IF check_configuration IS INITIAL. + RETURN. + ENDIF. - checkif_error( index = -stmnt_from - statement = statement_for_message ). - ENDLOOP. + raise_error( statement_level = statement-level + statement_index = structure-stmnt_from + statement_from = statement-from + error_priority = check_configuration-prio + parameter_01 = |{ public_attribute_counter }| + parameter_02 = |{ check_configuration-threshold }| ). ENDMETHOD. - METHOD inspect_tokens. - checkif_public_attribute_found( first_token = get_token_abs( statement-from ) - last_token = get_token_abs( statement-to ) ). - - checkif_attribute_in_structure( second_token = get_token_abs( statement-from + 1 ) - third_token = get_token_abs( statement-from + 2 ) ). - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_num_public_attributes.clas.testclasses.abap b/src/checks/y_check_num_public_attributes.clas.testclasses.abap index 36a1fc7b..b54173f0 100644 --- a/src/checks/y_check_num_public_attributes.clas.testclasses.abap +++ b/src/checks/y_check_num_public_attributes.clas.testclasses.abap @@ -52,8 +52,8 @@ CLASS ltc_instance IMPLEMENTATION. result = VALUE #( ( 'REPORT y_example. ' ) - ( ' CLASS y_example DEFINITION. "#EC NUM_PUBLIC_ATTR ' ) - ( ' PUBLIC SECTION. ' ) + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. "#EC NUM_PUBLIC_ATTR ' ) ( ' DATA: BEGIN OF one, ' ) ( ' index TYPE i, ' ) ( ' spfli_wa TYPE spfli, ' ) @@ -124,8 +124,8 @@ CLASS ltc_static IMPLEMENTATION. result = VALUE #( ( 'REPORT y_example. ' ) - ( ' CLASS y_example DEFINITION. "#EC NUM_PUBLIC_ATTR ' ) - ( ' PUBLIC SECTION. ' ) + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. "#EC NUM_PUBLIC_ATTR ' ) ( ' CLASS-DATA: BEGIN OF one, ' ) ( ' index TYPE i, ' ) ( ' spfli_wa TYPE spfli, ' ) @@ -196,8 +196,8 @@ CLASS ltc_mixed IMPLEMENTATION. result = VALUE #( ( 'REPORT y_example. ' ) - ( ' CLASS y_example DEFINITION. "#EC NUM_PUBLIC_ATTR ' ) - ( ' PUBLIC SECTION. ' ) + ( ' CLASS y_example DEFINITION. ' ) + ( ' PUBLIC SECTION. "#EC NUM_PUBLIC_ATTR ' ) ( ' CLASS-DATA: BEGIN OF one, ' ) ( ' index TYPE i, ' ) ( ' spfli_wa TYPE spfli, ' ) diff --git a/src/checks/y_check_number_attributes.clas.abap b/src/checks/y_check_number_attributes.clas.abap index 8bb2f74f..ac7dadcf 100644 --- a/src/checks/y_check_number_attributes.clas.abap +++ b/src/checks/y_check_number_attributes.clas.abap @@ -1,37 +1,62 @@ -CLASS y_check_number_attributes DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_number_attributes DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor. PROTECTED SECTION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. - METHODS execute_check REDEFINITION. PRIVATE SECTION. + CONSTANTS structure_depth_threshold TYPE i VALUE 0. + DATA attribute_counter TYPE i VALUE 0. DATA structure_depth TYPE i VALUE 0. - CONSTANTS structure_depth_threshold TYPE i VALUE 0. - METHODS checkif_attribute_in_structure - IMPORTING - second_token TYPE string - third_token TYPE string. + METHODS checkif_attribute_in_structure IMPORTING second_token TYPE string + third_token TYPE string. + + METHODS checkif_attribute_found IMPORTING first_token TYPE string. - METHODS checkif_attribute_found - IMPORTING first_token TYPE string. + METHODS check_result IMPORTING structure TYPE sstruc. - METHODS checkif_error - IMPORTING index TYPE i - statement TYPE sstmnt. ENDCLASS. -CLASS Y_CHECK_NUMBER_ATTRIBUTES IMPLEMENTATION. +CLASS y_check_number_attributes IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + settings-pseudo_comment = '"#EC NUMBER_ATTR' ##NO_TEXT. + settings-threshold = 12. + settings-documentation = |{ c_docs_path-checks }number-attributes.md|. + + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). + + relevant_structure_types = VALUE #( ). + + set_check_message( 'Number of attributes must be lower than &2! (&1>=&2)' ). + ENDMETHOD. + + + METHOD inspect_statements. + attribute_counter = 0. + + super->inspect_statements( structure ). + + check_result( structure ). + ENDMETHOD. + + + METHOD inspect_tokens. + checkif_attribute_found( first_token = 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 ) ). + ENDMETHOD. METHOD checkif_attribute_found. @@ -53,7 +78,9 @@ CLASS Y_CHECK_NUMBER_ATTRIBUTES IMPLEMENTATION. ENDMETHOD. - METHOD checkif_error. + METHOD check_result. + DATA(statement) = ref_scan_manager->statements[ structure-stmnt_from ]. + DATA(check_configuration) = detect_check_configuration( error_count = attribute_counter statement = statement ). IF check_configuration IS INITIAL. @@ -61,61 +88,12 @@ CLASS Y_CHECK_NUMBER_ATTRIBUTES IMPLEMENTATION. ENDIF. raise_error( statement_level = statement-level - statement_index = index + statement_index = structure-stmnt_from statement_from = statement-from error_priority = check_configuration-prio parameter_01 = |{ attribute_counter }| parameter_02 = |{ check_configuration-threshold }| ). - - ENDMETHOD. - - - METHOD constructor. - super->constructor( ). - - settings-pseudo_comment = '"#EC NUMBER_ATTR' ##NO_TEXT. - settings-threshold = 12. - settings-documentation = |{ c_docs_path-checks }number-attributes.md|. - - set_check_message( 'Number of attributes must be lower than &2! (&1>=&2)' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition - OR stmnt_type EQ scan_struc_stmnt_type-interface. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - attribute_counter = 0. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( statement = ). - ENDLOOP. - - checkif_error( index = -stmnt_from - statement = statement_for_message ). - ENDLOOP. - ENDMETHOD. - - - METHOD inspect_tokens. - checkif_attribute_found( first_token = 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 ) ). - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_number_events.clas.abap b/src/checks/y_check_number_events.clas.abap index 85d62b15..f49cf36d 100644 --- a/src/checks/y_check_number_events.clas.abap +++ b/src/checks/y_check_number_events.clas.abap @@ -1,21 +1,16 @@ -CLASS y_check_number_events DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_number_events DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. DATA event_counter TYPE i VALUE 0. - METHODS checkif_error - IMPORTING index TYPE i - statement TYPE sstmnt. + METHODS check_result IMPORTING structure TYPE sstruc. + ENDCLASS. @@ -23,60 +18,27 @@ ENDCLASS. CLASS Y_CHECK_NUMBER_EVENTS IMPLEMENTATION. - METHOD checkif_error. - DATA(check_configuration) = detect_check_configuration( error_count = event_counter - statement = 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 = |{ event_counter }| - parameter_02 = |{ check_configuration-threshold }| ). - ENDMETHOD. - - METHOD constructor. super->constructor( ). settings-pseudo_comment = '"#EC NUMBER_EVENTS' ##NO_TEXT. settings-documentation = |{ c_docs_path-checks }number-events.md|. - set_check_message( 'Number of events must be lower than &2! (&1>=&2)' ). - ENDMETHOD. - - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type = scan_struc_stmnt_type-class_definition - OR stmnt_type = scan_struc_stmnt_type-interface. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). - is_testcode = test_code_detector->is_testcode( ). + relevant_structure_types = VALUE #( ). - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + set_check_message( 'Number of events must be lower than &2! (&1>=&2)' ). + ENDMETHOD. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - event_counter = 0. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. + METHOD inspect_statements. + event_counter = 0. - inspect_tokens( statement = ). - ENDLOOP. + super->inspect_statements( structure ). - checkif_error( index = -stmnt_from - statement = statement_for_message ). - ENDLOOP. + check_result( structure ). ENDMETHOD. @@ -86,4 +48,24 @@ CLASS Y_CHECK_NUMBER_EVENTS IMPLEMENTATION. ADD 1 TO event_counter. ENDCASE. ENDMETHOD. + + + METHOD check_result. + DATA(statement) = ref_scan_manager->statements[ structure-stmnt_from ]. + + DATA(check_configuration) = detect_check_configuration( error_count = event_counter + statement = statement ). + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement-level + statement_index = structure-stmnt_from + statement_from = statement-from + error_priority = check_configuration-prio + parameter_01 = |{ event_counter }| + parameter_02 = |{ check_configuration-threshold }| ). + ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_number_interfaces.clas.abap b/src/checks/y_check_number_interfaces.clas.abap index 87c00659..adc4ea60 100644 --- a/src/checks/y_check_number_interfaces.clas.abap +++ b/src/checks/y_check_number_interfaces.clas.abap @@ -1,43 +1,21 @@ -CLASS y_check_number_interfaces DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_number_interfaces DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. - - METHODS constructor . + METHODS constructor. PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. DATA interface_counter TYPE i VALUE 0. - METHODS checkif_error - IMPORTING index TYPE i - statement TYPE sstmnt. -ENDCLASS. + METHODS check_result IMPORTING structure TYPE sstruc. +ENDCLASS. -CLASS Y_CHECK_NUMBER_INTERFACES IMPLEMENTATION. - - METHOD checkif_error. - DATA(check_configuration) = detect_check_configuration( error_count = interface_counter - statement = 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 = |{ interface_counter }| - parameter_02 = |{ check_configuration-threshold }| ). - ENDMETHOD. +CLASS y_check_number_interfaces IMPLEMENTATION. METHOD constructor. @@ -47,43 +25,47 @@ CLASS Y_CHECK_NUMBER_INTERFACES IMPLEMENTATION. settings-threshold = 4. settings-documentation = |{ c_docs_path-checks }number-interfaces.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). + + relevant_structure_types = VALUE #( ). + set_check_message( 'Number of interfaces must be lower than &2! (&1>=&2)' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition OR - stmnt_type EQ scan_struc_stmnt_type-interface. + METHOD inspect_statements. + interface_counter = 0. - is_testcode = test_code_detector->is_testcode( ). + super->inspect_statements( structure ). - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + check_result( structure ). + ENDMETHOD. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - interface_counter = 0. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. + METHOD inspect_tokens. + IF get_token_abs( statement-from ) = 'INTERFACES'. + ADD 1 TO interface_counter. + ENDIF. + ENDMETHOD. - inspect_tokens( statement = ). - ENDLOOP. - checkif_error( index = -stmnt_from - statement = statement_for_message ). - ENDLOOP. - ENDMETHOD. + METHOD check_result. + DATA(statement) = ref_scan_manager->statements[ structure-stmnt_from ]. + DATA(check_configuration) = detect_check_configuration( error_count = interface_counter + statement = statement ). + IF check_configuration IS INITIAL. + RETURN. + ENDIF. - METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) EQ 'INTERFACES'. - ADD 1 TO interface_counter. + raise_error( statement_level = statement-level + statement_index = structure-stmnt_from + statement_from = statement-from + error_priority = check_configuration-prio + parameter_01 = |{ interface_counter }| + parameter_02 = |{ check_configuration-threshold }| ). ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_number_methods.clas.abap b/src/checks/y_check_number_methods.clas.abap index dba2b44d..e8d8eca3 100644 --- a/src/checks/y_check_number_methods.clas.abap +++ b/src/checks/y_check_number_methods.clas.abap @@ -1,23 +1,17 @@ -CLASS y_check_number_methods DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_number_methods DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. + METHODS inspect_statements REDEFINITION. + METHODS inspect_tokens REDEFINITION. + - METHODS execute_check - REDEFINITION . - METHODS inspect_tokens - REDEFINITION . PRIVATE SECTION. DATA method_counter TYPE i VALUE 0. - METHODS checkif_error - IMPORTING index TYPE i - statement TYPE sstmnt. + METHODS check_result IMPORTING structure TYPE sstruc. + ENDCLASS. @@ -25,23 +19,6 @@ ENDCLASS. CLASS Y_CHECK_NUMBER_METHODS IMPLEMENTATION. - METHOD checkif_error. - DATA(check_configuration) = detect_check_configuration( error_count = method_counter - statement = 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 = |{ method_counter }| - parameter_02 = |{ check_configuration-threshold }| ). - - ENDMETHOD. - - METHOD constructor. super->constructor( ). @@ -49,38 +26,21 @@ CLASS Y_CHECK_NUMBER_METHODS IMPLEMENTATION. settings-threshold = 20. settings-documentation = |{ c_docs_path-checks }number-methods.md|. - set_check_message( 'Number of methods must be lower than &2! (&1>=&2)' ). - ENDMETHOD. - + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition OR - stmnt_type EQ scan_struc_stmnt_type-interface. + relevant_structure_types = VALUE #( ). - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + set_check_message( 'Number of methods must be lower than &2! (&1>=&2)' ). + ENDMETHOD. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(statement_for_message) - INDEX -stmnt_from. - method_counter = 0. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. + METHOD inspect_statements. + method_counter = 0. - inspect_tokens( statement = ). - ENDLOOP. + super->inspect_statements( structure ). - checkif_error( index = -stmnt_from - statement = statement_for_message ). - ENDLOOP. + check_result( structure ). ENDMETHOD. @@ -90,4 +50,25 @@ CLASS Y_CHECK_NUMBER_METHODS IMPLEMENTATION. ADD 1 TO method_counter. ENDCASE. ENDMETHOD. + + + METHOD check_result. + DATA(statement) = ref_scan_manager->statements[ structure-stmnt_from ]. + + DATA(check_configuration) = detect_check_configuration( error_count = method_counter + statement = statement ). + IF check_configuration IS INITIAL. + RETURN. + ENDIF. + + raise_error( statement_level = statement-level + statement_index = structure-stmnt_from + statement_from = statement-from + error_priority = check_configuration-prio + parameter_01 = |{ method_counter }| + parameter_02 = |{ check_configuration-threshold }| ). + + ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_omit_optional_exp.clas.abap b/src/checks/y_check_omit_optional_exp.clas.abap index 22c756e4..7de3ef41 100644 --- a/src/checks/y_check_omit_optional_exp.clas.abap +++ b/src/checks/y_check_omit_optional_exp.clas.abap @@ -1,8 +1,10 @@ -CLASS y_check_omit_optional_exp DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . +CLASS y_check_omit_optional_exp DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS has_optional_exporting IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. @@ -42,7 +44,7 @@ CLASS y_check_omit_optional_exp IMPLEMENTATION. ENDMETHOD. METHOD has_optional_exporting. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF -str = 'EXPORTING'. result = abap_true. diff --git a/src/checks/y_check_optional_parameters.clas.abap b/src/checks/y_check_optional_parameters.clas.abap index 9c4e3b19..6a8d352e 100644 --- a/src/checks/y_check_optional_parameters.clas.abap +++ b/src/checks/y_check_optional_parameters.clas.abap @@ -1,12 +1,14 @@ CLASS y_check_optional_parameters DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS has_optional_parameter IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -20,38 +22,14 @@ CLASS Y_CHECK_OPTIONAL_PARAMETERS IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }optional-parameters.md|. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) ). + relevant_structure_types = VALUE #( ). + set_check_message( 'Split methods instead of adding OPTIONAL parameters!' ). ENDMETHOD. - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type = scan_struc_stmnt_type-class_definition. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. - ENDMETHOD. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) = 'METHODS'. CHECK has_optional_parameter( statement ). @@ -65,11 +43,10 @@ CLASS Y_CHECK_OPTIONAL_PARAMETERS IMPLEMENTATION. statement_index = index statement_from = statement-from error_priority = configuration-prio ). - ENDMETHOD. METHOD has_optional_parameter. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() 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 979c44cf..34ce8b4f 100644 --- a/src/checks/y_check_prefer_case_to_elseif.clas.abap +++ b/src/checks/y_check_prefer_case_to_elseif.clas.abap @@ -3,25 +3,26 @@ CLASS y_check_prefer_case_to_elseif DEFINITION PUBLIC INHERITING FROM y_check_ba METHODS constructor. PROTECTED SECTION. - METHODS execute_check REDEFINITION. + METHODS inspect_structures REDEFINITION. + METHODS inspect_statements REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. - TYPES: BEGIN OF counter, + TYPES: BEGIN OF ty_counter, if_structure TYPE sstruc, if_statement TYPE sstmnt, condition TYPE string, count TYPE i, - END OF counter. - TYPES counters TYPE TABLE OF counter. + END OF ty_counter. + + TYPES ty_counters TYPE TABLE OF ty_counter. + + DATA counters TYPE ty_counters. METHODS has_multiple_conditions IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. - METHODS should_skip_test_code IMPORTING structure TYPE sstruc - RETURNING VALUE(result) TYPE abap_bool. - - METHODS handle_result IMPORTING counters TYPE counters. + METHODS check_result. ENDCLASS. @@ -37,57 +38,51 @@ CLASS y_check_prefer_case_to_elseif IMPLEMENTATION. settings-threshold = 5. settings-documentation = |{ c_docs_path-checks }prefer-case-to-elseif.md|. - set_check_message( 'Prefer CASE to ELSE IF for multiple alternative conditions!' ). - ENDMETHOD. - - - METHOD execute_check. - DATA counters TYPE counters. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-if ) + ( scan_struc_stmnt_type-elseif ) ). - DATA(structures) = ref_scan_manager->get_structures( ). - DATA(statements) = ref_scan_manager->get_statements( ). + relevant_structure_types = VALUE #( ). - LOOP AT structures ASSIGNING FIELD-SYMBOL() - WHERE type = scan_struc_type-condition - OR type = scan_struc_type-alternation. - - IF should_skip_test_code( ) = abap_true. - CONTINUE. - ENDIF. + set_check_message( 'Prefer CASE to ELSE IF for multiple alternative conditions!' ). + ENDMETHOD. - DATA(statement) = statements[ -stmnt_from ]. - IF has_multiple_conditions( statement ) = abap_true. - CONTINUE. - ENDIF. + METHOD inspect_structures. + CLEAR counters. - DATA(token) = get_token_abs( statement-from ). + super->inspect_structures( ). - DATA(if_structure) = COND #( WHEN token = 'IF' THEN - WHEN token = 'ELSEIF' THEN structures[ -back ] ). - - IF if_structure IS INITIAL. - CONTINUE. - ENDIF. + check_result( ). + ENDMETHOD. - DATA(condition) = get_token_abs( statement-from + 1 ). - TRY. - counters[ if_structure = if_structure - condition = condition ]-count = counters[ if_structure = if_structure - condition = condition ]-count + 1. - CATCH cx_sy_itab_line_not_found. - counters = VALUE #( BASE counters - ( if_structure = if_structure - if_statement = statements[ if_structure-stmnt_from ] - condition = condition - count = 1 ) ). - ENDTRY. + METHOD inspect_statements. + DATA(if_statement) = ref_scan_manager->statements[ structure-stmnt_from ]. - ENDLOOP. + IF has_multiple_conditions( if_statement ) = abap_true. + RETURN. + ENDIF. - handle_result( counters ). + DATA(if_structure) = COND #( WHEN structure-stmnt_type = scan_struc_stmnt_type-if THEN structure + WHEN structure-stmnt_type = scan_struc_stmnt_type-elseif THEN ref_scan_manager->structures[ structure-back ] ). + IF if_structure IS INITIAL. + RETURN. + ENDIF. + + DATA(condition) = get_token_abs( if_statement-from + 1 ). + + TRY. + counters[ if_structure = if_structure + condition = condition ]-count = counters[ if_structure = if_structure + condition = condition ]-count + 1. + CATCH cx_sy_itab_line_not_found. + counters = VALUE #( BASE counters + ( if_structure = if_structure + if_statement = if_statement + condition = condition + count = 1 ) ). + ENDTRY. ENDMETHOD. @@ -96,16 +91,8 @@ CLASS y_check_prefer_case_to_elseif IMPLEMENTATION. ENDMETHOD. - METHOD should_skip_test_code. - CHECK test_code_detector->is_testcode( structure ) = abap_true. - CHECK line_exists( check_configurations[ apply_on_testcode = abap_false ] ). - result = abap_true. - ENDMETHOD. - - - METHOD handle_result. + METHOD check_result. LOOP AT counters ASSIGNING FIELD-SYMBOL(). - DATA(configuration) = detect_check_configuration( error_count = -count statement = -if_statement ). @@ -113,15 +100,16 @@ CLASS y_check_prefer_case_to_elseif IMPLEMENTATION. CONTINUE. ENDIF. - raise_error( statement_level = -if_statement-level - statement_index = -if_structure-stmnt_from - statement_from = -if_statement-from - error_priority = configuration-prio ). + raise_error( statement_level = -if_statement-level + statement_index = -if_structure-stmnt_from + statement_from = -if_statement-from + error_priority = configuration-prio ). ENDLOOP. ENDMETHOD. + METHOD has_multiple_conditions. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to WHERE str = 'AND' OR str = 'OR'. result = abap_true. @@ -129,4 +117,5 @@ CLASS y_check_prefer_case_to_elseif IMPLEMENTATION. ENDLOOP. ENDMETHOD. + ENDCLASS. diff --git a/src/checks/y_check_prefer_is_not.clas.abap b/src/checks/y_check_prefer_is_not.clas.abap index 2e7e5de9..ea4b6bf9 100644 --- a/src/checks/y_check_prefer_is_not.clas.abap +++ b/src/checks/y_check_prefer_is_not.clas.abap @@ -1,10 +1,10 @@ CLASS y_check_prefer_is_not DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. - PRIVATE SECTION. + ENDCLASS. @@ -20,42 +20,15 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. settings-threshold = 0. settings-documentation = |{ c_docs_path-checks }prefer-is-not-to-not-is.md|. - set_check_message( 'Prefer IS NOT to NOT IS!' ). - ENDMETHOD. - + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-if ) ). + relevant_structure_types = VALUE #( ). - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type = scan_struc_stmnt_type-if. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'Prefer IS NOT to NOT IS!' ). ENDMETHOD. METHOD inspect_tokens. - - DATA(tokens) = ref_scan_manager->get_tokens( ). - - LOOP AT tokens ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to WHERE str = 'IF' OR str = 'ELSEIF' @@ -65,7 +38,7 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. DATA(position) = sy-tabix. TRY. - IF tokens[ position + 1 ]-str <> 'NOT'. + IF ref_scan_manager->tokens[ position + 1 ]-str <> 'NOT'. CONTINUE. ENDIF. CATCH cx_sy_itab_line_not_found. @@ -73,7 +46,7 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. ENDTRY. TRY. - IF tokens[ position + 2 ]-str = 'LINE_EXISTS('. + IF ref_scan_manager->tokens[ position + 2 ]-str = 'LINE_EXISTS('. CONTINUE. ENDIF. CATCH cx_sy_itab_line_not_found. @@ -92,7 +65,6 @@ CLASS y_check_prefer_is_not IMPLEMENTATION. error_priority = configuration-prio ). ENDLOOP. - ENDMETHOD. ENDCLASS. diff --git a/src/checks/y_check_procedure_coverage.clas.abap b/src/checks/y_check_procedure_coverage.clas.abap index 90688d12..60ed2e4a 100644 --- a/src/checks/y_check_procedure_coverage.clas.abap +++ b/src/checks/y_check_procedure_coverage.clas.abap @@ -1,9 +1,11 @@ CLASS y_check_procedure_coverage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + ENDCLASS. @@ -34,11 +36,14 @@ CLASS y_check_procedure_coverage IMPLEMENTATION. DATA(coverage) = y_unit_test_coverage=>get( program_name = program_name object = VALUE #( object = object_type obj_name = object_name ) coverage_type = ce_scv_coverage_type=>procedure ). + + DATA(procedure) = round( val = coverage->get_percentage( ) + dec = 2 ). CATCH cx_scv_execution_error. RETURN. ENDTRY. - DATA(check_configuration) = detect_check_configuration( error_count = CONV #( coverage ) + DATA(check_configuration) = detect_check_configuration( error_count = CONV #( procedure ) statement = VALUE #( level = 1 ) ). IF check_configuration IS INITIAL. @@ -49,8 +54,10 @@ CLASS y_check_procedure_coverage IMPLEMENTATION. statement_index = 1 statement_from = 1 error_priority = check_configuration-prio - parameter_01 = |{ coverage }| - parameter_02 = |{ check_configuration-threshold }| ). + parameter_01 = |{ procedure }| + parameter_02 = |{ check_configuration-threshold }| + parameter_03 = |{ coverage->get_total( ) }| + parameter_04 = |{ coverage->get_executed( ) }| ). ENDMETHOD. diff --git a/src/checks/y_check_profile_message.clas.abap b/src/checks/y_check_profile_message.clas.abap index 3927d7b0..313ac194 100644 --- a/src/checks/y_check_profile_message.clas.abap +++ b/src/checks/y_check_profile_message.clas.abap @@ -1,13 +1,12 @@ -CLASS y_check_profile_message DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . +CLASS y_check_profile_message DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. - METHODS constructor . + METHODS constructor. + PROTECTED SECTION. METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. METHODS inform REDEFINITION. + PRIVATE SECTION. CLASS-DATA ran TYPE abap_bool. METHODS get_profiles RETURNING VALUE(result) TYPE y_if_profile_manager=>profile_assignments. @@ -36,7 +35,6 @@ CLASS y_check_profile_message IMPLEMENTATION. METHOD execute_check. - CHECK ran = abap_false. CHECK has_attributes = abap_false. @@ -56,7 +54,6 @@ CLASS y_check_profile_message IMPLEMENTATION. parameter_02 = |{ list_profiles( profiles ) }| ). ran = abap_true. - ENDMETHOD. @@ -93,7 +90,6 @@ CLASS y_check_profile_message IMPLEMENTATION. CATCH ycx_entry_not_found. RETURN. ENDTRY. - ENDMETHOD. diff --git a/src/checks/y_check_pseudo_comment_usage.clas.abap b/src/checks/y_check_pseudo_comment_usage.clas.abap index f6247715..b645a7ea 100644 --- a/src/checks/y_check_pseudo_comment_usage.clas.abap +++ b/src/checks/y_check_pseudo_comment_usage.clas.abap @@ -1,41 +1,34 @@ -CLASS y_check_pseudo_comment_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_pseudo_comment_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. - CONSTANTS check_base_name TYPE tadir-obj_name VALUE 'Y_CHECK_BASE'. - DATA name_tab TYPE STANDARD TABLE OF tadir-obj_name. - - METHODS select_object_list - RETURNING VALUE(result) LIKE name_tab - RAISING cx_failed. - - METHODS call_get_pseudo_comment - IMPORTING obj_name TYPE stokesx-str - RETURNING VALUE(result) TYPE stokesx-str - RAISING cx_sy_create_object_error. - - METHODS execute_check REDEFINITION. + METHODS inspect_structures REDEFINITION. METHODS inspect_tokens REDEFINITION. PRIVATE SECTION. + CONSTANTS check_base_name TYPE tadir-obj_name VALUE 'Y_CHECK_BASE'. + + DATA name_tab TYPE STANDARD TABLE OF tadir-obj_name. DATA pseudo_comment_counter TYPE i VALUE 0 ##NO_TEXT. DATA class_names TYPE string_table. - METHODS count_cc_pseudo_comments - IMPORTING token TYPE stokesx - class_names TYPE string_table. + METHODS count_cc_pseudo_comments IMPORTING token TYPE stokesx. + + METHODS check_result. + + METHODS select_object_list RETURNING VALUE(result) LIKE name_tab + RAISING cx_failed. + + METHODS call_get_pseudo_comment IMPORTING obj_name TYPE stokesx-str + RETURNING VALUE(result) TYPE stokesx-str + RAISING cx_sy_create_object_error. - METHODS raise_error_wrapper. ENDCLASS. -CLASS Y_CHECK_PSEUDO_COMMENT_USAGE IMPLEMENTATION. +CLASS y_check_pseudo_comment_usage IMPLEMENTATION. METHOD call_get_pseudo_comment. @@ -61,7 +54,17 @@ CLASS Y_CHECK_PSEUDO_COMMENT_USAGE IMPLEMENTATION. settings-apply_on_productive_code = abap_true. settings-prio = c_note. + relevant_statement_types = VALUE #( BASE relevant_statement_types + ( scan_struc_stmnt_type-class_definition ) + ( scan_struc_stmnt_type-interface ) ). + set_check_message( '&1 pseudo comments!' ). + + TRY. + class_names = select_object_list( ). + CATCH cx_failed. + APPEND INITIAL LINE TO class_names. + ENDTRY. ENDMETHOD. @@ -78,43 +81,39 @@ CLASS Y_CHECK_PSEUDO_COMMENT_USAGE IMPLEMENTATION. ENDMETHOD. - METHOD execute_check. - TRY. - class_names = select_object_list( ). - CATCH cx_failed. - APPEND INITIAL LINE TO class_names. - ENDTRY. - + METHOD inspect_structures. pseudo_comment_counter = 0. - is_testcode = abap_false. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() - WHERE type EQ 'C' OR type EQ 'P'. - count_cc_pseudo_comments( token = class_names = class_names ). - ENDLOOP. + super->inspect_structures( ). - raise_error_wrapper( ). + check_result( ). ENDMETHOD. METHOD inspect_tokens. - RETURN. + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() + FROM statement-from TO statement-to + WHERE type EQ 'C' + OR type EQ 'P'. + count_cc_pseudo_comments( ). + ENDLOOP. ENDMETHOD. - METHOD raise_error_wrapper. - IF pseudo_comment_counter GT 0. - DATA(check_configuration) = detect_check_configuration( VALUE #( level = 1 ) ). "#EC DECL_IN_IF - IF check_configuration IS INITIAL. - RETURN. - ENDIF. + METHOD check_result. + CHECK pseudo_comment_counter > 0. + + DATA(check_configuration) = detect_check_configuration( VALUE #( level = 1 ) ). - raise_error( statement_level = 1 - statement_index = 1 - statement_from = 1 - error_priority = check_configuration-prio - parameter_01 = |{ pseudo_comment_counter }| ). + IF check_configuration IS INITIAL. + RETURN. ENDIF. + + raise_error( statement_level = 1 + statement_index = 1 + statement_from = 1 + error_priority = check_configuration-prio + parameter_01 = |{ pseudo_comment_counter }| ). ENDMETHOD. @@ -134,4 +133,6 @@ CLASS Y_CHECK_PSEUDO_COMMENT_USAGE IMPLEMENTATION. RAISE EXCEPTION TYPE cx_failed. ENDIF. ENDMETHOD. + + ENDCLASS. diff --git a/src/checks/y_check_receiving_usage.clas.abap b/src/checks/y_check_receiving_usage.clas.abap index 60f79568..2cde6c6c 100644 --- a/src/checks/y_check_receiving_usage.clas.abap +++ b/src/checks/y_check_receiving_usage.clas.abap @@ -1,15 +1,9 @@ -CLASS y_check_receiving_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_receiving_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. - - PRIVATE SECTION. ENDCLASS. @@ -30,15 +24,15 @@ CLASS Y_CHECK_RECEIVING_USAGE IMPLEMENTATION. METHOD inspect_tokens. - CHECK get_token_abs( statement-from ) CP '*(*' AND - get_token_abs( statement-from ) NE 'BADI'. + CHECK get_token_abs( statement-from ) CP '*(*'. + CHECK get_token_abs( statement-from ) NE 'BADI'. DATA(has_receiving) = abap_false. DATA(has_classic_exception) = abap_false. DATA(token_index) = 0. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + 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 @@ -58,7 +52,8 @@ CLASS Y_CHECK_RECEIVING_USAGE IMPLEMENTATION. RETURN. ENDIF. - IF has_receiving = abap_true AND has_classic_exception = abap_false. + IF has_receiving = abap_true + AND has_classic_exception = abap_false. raise_error( statement_level = statement-level statement_index = index statement_from = statement-from diff --git a/src/checks/y_check_returning_name.clas.abap b/src/checks/y_check_returning_name.clas.abap index 9538aae6..ed9089aa 100644 --- a/src/checks/y_check_returning_name.clas.abap +++ b/src/checks/y_check_returning_name.clas.abap @@ -1,12 +1,14 @@ -CLASS y_check_returning_name DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . +CLASS y_check_returning_name DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. - METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS has_returning_with_wrong_name IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. @@ -21,36 +23,15 @@ CLASS y_check_returning_name IMPLEMENTATION. settings-prio = c_warning. settings-documentation = |{ c_docs_path-checks }returning-name.md|. - set_check_message( 'Consider calling the RETURNING parameter RESULT!' ). - ENDMETHOD. - - METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type = scan_struc_stmnt_type-class_definition. - - is_testcode = test_code_detector->is_testcode( ). + version = '001'. - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-class_definition ) ). + relevant_structure_types = VALUE #( ). - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. - ENDLOOP. + set_check_message( 'Consider calling the RETURNING parameter RESULT!' ). ENDMETHOD. + METHOD inspect_tokens. CHECK get_token_abs( statement-from ) = 'METHODS'. @@ -69,10 +50,11 @@ CLASS y_check_returning_name IMPLEMENTATION. ENDMETHOD. + METHOD has_returning_with_wrong_name. DATA(skip) = abap_true. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF -str = 'RETURNING'. @@ -93,4 +75,5 @@ CLASS y_check_returning_name IMPLEMENTATION. ENDLOOP. ENDMETHOD. + ENDCLASS. diff --git a/src/checks/y_check_scope_of_variable.clas.abap b/src/checks/y_check_scope_of_variable.clas.abap index ae7dd0e4..b6b3a600 100644 --- a/src/checks/y_check_scope_of_variable.clas.abap +++ b/src/checks/y_check_scope_of_variable.clas.abap @@ -52,7 +52,7 @@ CLASS y_check_scope_of_variable IMPLEMENTATION. DATA(scope) = get_scope_structure( statement-struc ). DATA(statement_index) = index. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() FROM scope-stmnt_from TO scope-stmnt_to WHERE number > statement-number. @@ -62,7 +62,7 @@ CLASS y_check_scope_of_variable IMPLEMENTATION. CONTINUE. ENDIF. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM -from TO -to WHERE str = variable. @@ -83,8 +83,7 @@ CLASS y_check_scope_of_variable IMPLEMENTATION. METHOD is_isolated. - DATA(structures) = ref_scan_manager->get_structures( ). - DATA(structure) = structures[ strucutre_row ]. + DATA(structure) = ref_scan_manager->structures[ strucutre_row ]. result = xsdbool( structure-stmnt_type = scan_struc_stmnt_type-if OR structure-stmnt_type = scan_struc_stmnt_type-then @@ -107,8 +106,7 @@ CLASS y_check_scope_of_variable IMPLEMENTATION. METHOD get_scope_structure. - DATA(structures) = ref_scan_manager->get_structures( ). - DATA(structure) = structures[ strucutre_row ]. + DATA(structure) = ref_scan_manager->structures[ strucutre_row ]. DATA(is_root) = xsdbool( structure-stmnt_type = scan_struc_stmnt_type-form OR structure-stmnt_type = scan_struc_stmnt_type-method diff --git a/src/checks/y_check_self_reference.clas.abap b/src/checks/y_check_self_reference.clas.abap index ee7150ca..b546b3d0 100644 --- a/src/checks/y_check_self_reference.clas.abap +++ b/src/checks/y_check_self_reference.clas.abap @@ -1,17 +1,22 @@ CLASS y_check_self_reference DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. CONSTANTS method_call TYPE string VALUE 'A' ##NO_TEXT. + METHODS has_self_reference IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + ENDCLASS. CLASS y_check_self_reference IMPLEMENTATION. + METHOD constructor. super->constructor( ). @@ -23,6 +28,7 @@ CLASS y_check_self_reference IMPLEMENTATION. set_check_message( 'Omit the self-reference me when calling an instance method!' ). ENDMETHOD. + METHOD inspect_tokens. CHECK statement-type = method_call. @@ -41,8 +47,9 @@ CLASS y_check_self_reference IMPLEMENTATION. ENDMETHOD. + METHOD has_self_reference. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to WHERE str CP 'ME->*'. result = abap_true. @@ -50,4 +57,5 @@ CLASS y_check_self_reference IMPLEMENTATION. ENDLOOP. ENDMETHOD. + ENDCLASS. diff --git a/src/checks/y_check_statement_coverage.clas.abap b/src/checks/y_check_statement_coverage.clas.abap index ef536854..120e061e 100644 --- a/src/checks/y_check_statement_coverage.clas.abap +++ b/src/checks/y_check_statement_coverage.clas.abap @@ -1,9 +1,11 @@ CLASS y_check_statement_coverage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. METHODS constructor. + PROTECTED SECTION. METHODS execute_check REDEFINITION. METHODS inspect_tokens REDEFINITION. + ENDCLASS. @@ -34,11 +36,14 @@ CLASS y_check_statement_coverage IMPLEMENTATION. DATA(coverage) = y_unit_test_coverage=>get( program_name = program_name object = VALUE #( object = object_type obj_name = object_name ) coverage_type = ce_scv_coverage_type=>statement ). + + DATA(statement) = round( val = coverage->get_percentage( ) + dec = 2 ). CATCH cx_scv_execution_error. RETURN. ENDTRY. - DATA(check_configuration) = detect_check_configuration( error_count = CONV #( coverage ) + DATA(check_configuration) = detect_check_configuration( error_count = CONV #( statement ) statement = VALUE #( level = 1 ) ). IF check_configuration IS INITIAL. @@ -49,8 +54,10 @@ CLASS y_check_statement_coverage IMPLEMENTATION. statement_index = 1 statement_from = 1 error_priority = check_configuration-prio - parameter_01 = |{ coverage }| - parameter_02 = |{ check_configuration-threshold }| ). + parameter_01 = |{ statement }| + parameter_02 = |{ check_configuration-threshold }| + parameter_03 = |{ coverage->get_total( ) }| + parameter_04 = |{ coverage->get_executed( ) }| ). ENDMETHOD. diff --git a/src/checks/y_check_sub_assign_read_table.clas.abap b/src/checks/y_check_sub_assign_read_table.clas.abap index 8a56e743..a021b03f 100644 --- a/src/checks/y_check_sub_assign_read_table.clas.abap +++ b/src/checks/y_check_sub_assign_read_table.clas.abap @@ -1,16 +1,20 @@ CLASS y_check_sub_assign_read_table DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC . PUBLIC SECTION. - METHODS constructor . + METHODS constructor. + PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. + PRIVATE SECTION. METHODS is_read_table IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE abap_bool. + METHODS extract_fieldname IMPORTING statement TYPE sstmnt RETURNING VALUE(result) TYPE string. + METHODS has_subsequent_read IMPORTING statement TYPE sstmnt fieldname TYPE string - RETURNING VALUE(result) TYPE abap_bool. "#EC METH_RET_BOOL + RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -42,7 +46,7 @@ CLASS y_check_sub_assign_read_table IMPLEMENTATION. DATA(position) = index. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() FROM index TO structure-stmnt_to. IF is_read_table( ) = abap_false. @@ -81,7 +85,7 @@ CLASS y_check_sub_assign_read_table IMPLEMENTATION. METHOD extract_fieldname. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to WHERE str CP 'FIELD-SYMBOL(<*>)'. result = -str. @@ -93,7 +97,7 @@ CLASS y_check_sub_assign_read_table IMPLEMENTATION. METHOD has_subsequent_read. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. LOOP AT tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF -str <> 'INTO'. diff --git a/src/checks/y_check_test_seam_usage.clas.abap b/src/checks/y_check_test_seam_usage.clas.abap index cf341826..aef9e4b1 100644 --- a/src/checks/y_check_test_seam_usage.clas.abap +++ b/src/checks/y_check_test_seam_usage.clas.abap @@ -1,15 +1,10 @@ -CLASS y_check_test_seam_usage DEFINITION - PUBLIC - INHERITING FROM y_check_base - CREATE PUBLIC . - +CLASS y_check_test_seam_usage DEFINITION PUBLIC INHERITING FROM y_check_base CREATE PUBLIC. PUBLIC SECTION. + METHODS constructor. - METHODS constructor . PROTECTED SECTION. METHODS inspect_tokens REDEFINITION. - PRIVATE SECTION. ENDCLASS. diff --git a/src/examples/y_demo_failures.clas.abap b/src/examples/y_demo_failures.clas.abap index eaaa82ca..2c3d2447 100644 --- a/src/examples/y_demo_failures.clas.abap +++ b/src/examples/y_demo_failures.clas.abap @@ -50,73 +50,73 @@ CLASS y_demo_failures DEFINITION PUBLIC FINAL CREATE PUBLIC. EVENTS event_four. EVENTS event_five. -protected section. - - data ATTRIBUTE_2 type STRING . - data ATTRIBUTE_3 type STRING . - data ATTRIBUTE_4 type STRING . - data ATTRIBUTE_5 type STRING . - data ATTRIBUTE_6 type STRING . - - methods CALL_METHOD_USAGE . - methods CHAIN_DECLARATION_USAGE . - methods CHECK_STATEMENT_POSITION . - methods CHECK_IN_LOOP . - methods FUNCTION . - methods COMMENT_POSITION . - methods COMMENT_TYPE . - methods CX_ROOT_USAGE . - methods CYCLOMATIC_COMPLEXITY . - methods SUB_ASSIGN_READ_TABLE . - methods DEPRECATED_KEY_WORDS . - methods EMPTY_CATCHES . - methods EMPTY_IF_BRANCH . - methods EMPTY_PROCEDURE . - methods EQUALS_SIGN_CHAINING . - methods MAGIC_NUMBER . - methods METHOD_OUTPUT_PARAMETER - exporting - !ERROR type CHAR1 - returning - value(RESULT) type STRING_TABLE . "#EC NUM_OUTPUT_PARA - methods METHOD_RETURN_BOOL "#EC NUM_OUTPUT_PARA - returning - value(RESULT) type ABAP_BOOL . - methods MAX_NESTING_DEPTH . - methods NON_CLASS_BASED_EXCEPTION - exceptions - NO_CLASS_BASED . - methods NUMBER_EXECUTABLE_STATEMENTS . - methods NUMBER_OUTPUT_PARAMETERS - exporting - !OUTPUT_1 type STRING - !OUTPUT_2 type STRING . - methods PSEUDO_COMMENT_USAGE . - methods RECEIVING_USAGE . - methods EXTERNAL_CALL_IN_PROD_CODE_OK . - methods BOOLEAN_INPUT_PARAMETER - importing - !DO_SAVE type ABAP_BOOL . - methods OMIT_OPTIONAL_EXPORTING . - methods OPTIONAL_PARAMETERS - importing - !NAME type STRING optional . - methods RETURNING_NAME "#EC NUM_OUTPUT_PARA - returning - value(NAME) type STRING . - methods SELF_REFERENCE . - methods TEST_SEAM_USAGE . - methods MULTIPLE_PSEUDO_COMMENTS - importing - !NAME type STRING - !SURNAME type STRING optional - !ACTIVE type ABAP_BOOL optional - returning - 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 DEPRECATED_CLASSES . - methods SCOPE_OF_VARIABLE . + PROTECTED SECTION. + DATA attribute_2 TYPE string. + DATA attribute_3 TYPE string. + DATA attribute_4 TYPE string. + DATA attribute_5 TYPE string. + DATA attribute_6 TYPE string. + + METHODS call_method_usage. + METHODS chain_declaration_usage. + METHODS check_statement_position. + METHODS check_in_loop. + METHODS function. + METHODS comment_position. + METHODS comment_type. + METHODS cx_root_usage. + METHODS cyclomatic_complexity. + METHODS sub_assign_read_table. + METHODS deprecated_key_words. + METHODS empty_catches. + METHODS empty_if_branch. + METHODS empty_procedure. + METHODS equals_sign_chaining. + METHODS magic_number. + METHODS method_output_parameter + EXPORTING + !error TYPE char1 + RETURNING + VALUE(result) TYPE string_table. "#EC NUM_OUTPUT_PARA + METHODS method_return_bool "#EC NUM_OUTPUT_PARA + RETURNING + VALUE(result) TYPE abap_bool. + METHODS max_nesting_depth. + METHODS non_class_based_exception + EXCEPTIONS + no_class_based. + METHODS number_executable_statements. + METHODS number_output_parameters + EXPORTING + !output_1 TYPE string + !output_2 TYPE string. + METHODS pseudo_comment_usage. + METHODS receiving_usage. + METHODS external_call_in_prod_code_ok. + METHODS boolean_input_parameter + IMPORTING + !do_save TYPE abap_bool. + METHODS omit_optional_exporting. + METHODS optional_parameters + IMPORTING + !name TYPE string OPTIONAL. + METHODS returning_name "#EC NUM_OUTPUT_PARA + RETURNING + VALUE(name) TYPE string. + METHODS self_reference. + METHODS test_seam_usage. + METHODS multiple_pseudo_comments + IMPORTING + !name TYPE string + !surname TYPE string OPTIONAL + !active TYPE abap_bool OPTIONAL + RETURNING + 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 deprecated_classes. + METHODS scope_of_variable. + PRIVATE SECTION. DATA attribute_7 TYPE string. DATA attribute_8 TYPE string. @@ -124,6 +124,7 @@ protected section. DATA attribute_10 TYPE string. DATA attribute_11 TYPE string. DATA attribute_12 TYPE string. + ENDCLASS. @@ -177,7 +178,7 @@ CLASS Y_DEMO_FAILURES IMPLEMENTATION. METHOD cx_root_usage. TRY. RAISE EXCEPTION TYPE ycx_entry_not_found. - CATCH cx_root. "#EC EMPTY_CATCH + CATCH cx_root. "#EC EMPTY_CATCH ENDTRY. ENDMETHOD. @@ -385,17 +386,17 @@ CLASS Y_DEMO_FAILURES IMPLEMENTATION. METHOD prefer_case_to_elseif. DATA(value) = 0. - IF sy-mandt = 000. "#EC CI_MAGIC + IF sy-mandt = 000. "#EC CI_MAGIC value = 0. - ELSEIF sy-mandt = 100. "#EC CI_MAGIC + ELSEIF sy-mandt = 100. "#EC CI_MAGIC value = 1. - ELSEIF sy-mandt = 200. "#EC CI_MAGIC + ELSEIF sy-mandt = 200. "#EC CI_MAGIC value = 2. - ELSEIF sy-mandt = 300. "#EC CI_MAGIC + ELSEIF sy-mandt = 300. "#EC CI_MAGIC value = 3. - ELSEIF sy-mandt = 400. "#EC CI_MAGIC + ELSEIF sy-mandt = 400. "#EC CI_MAGIC value = 4. - ELSEIF sy-mandt = 500. "#EC CI_MAGIC + ELSEIF sy-mandt = 500. "#EC CI_MAGIC value = 5. ENDIF. ENDMETHOD. @@ -423,7 +424,7 @@ CLASS Y_DEMO_FAILURES IMPLEMENTATION. ENDMETHOD. "#EC EMPTY_PROCEDURE - METHOD scope_of_variable. + METHOD scope_of_variable. IF sy-subrc = 0. DATA(value) = 1. ELSE. @@ -453,5 +454,5 @@ CLASS Y_DEMO_FAILURES IMPLEMENTATION. " TEST-SEAM read_report_name. " DATA(report_name) = sy-repid. " END-TEST-SEAM. - ENDMETHOD. "#EC EMPTY_PROCEDURE + ENDMETHOD. "#EC EMPTY_PROCEDURE ENDCLASS. diff --git a/src/foundation/y_check_base.clas.abap b/src/foundation/y_check_base.clas.abap index 6bb2cb2d..6d747f4a 100644 --- a/src/foundation/y_check_base.clas.abap +++ b/src/foundation/y_check_base.clas.abap @@ -5,149 +5,159 @@ CLASS y_check_base DEFINITION PUBLIC ABSTRACT y_unit_test_coverage. PUBLIC SECTION. + CONSTANTS: BEGIN OF c_code, + error TYPE sci_errc VALUE '100', + warning TYPE sci_errc VALUE '101', + notification TYPE sci_errc VALUE '102', + END OF c_code. - CONSTANTS: - BEGIN OF c_code, - error TYPE sci_errc VALUE '100', - warning TYPE sci_errc VALUE '101', - notification TYPE sci_errc VALUE '102', - END OF c_code . CONSTANTS c_code_not_maintained TYPE sci_errc VALUE '106' ##NO_TEXT. - CONSTANTS: - BEGIN OF c_docs_path, - main TYPE string VALUE 'https://github.com/SAP/code-pal-for-abap/blob/master/docs/' ##NO_TEXT, - checks TYPE string VALUE 'https://github.com/SAP/code-pal-for-abap/blob/master/docs/checks/' ##NO_TEXT, - END OF c_docs_path . - DATA: - BEGIN OF settings READ-ONLY, - pseudo_comment TYPE sci_pcom, - disable_on_prodcode_selection TYPE abap_bool, - disable_on_testcode_selection TYPE abap_bool, - disable_threshold_selection TYPE abap_bool, - object_created_on TYPE creationdt, - threshold TYPE ycicc_threshold, - prio TYPE ycicc_message_kind, - apply_on_productive_code TYPE ycicc_productive_code, - apply_on_test_code TYPE ycicc_testcode, - documentation TYPE c LENGTH 1000, - is_threshold_reversed TYPE abap_bool, - END OF settings . - - METHODS constructor . - - METHODS get_attributes - REDEFINITION . - METHODS if_ci_test~display_documentation - REDEFINITION . - METHODS if_ci_test~query_attributes - REDEFINITION . - METHODS put_attributes - REDEFINITION . - METHODS run - REDEFINITION . - PROTECTED SECTION. + CONSTANTS: BEGIN OF c_docs_path, + main TYPE string VALUE 'https://github.com/SAP/code-pal-for-abap/blob/master/docs/' ##NO_TEXT, + checks TYPE string VALUE 'https://github.com/SAP/code-pal-for-abap/blob/master/docs/checks/' ##NO_TEXT, + END OF c_docs_path. + + DATA: BEGIN OF settings READ-ONLY, + pseudo_comment TYPE sci_pcom, + disable_on_prodcode_selection TYPE abap_bool, + disable_on_testcode_selection TYPE abap_bool, + disable_threshold_selection TYPE abap_bool, + object_created_on TYPE creationdt, + threshold TYPE ycicc_threshold, + prio TYPE ycicc_message_kind, + apply_on_productive_code TYPE ycicc_productive_code, + apply_on_test_code TYPE ycicc_testcode, + documentation TYPE c LENGTH 1000, + is_threshold_reversed TYPE abap_bool, + END OF settings. + + METHODS constructor. + + METHODS get_attributes REDEFINITION. + METHODS if_ci_test~display_documentation REDEFINITION. + METHODS if_ci_test~query_attributes REDEFINITION. + METHODS put_attributes REDEFINITION. + METHODS run REDEFINITION. + + PROTECTED SECTION. 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 . - DATA ref_scan_manager TYPE REF TO y_if_scan_manager . - DATA statistics TYPE REF TO y_if_scan_statistics . - DATA test_code_detector TYPE REF TO y_if_testcode_detector . + 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. + DATA ref_scan_manager TYPE REF TO y_if_scan_manager. + DATA statistics TYPE REF TO y_if_scan_statistics. + DATA test_code_detector TYPE REF TO y_if_testcode_detector. DATA use_default_attributes TYPE abap_bool VALUE abap_true ##NO_TEXT. - DATA attributes_maintained TYPE abap_bool . - - METHODS check_start_conditions - RAISING - ycx_object_not_processed - ycx_object_is_exempted . - "! Method to validate the check customizing - "! @parameter statement | Received in the inspect_tokens method. - "! @parameter error_count | Number of issues found to compare against the threshold. + DATA attributes_maintained TYPE abap_bool. + + "!

Relevant Statement Types for Inspection

+ "! There are default values set in the Y_CHECK_BASE, and you can reuse the constants available in the 'scan_struc_stmnt_type' structure to enhance or change it. + DATA relevant_statement_types TYPE TABLE OF sstruc-stmnt_type. + + "!

Relevant Structure Types for Inspection

+ "! There are default values set in the Y_CHECK_BASE, and you can reuse the constants available in the 'scan_struc_type' structure to enhance or change it. + DATA relevant_structure_types TYPE TABLE OF sstruc-type. + + METHODS execute_check. + + METHODS check_start_conditions RAISING ycx_object_not_processed + ycx_object_is_exempted. + + "!

Validates the Customizing

+ "! @parameter statement | Received from inspect_tokens method. + "! @parameter error_count | Number of findings found to compare against the threshold. "! @parameter result | Configuration structure if the check must be raised - METHODS detect_check_configuration - IMPORTING - statement TYPE sstmnt - error_count TYPE int4 DEFAULT 1 - RETURNING - VALUE(result) TYPE y_if_clean_code_manager=>check_configuration. - METHODS execute_check . - METHODS get_code - IMPORTING - !message_prio TYPE sychar01 - RETURNING - VALUE(result) TYPE sci_errc . - METHODS inspect_tokens - ABSTRACT - IMPORTING - !structure TYPE sstruc OPTIONAL - !index TYPE i OPTIONAL - !statement TYPE sstmnt OPTIONAL . "#EC OPTL_PARAM - METHODS raise_error - IMPORTING - !object_type TYPE trobjtype DEFAULT c_type_include - !statement_level TYPE stmnt_levl - !statement_index TYPE int4 - !statement_from TYPE int4 - !error_counter TYPE sci_errcnt OPTIONAL - !error_priority TYPE sychar01 - !parameter_01 TYPE csequence OPTIONAL - !parameter_02 TYPE csequence OPTIONAL - !parameter_03 TYPE csequence OPTIONAL - !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 - - METHODS get_column_abs - REDEFINITION . - METHODS get_column_rel - REDEFINITION . - METHODS get_include - REDEFINITION . - METHODS get_line_abs - REDEFINITION . - METHODS get_line_column_abs - REDEFINITION . - METHODS get_line_column_rel - REDEFINITION . - METHODS get_line_rel - REDEFINITION . - METHODS get_token_abs - REDEFINITION . - METHODS get_token_rel - REDEFINITION . - METHODS keyword - REDEFINITION . - METHODS set_check_message - IMPORTING message TYPE itex132. - METHODS get_class_description - RETURNING VALUE(result) TYPE string. + METHODS detect_check_configuration IMPORTING statement TYPE sstmnt + error_count TYPE int4 DEFAULT 1 + RETURNING VALUE(result) TYPE y_if_clean_code_manager=>check_configuration. + + METHODS get_code IMPORTING message_prio TYPE sychar01 + RETURNING VALUE(result) TYPE sci_errc. + + "!

Inspect Structures

+ METHODS inspect_structures. + + "!

Inspect Statements of a Structure

+ "! @parameter structure | Leading Structure + METHODS inspect_statements IMPORTING structure TYPE sstruc. + + "!

Inspect Tokens of a Statement

+ "! @parameter structure | Leading Structure + "! @parameter index | Leading Index + "! @parameter statement | Leading Statement + METHODS inspect_tokens ABSTRACT IMPORTING structure TYPE sstruc + index TYPE i + statement TYPE sstmnt. + + METHODS raise_error IMPORTING object_type TYPE trobjtype DEFAULT c_type_include + statement_level TYPE stmnt_levl + statement_index TYPE int4 + statement_from TYPE int4 + error_counter TYPE sci_errcnt OPTIONAL + error_priority TYPE sychar01 + parameter_01 TYPE csequence OPTIONAL + parameter_02 TYPE csequence OPTIONAL + parameter_03 TYPE csequence OPTIONAL + 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 + + METHODS get_column_abs REDEFINITION. + METHODS get_column_rel REDEFINITION. + METHODS get_include REDEFINITION. + METHODS get_line_abs REDEFINITION. + METHODS get_line_column_abs REDEFINITION. + METHODS get_line_column_rel REDEFINITION. + METHODS get_line_rel REDEFINITION. + METHODS get_token_abs REDEFINITION. + METHODS get_token_rel REDEFINITION. + METHODS keyword REDEFINITION. + METHODS set_check_message IMPORTING message TYPE itex132. + METHODS get_class_description RETURNING VALUE(result) TYPE string. + METHODS is_in_scope IMPORTING statement TYPE sstmnt + RETURNING VALUE(result) TYPE abap_bool. + PRIVATE SECTION. - METHODS do_attributes_exist - RETURNING - VALUE(result) TYPE abap_bool . + METHODS do_attributes_exist RETURNING VALUE(result) TYPE abap_bool. + METHODS instantiate_objects. METHODS enable_rfc. - METHODS is_skipped - IMPORTING config TYPE y_if_clean_code_manager=>check_configuration - error_count TYPE int4 - RETURNING VALUE(result) TYPE abap_bool. + METHODS is_skipped IMPORTING config TYPE y_if_clean_code_manager=>check_configuration + error_count TYPE int4 + RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_treshold_config_valid IMPORTING previous_threshold TYPE int4 + config_threshold TYPE int4 + RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_config_setup_valid IMPORTING previous_config TYPE y_if_clean_code_manager=>check_configuration + config TYPE y_if_clean_code_manager=>check_configuration + RETURNING VALUE(result) TYPE abap_bool. + + METHODS should_skip_test_code IMPORTING structure TYPE sstruc + RETURNING VALUE(result) TYPE abap_bool. + + METHODS should_skip_type IMPORTING structure TYPE sstruc + RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_statement_type_relevant IMPORTING structure TYPE sstruc + RETURNING VALUE(result) TYPE abap_bool. + + METHODS is_structure_type_relevant IMPORTING structure TYPE sstruc + RETURNING VALUE(result) TYPE abap_bool. + + - METHODS is_treshold_config_valid - IMPORTING previous_threshold TYPE int4 - config_threshold TYPE int4 - RETURNING VALUE(result) TYPE abap_bool. + METHODS get_application_component IMPORTING level TYPE slevel + RETURNING VALUE(result) TYPE df14l-ps_posid. - METHODS is_config_setup_valid - IMPORTING previous_config TYPE y_if_clean_code_manager=>check_configuration - config TYPE y_if_clean_code_manager=>check_configuration - RETURNING VALUE(result) TYPE abap_bool. ENDCLASS. @@ -185,6 +195,13 @@ CLASS y_check_base IMPLEMENTATION. has_attributes = do_attributes_exist( ). + relevant_statement_types = VALUE #( ( scan_struc_stmnt_type-form ) + ( scan_struc_stmnt_type-method ) + ( scan_struc_stmnt_type-function ) + ( scan_struc_stmnt_type-module ) ). + + relevant_structure_types = VALUE #( ( scan_struc_type-event ) ). + INSERT VALUE #( test = myname code = c_code_not_maintained kind = cl_ci_test_root=>c_note @@ -193,6 +210,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD detect_check_configuration. + DATA(include) = get_include( p_level = statement-level ). DATA(creation_date) = NEW y_object_creation_date( )->y_if_object_creation_date~get_program_create_date( include ). @@ -225,33 +243,37 @@ CLASS y_check_base IMPLEMENTATION. METHOD execute_check. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() - WHERE stmnt_type EQ scan_struc_stmnt_type-form - OR stmnt_type EQ scan_struc_stmnt_type-method - OR stmnt_type EQ scan_struc_stmnt_type-function - OR stmnt_type EQ scan_struc_stmnt_type-module - OR type EQ scan_struc_type-event. - - is_testcode = test_code_detector->is_testcode( ). - - TRY. - DATA(check_configuration) = check_configurations[ apply_on_testcode = abap_true ]. - CATCH cx_sy_itab_line_not_found. - IF is_testcode EQ abap_true. - CONTINUE. - ENDIF. - ENDTRY. - - DATA(index) = -stmnt_from. - - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() - FROM -stmnt_from TO -stmnt_to. - - inspect_tokens( index = index - structure = - statement = ). - index = index + 1. - ENDLOOP. + inspect_structures( ). + ENDMETHOD. + + + METHOD inspect_structures. + LOOP AT ref_scan_manager->structures ASSIGNING FIELD-SYMBOL(). + IF should_skip_test_code( ) = abap_true + OR should_skip_type( ) = abap_true. + CONTINUE. + ENDIF. + + inspect_statements( ). + ENDLOOP. + ENDMETHOD. + + + METHOD inspect_statements. + DATA(index) = structure-stmnt_from. + + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() + FROM structure-stmnt_from + TO structure-stmnt_to. + IF is_in_scope( ) = abap_false. + CONTINUE. + ENDIF. + + inspect_tokens( index = index + structure = structure + statement = ). + + index = index + 1. ENDLOOP. ENDMETHOD. @@ -293,7 +315,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_column_abs. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -313,7 +335,7 @@ CLASS y_check_base IMPLEMENTATION. DATA(index) = statement_wa-from + p_n - 1. CHECK index <= statement_wa-to. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -339,7 +361,7 @@ CLASS y_check_base IMPLEMENTATION. l_level = statement_wa-level. ENDIF. DO. - READ TABLE ref_scan_manager->get_levels( ) INDEX l_level INTO l_levels_wa. + READ TABLE ref_scan_manager->levels INDEX l_level INTO l_levels_wa. IF sy-subrc NE 0. RETURN. ENDIF. @@ -353,7 +375,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_line_abs. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -370,7 +392,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_line_column_abs. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -388,7 +410,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_line_column_rel. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -411,7 +433,7 @@ CLASS y_check_base IMPLEMENTATION. DATA(index) = statement_wa-from + p_n - 1. CHECK index <= statement_wa-to. - DATA(tokens) = ref_scan_manager->get_tokens( ). + DATA(tokens) = ref_scan_manager->tokens. IF lines( tokens ) = 0. RETURN. ENDIF. @@ -428,7 +450,7 @@ CLASS y_check_base IMPLEMENTATION. METHOD get_token_abs. - READ TABLE ref_scan_manager->get_tokens( ) INDEX p_n INTO token_wa. + READ TABLE ref_scan_manager->tokens INDEX p_n INTO token_wa. IF sy-subrc EQ 0. p_result = token_wa-str. ENDIF. @@ -442,7 +464,7 @@ CLASS y_check_base IMPLEMENTATION. IF l_index > statement_wa-to. RETURN. ENDIF. - READ TABLE ref_scan_manager->get_tokens( ) INDEX l_index INTO token_wa. + READ TABLE ref_scan_manager->tokens INDEX l_index INTO token_wa. p_result = token_wa-str. ENDMETHOD. @@ -589,7 +611,7 @@ CLASS y_check_base IMPLEMENTATION. p_result = 'COMPUTE'. RETURN. ENDIF. - READ TABLE ref_scan_manager->get_tokens( ) INDEX statement_wa-from INTO token_wa. + READ TABLE ref_scan_manager->tokens INDEX statement_wa-from INTO token_wa. p_result = token_wa-str. ENDMETHOD. @@ -739,4 +761,61 @@ CLASS y_check_base IMPLEMENTATION. result = xsdbool( ( previous_threshold >= config_threshold AND settings-is_threshold_reversed = abap_false ) OR ( previous_threshold < config_threshold AND settings-is_threshold_reversed = abap_true ) ). ENDMETHOD. + + + METHOD should_skip_test_code. + " From Code Inspector (required) + is_testcode = test_code_detector->is_testcode( structure ). + + DATA(has_customizing_for_prod_only) = xsdbool( NOT line_exists( check_configurations[ apply_on_testcode = abap_true ] ) ). + + result = xsdbool( has_customizing_for_prod_only = abap_true + AND is_testcode = abap_true ). + ENDMETHOD. + + + METHOD should_skip_type. + result = xsdbool( is_statement_type_relevant( structure ) = abap_false + AND is_structure_type_relevant( structure ) = abap_false ). + ENDMETHOD. + + + METHOD is_statement_type_relevant. + result = xsdbool( line_exists( relevant_statement_types[ table_line = structure-stmnt_type ] ) ). + ENDMETHOD. + + + METHOD is_structure_type_relevant. + result = xsdbool( line_exists( relevant_structure_types[ table_line = structure-type ] ) ). + ENDMETHOD. + + + METHOD is_in_scope. + TRY. + DATA(main_level) = ref_scan_manager->levels[ level = 0 ]. + DATA(main_application_component) = get_application_component( main_level ). + CATCH cx_sy_itab_line_not_found. + RETURN. + ENDTRY. + + TRY. + DATA(current_level) = ref_scan_manager->levels[ statement-level ]. + DATA(current_application_component) = get_application_component( current_level ). + CATCH cx_sy_itab_line_not_found. + RETURN. + ENDTRY. + + result = xsdbool( current_application_component = main_application_component ). + ENDMETHOD. + + + METHOD get_application_component. + TRY. + result = y_code_pal_app_comp=>get( level-name ). + CATCH ycx_entry_not_found. + RETURN. + ENDTRY. + ENDMETHOD. + + ENDCLASS. diff --git a/src/foundation/y_check_base.clas.locals_imp.abap b/src/foundation/y_check_base.clas.locals_imp.abap new file mode 100644 index 00000000..054e5483 --- /dev/null +++ b/src/foundation/y_check_base.clas.locals_imp.abap @@ -0,0 +1,46 @@ +*"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations +CLASS ltd_ref_scan_manager DEFINITION INHERITING FROM y_ref_scan_manager_double. + PUBLIC SECTION. + METHODS constructor. + +ENDCLASS. + + +CLASS ltd_ref_scan_manager IMPLEMENTATION. + + METHOD constructor. + super->constructor( ). + inject_code( VALUE #( ( 'REPORT y_example. ' ) ) ). + ENDMETHOD. + +ENDCLASS. + + + +CLASS ltd_check_base DEFINITION INHERITING FROM y_check_base. + PUBLIC SECTION. + METHODS constructor. + + PROTECTED SECTION. + METHODS inspect_tokens REDEFINITION. + +ENDCLASS. + + +CLASS ltd_check_base IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + ref_scan_manager = NEW ltd_ref_scan_manager( ). + ENDMETHOD. + + + METHOD inspect_tokens. + RETURN. + ENDMETHOD. + + +ENDCLASS. diff --git a/src/foundation/y_check_base.clas.testclasses.abap b/src/foundation/y_check_base.clas.testclasses.abap index 9aca2e2d..25d03785 100644 --- a/src/foundation/y_check_base.clas.testclasses.abap +++ b/src/foundation/y_check_base.clas.testclasses.abap @@ -1,41 +1,3 @@ -CLASS ltd_ref_scan_manager DEFINITION INHERITING FROM y_ref_scan_manager_double FOR TESTING. "#EC INTF_IN_CLASS - PUBLIC SECTION. - METHODS constructor. -ENDCLASS. - -CLASS ltd_ref_scan_manager IMPLEMENTATION. - - METHOD constructor. - super->constructor( ). - - inject_code( VALUE #( - ( 'REPORT y_example. ' ) - ( ' "Something ' ) - ) ). - ENDMETHOD. - -ENDCLASS. - -CLASS ltc_check_base_double DEFINITION FOR TESTING INHERITING FROM y_check_base. - PUBLIC SECTION. - METHODS constructor. - PROTECTED SECTION. - METHODS inspect_tokens REDEFINITION. -ENDCLASS. - -CLASS ltc_check_base_double IMPLEMENTATION. - - METHOD constructor. - super->constructor( ). - ref_scan_manager = NEW ltd_ref_scan_manager( ). - ENDMETHOD. - - METHOD inspect_tokens. - RETURN. - ENDMETHOD. - -ENDCLASS. - CLASS ltc_check_configuration_base DEFINITION ABSTRACT FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PROTECTED SECTION. DATA cut TYPE REF TO y_check_base. @@ -131,7 +93,7 @@ ENDCLASS. CLASS ltc_check_configuration_bound IMPLEMENTATION. METHOD setup. - cut = NEW ltc_check_base_double( ). + cut = NEW ltd_check_base( ). ENDMETHOD. METHOD is_bound. @@ -151,7 +113,7 @@ ENDCLASS. CLASS ltc_check_configuration_error IMPLEMENTATION. METHOD setup. - cut = NEW ltc_check_base_double( ). + cut = NEW ltd_check_base( ). ENDMETHOD. METHOD error_vs_error. @@ -288,6 +250,7 @@ CLASS ltc_check_configuration_error IMPLEMENTATION. ENDCLASS. + CLASS ltc_check_configuration_warn DEFINITION FOR TESTING INHERITING FROM ltc_check_configuration_base RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. METHODS setup. @@ -296,10 +259,11 @@ CLASS ltc_check_configuration_warn DEFINITION FOR TESTING INHERITING FROM ltc_ch METHODS warning_vs_note FOR TESTING. ENDCLASS. + CLASS ltc_check_configuration_warn IMPLEMENTATION. METHOD setup. - cut = NEW ltc_check_base_double( ). + cut = NEW ltd_check_base( ). ENDMETHOD. METHOD warning_vs_error. @@ -436,6 +400,7 @@ CLASS ltc_check_configuration_warn IMPLEMENTATION. ENDCLASS. + CLASS ltc_check_configuration_note DEFINITION FOR TESTING INHERITING FROM ltc_check_configuration_base RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. METHODS setup. @@ -444,10 +409,11 @@ CLASS ltc_check_configuration_note DEFINITION FOR TESTING INHERITING FROM ltc_ch METHODS note_vs_note FOR TESTING. ENDCLASS. + CLASS ltc_check_configuration_note IMPLEMENTATION. METHOD setup. - cut = NEW ltc_check_base_double( ). + cut = NEW ltd_check_base( ). ENDMETHOD. METHOD note_vs_error. diff --git a/src/foundation/y_check_base.clas.xml b/src/foundation/y_check_base.clas.xml index 12f88a5d..8a225f47 100644 --- a/src/foundation/y_check_base.clas.xml +++ b/src/foundation/y_check_base.clas.xml @@ -63,6 +63,42 @@ + + Y_CHECK_BASE + DETECT_CHECK_CONFIGURATION + E + Validates the Customizing + + + Y_CHECK_BASE + INSPECT_STATEMENTS + E + Inspect Statements of a Structure + + + Y_CHECK_BASE + INSPECT_STRUCTURES + E + Inspect Structures + + + Y_CHECK_BASE + INSPECT_TOKENS + E + Inspect Tokens of a Statement + + + Y_CHECK_BASE + RELEVANT_STATEMENT_TYPES + E + Relevant Statement Types for Inspection + + + Y_CHECK_BASE + RELEVANT_STRUCTURE_TYPES + E + Relevant Structure Types for Inspection + Y_CHECK_BASE SETTINGS diff --git a/src/foundation/y_ci_check_registration.prog.abap b/src/foundation/y_ci_check_registration.prog.abap index 060ef6d9..b097c24e 100644 --- a/src/foundation/y_ci_check_registration.prog.abap +++ b/src/foundation/y_ci_check_registration.prog.abap @@ -24,9 +24,9 @@ CONSTANTS: BEGIN OF reference, error TYPE c LENGTH 1 VALUE 'E', END OF reference. -CLASS lcl_check_registration DEFINITION. "#EC NUM_PUBLIC_ATTR +CLASS lcl_check_registration DEFINITION. PUBLIC SECTION. - CLASS-DATA name_tab TYPE STANDARD TABLE OF scitests-name. + CLASS-DATA name_tab TYPE STANDARD TABLE OF scitests-name READ-ONLY. CLASS-METHODS select_object_list RETURNING VALUE(result) LIKE name_tab diff --git a/src/foundation/y_code_pal_app_comp.clas.abap b/src/foundation/y_code_pal_app_comp.clas.abap new file mode 100644 index 00000000..69f9b7c6 --- /dev/null +++ b/src/foundation/y_code_pal_app_comp.clas.abap @@ -0,0 +1,66 @@ +CLASS y_code_pal_app_comp DEFINITION SHARED MEMORY ENABLED PUBLIC CREATE PUBLIC. + PUBLIC SECTION. + + TYPES: BEGIN OF entry, + program TYPE tadir-obj_name, + application_component TYPE df14l-ps_posid, + END OF entry. + + TYPES entries TYPE TABLE OF entry. + + CLASS-METHODS get IMPORTING program TYPE entry-program + RETURNING VALUE(result) TYPE entry-application_component + RAISING ycx_entry_not_found. + + PRIVATE SECTION. + CLASS-DATA buffer TYPE entries. + + CLASS-METHODS get_entry IMPORTING program TYPE entry-program + RETURNING VALUE(result) TYPE entry + RAISING ycx_entry_not_found. + + CLASS-METHODS new_entry IMPORTING program TYPE entry-program + RETURNING VALUE(result) TYPE entry + RAISING ycx_entry_not_found. + +ENDCLASS. + + + +CLASS y_code_pal_app_comp IMPLEMENTATION. + + + METHOD get. + DATA(entry) = get_entry( program ). + result = entry-application_component. + ENDMETHOD. + + + METHOD get_entry. + TRY. + result = buffer[ program = program ]. + CATCH cx_sy_itab_line_not_found. + result = new_entry( program ). + ENDTRY. + ENDMETHOD. + + + METHOD new_entry. + SELECT SINGLE ta~obj_name, df~ps_posid + FROM tadir AS ta + LEFT JOIN tdevc AS td ON ta~devclass = td~devclass + LEFT JOIN df14l AS df ON td~component = df~fctr_id + INTO @result + WHERE ta~pgmid = 'R3TR' + AND ta~object = 'PROG' + AND ta~obj_name = @program. + + IF sy-subrc <> 0. + RAISE EXCEPTION TYPE ycx_entry_not_found. + ENDIF. + + APPEND result TO buffer. + ENDMETHOD. + + +ENDCLASS. diff --git a/src/foundation/y_code_pal_app_comp.clas.xml b/src/foundation/y_code_pal_app_comp.clas.xml new file mode 100644 index 00000000..cc78c3f9 --- /dev/null +++ b/src/foundation/y_code_pal_app_comp.clas.xml @@ -0,0 +1,17 @@ + + + + + + Y_CODE_PAL_APP_COMP + E + Application Component + 1 + X + X + X + X + + + + diff --git a/src/foundation/y_code_pal_service.clas.abap b/src/foundation/y_code_pal_service.clas.abap index 743bc0f0..caab0bae 100644 --- a/src/foundation/y_code_pal_service.clas.abap +++ b/src/foundation/y_code_pal_service.clas.abap @@ -153,6 +153,14 @@ CLASS y_code_pal_service IMPLEMENTATION. RETURN. ENDIF. + TRY. + y_profile_manager=>create( )->delete_profiles( ). + CATCH ycx_failed_to_remove_a_line. + raise_internal_server_error( ). + response->set_cdata( 'Profiles were not disabled' ). + RETURN. + ENDTRY. + DATA(atc) = NEW cl_satc_api_factory( ). TRY. diff --git a/src/foundation/y_if_scan_manager.intf.abap b/src/foundation/y_if_scan_manager.intf.abap index bd5cb892..37f66af5 100644 --- a/src/foundation/y_if_scan_manager.intf.abap +++ b/src/foundation/y_if_scan_manager.intf.abap @@ -1,8 +1,12 @@ -INTERFACE y_if_scan_manager PUBLIC . - METHODS get_levels RETURNING VALUE(result) TYPE slevel_tab . - METHODS get_statements RETURNING VALUE(result) TYPE sstmnt_tab . - METHODS get_structures RETURNING VALUE(result) TYPE sstruc_tab . - METHODS get_tokens RETURNING VALUE(result) TYPE stokesx_tab . - METHODS is_scan_ok RETURNING VALUE(result) TYPE abap_bool . - METHODS set_ref_scan IMPORTING !io_ref_scan TYPE REF TO cl_ci_scan . +INTERFACE y_if_scan_manager PUBLIC. + + DATA levels TYPE slevel_tab READ-ONLY. + DATA structures TYPE sstruc_tab READ-ONLY. + DATA statements TYPE sstmnt_tab READ-ONLY. + DATA tokens TYPE stokesx_tab READ-ONLY. + + METHODS is_scan_ok RETURNING VALUE(result) TYPE abap_bool. + + METHODS set_ref_scan IMPORTING io_ref_scan TYPE REF TO cl_ci_scan. + ENDINTERFACE. diff --git a/src/foundation/y_pseudo_comment_detector.clas.abap b/src/foundation/y_pseudo_comment_detector.clas.abap index 416e6306..31ad1b55 100644 --- a/src/foundation/y_pseudo_comment_detector.clas.abap +++ b/src/foundation/y_pseudo_comment_detector.clas.abap @@ -62,12 +62,12 @@ CLASS y_pseudo_comment_detector IMPLEMENTATION. DATA(l_position) = position + 1. DO. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(l_statement_wa) INDEX l_position. + READ TABLE ref_scan_manager->statements INTO DATA(l_statement_wa) INDEX l_position. IF sy-subrc <> 0 OR l_statement_wa-type <> 'P'. EXIT. ENDIF. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM l_statement_wa-from TO l_statement_wa-to. IF -str CS y_if_pseudo_comment_detector=>ec_comment AND ( @@ -92,13 +92,13 @@ CLASS y_pseudo_comment_detector IMPLEMENTATION. DATA(l_position) = position - 1. DO. - READ TABLE ref_scan_manager->get_statements( ) INTO DATA(l_statement_wa) INDEX l_position. + READ TABLE ref_scan_manager->statements INTO DATA(l_statement_wa) INDEX l_position. IF sy-subrc <> 0 OR ( l_statement_wa-type <> 'S' AND l_statement_wa-type <> 'G' ). EXIT. ENDIF. IF l_statement_wa-type = 'S'. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM l_statement_wa-from TO l_statement_wa-to. IF -str CS y_if_pseudo_comment_detector=>ec_comment AND ( diff --git a/src/foundation/y_ref_scan_manager.clas.abap b/src/foundation/y_ref_scan_manager.clas.abap index 0b748f64..ac14c192 100644 --- a/src/foundation/y_ref_scan_manager.clas.abap +++ b/src/foundation/y_ref_scan_manager.clas.abap @@ -1,51 +1,30 @@ CLASS y_ref_scan_manager DEFINITION PUBLIC CREATE PUBLIC. PUBLIC SECTION. INTERFACES y_if_scan_manager. - CONSTANTS ok TYPE syst_subrc VALUE 0. - ALIASES get_levels FOR y_if_scan_manager~get_levels. - ALIASES get_statements FOR y_if_scan_manager~get_statements. - ALIASES get_structures FOR y_if_scan_manager~get_structures. - ALIASES get_tokens FOR y_if_scan_manager~get_tokens. - ALIASES is_scan_ok FOR y_if_scan_manager~is_scan_ok. - ALIASES set_ref_scan FOR y_if_scan_manager~set_ref_scan. - PROTECTED SECTION. + PRIVATE SECTION. DATA ref_scan TYPE REF TO cl_ci_scan. + ENDCLASS. CLASS y_ref_scan_manager IMPLEMENTATION. - METHOD get_levels. - CHECK ref_scan IS NOT INITIAL. - result = ref_scan->levels. - ENDMETHOD. - - METHOD get_statements. - CHECK ref_scan IS NOT INITIAL. - result = ref_scan->statements. - ENDMETHOD. - METHOD get_structures. + METHOD y_if_scan_manager~is_scan_ok. + CONSTANTS ok TYPE syst_subrc VALUE 0. CHECK ref_scan IS NOT INITIAL. - result = ref_scan->structures. + result = xsdbool( ref_scan->subrc = ok ). ENDMETHOD. - METHOD get_tokens. - CHECK ref_scan IS NOT INITIAL. - result = ref_scan->tokens. - ENDMETHOD. - METHOD is_scan_ok. - CHECK ref_scan IS NOT INITIAL. + METHOD y_if_scan_manager~set_ref_scan. + ref_scan = io_ref_scan. - result = abap_true. - IF ref_scan->subrc <> ok. - result = abap_false. - ENDIF. + y_if_scan_manager~levels = ref_scan->levels. + y_if_scan_manager~structures = ref_scan->structures. + y_if_scan_manager~statements = ref_scan->statements. + y_if_scan_manager~tokens = ref_scan->tokens. ENDMETHOD. - METHOD set_ref_scan. - ref_scan = io_ref_scan. - ENDMETHOD. ENDCLASS. diff --git a/src/foundation/y_ref_scan_manager_double.clas.abap b/src/foundation/y_ref_scan_manager_double.clas.abap index 562e70bd..76d6fc99 100644 --- a/src/foundation/y_ref_scan_manager_double.clas.abap +++ b/src/foundation/y_ref_scan_manager_double.clas.abap @@ -1,20 +1,48 @@ CLASS y_ref_scan_manager_double DEFINITION PUBLIC INHERITING FROM y_ref_scan_manager. "#EC INTF_IN_CLASS PUBLIC SECTION. - METHODS set_ref_scan REDEFINITION. + CONSTANTS unit_test_identifier TYPE trdir-name VALUE 'CODE_PAL_FOR_ABAP_UNIT_tEST' ##NO_TEXT. + + METHODS y_if_scan_manager~set_ref_scan REDEFINITION. METHODS inject_code IMPORTING source TYPE y_char255_tab. + PROTECTED SECTION. - METHODS create_ref_scan IMPORTING include TYPE REF TO cl_ci_source_include + METHODS create_ref_scan IMPORTING include TYPE REF TO cl_ci_source_include RETURNING VALUE(result) TYPE REF TO cl_ci_scan . + METHODS syntax_check IMPORTING source TYPE y_char255_tab. - METHODS convert_code IMPORTING source TYPE y_char255_tab + + METHODS convert_code IMPORTING source TYPE y_char255_tab RETURNING VALUE(result) TYPE sci_include. + + METHODS create_trdir RETURNING VALUE(result) TYPE trdir. + PRIVATE SECTION. DATA source_code TYPE sci_include. + ENDCLASS. -CLASS Y_REF_SCAN_MANAGER_DOUBLE IMPLEMENTATION. +CLASS y_ref_scan_manager_double IMPLEMENTATION. + + + METHOD y_if_scan_manager~set_ref_scan. + DATA(trdir) = create_trdir( ). + + DATA(include) = cl_ci_source_include=>feed( p_include = source_code + p_trdir = trdir ). + + DATA(ref_scan) = create_ref_scan( include ). + + super->y_if_scan_manager~set_ref_scan( ref_scan ). + ENDMETHOD. + + + METHOD inject_code. + syntax_check( source ). + source_code = convert_code( source ). + ENDMETHOD. + METHOD syntax_check. DATA program TYPE string. @@ -33,20 +61,11 @@ CLASS Y_REF_SCAN_MANAGER_DOUBLE IMPLEMENTATION. ENDMETHOD. - METHOD inject_code. - syntax_check( source ). - source_code = convert_code( source ). - ENDMETHOD. METHOD convert_code. MOVE-CORRESPONDING source TO result. ENDMETHOD. - METHOD set_ref_scan. - DATA(include) = cl_ci_source_include=>feed( source_code ). - DATA(ref_scan) = create_ref_scan( include ). - super->set_ref_scan( ref_scan ). - ENDMETHOD. METHOD create_ref_scan. CONSTANTS class_type TYPE string VALUE 'CL_CI_SCAN'. @@ -71,4 +90,9 @@ CLASS Y_REF_SCAN_MANAGER_DOUBLE IMPLEMENTATION. ENDIF. ENDMETHOD. + + METHOD create_trdir. + result = VALUE #( name = unit_test_identifier ). + ENDMETHOD. + ENDCLASS. diff --git a/src/foundation/y_test_code_detector.clas.abap b/src/foundation/y_test_code_detector.clas.abap index f83c4b98..ee11cc3f 100644 --- a/src/foundation/y_test_code_detector.clas.abap +++ b/src/foundation/y_test_code_detector.clas.abap @@ -40,7 +40,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. RETURN. ENDIF. - LOOP AT ref_scan_manager->get_structures( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->structures ASSIGNING FIELD-SYMBOL() WHERE stmnt_type EQ scan_struc_stmnt_type-class_definition. process_statements( ). @@ -53,7 +53,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. IF l_index > statement_wa-to. RETURN. ENDIF. - READ TABLE ref_scan_manager->get_tokens( ) INDEX l_index INTO DATA(token_wa). + READ TABLE ref_scan_manager->tokens INDEX l_index INTO DATA(token_wa). result = token_wa-str. ENDMETHOD. @@ -74,7 +74,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. result = 'COMPUTE'. RETURN. ENDIF. - READ TABLE ref_scan_manager->get_tokens( ) INDEX statement_wa-from INTO DATA(token_wa). + READ TABLE ref_scan_manager->tokens INDEX statement_wa-from INTO DATA(token_wa). result = token_wa-str. ENDMETHOD. @@ -82,7 +82,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. METHOD process_statements. CLEAR test_code. - LOOP AT ref_scan_manager->get_statements( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->statements ASSIGNING FIELD-SYMBOL() FROM structure-stmnt_from TO structure-stmnt_to. statement_wa = . @@ -92,7 +92,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. METHOD process_tokens. - LOOP AT ref_scan_manager->get_tokens( ) ASSIGNING FIELD-SYMBOL() + LOOP AT ref_scan_manager->tokens ASSIGNING FIELD-SYMBOL() FROM statement-from TO statement-to. IF try_testclass( ). @@ -148,7 +148,7 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. RETURN. ENDIF. - READ TABLE ref_scan_manager->get_statements( ) INTO statement_wa INDEX structure-stmnt_from. + READ TABLE ref_scan_manager->statements INTO statement_wa INDEX structure-stmnt_from. IF is_test_class( ). result = abap_true. @@ -157,12 +157,12 @@ CLASS Y_TEST_CODE_DETECTOR IMPLEMENTATION. DO. DATA(low_level_structure) = high_level_structure. "#EC DECL_IN_IF - READ TABLE ref_scan_manager->get_structures( ) INTO high_level_structure INDEX low_level_structure-back. + READ TABLE ref_scan_manager->structures INTO high_level_structure INDEX low_level_structure-back. IF sy-subrc NE 0. EXIT. ENDIF. - READ TABLE ref_scan_manager->get_statements( ) INTO statement_wa INDEX high_level_structure-stmnt_from. + READ TABLE ref_scan_manager->statements INTO statement_wa INDEX high_level_structure-stmnt_from. IF is_test_class( ). result = abap_true. EXIT. diff --git a/src/foundation/y_test_code_detector.clas.testclasses.abap b/src/foundation/y_test_code_detector.clas.testclasses.abap index 187892f3..5a3f47e5 100644 --- a/src/foundation/y_test_code_detector.clas.testclasses.abap +++ b/src/foundation/y_test_code_detector.clas.testclasses.abap @@ -75,7 +75,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_class_no. ref_scan_manager_double->set_data_without_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -88,7 +88,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_class_yes. ref_scan_manager_double->set_data_with_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -101,7 +101,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_method_no. ref_scan_manager_double->set_data_without_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -114,7 +114,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_method_yes. ref_scan_manager_double->set_data_with_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -127,7 +127,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_if_in_test_code_yes. ref_scan_manager_double->set_data_with_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -140,7 +140,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_attribute_no. ref_scan_manager_double->set_data_without_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( @@ -153,7 +153,7 @@ CLASS ltc_test_code_detector IMPLEMENTATION. METHOD is_test_attribute_yes. ref_scan_manager_double->set_data_with_test( ). - LOOP AT ref_scan_manager_double->y_if_scan_manager~get_structures( ) ASSIGNING FIELD-SYMBOL() + 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. cl_abap_unit_assert=>assert_equals( diff --git a/src/foundation/y_unit_test_base.clas.abap b/src/foundation/y_unit_test_base.clas.abap index fb24334d..6aefc7db 100644 --- a/src/foundation/y_unit_test_base.clas.abap +++ b/src/foundation/y_unit_test_base.clas.abap @@ -38,7 +38,7 @@ ENDCLASS. CLASS y_unit_test_base IMPLEMENTATION. METHOD bound. - cl_abap_unit_assert=>assert_bound( cut ). + cl_abap_unit_assert=>assert_bound( cut ). ENDMETHOD. METHOD with_issue. diff --git a/src/foundation/y_unit_test_coverage.clas.abap b/src/foundation/y_unit_test_coverage.clas.abap index b0c3cecc..bb868c50 100644 --- a/src/foundation/y_unit_test_coverage.clas.abap +++ b/src/foundation/y_unit_test_coverage.clas.abap @@ -3,20 +3,24 @@ CLASS y_unit_test_coverage DEFINITION SHARED MEMORY ENABLED PUBLIC CREATE PUBLIC CLASS-METHODS get IMPORTING program_name TYPE programm object TYPE cl_aucv_task=>ty_object_directory_element coverage_type TYPE REF TO ce_scv_coverage_type - RETURNING VALUE(result) TYPE decfloat16 + RETURNING VALUE(result) TYPE REF TO if_scv_coverage RAISING cx_scv_execution_error. + CLASS-METHODS get_for_list IMPORTING objects TYPE cl_aucv_task=>ty_object_directory_elements + RETURNING VALUE(result) TYPE REF TO if_scv_measurement + RAISING cx_scv_execution_error. + PRIVATE SECTION. TYPES: BEGIN OF buffer_entry, - object TYPE cl_aucv_task=>ty_object_directory_element, - coverages TYPE if_scv_coverage=>tab, + object TYPE cl_aucv_task=>ty_object_directory_element, + coverages TYPE if_scv_coverage=>tab, END OF buffer_entry. CLASS-DATA buffer TYPE TABLE OF buffer_entry WITH KEY object. CLASS-METHODS get_coverage IMPORTING object TYPE cl_aucv_task=>ty_object_directory_element coverage_type TYPE REF TO ce_scv_coverage_type - RETURNING VALUE(result) TYPE decfloat16. + RETURNING VALUE(result) TYPE REF TO if_scv_coverage. ENDCLASS. @@ -24,6 +28,7 @@ ENDCLASS. CLASS y_unit_test_coverage IMPLEMENTATION. + METHOD get. IF line_exists( buffer[ object = object ] ). @@ -53,15 +58,27 @@ CLASS y_unit_test_coverage IMPLEMENTATION. ENDMETHOD. + METHOD get_coverage. DATA(entry) = buffer[ object = object ]. - DATA(coverage) = entry-coverages[ table_line->type = coverage_type ]. + result = entry-coverages[ table_line->type = coverage_type ]. - result = round( val = coverage->get_percentage( ) - dec = 2 ). + ENDMETHOD. + + + METHOD get_for_list. + + DATA(aunit) = cl_aucv_task=>create( i_measure_coverage = abap_true ). + + aunit->add_associated_unit_tests( objects ). + + aunit->run( if_aunit_task=>c_run_mode-catch_short_dump ). + + result = aunit->get_coverage_measurement( ). ENDMETHOD. + ENDCLASS. diff --git a/src/profiles/y_if_profile_manager.intf.abap b/src/profiles/y_if_profile_manager.intf.abap index f3afc5e4..a2ad7838 100644 --- a/src/profiles/y_if_profile_manager.intf.abap +++ b/src/profiles/y_if_profile_manager.intf.abap @@ -82,6 +82,9 @@ INTERFACE y_if_profile_manager !profile TYPE ytab_profiles RAISING ycx_failed_to_remove_a_line . + METHODS delete_profiles + RAISING + ycx_failed_to_remove_a_line . METHODS delete_check IMPORTING !check TYPE ytab_checks diff --git a/src/profiles/y_profile_manager.clas.abap b/src/profiles/y_profile_manager.clas.abap index 79f24f44..9116104a 100644 --- a/src/profiles/y_profile_manager.clas.abap +++ b/src/profiles/y_profile_manager.clas.abap @@ -151,6 +151,18 @@ CLASS y_profile_manager IMPLEMENTATION. ENDMETHOD. + METHOD y_if_profile_manager~delete_profiles. + TRY. + DATA(profiles) = y_if_profile_manager~select_profiles( sy-uname ). + CATCH ycx_entry_not_found. + RETURN. + ENDTRY. + + LOOP AT profiles ASSIGNING FIELD-SYMBOL(). + y_if_profile_manager~delete_profile( ). + ENDLOOP. + ENDMETHOD. + METHOD y_if_profile_manager~get_checks_type_name. result = checks_type. ENDMETHOD. @@ -334,10 +346,11 @@ CLASS y_profile_manager IMPLEMENTATION. METHOD y_if_profile_manager~select_all_profiles. - SELECT * FROM ytab_profiles INTO TABLE @result. - IF sy-subrc NE 0. - RAISE EXCEPTION TYPE ycx_entry_not_found. - ENDIF. + "Based on Checks because the profile might be inactive + SELECT DISTINCT profile FROM ytab_checks INTO TABLE @DATA(profiles). + LOOP AT profiles ASSIGNING FIELD-SYMBOL(). + APPEND VALUE ytab_profiles( profile = ) TO result. + ENDLOOP. ENDMETHOD. diff --git a/src/y_code_pal_version.intf.abap b/src/y_code_pal_version.intf.abap index faa42ed5..ff493c77 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.10.0' ##NO_TEXT. + CONSTANTS abap TYPE string VALUE '1.11.0' ##NO_TEXT. ENDINTERFACE.