From 16656d8141fdd86734fe9cca1d9748505b4be487 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Mon, 26 Sep 2022 11:20:17 -0400 Subject: [PATCH] CLAS: Fix pull for deleted interface methods (#5768) * CLAS: Fix pull for deleted interface methods In case an interface method was deleted, pulling a class that had implemented such method would not delete the implementation. This resulted in a diff and manual effort to remove the method (or repair the class). The fix will compare the implemented methods and trigger the repair if necessary. Closes #5578 * Update zcl_abapgit_oo_class.clas.abap * return all includes Co-authored-by: Lars Hvam --- src/objects/oo/zcl_abapgit_oo_class.clas.abap | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/objects/oo/zcl_abapgit_oo_class.clas.abap b/src/objects/oo/zcl_abapgit_oo_class.clas.abap index 001ca661f..60ba6fe1b 100644 --- a/src/objects/oo/zcl_abapgit_oo_class.clas.abap +++ b/src/objects/oo/zcl_abapgit_oo_class.clas.abap @@ -94,6 +94,16 @@ CLASS zcl_abapgit_oo_class DEFINITION CLASS-METHODS delete_report IMPORTING !iv_program TYPE programm . + CLASS-METHODS get_method_includes + IMPORTING + !iv_classname TYPE seoclsname + RETURNING + VALUE(rt_includes) TYPE seop_methods_w_include. + CLASS-METHODS repair_classpool + IMPORTING + !is_key TYPE seoclskey + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -195,6 +205,13 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. ENDMETHOD. + METHOD get_method_includes. + " get method includes for implemented interfaces + " this will contain also leftover includes for deleted interface methods + rt_includes = cl_oo_classname_service=>get_all_method_includes( iv_classname ). + ENDMETHOD. + + METHOD init_scanner. DATA: lx_exc TYPE REF TO cx_root, @@ -224,6 +241,21 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. ENDMETHOD. + METHOD repair_classpool. + + CALL FUNCTION 'SEO_CLASS_REPAIR_CLASSPOOL' + EXPORTING + clskey = is_key + EXCEPTIONS + not_existing = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error repairing class { is_key-clsname }| ). + ENDIF. + + ENDMETHOD. + + METHOD update_cs_number_of_methods. " Indirect access to keep downward compatibility @@ -490,6 +522,7 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. lv_program TYPE program, lo_scanner TYPE REF TO cl_oo_source_scanner_class, lt_methods TYPE cl_oo_source_scanner_class=>type_method_implementations, + lt_incls TYPE seop_methods_w_include, lv_method LIKE LINE OF lt_methods, lt_public TYPE seop_source_string, lt_source TYPE seop_source_string. @@ -548,6 +581,8 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. * methods lt_methods = lo_scanner->get_method_implementations( ). + lt_incls = get_method_includes( is_key-clsname ). + LOOP AT lt_methods INTO lv_method. TRY. lt_source = lo_scanner->get_method_impl_source( lv_method ). @@ -561,6 +596,9 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. update_report( iv_program = lv_program it_source = lt_source ). + + " If method was implemented before, remove from list + DELETE lt_incls WHERE cpdkey-clsname = is_key-clsname AND cpdkey-cpdname = lv_method. ENDLOOP. * full class include @@ -568,6 +606,12 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION. it_source = it_source it_methods = lt_methods ). + " If there are leftover method includes, then class needs to be repaired + " which will delete the obsolete includes + IF lt_incls IS NOT INITIAL. + repair_classpool( is_key ). + ENDIF. + update_source_index( iv_clsname = is_key-clsname io_scanner = lo_scanner ).