diff --git a/package.json b/package.json index b857ccdfe..c80b8fc35 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ ] }, "devDependencies": { - "@abaplint/cli": "^2.94.13", - "@abaplint/database-sqlite": "^2.3.93", - "@abaplint/runtime": "^2.3.94", - "@abaplint/transpiler-cli": "^2.3.94", + "@abaplint/cli": "^2.94.23", + "@abaplint/database-sqlite": "^2.3.105", + "@abaplint/runtime": "^2.3.109", + "@abaplint/transpiler-cli": "^2.3.110", "abapmerge": "^0.14.8", "c8": "^7.12.0", - "eslint": "^8.31.0" + "eslint": "^8.32.0" } } diff --git a/src/json/zcl_abapgit_ajson.clas.abap b/src/json/zcl_abapgit_ajson.clas.abap index 833892a39..a90f14a3e 100644 --- a/src/json/zcl_abapgit_ajson.clas.abap +++ b/src/json/zcl_abapgit_ajson.clas.abap @@ -874,7 +874,7 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION. IF ls_split_path IS INITIAL. " Assign root, exceptional processing ls_new_node-path = ls_split_path-path. ls_new_node-name = ls_split_path-name. - ls_new_node-type = 'array'. + ls_new_node-type = zif_abapgit_ajson=>node_type-array. INSERT ls_new_node INTO TABLE mt_json_tree. RETURN. ENDIF. diff --git a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap index af122e0f0..9ff24ee6a 100644 --- a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap +++ b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap @@ -164,12 +164,7 @@ CLASS lcl_json_parser DEFINITION FINAL. ty_stack_tt TYPE STANDARD TABLE OF REF TO zif_abapgit_ajson=>ty_node. DATA mt_stack TYPE ty_stack_tt. - - CLASS-METHODS join_path - IMPORTING - it_stack TYPE ty_stack_tt - RETURNING - VALUE(rv_path) TYPE string. + DATA mv_stack_path TYPE string. METHODS raise IMPORTING @@ -264,6 +259,7 @@ CLASS lcl_json_parser IMPLEMENTATION. FIELD-SYMBOLS LIKE LINE OF rt_json_tree. CLEAR mt_stack. + CLEAR mv_stack_path. IF iv_json IS INITIAL. RETURN. ENDIF. @@ -287,14 +283,15 @@ CLASS lcl_json_parser IMPLEMENTATION. APPEND INITIAL LINE TO rt_json_tree ASSIGNING . - -type = to_lower( lo_open->qname-name ). + -type = lo_open->qname-name. READ TABLE mt_stack INDEX 1 INTO lr_stack_top. IF sy-subrc = 0. - -path = join_path( mt_stack ). + " Using string is faster than rebuilding path from stack + -path = mv_stack_path. lr_stack_top->children = lr_stack_top->children + 1. - IF lr_stack_top->type = 'array'. + IF lr_stack_top->type = `array`. " This is parser type not ajson type -name = |{ lr_stack_top->children }|. -index = lr_stack_top->children. ELSE. @@ -312,6 +309,8 @@ CLASS lcl_json_parser IMPLEMENTATION. GET REFERENCE OF INTO lr_stack_top. INSERT lr_stack_top INTO mt_stack INDEX 1. + " add path component + mv_stack_path = mv_stack_path && -name && '/'. WHEN if_sxml_node=>co_nt_element_close. DATA lo_close TYPE REF TO if_sxml_close_element. @@ -323,6 +322,9 @@ CLASS lcl_json_parser IMPLEMENTATION. raise( 'Unexpected closing node type' ). ENDIF. + " remove last path component + mv_stack_path = substring( val = mv_stack_path + len = find( val = mv_stack_path sub = '/' occ = -2 ) + 1 ). WHEN if_sxml_node=>co_nt_value. DATA lo_value TYPE REF TO if_sxml_value_node. lo_value ?= lo_node. @@ -340,21 +342,11 @@ CLASS lcl_json_parser IMPLEMENTATION. ENDMETHOD. - METHOD join_path. - - FIELD-SYMBOLS LIKE LINE OF it_stack. - - LOOP AT it_stack ASSIGNING . - rv_path = ->name && '/' && rv_path. - ENDLOOP. - - ENDMETHOD. - METHOD raise. zcx_abapgit_ajson_error=>raise( - iv_location = join_path( mt_stack ) - iv_msg = |JSON PARSER: { iv_error } @ { join_path( mt_stack ) }| ). + iv_location = mv_stack_path + iv_msg = |JSON PARSER: { iv_error } @ { mv_stack_path }| ). ENDMETHOD. @@ -1083,7 +1075,7 @@ CLASS lcl_abap_to_json DEFINITION FINAL. CLASS-METHODS insert_with_type IMPORTING iv_data TYPE any - iv_type TYPE string + iv_type TYPE zif_abapgit_ajson=>ty_node_type is_prefix TYPE zif_abapgit_ajson=>ty_path_name OPTIONAL iv_array_index TYPE i DEFAULT 0 ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL @@ -1192,7 +1184,7 @@ CLASS lcl_abap_to_json DEFINITION FINAL. METHODS insert_value_with_type IMPORTING iv_data TYPE any - iv_type TYPE string + iv_type TYPE zif_abapgit_ajson=>ty_node_type io_type TYPE REF TO cl_abap_typedescr is_prefix TYPE zif_abapgit_ajson=>ty_path_name iv_index TYPE i DEFAULT 0 diff --git a/src/json/zcl_abapgit_ajson.clas.testclasses.abap b/src/json/zcl_abapgit_ajson.clas.testclasses.abap index 51e30a26b..7af010bc7 100644 --- a/src/json/zcl_abapgit_ajson.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson.clas.testclasses.abap @@ -1003,31 +1003,31 @@ CLASS ltcl_reader_test IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/' ) - exp = 'object' ). + exp = zif_abapgit_ajson=>node_type-object ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/string' ) - exp = 'str' ). + exp = zif_abapgit_ajson=>node_type-string ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/number' ) - exp = 'num' ). + exp = zif_abapgit_ajson=>node_type-number ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/float' ) - exp = 'num' ). + exp = zif_abapgit_ajson=>node_type-number ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/boolean' ) - exp = 'bool' ). + exp = zif_abapgit_ajson=>node_type-boolean ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/false' ) - exp = 'bool' ). + exp = zif_abapgit_ajson=>node_type-boolean ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/null' ) - exp = 'null' ). + exp = zif_abapgit_ajson=>node_type-null ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/date' ) - exp = 'str' ). + exp = zif_abapgit_ajson=>node_type-string ). cl_abap_unit_assert=>assert_equals( act = li_cut->get_node_type( '/issues' ) - exp = 'array' ). + exp = zif_abapgit_ajson=>node_type-array ). ENDMETHOD. @@ -2987,12 +2987,12 @@ CLASS ltcl_writer_test IMPLEMENTATION. LOOP AT io_json_in->mt_json_tree ASSIGNING WHERE path = iv_path. lv_path = -path && -name && '/'. CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. io_json_out->touch_array( lv_path ). set_with_type_slice( io_json_in = io_json_in io_json_out = io_json_out iv_path = lv_path ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. set_with_type_slice( io_json_in = io_json_in io_json_out = io_json_out iv_path = lv_path ). diff --git a/src/json/zcl_abapgit_ajson_utilities.clas.abap b/src/json/zcl_abapgit_ajson_utilities.clas.abap index b97348758..ca1867f44 100644 --- a/src/json/zcl_abapgit_ajson_utilities.clas.abap +++ b/src/json/zcl_abapgit_ajson_utilities.clas.abap @@ -102,7 +102,7 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. IF iv_keep_empty_arrays = abap_false. LOOP AT io_json->mt_json_tree INTO ls_json_tree - WHERE type = 'array' AND children = 0. + WHERE type = zif_abapgit_ajson=>node_type-array AND children = 0. io_json->delete( ls_json_tree-path && ls_json_tree-name ). @@ -113,7 +113,7 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. ENDIF. LOOP AT io_json->mt_json_tree INTO ls_json_tree - WHERE type = 'object' AND children = 0. + WHERE type = zif_abapgit_ajson=>node_type-object AND children = 0. io_json->delete( ls_json_tree-path && ls_json_tree-name ). @@ -184,12 +184,12 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. IF -type = -type. CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. mo_insert->touch_array( lv_path_a ). mo_change->touch_array( lv_path_a ). mo_delete->touch_array( lv_path_a ). diff_a_b( lv_path_a ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. diff_a_b( lv_path_a ). WHEN OTHERS. IF -value <> -value. @@ -203,10 +203,10 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. ELSE. " save changed type as delete + insert CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. mo_delete->touch_array( lv_path_a ). diff_a_b( lv_path_a ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. diff_a_b( lv_path_a ). WHEN OTHERS. mo_delete->set( @@ -215,10 +215,10 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. iv_node_type = -type ). ENDCASE. CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. mo_insert->touch_array( lv_path_b ). diff_b_a( lv_path_b ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. diff_b_a( lv_path_b ). WHEN OTHERS. mo_insert->set( @@ -230,10 +230,10 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. ELSE. " save as delete CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. mo_delete->touch_array( lv_path_a ). diff_a_b( lv_path_a ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. diff_a_b( lv_path_a ). WHEN OTHERS. mo_delete->set( @@ -257,12 +257,12 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION. lv_path = -path && -name && '/'. CASE -type. - WHEN 'array'. + WHEN zif_abapgit_ajson=>node_type-array. mo_insert->touch_array( lv_path ). diff_b_a( iv_path = lv_path iv_array = abap_true ). - WHEN 'object'. + WHEN zif_abapgit_ajson=>node_type-object. diff_b_a( lv_path ). WHEN OTHERS. IF iv_array = abap_false. diff --git a/src/json/zif_abapgit_ajson.intf.abap b/src/json/zif_abapgit_ajson.intf.abap index cf24fe5ea..f5bd4d89d 100644 --- a/src/json/zif_abapgit_ajson.intf.abap +++ b/src/json/zif_abapgit_ajson.intf.abap @@ -1,25 +1,28 @@ INTERFACE zif_abapgit_ajson PUBLIC. - CONSTANTS version TYPE string VALUE 'v1.1.6'. "#EC NOTEXT + CONSTANTS version TYPE string VALUE 'v1.1.7'. "#EC NOTEXT CONSTANTS origin TYPE string VALUE 'https://github.com/sbcgua/ajson'. "#EC NOTEXT CONSTANTS license TYPE string VALUE 'MIT'. "#EC NOTEXT + TYPES: + ty_node_type TYPE string. + CONSTANTS: BEGIN OF node_type, - boolean TYPE string VALUE 'bool', - string TYPE string VALUE 'str', - number TYPE string VALUE 'num', - null TYPE string VALUE 'null', - array TYPE string VALUE 'array', - object TYPE string VALUE 'object', + boolean TYPE ty_node_type VALUE 'bool', + string TYPE ty_node_type VALUE 'str', + number TYPE ty_node_type VALUE 'num', + null TYPE ty_node_type VALUE 'null', + array TYPE ty_node_type VALUE 'array', + object TYPE ty_node_type VALUE 'object', END OF node_type. TYPES: BEGIN OF ty_node, path TYPE string, name TYPE string, - type TYPE string, + type TYPE ty_node_type, value TYPE string, index TYPE i, order TYPE i, @@ -112,7 +115,7 @@ INTERFACE zif_abapgit_ajson IMPORTING iv_path TYPE string RETURNING - VALUE(rv_node_type) TYPE string. + VALUE(rv_node_type) TYPE ty_node_type. METHODS get_boolean IMPORTING @@ -181,7 +184,7 @@ INTERFACE zif_abapgit_ajson iv_path TYPE string iv_val TYPE any iv_ignore_empty TYPE abap_bool DEFAULT abap_true - iv_node_type TYPE string OPTIONAL + iv_node_type TYPE ty_node_type OPTIONAL RETURNING VALUE(ri_json) TYPE REF TO zif_abapgit_ajson RAISING