CLASS zcl_abapgit_oo_serializer DEFINITION PUBLIC CREATE PUBLIC. PUBLIC SECTION. METHODS serialize_abap_clif_source IMPORTING !is_class_key TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception cx_sy_dyn_call_error . METHODS are_test_classes_skipped RETURNING VALUE(rv_return) TYPE abap_bool . METHODS serialize_locals_imp IMPORTING !is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception . METHODS serialize_locals_def IMPORTING !is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception . METHODS serialize_testclasses IMPORTING !is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception . METHODS serialize_macros IMPORTING !is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception . METHODS calculate_skip_testclass IMPORTING !it_source TYPE zif_abapgit_definitions=>ty_string_tt RETURNING VALUE(rv_skip_testclass) TYPE abap_bool . PRIVATE SECTION. DATA mv_skip_testclass TYPE abap_bool. METHODS serialize_abap_old IMPORTING is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception. METHODS serialize_abap_new IMPORTING is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt RAISING zcx_abapgit_exception cx_sy_dyn_call_error. METHODS remove_signatures CHANGING ct_source TYPE zif_abapgit_definitions=>ty_string_tt. METHODS read_include IMPORTING is_clskey TYPE seoclskey iv_type TYPE seop_include_ext_app RETURNING VALUE(rt_source) TYPE seop_source_string. METHODS reduce CHANGING ct_source TYPE zif_abapgit_definitions=>ty_string_tt. ENDCLASS. CLASS ZCL_ABAPGIT_OO_SERIALIZER IMPLEMENTATION. METHOD are_test_classes_skipped. rv_return = mv_skip_testclass. ENDMETHOD. METHOD calculate_skip_testclass. DATA: lv_line1 LIKE LINE OF it_source, lv_line2 LIKE LINE OF it_source. * when creating classes in Eclipse it automatically generates the * testclass include, but it is not needed, so skip to avoid * creating an extra file in the repository. * Also remove it if the content is manually removed, but * the class still thinks it contains tests rv_skip_testclass = abap_false. IF lines( it_source ) = 2. READ TABLE it_source INDEX 1 INTO lv_line1. ASSERT sy-subrc = 0. READ TABLE it_source INDEX 2 INTO lv_line2. ASSERT sy-subrc = 0. IF strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' AND lv_line2 IS INITIAL. rv_skip_testclass = abap_true. ENDIF. ELSEIF lines( it_source ) = 1. READ TABLE it_source INDEX 1 INTO lv_line1. ASSERT sy-subrc = 0. IF lv_line1 IS INITIAL OR ( strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' ) OR ( strlen( lv_line1 ) = 1 AND lv_line1(1) = '*' ). rv_skip_testclass = abap_true. ENDIF. ELSEIF lines( it_source ) = 0. rv_skip_testclass = abap_true. ENDIF. ENDMETHOD. METHOD read_include. DATA: ls_include TYPE progstruc. ASSERT iv_type = seop_ext_class_locals_def OR iv_type = seop_ext_class_locals_imp OR iv_type = seop_ext_class_macros OR iv_type = seop_ext_class_testclasses. ls_include-rootname = is_clskey-clsname. TRANSLATE ls_include-rootname USING ' ='. ls_include-categorya = iv_type(1). ls_include-codea = iv_type+1(4). * it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE * on 750 kernels, where the READ REPORT without STATE addition does not * return the active version, this method is a workaround for this issue READ REPORT ls_include INTO rt_source STATE 'A'. ENDMETHOD. METHOD reduce. DATA: lv_source LIKE LINE OF ct_source, lv_found TYPE sap_bool. * skip files that only contain the standard comments lv_found = abap_false. LOOP AT ct_source INTO lv_source. IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'. lv_found = abap_true. ENDIF. ENDLOOP. IF lv_found = abap_false. CLEAR ct_source. ENDIF. ENDMETHOD. METHOD remove_signatures. * signatures messes up in CL_OO_SOURCE when deserializing and serializing * within same session DATA: lv_begin TYPE string, lv_end TYPE string, lv_remove TYPE sap_bool, lv_source LIKE LINE OF ct_source. "@TODO: Put under test CONCATENATE '* ------------------------------------' '---------------------------------------------------+' INTO lv_begin. CONCATENATE '* +------------------------------------------------' '--------------------------------------' INTO lv_end. lv_remove = abap_false. LOOP AT ct_source INTO lv_source. IF lv_source = lv_begin. lv_remove = abap_true. ENDIF. IF lv_remove = abap_true. DELETE ct_source INDEX sy-tabix. ENDIF. IF lv_source = lv_end. lv_remove = abap_false. ENDIF. ENDLOOP. ENDMETHOD. METHOD serialize_abap_clif_source. TRY. rt_source = serialize_abap_new( is_class_key ). CATCH cx_sy_dyn_call_error. rt_source = serialize_abap_old( is_class_key ). ENDTRY. ENDMETHOD. METHOD serialize_abap_new. DATA: lo_source TYPE REF TO object, lo_instance TYPE REF TO object. * do not call the class/methods statically, as it will * give syntax errors on old versions CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') RECEIVING result = lo_instance. CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') EXPORTING clif_name = is_clskey-clsname version = 'A' RECEIVING result = lo_source. CALL METHOD lo_source->('GET_SOURCE') IMPORTING source = rt_source. ENDMETHOD. METHOD serialize_abap_old. * for old ABAP AS versions DATA: lo_source TYPE REF TO cl_oo_source. CREATE OBJECT lo_source EXPORTING clskey = is_clskey EXCEPTIONS class_not_existing = 1 OTHERS = 2. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from CL_OO_SOURCE' ). ENDIF. lo_source->read( 'A' ). rt_source = lo_source->get_old_source( ). remove_signatures( CHANGING ct_source = rt_source ). ENDMETHOD. METHOD serialize_locals_def. rt_source = read_include( is_clskey = is_clskey iv_type = seop_ext_class_locals_def ). reduce( CHANGING ct_source = rt_source ). ENDMETHOD. METHOD serialize_locals_imp. rt_source = read_include( is_clskey = is_clskey iv_type = seop_ext_class_locals_imp ). reduce( CHANGING ct_source = rt_source ). ENDMETHOD. METHOD serialize_macros. rt_source = read_include( is_clskey = is_clskey iv_type = seop_ext_class_macros ). reduce( CHANGING ct_source = rt_source ). ENDMETHOD. METHOD serialize_testclasses. rt_source = read_include( is_clskey = is_clskey iv_type = seop_ext_class_testclasses ). mv_skip_testclass = calculate_skip_testclass( rt_source ). ENDMETHOD. ENDCLASS.