mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +08:00
Do a syntax check before accessing version constant (#6733)
Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com>
This commit is contained in:
parent
350d2eb7a7
commit
bf76fedf19
|
@ -355,4 +355,10 @@ CLASS zcl_abapgit_oo_base IMPLEMENTATION.
|
|||
DELETE FROM seosubcotx WHERE clsname = is_key-clsname."#EC CI_SUBRC
|
||||
INSERT seosubcotx FROM TABLE lt_descriptions. "#EC CI_SUBRC
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_oo_object_fnc~syntax_check.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
|
|
@ -27,6 +27,8 @@ CLASS zcl_abapgit_oo_class DEFINITION
|
|||
REDEFINITION .
|
||||
METHODS zif_abapgit_oo_object_fnc~exists
|
||||
REDEFINITION .
|
||||
METHODS zif_abapgit_oo_object_fnc~syntax_check
|
||||
REDEFINITION .
|
||||
PROTECTED SECTION.
|
||||
|
||||
TYPES:
|
||||
|
@ -968,4 +970,31 @@ CLASS zcl_abapgit_oo_class IMPLEMENTATION.
|
|||
lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ).
|
||||
READ TEXTPOOL lv_cp INTO rt_text_pool LANGUAGE iv_language. "#EC CI_READ_REP
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_oo_object_fnc~syntax_check.
|
||||
DATA:
|
||||
ls_clskey TYPE seoclskey,
|
||||
lv_syntaxerror TYPE abap_bool.
|
||||
|
||||
ls_clskey-clsname = to_upper( iv_object_name ).
|
||||
|
||||
CALL FUNCTION 'SEO_CLASS_CHECK_CLASSPOOL'
|
||||
EXPORTING
|
||||
clskey = ls_clskey
|
||||
suppress_error_popup = abap_true
|
||||
IMPORTING
|
||||
syntaxerror = lv_syntaxerror
|
||||
EXCEPTIONS
|
||||
_internal_class_not_existing = 1
|
||||
OTHERS = 2.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise_t100( ).
|
||||
ENDIF.
|
||||
|
||||
IF lv_syntaxerror = abap_true.
|
||||
zcx_abapgit_exception=>raise( |Class { ls_clskey-clsname } has syntax errors | ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
|
|
@ -6,10 +6,19 @@ CLASS zcl_abapgit_oo_factory DEFINITION PUBLIC.
|
|||
IMPORTING
|
||||
iv_object_type TYPE tadir-object
|
||||
RETURNING
|
||||
VALUE(ri_object_oriented_object) TYPE REF TO zif_abapgit_oo_object_fnc.
|
||||
PRIVATE SECTION.
|
||||
VALUE(ri_object_oriented_object) TYPE REF TO zif_abapgit_oo_object_fnc,
|
||||
|
||||
make_by_name
|
||||
IMPORTING
|
||||
iv_object_name TYPE seoclsname
|
||||
RETURNING
|
||||
VALUE(ri_object_oriented_object) TYPE REF TO zif_abapgit_oo_object_fnc
|
||||
RAISING
|
||||
zcx_abapgit_exception.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CLASS-DATA gi_object_oriented_object TYPE REF TO zif_abapgit_oo_object_fnc .
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
@ -28,4 +37,30 @@ CLASS zcl_abapgit_oo_factory IMPLEMENTATION.
|
|||
CREATE OBJECT ri_object_oriented_object TYPE zcl_abapgit_oo_interface.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD make_by_name.
|
||||
|
||||
DATA:
|
||||
li_interface TYPE REF TO zif_abapgit_oo_object_fnc,
|
||||
li_class TYPE REF TO zif_abapgit_oo_object_fnc,
|
||||
ls_object_name TYPE seoclskey.
|
||||
|
||||
ls_object_name-clsname = to_upper( iv_object_name ).
|
||||
|
||||
CREATE OBJECT li_class TYPE zcl_abapgit_oo_class.
|
||||
IF li_class->exists( ls_object_name ) = abap_true.
|
||||
ri_object_oriented_object = li_class.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
CREATE OBJECT li_interface TYPE zcl_abapgit_oo_interface.
|
||||
IF li_interface->exists( ls_object_name ) = abap_true.
|
||||
ri_object_oriented_object = li_interface.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
zcx_abapgit_exception=>raise( |{ iv_object_name } is neither a class nor an interface| ).
|
||||
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
|
|
|
@ -17,6 +17,8 @@ CLASS zcl_abapgit_oo_interface DEFINITION
|
|||
REDEFINITION .
|
||||
METHODS zif_abapgit_oo_object_fnc~exists
|
||||
REDEFINITION .
|
||||
METHODS zif_abapgit_oo_object_fnc~syntax_check
|
||||
REDEFINITION .
|
||||
PROTECTED SECTION.
|
||||
PRIVATE SECTION.
|
||||
|
||||
|
@ -339,4 +341,30 @@ CLASS zcl_abapgit_oo_interface IMPLEMENTATION.
|
|||
rs_interface_properties-r3release,
|
||||
rs_interface_properties-version.
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_oo_object_fnc~syntax_check.
|
||||
DATA:
|
||||
ls_intkey TYPE seoclskey,
|
||||
lv_syntaxerror TYPE abap_bool.
|
||||
|
||||
ls_intkey-clsname = to_upper( iv_object_name ).
|
||||
|
||||
CALL FUNCTION 'SEO_INTERFACE_CHECK_POOL'
|
||||
EXPORTING
|
||||
intkey = ls_intkey
|
||||
suppress_error_popup = abap_true
|
||||
IMPORTING
|
||||
syntaxerror = lv_syntaxerror
|
||||
EXCEPTIONS
|
||||
OTHERS = 1.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise_t100( ).
|
||||
ENDIF.
|
||||
|
||||
IF lv_syntaxerror = abap_true.
|
||||
zcx_abapgit_exception=>raise( |Interface { ls_intkey-clsname } has syntax errors | ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
|
|
@ -187,5 +187,10 @@ INTERFACE zif_abapgit_oo_object_fnc PUBLIC.
|
|||
IMPORTING
|
||||
iv_object_name TYPE seoclsname
|
||||
RETURNING
|
||||
VALUE(rt_attributes) TYPE ty_obj_attribute_tt.
|
||||
VALUE(rt_attributes) TYPE ty_obj_attribute_tt,
|
||||
syntax_check
|
||||
IMPORTING
|
||||
iv_object_name TYPE seoclsname
|
||||
RAISING
|
||||
zcx_abapgit_exception.
|
||||
ENDINTERFACE.
|
||||
|
|
|
@ -104,6 +104,9 @@ CLASS lth_oo_object_fnc IMPLEMENTATION.
|
|||
METHOD zif_abapgit_oo_object_fnc~update_descriptions_sub.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD zif_abapgit_oo_object_fnc~syntax_check.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
|
|
@ -251,7 +251,7 @@ CLASS zcl_abapgit_version IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
METHOD get_version_constant_value.
|
||||
DATA: lv_version_class TYPE string,
|
||||
DATA: lv_version_class TYPE seoclsname,
|
||||
lv_version_component TYPE string.
|
||||
FIELD-SYMBOLS: <lv_version> TYPE string.
|
||||
|
||||
|
@ -264,6 +264,10 @@ CLASS zcl_abapgit_version IMPLEMENTATION.
|
|||
zcx_abapgit_exception=>raise( 'Version constant cannot be parsed' ).
|
||||
ENDIF.
|
||||
|
||||
" You should remember that accessing a class or an interface with syntax errors
|
||||
" gives us a shortdump. Therefore we do a syntax check here.
|
||||
zcl_abapgit_oo_factory=>make_by_name( lv_version_class )->syntax_check( lv_version_class ).
|
||||
|
||||
ASSIGN (lv_version_class)=>(lv_version_component) TO <lv_version>.
|
||||
IF sy-subrc = 0.
|
||||
rv_version = <lv_version>.
|
||||
|
|
Loading…
Reference in New Issue
Block a user