mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 11:46:38 +08:00
291 lines
7.8 KiB
ABAP
291 lines
7.8 KiB
ABAP
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 '* <SIGNATURE>------------------------------------'
|
|
'---------------------------------------------------+'
|
|
INTO lv_begin.
|
|
|
|
CONCATENATE '* +------------------------------------------------'
|
|
'--------------------------------------</SIGNATURE>'
|
|
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.
|