From d474a48cdba7f0b03898aacd7b996881931bd6f6 Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Mon, 12 Dec 2016 17:33:41 +0100 Subject: [PATCH 01/20] Isolating creation dependencies --- src/zabapgit_object_clas.prog.abap | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 5549a80c8..635050282 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -7,6 +7,91 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* +INTERFACE lif_object_oriented_object. + METHODS: + create + IMPORTING + iv_package TYPE devclass + iv_overwrite TYPE seox_boolean DEFAULT seox_true + CHANGING + is_properties TYPE any + RAISING + lcx_exception. +ENDINTERFACE. + +CLASS lcl_object_oriented_class DEFINITION. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object. +ENDCLASS. +CLASS lcl_object_oriented_class IMPLEMENTATION. + METHOD lif_object_oriented_object~create. + CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = iv_overwrite + CHANGING + class = is_properties + EXCEPTIONS + existing = 1 + is_interface = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). + ENDIF. + ENDMETHOD. +ENDCLASS. + +CLASS lcl_object_oriented_interface DEFINITION. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object. +ENDCLASS. + +CLASS lcl_object_oriented_interface IMPLEMENTATION. + METHOD lif_object_oriented_object~create. + CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = iv_overwrite + CHANGING + interface = is_properties + EXCEPTIONS + existing = 1 + is_class = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). + ENDIF. + ENDMETHOD. +ENDCLASS. + +CLASS lcl_object_oriented_factory DEFINITION. + PUBLIC SECTION. + CLASS-METHODS: + create + IMPORTING + iv_object_type TYPE tadir-object + RETURNING + VALUE(ro_object_oriented_object) TYPE REF TO lif_object_oriented_object. +ENDCLASS. +CLASS lcl_object_oriented_factory IMPLEMENTATION. + METHOD create. + IF iv_object_type = 'CLAS'. + CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_class. + ELSEIF iv_object_type = 'INTF'. + CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_interface. + ENDIF. + ENDMETHOD. +ENDCLASS. + + CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. PUBLIC SECTION. From 29f0a9646cbd1340f43da76b4b0c3fe9106ee730 Mon Sep 17 00:00:00 2001 From: TheWirtschaftsmann Date: Tue, 13 Dec 2016 17:59:02 +0200 Subject: [PATCH 02/20] Xml syntax #443 * Refactoring update Overview of changes: - Renaming of ltcl_code_highlighter* to ltcl_syntax_highlighter*. - Fine-tuning of regex generation. - Fine-tuning of order_matches to take into account key words inside of structures. * file extension Refactored checking of file extension. * Refactoring of highlighter Refactoring of highlighter and adding XML-parser. --- src/zabapgit_page_diff.prog.abap | 9 +- src/zabapgit_syntax_highlighter.prog.abap | 956 ++++++++++++++-------- 2 files changed, 632 insertions(+), 333 deletions(-) diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 0cab80365..79ed392c0 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -255,24 +255,21 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD render_lines. - DATA: lo_highlighter TYPE REF TO lcl_code_highlighter, + DATA: lo_highlighter TYPE REF TO lcl_syntax_highlighter, lt_diffs TYPE lcl_diff=>ty_diffs_tt, lv_local TYPE string, lv_remote TYPE string, lv_lattr TYPE string, lv_rattr TYPE string, - lv_highlight TYPE abap_bool, lv_insert_nav TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF lt_diffs. - CREATE OBJECT lo_highlighter. + lo_highlighter = lcl_syntax_highlighter=>create( is_diff-filename ). CREATE OBJECT ro_html. lt_diffs = is_diff-o_diff->get( ). - lv_highlight = boolc( is_diff-filename CP '*.abap' ). - LOOP AT lt_diffs ASSIGNING . IF -short = abap_false. lv_insert_nav = abap_true. @@ -292,7 +289,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lv_remote = -old. ENDIF. - IF lv_highlight = abap_true. + IF lo_highlighter IS BOUND. lv_local = lo_highlighter->process_line( lv_local ). lv_remote = lo_highlighter->process_line( lv_remote ). ELSE. diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 8ccef3149..718357b6c 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -2,43 +2,31 @@ *& Include ZABAPGIT_SYNTAX_HIGHLIGHTER *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* -*& Class lcl_code_highligher +*& Class lcl_syntax_highligher *&---------------------------------------------------------------------* -CLASS ltcl_code_highlighter1 DEFINITION DEFERRED. -CLASS ltcl_code_highlighter2 DEFINITION DEFERRED. +CLASS ltcl_syntax_highlighter1 DEFINITION DEFERRED. +CLASS ltcl_syntax_highlighter2 DEFINITION DEFERRED. + +CLASS lcl_syntax_abap DEFINITION DEFERRED. +CLASS lcl_syntax_xml DEFINITION DEFERRED. *----------------------------------------------------------------------* -* CLASS lcl_code_highlighter DEFINITION +* CLASS lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* -CLASS lcl_code_highlighter DEFINITION FRIENDS ltcl_code_highlighter1 ltcl_code_highlighter2. +CLASS lcl_syntax_highlighter DEFINITION ABSTRACT + FRIENDS ltcl_syntax_highlighter1 ltcl_syntax_highlighter2. PUBLIC SECTION. - CLASS-METHODS: - class_constructor. + CLASS-METHODS create + IMPORTING iv_filename TYPE string + RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter. - METHODS: - process_line + METHODS process_line IMPORTING iv_line TYPE string RETURNING VALUE(rv_line) TYPE string. - PRIVATE SECTION. - CONSTANTS: - BEGIN OF c_token, - keyword TYPE c VALUE 'K', - text TYPE c VALUE 'T', - comment TYPE c VALUE 'C', - none TYPE c VALUE 'N', - END OF c_token. - - CONSTANTS: - BEGIN OF c_css, - keyword TYPE string VALUE 'keyword', - text TYPE string VALUE 'text', - comment TYPE string VALUE 'comment', - none TYPE string VALUE 'none', - END OF c_css. - + PROTECTED SECTION. TYPES: BEGIN OF ty_match, token TYPE char1, " Type of matches @@ -52,45 +40,108 @@ CLASS lcl_code_highlighter DEFINITION FRIENDS ltcl_code_highlighter1 ltcl_code_h TYPES: BEGIN OF ty_regex, - regex TYPE REF TO cl_abap_regex, - token TYPE char1, + regex TYPE REF TO cl_abap_regex, + token TYPE char1, END OF ty_regex. + TYPES: + BEGIN OF ty_style_map, + token TYPE char1, + style TYPE string, + END OF ty_style_map. + + CONSTANTS: + BEGIN OF c_css, + keyword TYPE string VALUE 'keyword', "#EC NOTEXT + text TYPE string VALUE 'text', "#EC NOTEXT + comment TYPE string VALUE 'comment', "#EC NOTEXT + xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT + attr TYPE string VALUE 'attr', "#EC NOTEXT + attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT + none TYPE string VALUE 'none', "#EC NOTEXT + END OF c_css. + + CONSTANTS: + BEGIN OF c_token, + keyword TYPE c VALUE 'K', "#EC NOTEXT + text TYPE c VALUE 'T', "#EC NOTEXT + comment TYPE c VALUE 'C', "#EC NOTEXT + xml_tag TYPE c VALUE 'X', "#EC NOTEXT + attr TYPE c VALUE 'A', "#EC NOTEXT + attr_val TYPE c VALUE 'V', "#EC NOTEXT + none TYPE c VALUE 'N', "#EC NOTEXT + END OF c_token. + CLASS-DATA: BEGIN OF c_regex, - comment TYPE string, - text TYPE string, - keyword TYPE string, + comment TYPE string, + text TYPE string, + keyword TYPE string, + xml_tag TYPE string, + attr TYPE string, + attr_val TYPE string, END OF c_regex. - CLASS-DATA: mo_regex_table TYPE TABLE OF ty_regex. + CLASS-DATA: + mo_regex_table TYPE TABLE OF ty_regex, + mo_style_map TYPE TABLE OF ty_style_map. - METHODS: - parse_line + METHODS parse_line IMPORTING iv_line TYPE string RETURNING VALUE(rt_matches) TYPE ty_match_tt. - METHODS: - order_matches + METHODS order_matches ABSTRACT IMPORTING iv_line TYPE string CHANGING ct_matches TYPE ty_match_tt. - METHODS: - format_line + METHODS extend_matches + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. + + METHODS format_line IMPORTING iv_line TYPE string it_matches TYPE ty_match_tt RETURNING VALUE(rv_line) TYPE string. - METHODS: - apply_style + METHODS apply_style IMPORTING iv_line TYPE string iv_class TYPE string RETURNING VALUE(rv_line) TYPE string. -ENDCLASS. "lcl_code_highlighter DEFINITION +ENDCLASS. " lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* -* Macros +* CLASS lcl_syntax_abap DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter. + + PUBLIC SECTION. + CLASS-METHODS class_constructor. + + PROTECTED SECTION. + CLASS-METHODS get_keywords RETURNING VALUE(rv_string) TYPE string. + METHODS order_matches REDEFINITION. + +ENDCLASS. " lcl_syntax_abap DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_syntax_xml DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter. + PUBLIC SECTION. + CLASS-METHODS class_constructor. + + PROTECTED SECTION. + METHODS order_matches REDEFINITION. + +ENDCLASS. " lcl_syntax_xml DEFINITION + +*----------------------------------------------------------------------* +* Macros to fill table with a regular expressions to be parsed *----------------------------------------------------------------------* DEFINE _add_regex. @@ -100,24 +151,205 @@ DEFINE _add_regex. pattern = c_regex-&1 ignore_case = abap_true. - ls_regex_table-token = c_token-&1. + ls_regex_table-token = c_token-&1. APPEND ls_regex_table TO mo_regex_table. -END-OF-DEFINITION. +END-OF-DEFINITION. " _add_regex *----------------------------------------------------------------------* -* CLASS lcl_code_highlighter IMPLEMENTATION +* Macros to fill table with mapping of tokens against CSS-styles *----------------------------------------------------------------------* -CLASS lcl_code_highlighter IMPLEMENTATION. + +DEFINE _add_style_mapping. + + ls_style_map-token = c_token-&1. + ls_style_map-style = c_css-&1. + APPEND ls_style_map TO mo_style_map. + +END-OF-DEFINITION. " _add_style_mapping +*----------------------------------------------------------------------* +* CLASS lcl_syntax_highlighter IMPLEMENTATION +*----------------------------------------------------------------------* +* Implementation of syntax highligther for ABAP source code +*----------------------------------------------------------------------* +CLASS lcl_syntax_highlighter IMPLEMENTATION. + + METHOD create. + + " Create instance of highighter dynamically dependent on syntax type + IF iv_filename CP '*.abap'. + CREATE OBJECT ro_instance TYPE lcl_syntax_abap. + ELSEIF iv_filename CP '*.xml'. + CREATE OBJECT ro_instance TYPE lcl_syntax_xml. + ELSE. + CLEAR ro_instance. + ENDIF. + + ENDMETHOD. " create. + + METHOD parse_line. + + DATA: + lo_regex TYPE REF TO cl_abap_regex, + lo_matcher TYPE REF TO cl_abap_matcher, + lt_result TYPE match_result_tab, + ls_match TYPE ty_match. + + FIELD-SYMBOLS: + TYPE ty_regex, + TYPE match_result, + TYPE ty_match. + + " Process syntax-dependent regex table and find all matches + LOOP AT mo_regex_table ASSIGNING . + lo_regex = -regex. + lo_matcher = lo_regex->create_matcher( text = iv_line ). + lt_result = lo_matcher->find_all( ). + + " Save matches into custom table with predefined tokens + LOOP AT lt_result ASSIGNING . + CLEAR: ls_match. + ls_match-token = -token. + ls_match-offset = -offset. + ls_match-length = -length. + APPEND ls_match TO rt_matches. + ENDLOOP. + ENDLOOP. + + ENDMETHOD. " parse_line + + METHOD extend_matches. + DATA: + lv_line_len TYPE i, + lv_last_pos TYPE i VALUE 0, + lv_length TYPE i, + ls_match TYPE ty_match. + + FIELD-SYMBOLS TYPE ty_match. + + lv_line_len = strlen( iv_line ). + + " Add entries refering to parts of text that should not be formatted + LOOP AT ct_matches ASSIGNING . + IF -offset > lv_last_pos. + lv_length = -offset - lv_last_pos. + ls_match-token = c_token-none. + ls_match-offset = lv_last_pos. + ls_match-length = lv_length. + INSERT ls_match INTO ct_matches INDEX sy-tabix. + ENDIF. + lv_last_pos = -offset + -length. + ENDLOOP. + + " Add remainder of the string + IF lv_line_len > lv_last_pos. + lv_length = lv_line_len - lv_last_pos. + ls_match-token = c_token-none. + ls_match-offset = lv_last_pos. + ls_match-length = lv_length. + APPEND ls_match TO ct_matches. + ENDIF. + + ENDMETHOD. " extend_matches + + METHOD format_line. + + DATA: + lv_chunk TYPE string, + lv_css_class TYPE string, + ls_style_map TYPE ty_style_map. + + FIELD-SYMBOLS TYPE ty_match. + + LOOP AT it_matches ASSIGNING . + lv_chunk = substring( val = iv_line off = -offset len = -length ). + + READ TABLE mo_style_map INTO ls_style_map WITH KEY token = -token. + + IF sy-subrc IS INITIAL. + lv_css_class = ls_style_map-style. + ELSE. + CLEAR: lv_css_class. + ENDIF. + + lv_chunk = me->apply_style( iv_line = lv_chunk + iv_class = lv_css_class ). + + rv_line = rv_line && lv_chunk. + ENDLOOP. + + ENDMETHOD. " format_line + + METHOD apply_style. + + DATA lv_escaped TYPE string. + + lv_escaped = escape( val = iv_line format = cl_abap_format=>e_html_attr ). + IF iv_class IS NOT INITIAL. + rv_line = |{ lv_escaped }|. + ELSE. + rv_line = lv_escaped. + ENDIF. + + ENDMETHOD. " apply_style + + METHOD process_line. + + DATA: lt_matches TYPE ty_match_tt. + + IF strlen( iv_line ) = 0. + RETURN. + ENDIF. + + lt_matches = me->parse_line( iv_line = iv_line ). + + me->order_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches ). + + me->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches ). + + rv_line = me->format_line( iv_line = iv_line + it_matches = lt_matches ). + + ENDMETHOD. " process_line + +ENDCLASS. " lcl_syntax_highlighter IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_syntax_abap IMPLEMENTATION +*----------------------------------------------------------------------* +* Implementation of syntax highligther for XML source code +*----------------------------------------------------------------------* +CLASS lcl_syntax_abap IMPLEMENTATION. METHOD class_constructor. - DATA: ls_regex_table TYPE ty_regex. + DATA: + ls_regex_table TYPE ty_regex, + ls_style_map TYPE ty_style_map. - c_regex-comment = '##|"|^\*'. - c_regex-text = '`|''|\||\{|\}'. - c_regex-keyword = '&&|\b(' && - '\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && + " Declare regular expressions' constants + c_regex-comment = '##|"|^\*'. "#EC NOTEXT + c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT + c_regex-keyword = '&&|\b(' && get_keywords( ) && ')\b'. "#EC NOTEXT + + " Initialize instances of regular expressions + _add_regex keyword. + _add_regex comment. + _add_regex text. + + " Initialize mapping of tokens and CSS-styles + _add_style_mapping keyword. + _add_style_mapping comment. + _add_style_mapping text. + + ENDMETHOD. " class_constructor + + METHOD get_keywords. + + rv_string = + '\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && '|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' && '|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' && '|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' && @@ -210,58 +442,15 @@ CLASS lcl_code_highlighter IMPLEMENTATION. '|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES' && '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' && '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && - '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE' && - ')\b'. - - " Initialize instances of regular expressions - _add_regex keyword. - _add_regex comment. - _add_regex text. - - ENDMETHOD. "class_constructor - - METHOD parse_line. - - DATA: - lo_regex TYPE REF TO cl_abap_regex, - lo_matcher TYPE REF TO cl_abap_matcher, - lt_result TYPE match_result_tab, - ls_match TYPE ty_match. - - FIELD-SYMBOLS: - TYPE ty_regex, - TYPE match_result, - TYPE ty_match. - - LOOP AT mo_regex_table ASSIGNING . - lo_regex = -regex. - lo_matcher = lo_regex->create_matcher( text = iv_line ). - lt_result = lo_matcher->find_all( ). - - LOOP AT lt_result ASSIGNING . - ls_match-token = -token. - ls_match-offset = -offset. - ls_match-length = -length. - - IF ls_match-token = c_token-text. - ls_match-text_tag = substring( val = iv_line off = ls_match-offset len = ls_match-length ). - ENDIF. - - APPEND ls_match TO rt_matches. - ENDLOOP. - ENDLOOP. - - ENDMETHOD. " parse_line + '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. + ENDMETHOD. " get_keywords. METHOD order_matches. DATA: lv_index TYPE sy-tabix, lv_line_len TYPE i, - lv_prev_token TYPE c, - lv_last_pos TYPE i VALUE 0, - lv_length TYPE i, - ls_match TYPE ty_match. + lv_prev_token TYPE c. FIELD-SYMBOLS: TYPE ty_match, @@ -281,11 +470,20 @@ CLASS lcl_code_highlighter IMPLEMENTATION. ENDIF. CASE -token. + WHEN c_token-keyword. + IF -offset > 0. + " Delete match if keyword is part of structure or field symbol + IF substring( val = iv_line off = ( -offset - 1 ) len = 1 ) CA '-<'. + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. + ENDIF. WHEN c_token-comment. -length = lv_line_len - -offset. DELETE ct_matches FROM lv_index + 1. CONTINUE. WHEN c_token-text. + -text_tag = substring( val = iv_line off = -offset len = -length ). IF lv_prev_token = c_token-text. IF -text_tag = -text_tag. -length = -offset + -length - -offset. @@ -310,153 +508,160 @@ CLASS lcl_code_highlighter IMPLEMENTATION. lv_prev_token = -token. ASSIGN TO . ENDLOOP. + ENDMETHOD. " order_matches. +ENDCLASS. " lcl_syntax_abap IMPLEMENTATION - " Add entries refering to parts of text that should not be formatted - LOOP AT ct_matches ASSIGNING . - IF -offset > lv_last_pos. - lv_length = -offset - lv_last_pos. - ls_match-token = c_token-none. - ls_match-offset = lv_last_pos. - ls_match-length = lv_length. - INSERT ls_match INTO ct_matches INDEX sy-tabix. - ENDIF. - lv_last_pos = -offset + -length. - ENDLOOP. - - " Add remainder of the string - IF lv_line_len > lv_last_pos. - lv_length = lv_line_len - lv_last_pos. - ls_match-token = c_token-none. - ls_match-offset = lv_last_pos. - ls_match-length = lv_length. - APPEND ls_match TO ct_matches. - ENDIF. - - ENDMETHOD. " order_matches. - - METHOD format_line. +*----------------------------------------------------------------------* +* CLASS lcl_syntax_xml IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_syntax_xml IMPLEMENTATION. + METHOD class_constructor. DATA: - lv_chunk TYPE string, - lv_css_class TYPE string. + ls_regex_table TYPE ty_regex, + ls_style_map TYPE ty_style_map. + + c_regex-xml_tag = '[<>]'. "#EC NOTEXT + c_regex-attr = '\s[a-z:]+\s*(?==)'. "#EC NOTEXT + c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT + + " Initialize instances of regular expressions + _add_regex xml_tag. + _add_regex attr. + _add_regex attr_val. + + " Initialize mapping of tokens and CSS-styles + _add_style_mapping xml_tag. + _add_style_mapping attr. + _add_style_mapping attr_val. + + ENDMETHOD. + + METHOD order_matches. + DATA: + lv_index TYPE sy-tabix, + lv_line_len TYPE i, + lv_prev_token TYPE c, + lv_state TYPE c VALUE 'O'. " O - for open tag; C - for closed tag; FIELD-SYMBOLS: - TYPE ty_match. + TYPE ty_match, + TYPE ty_match. - LOOP AT it_matches ASSIGNING . - lv_chunk = substring( val = iv_line off = -offset len = -length ). + SORT ct_matches BY offset. + + lv_line_len = strlen( iv_line ). + + LOOP AT ct_matches ASSIGNING . + lv_index = sy-tabix. CASE -token. - WHEN c_token-keyword. - lv_css_class = c_css-keyword. - WHEN c_token-comment. - lv_css_class = c_css-comment. - WHEN c_token-text. - lv_css_class = c_css-text. - WHEN c_token-none. - CLEAR: lv_css_class. + WHEN c_token-xml_tag. + -text_tag = substring( val = iv_line off = -offset len = -length ). + IF -text_tag = '>' AND lv_prev_token = c_token-xml_tag. " No other matches between two tags + lv_state = 'C'. + -length = -offset - -offset + -length. + DELETE ct_matches INDEX lv_index. + CONTINUE. + ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. " Adjust length and offset of closing tag + lv_state = 'C'. + -length = -offset - -offset - -length + -length. + -offset = -offset + -length. + ELSE. + lv_state = 'O'. + ENDIF. + + WHEN OTHERS. + IF lv_prev_token = c_token-xml_tag. + -length = -offset - -offset. " Extend length of the opening tag + ENDIF. + + IF lv_state = 'C'. " Delete all matches between tags + DELETE ct_matches INDEX lv_index. + CONTINUE. + ENDIF. ENDCASE. - lv_chunk = me->apply_style( iv_line = lv_chunk - iv_class = lv_css_class ). - - rv_line = rv_line && lv_chunk. + lv_prev_token = -token. + ASSIGN TO . ENDLOOP. - - ENDMETHOD. "format_line - - METHOD apply_style. - - DATA lv_escaped TYPE string. - - lv_escaped = escape( val = iv_line format = cl_abap_format=>e_html_attr ). - IF iv_class IS NOT INITIAL. - rv_line = |{ lv_escaped }|. - ELSE. - rv_line = lv_escaped. - ENDIF. - - ENDMETHOD. "apply_style - - METHOD process_line. - - DATA: lt_matches TYPE ty_match_tt. - - IF strlen( iv_line ) = 0. - RETURN. - ENDIF. - - lt_matches = me->parse_line( iv_line ). - - me->order_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches ). - - rv_line = me->format_line( iv_line = iv_line - it_matches = lt_matches ). - - ENDMETHOD. " process_line - -ENDCLASS. " lcl_code_highlighter IMPLEMENTATION + ENDMETHOD. " order_matches +ENDCLASS. " lcl_syntax_xml IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS ltcl_code_highlighter definition +* CLASS ltcl_syntax_highlighter1 definition *----------------------------------------------------------------------* -CLASS ltcl_code_highlighter1 DEFINITION FINAL +CLASS ltcl_syntax_highlighter1 DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. DATA: - mo TYPE REF TO lcl_code_highlighter, - mt_after_parse TYPE lcl_code_highlighter=>ty_match_tt, - ms_match TYPE lcl_code_highlighter=>ty_match, - mt_after_order TYPE lcl_code_highlighter=>ty_match_tt. + mo TYPE REF TO lcl_syntax_highlighter, + mt_after_parse TYPE lcl_syntax_highlighter=>ty_match_tt, + mt_after_order TYPE lcl_syntax_highlighter=>ty_match_tt, + mt_after_extend TYPE lcl_syntax_highlighter=>ty_match_tt, + ms_match TYPE lcl_syntax_highlighter=>ty_match. METHODS: setup, - test IMPORTING iv_line TYPE string, + test IMPORTING iv_line TYPE string + iv_filename TYPE string + RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, test01 FOR TESTING, test02 FOR TESTING, test03 FOR TESTING, test04 FOR TESTING, test05 FOR TESTING, test06 FOR TESTING, - test07 FOR TESTING. + test07 FOR TESTING, + test08 FOR TESTING. -ENDCLASS. " ltcl_code_highlighter +ENDCLASS. " ltcl_syntax_highlighter1 *----------------------------------------------------------------------* -* CLASS ltcl_code_highlighter IMPLEMENTATION +* CLASS ltcl_syntax_highlighter1 IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_code_highlighter1 IMPLEMENTATION. +CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. DEFINE _generate_parse. ms_match-token = &1. ms_match-offset = &2. ms_match-length = &3. - ms_match-text_tag = &4. - APPEND ms_match to mt_after_parse. - END-OF-DEFINITION. + append ms_match to mt_after_parse. + END-OF-DEFINITION. " _generate_parse DEFINE _generate_order. ms_match-token = &1. ms_match-offset = &2. ms_match-length = &3. ms_match-text_tag = &4. - APPEND ms_match to mt_after_order. - END-OF-DEFINITION. + append ms_match to mt_after_order. + END-OF-DEFINITION. " _generate_order + + DEFINE _generate_extend. + ms_match-token = &1. + ms_match-offset = &2. + ms_match-length = &3. + ms_match-text_tag = &4. + append ms_match to mt_after_extend. + END-OF-DEFINITION. " _generate_extend METHOD setup. - CREATE OBJECT mo. CLEAR mt_after_parse. CLEAR mt_after_order. + CLEAR mt_after_extend. ENDMETHOD. " setup METHOD test. - DATA: lt_matches_act TYPE lcl_code_highlighter=>ty_match_tt. + DATA: + lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt. + mo = lcl_syntax_highlighter=>create( iv_filename ). - lt_matches_act = mo->parse_line( iv_line ). + lt_matches_act = mo->parse_line( iv_line = iv_line ). SORT lt_matches_act BY offset. @@ -464,263 +669,352 @@ CLASS ltcl_code_highlighter1 IMPLEMENTATION. act = lt_matches_act msg = | Error during parsing: { iv_line }| ). - IF lines( mt_after_order ) > 0. - mo->order_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches_act ). + mo->order_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). - cl_abap_unit_assert=>assert_equals( exp = mt_after_order - act = lt_matches_act - msg = | Error during ordering: { iv_line }| ). - ENDIF. + cl_abap_unit_assert=>assert_equals( exp = mt_after_order + act = lt_matches_act + msg = | Error during ordering: { iv_line }| ). - ENDMETHOD. + mo->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). + cl_abap_unit_assert=>assert_equals( exp = mt_after_extend + act = lt_matches_act + msg = | Error during extending: { iv_line }| ). + + ENDMETHOD. "test ****************************************************** * Test parsing and ordering of comments * ****************************************************** METHOD test01. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = '* commented out line with key word data'. + lv_line = '* commented out line with key word data'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'C' 0 1 ''. - _generate_parse 'K' 12 3 ''. - _generate_parse 'K' 16 4 ''. - _generate_parse 'K' 21 4 ''. - _generate_parse 'K' 26 3 ''. - _generate_parse 'K' 30 4 ''. - _generate_parse 'K' 35 4 ''. + _generate_parse 'C' 0 1. + _generate_parse 'K' 12 3. + _generate_parse 'K' 16 4. + _generate_parse 'K' 21 4. + _generate_parse 'K' 26 3. + _generate_parse 'K' 30 4. + _generate_parse 'K' 35 4. " Generate table with expected values after ordering _generate_order 'C' 0 39 ''. - test( lv_line ). + " Generate table with expected values after ordering + _generate_extend 'C' 0 39 ''. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test01 ****************************************************** * Test parsing and ordering of remainder of string * ****************************************************** METHOD test02. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'data: lv_var_name type string.'. + lv_line = 'data: lv_var_name type string.'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'K' 0 4 ''. - _generate_parse 'K' 18 4 ''. + _generate_parse 'K' 0 4. + _generate_parse 'K' 18 4. " Generate table with expected values after ordering _generate_order 'K' 0 4 ''. - _generate_order 'N' 4 14 ''. _generate_order 'K' 18 4 ''. - _generate_order 'N' 22 8 ''. - test( lv_line ). + " Generate table with expected values after extending + _generate_extend 'K' 0 4 ''. + _generate_extend 'N' 4 14 ''. + _generate_extend 'K' 18 4 ''. + _generate_extend 'N' 22 8 ''. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test02 ****************************************************** * Test parsing and ordering of key words & texts * ****************************************************** METHOD test03. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'call function ''FM_NAME''. " Commented'. + + lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'K' 0 4 ''. - _generate_parse 'K' 5 8 ''. - _generate_parse 'T' 14 1 ''''. - _generate_parse 'T' 22 1 ''''. - _generate_parse 'C' 25 1 ''. + _generate_parse 'K' 0 4. + _generate_parse 'K' 5 8. + _generate_parse 'T' 14 1. + _generate_parse 'T' 22 1. + _generate_parse 'C' 25 1. " Generate table with expected values after ordering _generate_order 'K' 0 4 ''. - _generate_order 'N' 4 1 ''. _generate_order 'K' 5 8 ''. - _generate_order 'N' 13 1 ''. _generate_order 'T' 14 9 ''''. - _generate_order 'N' 23 2 ''. _generate_order 'C' 25 11 ''. - test( lv_line ). + " Generate table with expected values after extending + _generate_extend 'K' 0 4 ''. + _generate_extend 'N' 4 1 ''. + _generate_extend 'K' 5 8 ''. + _generate_extend 'N' 13 1 ''. + _generate_extend 'T' 14 9 ''''. + _generate_extend 'N' 23 2 ''. + _generate_extend 'C' 25 11 ''. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test03 ****************************************************** * Test parsing and ordering of key words in texts * ****************************************************** METHOD test04. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. + lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'K' 0 9 ''. - _generate_parse 'K' 18 4 ''. - _generate_parse 'K' 30 5 ''. - _generate_parse 'T' 36 1 ''''. - _generate_parse 'K' 48 4 ''. - _generate_parse 'T' 63 1 ''''. + _generate_parse 'K' 0 9. + _generate_parse 'K' 18 4. + _generate_parse 'K' 30 5. + _generate_parse 'T' 36 1. + _generate_parse 'K' 48 4. + _generate_parse 'T' 63 1. " Generate table with expected values after ordering _generate_order 'K' 0 9 ''. - _generate_order 'N' 9 9 ''. _generate_order 'K' 18 4 ''. - _generate_order 'N' 22 8 ''. _generate_order 'K' 30 5 ''. - _generate_order 'N' 35 1 ''. _generate_order 'T' 36 28 ''''. - _generate_order 'N' 64 1 ''. - test( lv_line ). + " Generate table with expected values after ordering + _generate_extend 'K' 0 9 ''. + _generate_extend 'N' 9 9 ''. + _generate_extend 'K' 18 4 ''. + _generate_extend 'N' 22 8 ''. + _generate_extend 'K' 30 5 ''. + _generate_extend 'N' 35 1 ''. + _generate_extend 'T' 36 28 ''''. + _generate_extend 'N' 64 1 ''. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test04 ****************************************************** * Test parsing and ordering texts in curly brackets * ****************************************************** METHOD test05. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'a = |{ b }={ c }|.'. + lv_line = 'a = |{ b }={ c }|.'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'T' 4 1 '|'. - _generate_parse 'T' 5 1 '{'. - _generate_parse 'T' 9 1 '}'. - _generate_parse 'T' 11 1 '{'. - _generate_parse 'K' 13 1 ''. - _generate_parse 'T' 15 1 '}'. - _generate_parse 'T' 16 1 '|'. + _generate_parse 'T' 4 1. + _generate_parse 'T' 5 1. + _generate_parse 'T' 9 1. + _generate_parse 'T' 11 1. + _generate_parse 'K' 13 1. + _generate_parse 'T' 15 1. + _generate_parse 'T' 16 1. " Generate table with expected values after ordering - _generate_order 'N' 0 4 ''. _generate_order 'T' 4 1 '|'. - _generate_order 'N' 5 5 ''. _generate_order 'T' 10 1 '}'. - _generate_order 'N' 11 2 ''. _generate_order 'K' 13 1 ''. - _generate_order 'N' 14 2 ''. _generate_order 'T' 16 1 '}'. - _generate_order 'N' 17 1 ''. - test( lv_line ). + " Generate table with expected values after extending + _generate_extend 'N' 0 4 ''. + _generate_extend 'T' 4 1 '|'. + _generate_extend 'N' 5 5 ''. + _generate_extend 'T' 10 1 '}'. + _generate_extend 'N' 11 2 ''. + _generate_extend 'K' 13 1 ''. + _generate_extend 'N' 14 2 ''. + _generate_extend 'T' 16 1 '}'. + _generate_extend 'N' 17 1 ''. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test05 ****************************************************** * Test parsing and ordering of texts * ****************************************************** METHOD test06. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. + lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'K' 22 2 ''. - _generate_parse 'T' 25 1 '|'. - _generate_parse 'T' 30 1 '{'. - _generate_parse 'T' 32 1 ''''. - _generate_parse 'T' 35 1 ''''. - _generate_parse 'K' 37 2 ''. - _generate_parse 'T' 40 1 '|'. - _generate_parse 'T' 43 1 '{'. - _generate_parse 'T' 45 1 ''''. - _generate_parse 'T' 48 1 ''''. - _generate_parse 'T' 50 1 '}'. - _generate_parse 'T' 51 1 '|'. - _generate_parse 'T' 53 1 '}'. - _generate_parse 'T' 54 1 '|'. + _generate_parse 'K' 22 2. + _generate_parse 'T' 25 1. + _generate_parse 'T' 30 1. + _generate_parse 'T' 32 1. + _generate_parse 'T' 35 1. + _generate_parse 'K' 37 2. + _generate_parse 'T' 40 1. + _generate_parse 'T' 43 1. + _generate_parse 'T' 45 1. + _generate_parse 'T' 48 1. + _generate_parse 'T' 50 1. + _generate_parse 'T' 51 1. + _generate_parse 'T' 53 1. + _generate_parse 'T' 54 1. " Generate table with expected values after ordering - _generate_order 'N' 00 22 ''. _generate_order 'K' 22 2 ''. - _generate_order 'N' 24 1 ''. _generate_order 'T' 25 5 '|'. - _generate_order 'N' 30 2 ''. _generate_order 'T' 32 4 ''''. - _generate_order 'N' 36 1 ''. _generate_order 'K' 37 2 ''. - _generate_order 'N' 39 1 ''. _generate_order 'T' 40 3 '|'. - _generate_order 'N' 43 2 ''. _generate_order 'T' 45 4 ''''. - _generate_order 'N' 49 2 ''. _generate_order 'T' 51 1 '}'. - _generate_order 'N' 52 2 ''. _generate_order 'T' 54 1 '}'. - test( lv_line ). + " Generate table with expected values after extending + _generate_extend 'N' 00 22 ''. + _generate_extend 'K' 22 2 ''. + _generate_extend 'N' 24 1 ''. + _generate_extend 'T' 25 5 '|'. + _generate_extend 'N' 30 2 ''. + _generate_extend 'T' 32 4 ''''. + _generate_extend 'N' 36 1 ''. + _generate_extend 'K' 37 2 ''. + _generate_extend 'N' 39 1 ''. + _generate_extend 'T' 40 3 '|'. + _generate_extend 'N' 43 2 ''. + _generate_extend 'T' 45 4 ''''. + _generate_extend 'N' 49 2 ''. + _generate_extend 'T' 51 1 '}'. + _generate_extend 'N' 52 2 ''. + _generate_extend 'T' 54 1 '}'. - ENDMETHOD. + test( iv_line = lv_line iv_filename = lv_filename ). + ENDMETHOD. "test06 + +******************************************************** +* Check that '*' in select statement is not a match * +******************************************************** METHOD test07. - DATA: lv_line TYPE string. + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT - lv_line = 'SELECT * FROM foo'. + lv_line = 'SELECT * FROM foo'. "#EC NOTEXT " Generate table with expected values after parsing - _generate_parse 'K' 0 6 ''. - _generate_parse 'K' 9 4 ''. + _generate_parse 'K' 0 6. + _generate_parse 'K' 9 4. - test( lv_line ). + " Generate table with expected values after ordering + _generate_order 'K' 0 6 ''. + _generate_order 'K' 9 4 ''. - ENDMETHOD. + " Generate table with expected values after ordering + _generate_extend 'K' 0 6 ''. + _generate_extend 'N' 6 3 ''. + _generate_extend 'K' 9 4 ''. + _generate_extend 'N' 13 4 ''. -ENDCLASS. + test( iv_line = lv_line iv_filename = lv_filename ). -CLASS ltcl_code_highlighter2 DEFINITION FINAL + ENDMETHOD. "test07 + +******************************************************** +* Test parsing and ordering of key words in structures * +******************************************************** + METHOD test08. + + DATA: + lv_line TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + + lv_line = 'lv_length = -length.'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'K' 13 5. + _generate_parse 'K' 20 6. + + " Generate table with expected values after ordering + _generate_extend 'N' 0 27 ''. + + test( iv_line = lv_line iv_filename = lv_filename ). + + ENDMETHOD. "test08 +ENDCLASS. " ltcl_syntax_highlighter1 IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS ltcl_syntax_highlighter2 DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS ltcl_syntax_highlighter2 DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. - DATA: - mo TYPE REF TO lcl_code_highlighter. + DATA mo TYPE REF TO lcl_syntax_highlighter. - METHODS: setup. METHODS: process_line FOR TESTING. - METHODS: format_line FOR TESTING. - METHODS: apply_style FOR TESTING. + METHODS: format_line FOR TESTING. + METHODS: apply_style FOR TESTING. -ENDCLASS. " ltcl_code_highlighter +ENDCLASS. " ltcl_syntax_highlighter2 *----------------------------------------------------------------------* -* CLASS ltcl_code_highlighter IMPLEMENTATION +* CLASS ltcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_code_highlighter2 IMPLEMENTATION. - - - METHOD setup. - CREATE OBJECT mo. - ENDMETHOD. - +CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. METHOD format_line. DATA: lv_line TYPE string, lv_line_act TYPE string, - lv_line_exp TYPE string. + lv_line_exp TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - lv_line = 'call function ''FM_NAME''. " Commented'. + " Create syntax highlighter + mo = lcl_syntax_highlighter=>create( lv_filename ). + + lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT lv_line_exp = - 'call' && - ' function' && - ' 'FM_NAME'.' && - ' " Commented'. + 'call' && "#EC NOTEXT + ' function' && "#EC NOTEXT + ' 'FM_NAME'.' && "#EC NOTEXT + ' " Commented'. "#EC NOTEXT - lv_line_act = mo->process_line( lv_line ). + lv_line_act = mo->process_line( iv_line = lv_line ). cl_abap_unit_assert=>assert_equals( exp = lv_line_exp act = lv_line_act @@ -730,34 +1024,42 @@ CLASS ltcl_code_highlighter2 IMPLEMENTATION. METHOD apply_style. DATA: - lv_line_act TYPE string. + lv_line_act TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. + + " Create syntax highlighter + mo = lcl_syntax_highlighter=>create( lv_filename ). " Call the method and compare results - lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' - iv_class = lcl_code_highlighter=>c_css-keyword ). + lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT + iv_class = lcl_syntax_highlighter=>c_css-keyword ). cl_abap_unit_assert=>assert_equals( act = lv_line_act - exp = 'CALL FUNCTION' - msg = 'Failure during applying of style.' ). + exp = 'CALL FUNCTION' "#EC NOTEXT + msg = 'Failure during applying of style.' ). "#EC NOTEXT ENDMETHOD. " apply_style METHOD process_line. DATA: - lv_line_act TYPE string. + lv_line_act TYPE string, + lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. + + " Create syntax highlighter + mo = lcl_syntax_highlighter=>create( lv_filename ). " Call the method with empty parameter and compare results lv_line_act = mo->process_line( iv_line = '' ). cl_abap_unit_assert=>assert_equals( act = lv_line_act exp = '' - msg = 'Failure in method process_line.' ). + msg = 'Failure in method process_line.' ). "#EC NOTEXT " Call the method with non-empty line and compare results - lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ). + lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ). "#EC NOTEXT cl_abap_unit_assert=>assert_equals( act = lv_line_act - exp = '* CALL FUNCTION' - msg = 'Failure in method process_line.' ). + exp = '* CALL FUNCTION' "#EC NOTEXT + msg = 'Failure in method process_line.' ). "#EC NOTEXT ENDMETHOD. " process_line -ENDCLASS. " ltcl_code_highlighter \ No newline at end of file +ENDCLASS. " ltcl_syntax_highlighter \ No newline at end of file From b509a3e11fae45f3368cf63b021ad9bae9e8685c Mon Sep 17 00:00:00 2001 From: TheWirtschaftsmann Date: Wed, 14 Dec 2016 17:57:31 +0200 Subject: [PATCH 03/20] Xml syntax - part2 #443 * code style adjustments * styles & small fixes * Refactoring of XML-parser --- src/zabapgit_css_common.w3mi.data.css | 3 + src/zabapgit_syntax_highlighter.prog.abap | 659 +++++++++++++--------- 2 files changed, 405 insertions(+), 257 deletions(-) diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index f81327870..924b1d664 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -503,6 +503,9 @@ table.diff_tab code { table.diff_tab code span.keyword { color: #0a69ce; } table.diff_tab code span.text { color: #48ce4f; } table.diff_tab code span.comment { color: #808080; font-style: italic; } +table.diff_tab code span.xml_tag { color: #3370e0; } +table.diff_tab code span.attr { color: #f20707; } +table.diff_tab code span.attr_val { color: #7a02f9; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 718357b6c..65f8b1601 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -5,8 +5,8 @@ *& Class lcl_syntax_highligher *&---------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 DEFINITION DEFERRED. -CLASS ltcl_syntax_highlighter2 DEFINITION DEFERRED. +CLASS ltcl_syntax_cases DEFINITION DEFERRED. +CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED. CLASS lcl_syntax_abap DEFINITION DEFERRED. CLASS lcl_syntax_xml DEFINITION DEFERRED. @@ -15,9 +15,10 @@ CLASS lcl_syntax_xml DEFINITION DEFERRED. * CLASS lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* CLASS lcl_syntax_highlighter DEFINITION ABSTRACT - FRIENDS ltcl_syntax_highlighter1 ltcl_syntax_highlighter2. + FRIENDS ltcl_syntax_cases ltcl_syntax_basic_logic. PUBLIC SECTION. + CLASS-METHODS create IMPORTING iv_filename TYPE string RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter. @@ -27,6 +28,7 @@ CLASS lcl_syntax_highlighter DEFINITION ABSTRACT RETURNING VALUE(rv_line) TYPE string. PROTECTED SECTION. + TYPES: BEGIN OF ty_match, token TYPE char1, " Type of matches @@ -39,74 +41,37 @@ CLASS lcl_syntax_highlighter DEFINITION ABSTRACT ty_match_tt TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY. TYPES: - BEGIN OF ty_regex, + BEGIN OF ty_rule, regex TYPE REF TO cl_abap_regex, token TYPE char1, - END OF ty_regex. + style TYPE string, + END OF ty_rule. - TYPES: - BEGIN OF ty_style_map, - token TYPE char1, - style TYPE string, - END OF ty_style_map. + CONSTANTS c_token_none TYPE c VALUE '.'. - CONSTANTS: - BEGIN OF c_css, - keyword TYPE string VALUE 'keyword', "#EC NOTEXT - text TYPE string VALUE 'text', "#EC NOTEXT - comment TYPE string VALUE 'comment', "#EC NOTEXT - xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT - attr TYPE string VALUE 'attr', "#EC NOTEXT - attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT - none TYPE string VALUE 'none', "#EC NOTEXT - END OF c_css. - - CONSTANTS: - BEGIN OF c_token, - keyword TYPE c VALUE 'K', "#EC NOTEXT - text TYPE c VALUE 'T', "#EC NOTEXT - comment TYPE c VALUE 'C', "#EC NOTEXT - xml_tag TYPE c VALUE 'X', "#EC NOTEXT - attr TYPE c VALUE 'A', "#EC NOTEXT - attr_val TYPE c VALUE 'V', "#EC NOTEXT - none TYPE c VALUE 'N', "#EC NOTEXT - END OF c_token. - - CLASS-DATA: - BEGIN OF c_regex, - comment TYPE string, - text TYPE string, - keyword TYPE string, - xml_tag TYPE string, - attr TYPE string, - attr_val TYPE string, - END OF c_regex. - - CLASS-DATA: - mo_regex_table TYPE TABLE OF ty_regex, - mo_style_map TYPE TABLE OF ty_style_map. + DATA mt_rules TYPE STANDARD TABLE OF ty_rule. METHODS parse_line - IMPORTING iv_line TYPE string - RETURNING VALUE(rt_matches) TYPE ty_match_tt. + IMPORTING iv_line TYPE string + RETURNING VALUE(rt_matches) TYPE ty_match_tt. METHODS order_matches ABSTRACT - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. METHODS extend_matches - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. METHODS format_line - IMPORTING iv_line TYPE string - it_matches TYPE ty_match_tt - RETURNING VALUE(rv_line) TYPE string. + IMPORTING iv_line TYPE string + it_matches TYPE ty_match_tt + RETURNING VALUE(rv_line) TYPE string. METHODS apply_style - IMPORTING iv_line TYPE string - iv_class TYPE string - RETURNING VALUE(rv_line) TYPE string. + IMPORTING iv_line TYPE string + iv_class TYPE string + RETURNING VALUE(rv_line) TYPE string. ENDCLASS. " lcl_syntax_highlighter DEFINITION @@ -115,13 +80,40 @@ ENDCLASS. " lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter. +CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. PUBLIC SECTION. - CLASS-METHODS class_constructor. + + CLASS-METHODS class_constructor. + METHODS constructor. + + CONSTANTS: + BEGIN OF c_css, + keyword TYPE string VALUE 'keyword', "#EC NOTEXT + text TYPE string VALUE 'text', "#EC NOTEXT + comment TYPE string VALUE 'comment', "#EC NOTEXT + END OF c_css. + + CONSTANTS: + BEGIN OF c_token, + keyword TYPE c VALUE 'K', "#EC NOTEXT + text TYPE c VALUE 'T', "#EC NOTEXT + comment TYPE c VALUE 'C', "#EC NOTEXT + END OF c_token. PROTECTED SECTION. - CLASS-METHODS get_keywords RETURNING VALUE(rv_string) TYPE string. + + CLASS-DATA: + c_keyword_regex TYPE REF TO cl_abap_regex, " Temporary + BEGIN OF c_regex, + comment TYPE string, + text TYPE string, + keyword TYPE string, + END OF c_regex. + + CLASS-METHODS get_keywords + RETURNING VALUE(rv_string) TYPE string. + METHODS order_matches REDEFINITION. ENDCLASS. " lcl_syntax_abap DEFINITION @@ -131,11 +123,35 @@ ENDCLASS. " lcl_syntax_abap DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter. +CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. + PUBLIC SECTION. - CLASS-METHODS class_constructor. + + METHODS constructor. + + CONSTANTS: + BEGIN OF c_css, + xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT + attr TYPE string VALUE 'attr', "#EC NOTEXT + attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT + END OF c_css. + + CONSTANTS: + BEGIN OF c_token, + xml_tag TYPE c VALUE 'X', "#EC NOTEXT + attr TYPE c VALUE 'A', "#EC NOTEXT + attr_val TYPE c VALUE 'V', "#EC NOTEXT + END OF c_token. PROTECTED SECTION. + + CLASS-DATA: + BEGIN OF c_regex, + xml_tag TYPE string, + attr TYPE string, + attr_val TYPE string, + END OF c_regex. + METHODS order_matches REDEFINITION. ENDCLASS. " lcl_syntax_xml DEFINITION @@ -144,34 +160,25 @@ ENDCLASS. " lcl_syntax_xml DEFINITION * Macros to fill table with a regular expressions to be parsed *----------------------------------------------------------------------* -DEFINE _add_regex. +DEFINE _add_rule. - CREATE OBJECT ls_regex_table-regex + CREATE OBJECT ls_rule-regex EXPORTING pattern = c_regex-&1 ignore_case = abap_true. - ls_regex_table-token = c_token-&1. - APPEND ls_regex_table TO mo_regex_table. + ls_rule-token = c_token-&1. + ls_rule-style = c_css-&1. + APPEND ls_rule TO mt_rules. -END-OF-DEFINITION. " _add_regex +END-OF-DEFINITION. " _add_rule -*----------------------------------------------------------------------* -* Macros to fill table with mapping of tokens against CSS-styles -*----------------------------------------------------------------------* - -DEFINE _add_style_mapping. - - ls_style_map-token = c_token-&1. - ls_style_map-style = c_css-&1. - APPEND ls_style_map TO mo_style_map. - -END-OF-DEFINITION. " _add_style_mapping *----------------------------------------------------------------------* * CLASS lcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* * Implementation of syntax highligther for ABAP source code *----------------------------------------------------------------------* + CLASS lcl_syntax_highlighter IMPLEMENTATION. METHOD create. @@ -196,12 +203,12 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. ls_match TYPE ty_match. FIELD-SYMBOLS: - TYPE ty_regex, + LIKE LINE OF mt_rules, TYPE match_result, TYPE ty_match. " Process syntax-dependent regex table and find all matches - LOOP AT mo_regex_table ASSIGNING . + LOOP AT mt_rules ASSIGNING . lo_regex = -regex. lo_matcher = lo_regex->create_matcher( text = iv_line ). lt_result = lo_matcher->find_all( ). @@ -219,6 +226,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. ENDMETHOD. " parse_line METHOD extend_matches. + DATA: lv_line_len TYPE i, lv_last_pos TYPE i VALUE 0, @@ -229,11 +237,13 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. lv_line_len = strlen( iv_line ). + SORT ct_matches BY offset. + " Add entries refering to parts of text that should not be formatted LOOP AT ct_matches ASSIGNING . IF -offset > lv_last_pos. lv_length = -offset - lv_last_pos. - ls_match-token = c_token-none. + ls_match-token = c_token_none. ls_match-offset = lv_last_pos. ls_match-length = lv_length. INSERT ls_match INTO ct_matches INDEX sy-tabix. @@ -244,7 +254,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. " Add remainder of the string IF lv_line_len > lv_last_pos. lv_length = lv_line_len - lv_last_pos. - ls_match-token = c_token-none. + ls_match-token = c_token_none. ls_match-offset = lv_last_pos. ls_match-length = lv_length. APPEND ls_match TO ct_matches. @@ -255,25 +265,19 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. METHOD format_line. DATA: - lv_chunk TYPE string, - lv_css_class TYPE string, - ls_style_map TYPE ty_style_map. + lv_chunk TYPE string, + ls_rule LIKE LINE OF mt_rules. FIELD-SYMBOLS TYPE ty_match. LOOP AT it_matches ASSIGNING . lv_chunk = substring( val = iv_line off = -offset len = -length ). - READ TABLE mo_style_map INTO ls_style_map WITH KEY token = -token. - - IF sy-subrc IS INITIAL. - lv_css_class = ls_style_map-style. - ELSE. - CLEAR: lv_css_class. - ENDIF. + CLEAR ls_rule. " Failed read equals no style + READ TABLE mt_rules INTO ls_rule WITH KEY token = -token. lv_chunk = me->apply_style( iv_line = lv_chunk - iv_class = lv_css_class ). + iv_class = ls_rule-style ). rv_line = rv_line && lv_chunk. ENDLOOP. @@ -321,31 +325,40 @@ ENDCLASS. " lcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* * Implementation of syntax highligther for XML source code *----------------------------------------------------------------------* + CLASS lcl_syntax_abap IMPLEMENTATION. METHOD class_constructor. - DATA: - ls_regex_table TYPE ty_regex, - ls_style_map TYPE ty_style_map. - - " Declare regular expressions' constants - c_regex-comment = '##|"|^\*'. "#EC NOTEXT - c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT - c_regex-keyword = '&&|\b(' && get_keywords( ) && ')\b'. "#EC NOTEXT - - " Initialize instances of regular expressions - _add_regex keyword. - _add_regex comment. - _add_regex text. - - " Initialize mapping of tokens and CSS-styles - _add_style_mapping keyword. - _add_style_mapping comment. - _add_style_mapping text. + CREATE OBJECT c_keyword_regex + EXPORTING + pattern = '&&|\b(' && get_keywords( ) && ')\b' + ignore_case = abap_true. ENDMETHOD. " class_constructor + METHOD constructor. + + DATA ls_rule LIKE LINE OF mt_rules. + + super->constructor( ). + + " Declare regular expressions' constants + c_regex-comment = '##|"|^\*'. "#EC NOTEXT + c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT + + " Initialize instances of regular expression + _add_rule comment. + _add_rule text. + + " Temporary + ls_rule-regex = c_keyword_regex. + ls_rule-token = c_token-keyword. + ls_rule-style = c_css-keyword. + APPEND ls_rule TO mt_rules. + + ENDMETHOD. " constructor + METHOD get_keywords. rv_string = @@ -426,7 +439,7 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO' && '|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECTION' && '|SELECTIONS|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS' && - '|SELECTOR|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' && + '|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' && '|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE' && '|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP' && '|STANDARD|STARTING|START-OF-SELECTION|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO' && @@ -443,6 +456,7 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' && '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. + ENDMETHOD. " get_keywords. METHOD order_matches. @@ -478,10 +492,12 @@ CLASS lcl_syntax_abap IMPLEMENTATION. CONTINUE. ENDIF. ENDIF. + WHEN c_token-comment. -length = lv_line_len - -offset. DELETE ct_matches FROM lv_index + 1. CONTINUE. + WHEN c_token-text. -text_tag = substring( val = iv_line off = -offset len = -length ). IF lv_prev_token = c_token-text. @@ -503,12 +519,15 @@ CLASS lcl_syntax_abap IMPLEMENTATION. DELETE ct_matches INDEX lv_index. CONTINUE. ENDIF. + ENDCASE. lv_prev_token = -token. ASSIGN TO . ENDLOOP. + ENDMETHOD. " order_matches. + ENDCLASS. " lcl_syntax_abap IMPLEMENTATION *----------------------------------------------------------------------* @@ -517,29 +536,26 @@ ENDCLASS. " lcl_syntax_abap IMPLEMENTATION * *----------------------------------------------------------------------* CLASS lcl_syntax_xml IMPLEMENTATION. - METHOD class_constructor. - DATA: - ls_regex_table TYPE ty_regex, - ls_style_map TYPE ty_style_map. + METHOD constructor. - c_regex-xml_tag = '[<>]'. "#EC NOTEXT - c_regex-attr = '\s[a-z:]+\s*(?==)'. "#EC NOTEXT - c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT + DATA ls_rule LIKE LINE OF mt_rules. + + super->constructor( ). + + c_regex-xml_tag = '[<>]'. "#EC NOTEXT + c_regex-attr = '\s[-a-z:_0-9]+\s*(?==)'. "#EC NOTEXT + c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT " Initialize instances of regular expressions - _add_regex xml_tag. - _add_regex attr. - _add_regex attr_val. - - " Initialize mapping of tokens and CSS-styles - _add_style_mapping xml_tag. - _add_style_mapping attr. - _add_style_mapping attr_val. + _add_rule xml_tag. + _add_rule attr. + _add_rule attr_val. ENDMETHOD. METHOD order_matches. + DATA: lv_index TYPE sy-tabix, lv_line_len TYPE i, @@ -582,48 +598,54 @@ CLASS lcl_syntax_xml IMPLEMENTATION. DELETE ct_matches INDEX lv_index. CONTINUE. ENDIF. + ENDCASE. lv_prev_token = -token. ASSIGN TO . ENDLOOP. + ENDMETHOD. " order_matches + ENDCLASS. " lcl_syntax_xml IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter1 definition +* CLASS ltcl_syntax_cases definition *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 DEFINITION FINAL +CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. DATA: - mo TYPE REF TO lcl_syntax_highlighter, mt_after_parse TYPE lcl_syntax_highlighter=>ty_match_tt, mt_after_order TYPE lcl_syntax_highlighter=>ty_match_tt, mt_after_extend TYPE lcl_syntax_highlighter=>ty_match_tt, ms_match TYPE lcl_syntax_highlighter=>ty_match. METHODS: - setup, - test IMPORTING iv_line TYPE string - iv_filename TYPE string - RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, - test01 FOR TESTING, - test02 FOR TESTING, - test03 FOR TESTING, - test04 FOR TESTING, - test05 FOR TESTING, - test06 FOR TESTING, - test07 FOR TESTING, - test08 FOR TESTING. + do_test IMPORTING iv_line TYPE string + iv_filename TYPE string + RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, + test_abap_01 FOR TESTING, + test_abap_02 FOR TESTING, + test_abap_03 FOR TESTING, + test_abap_04 FOR TESTING, + test_abap_05 FOR TESTING, + test_abap_06 FOR TESTING, + test_abap_07 FOR TESTING, + test_abap_08 FOR TESTING, + test_xml_01 FOR TESTING, + test_xml_02 FOR TESTING, + test_xml_03 FOR TESTING, + test_xml_04 FOR TESTING, + test_xml_05 FOR TESTING. -ENDCLASS. " ltcl_syntax_highlighter1 +ENDCLASS. " ltcl_syntax_cases *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter1 IMPLEMENTATION +* CLASS ltcl_syntax_cases IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. +CLASS ltcl_syntax_cases IMPLEMENTATION. DEFINE _generate_parse. ms_match-token = &1. @@ -648,20 +670,14 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. append ms_match to mt_after_extend. END-OF-DEFINITION. " _generate_extend - METHOD setup. - CLEAR mt_after_parse. - CLEAR mt_after_order. - CLEAR mt_after_extend. - ENDMETHOD. " setup + METHOD do_test. - METHOD test. + DATA: lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt, + lo TYPE REF TO lcl_syntax_highlighter. - DATA: - lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt. - mo = lcl_syntax_highlighter=>create( iv_filename ). - - lt_matches_act = mo->parse_line( iv_line = iv_line ). + lo = lcl_syntax_highlighter=>create( iv_filename ). + lt_matches_act = lo->parse_line( iv_line = iv_line ). SORT lt_matches_act BY offset. @@ -669,15 +685,15 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. act = lt_matches_act msg = | Error during parsing: { iv_line }| ). - mo->order_matches( EXPORTING iv_line = iv_line + lo->order_matches( EXPORTING iv_line = iv_line CHANGING ct_matches = lt_matches_act ). cl_abap_unit_assert=>assert_equals( exp = mt_after_order act = lt_matches_act msg = | Error during ordering: { iv_line }| ). - mo->extend_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches_act ). + lo->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). cl_abap_unit_assert=>assert_equals( exp = mt_after_extend act = lt_matches_act @@ -688,11 +704,9 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. ****************************************************** * Test parsing and ordering of comments * ****************************************************** - METHOD test01. + METHOD test_abap_01. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = '* commented out line with key word data'. "#EC NOTEXT @@ -711,18 +725,16 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after ordering _generate_extend 'C' 0 39 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test01 + ENDMETHOD. " test_abap_01 ****************************************************** * Test parsing and ordering of remainder of string * ****************************************************** - METHOD test02. + METHOD test_abap_02. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'data: lv_var_name type string.'. "#EC NOTEXT @@ -736,22 +748,20 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after extending _generate_extend 'K' 0 4 ''. - _generate_extend 'N' 4 14 ''. + _generate_extend '.' 4 14 ''. _generate_extend 'K' 18 4 ''. - _generate_extend 'N' 22 8 ''. + _generate_extend '.' 22 8 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test02 + ENDMETHOD. " test_abap_02 ****************************************************** * Test parsing and ordering of key words & texts * ****************************************************** - METHOD test03. + METHOD test_abap_03. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT @@ -771,25 +781,23 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after extending _generate_extend 'K' 0 4 ''. - _generate_extend 'N' 4 1 ''. + _generate_extend '.' 4 1 ''. _generate_extend 'K' 5 8 ''. - _generate_extend 'N' 13 1 ''. + _generate_extend '.' 13 1 ''. _generate_extend 'T' 14 9 ''''. - _generate_extend 'N' 23 2 ''. + _generate_extend '.' 23 2 ''. _generate_extend 'C' 25 11 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test03 + ENDMETHOD. " test_abap_03 ****************************************************** * Test parsing and ordering of key words in texts * ****************************************************** - METHOD test04. + METHOD test_abap_04. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. "#EC NOTEXT @@ -809,26 +817,24 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after ordering _generate_extend 'K' 0 9 ''. - _generate_extend 'N' 9 9 ''. + _generate_extend '.' 9 9 ''. _generate_extend 'K' 18 4 ''. - _generate_extend 'N' 22 8 ''. + _generate_extend '.' 22 8 ''. _generate_extend 'K' 30 5 ''. - _generate_extend 'N' 35 1 ''. + _generate_extend '.' 35 1 ''. _generate_extend 'T' 36 28 ''''. - _generate_extend 'N' 64 1 ''. + _generate_extend '.' 64 1 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test04 + ENDMETHOD. " test_abap_04 ****************************************************** * Test parsing and ordering texts in curly brackets * ****************************************************** - METHOD test05. + METHOD test_abap_05. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'a = |{ b }={ c }|.'. "#EC NOTEXT @@ -848,28 +854,26 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'T' 16 1 '}'. " Generate table with expected values after extending - _generate_extend 'N' 0 4 ''. + _generate_extend '.' 0 4 ''. _generate_extend 'T' 4 1 '|'. - _generate_extend 'N' 5 5 ''. + _generate_extend '.' 5 5 ''. _generate_extend 'T' 10 1 '}'. - _generate_extend 'N' 11 2 ''. + _generate_extend '.' 11 2 ''. _generate_extend 'K' 13 1 ''. - _generate_extend 'N' 14 2 ''. + _generate_extend '.' 14 2 ''. _generate_extend 'T' 16 1 '}'. - _generate_extend 'N' 17 1 ''. + _generate_extend '.' 17 1 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test05 + ENDMETHOD. " test_abap_05 ****************************************************** * Test parsing and ordering of texts * ****************************************************** - METHOD test06. + METHOD test_abap_06. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. "#EC NOTEXT @@ -900,35 +904,33 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'T' 54 1 '}'. " Generate table with expected values after extending - _generate_extend 'N' 00 22 ''. + _generate_extend '.' 00 22 ''. _generate_extend 'K' 22 2 ''. - _generate_extend 'N' 24 1 ''. + _generate_extend '.' 24 1 ''. _generate_extend 'T' 25 5 '|'. - _generate_extend 'N' 30 2 ''. + _generate_extend '.' 30 2 ''. _generate_extend 'T' 32 4 ''''. - _generate_extend 'N' 36 1 ''. + _generate_extend '.' 36 1 ''. _generate_extend 'K' 37 2 ''. - _generate_extend 'N' 39 1 ''. + _generate_extend '.' 39 1 ''. _generate_extend 'T' 40 3 '|'. - _generate_extend 'N' 43 2 ''. + _generate_extend '.' 43 2 ''. _generate_extend 'T' 45 4 ''''. - _generate_extend 'N' 49 2 ''. + _generate_extend '.' 49 2 ''. _generate_extend 'T' 51 1 '}'. - _generate_extend 'N' 52 2 ''. + _generate_extend '.' 52 2 ''. _generate_extend 'T' 54 1 '}'. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test06 + ENDMETHOD. " test_abap_06 ******************************************************** * Check that '*' in select statement is not a match * ******************************************************** - METHOD test07. + METHOD test_abap_07. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'SELECT * FROM foo'. "#EC NOTEXT @@ -940,24 +942,22 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'K' 0 6 ''. _generate_order 'K' 9 4 ''. - " Generate table with expected values after ordering + " Generate table with expected values after extending _generate_extend 'K' 0 6 ''. - _generate_extend 'N' 6 3 ''. + _generate_extend '.' 6 3 ''. _generate_extend 'K' 9 4 ''. - _generate_extend 'N' 13 4 ''. + _generate_extend '.' 13 4 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test07 + ENDMETHOD. " test_abap_07 ******************************************************** * Test parsing and ordering of key words in structures * ******************************************************** - METHOD test08. + METHOD test_abap_08. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'lv_length = -length.'. "#EC NOTEXT @@ -965,46 +965,197 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_parse 'K' 13 5. _generate_parse 'K' 20 6. + " Generate table with expected values after extending + _generate_extend '.' 0 27 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_08 + +******************************************************** +* Test parsing and ordering of tags in xml * +******************************************************** + METHOD test_xml_01. + + DATA lv_line TYPE string. + + lv_line = 'Text'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 4 1. + _generate_parse 'X' 9 1. + _generate_parse 'X' 14 1. + " Generate table with expected values after ordering - _generate_extend 'N' 0 27 ''. + _generate_order 'X' 0 5 '<'. + _generate_order 'X' 9 6 '<'. - test( iv_line = lv_line iv_filename = lv_filename ). + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend '.' 5 4 ''. + _generate_extend 'X' 9 6 '<'. - ENDMETHOD. "test08 -ENDCLASS. " ltcl_syntax_highlighter1 IMPLEMENTATION + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_01 + + METHOD test_xml_02. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 5 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 6 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 6 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_02 + + METHOD test_xml_03. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 4 10. + _generate_parse 'V' 15 7. + _generate_parse 'X' 23 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 4 '<'. + _generate_order 'A' 4 10 ''. + _generate_order 'V' 15 7 ''. + _generate_order 'X' 22 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 4 '<'. + _generate_extend 'A' 4 10 ''. + _generate_extend '.' 14 1 ''. + _generate_extend 'V' 15 7 ''. + _generate_extend 'X' 22 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_03 + + METHOD test_xml_04. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 5 8. + _generate_parse 'V' 14 5. + _generate_parse 'X' 20 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 5 '<'. + _generate_order 'A' 5 8 ''. + _generate_order 'V' 14 5 ''. + _generate_order 'X' 19 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend 'A' 5 8 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 5 ''. + _generate_extend 'X' 19 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_04 + + METHOD test_xml_05. + + DATA lv_line TYPE string. + + lv_line = '"text"'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 7 6. + _generate_parse 'V' 14 4. + _generate_parse 'A' 18 6. + _generate_parse 'V' 25 4. + _generate_parse 'X' 29 1. + _generate_parse 'V' 30 6. + _generate_parse 'X' 36 1. + _generate_parse 'X' 44 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 7 '<'. + _generate_order 'A' 7 6 ''. + _generate_order 'V' 14 4 ''. + _generate_order 'A' 18 6 ''. + _generate_order 'V' 25 4 ''. + _generate_order 'X' 29 1 '>'. + _generate_order 'X' 36 9 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 7 '<'. + _generate_extend 'A' 7 6 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 4 ''. + _generate_extend 'A' 18 6 ''. + _generate_extend '.' 24 1 ''. + _generate_extend 'V' 25 4 ''. + _generate_extend 'X' 29 1 '>'. + _generate_extend '.' 30 6 ''. + _generate_extend 'X' 36 9 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_05 +ENDCLASS. " ltcl_syntax_cases IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter2 DEFINITION +* CLASS ltcl_syntax_basic_logic DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter2 DEFINITION FINAL +CLASS ltcl_syntax_basic_logic DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. DATA mo TYPE REF TO lcl_syntax_highlighter. - METHODS: process_line FOR TESTING. - METHODS: format_line FOR TESTING. - METHODS: apply_style FOR TESTING. + METHODS: + setup, + process_line FOR TESTING, + format_line FOR TESTING, + apply_style FOR TESTING. -ENDCLASS. " ltcl_syntax_highlighter2 +ENDCLASS. " ltcl_syntax_basic_logic *----------------------------------------------------------------------* * CLASS ltcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. +CLASS ltcl_syntax_basic_logic IMPLEMENTATION. + + METHOD setup. + mo = lcl_syntax_highlighter=>create( '*.abap' ). + ENDMETHOD. " setup + METHOD format_line. DATA: lv_line TYPE string, lv_line_act TYPE string, - lv_line_exp TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + lv_line_exp TYPE string. lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT @@ -1023,29 +1174,22 @@ CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. ENDMETHOD. " format_line METHOD apply_style. - DATA: - lv_line_act TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + DATA lv_line_act TYPE string. " Call the method and compare results lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT - iv_class = lcl_syntax_highlighter=>c_css-keyword ). + iv_class = lcl_syntax_abap=>c_css-keyword ). cl_abap_unit_assert=>assert_equals( act = lv_line_act exp = 'CALL FUNCTION' "#EC NOTEXT msg = 'Failure during applying of style.' ). "#EC NOTEXT + ENDMETHOD. " apply_style METHOD process_line. - DATA: - lv_line_act TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + DATA lv_line_act TYPE string. " Call the method with empty parameter and compare results lv_line_act = mo->process_line( iv_line = '' ). @@ -1060,6 +1204,7 @@ CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = lv_line_act exp = '* CALL FUNCTION' "#EC NOTEXT msg = 'Failure in method process_line.' ). "#EC NOTEXT + ENDMETHOD. " process_line ENDCLASS. " ltcl_syntax_highlighter \ No newline at end of file From 5af19e6200fba9636f71e9f6d0ea4d30be1fa7bc Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 14 Dec 2016 19:53:43 +0200 Subject: [PATCH 04/20] faster abap syntax (hash vs regex) #443 --- src/zabapgit_syntax_highlighter.prog.abap | 200 +++++++++++++--------- 1 file changed, 115 insertions(+), 85 deletions(-) diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 65f8b1601..06a5bd184 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -1,9 +1,6 @@ *&---------------------------------------------------------------------* *& Include ZABAPGIT_SYNTAX_HIGHLIGHTER *&---------------------------------------------------------------------* -*&---------------------------------------------------------------------* -*& Class lcl_syntax_highligher -*&---------------------------------------------------------------------* CLASS ltcl_syntax_cases DEFINITION DEFERRED. CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED. @@ -52,8 +49,8 @@ CLASS lcl_syntax_highlighter DEFINITION ABSTRACT DATA mt_rules TYPE STANDARD TABLE OF ty_rule. METHODS parse_line - IMPORTING iv_line TYPE string - RETURNING VALUE(rt_matches) TYPE ty_match_tt. + IMPORTING iv_line TYPE string + EXPORTING et_matches TYPE ty_match_tt. METHODS order_matches ABSTRACT IMPORTING iv_line TYPE string @@ -78,51 +75,49 @@ ENDCLASS. " lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* * CLASS lcl_syntax_abap DEFINITION *----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. PUBLIC SECTION. - CLASS-METHODS class_constructor. - METHODS constructor. + CLASS-METHODS class_constructor. + METHODS constructor. CONSTANTS: BEGIN OF c_css, keyword TYPE string VALUE 'keyword', "#EC NOTEXT text TYPE string VALUE 'text', "#EC NOTEXT comment TYPE string VALUE 'comment', "#EC NOTEXT - END OF c_css. + END OF c_css, - CONSTANTS: BEGIN OF c_token, keyword TYPE c VALUE 'K', "#EC NOTEXT text TYPE c VALUE 'T', "#EC NOTEXT comment TYPE c VALUE 'C', "#EC NOTEXT - END OF c_token. + END OF c_token, + + BEGIN OF c_regex, + comment TYPE string VALUE '##|"|^\*', + text TYPE string VALUE '`|''|\||\{|\}', + keyword TYPE string VALUE '&&|\b[-_a-z0-9]+\b', + END OF c_regex. PROTECTED SECTION. - CLASS-DATA: - c_keyword_regex TYPE REF TO cl_abap_regex, " Temporary - BEGIN OF c_regex, - comment TYPE string, - text TYPE string, - keyword TYPE string, - END OF c_regex. + CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line. - CLASS-METHODS get_keywords - RETURNING VALUE(rv_string) TYPE string. + CLASS-METHODS init_keywords. + CLASS-METHODS is_keyword + IMPORTING iv_chunk TYPE string + RETURNING VALUE(rv_yes) TYPE abap_bool. METHODS order_matches REDEFINITION. + METHODS parse_line REDEFINITION. ENDCLASS. " lcl_syntax_abap DEFINITION *----------------------------------------------------------------------* * CLASS lcl_syntax_xml DEFINITION *----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. PUBLIC SECTION. @@ -134,24 +129,22 @@ CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT attr TYPE string VALUE 'attr', "#EC NOTEXT attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT - END OF c_css. + END OF c_css, - CONSTANTS: BEGIN OF c_token, xml_tag TYPE c VALUE 'X', "#EC NOTEXT attr TYPE c VALUE 'A', "#EC NOTEXT attr_val TYPE c VALUE 'V', "#EC NOTEXT - END OF c_token. + END OF c_token, + + BEGIN OF c_regex, + xml_tag TYPE string VALUE '[<>]', "#EC NOTEXT + attr TYPE string VALUE '\s[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT + attr_val TYPE string VALUE '["''][^''"]+[''"]', "#EC NOTEXT + END OF c_regex. PROTECTED SECTION. - CLASS-DATA: - BEGIN OF c_regex, - xml_tag TYPE string, - attr TYPE string, - attr_val TYPE string, - END OF c_regex. - METHODS order_matches REDEFINITION. ENDCLASS. " lcl_syntax_xml DEFINITION @@ -207,6 +200,8 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. TYPE match_result, TYPE ty_match. + CLEAR et_matches. + " Process syntax-dependent regex table and find all matches LOOP AT mt_rules ASSIGNING . lo_regex = -regex. @@ -219,7 +214,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. ls_match-token = -token. ls_match-offset = -offset. ls_match-length = -length. - APPEND ls_match TO rt_matches. + APPEND ls_match TO et_matches. ENDLOOP. ENDLOOP. @@ -305,7 +300,8 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. RETURN. ENDIF. - lt_matches = me->parse_line( iv_line = iv_line ). + me->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = lt_matches ). me->order_matches( EXPORTING iv_line = iv_line CHANGING ct_matches = lt_matches ). @@ -330,39 +326,40 @@ CLASS lcl_syntax_abap IMPLEMENTATION. METHOD class_constructor. - CREATE OBJECT c_keyword_regex - EXPORTING - pattern = '&&|\b(' && get_keywords( ) && ')\b' - ignore_case = abap_true. + init_keywords( ). ENDMETHOD. " class_constructor + METHOD is_keyword. + + DATA lv_str TYPE string. + + lv_str = to_upper( iv_chunk ). + READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS. + rv_yes = boolc( sy-subrc = 0 ). + + ENDMETHOD. " is_keyword. + METHOD constructor. DATA ls_rule LIKE LINE OF mt_rules. super->constructor( ). - " Declare regular expressions' constants - c_regex-comment = '##|"|^\*'. "#EC NOTEXT - c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT - " Initialize instances of regular expression + _add_rule keyword. _add_rule comment. _add_rule text. - " Temporary - ls_rule-regex = c_keyword_regex. - ls_rule-token = c_token-keyword. - ls_rule-style = c_css-keyword. - APPEND ls_rule TO mt_rules. - ENDMETHOD. " constructor - METHOD get_keywords. + METHOD init_keywords. - rv_string = - '\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && + DATA: lv_keywords TYPE string, + lt_keywords TYPE STANDARD TABLE OF string. + + lv_keywords = + '&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY' && '|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' && '|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' && '|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' && @@ -435,17 +432,18 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION' && '|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE' && '|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE' && - '|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL' && - '|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO' && - '|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECTION' && - '|SELECTIONS|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS' && - '|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' && - '|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE' && - '|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP' && - '|STANDARD|STARTING|START-OF-SELECTION|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO' && - '|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE' && - '|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED' && - '|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' && + '|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP' && + '|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC' && + '|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH' && + '|SECONDARY|SECONDS|SECTION|SELECT|SELECTION|SELECTIONS|SELECTION-SCREEN|SELECTION-SET' && + '|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET' && + '|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE' && + '|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL' && + '|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|STARTING|START-OF-SELECTION|STATE' && + '|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE' && + '|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT' && + '|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH' && + '|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' && '|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP' && '|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP' && '|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE' && @@ -457,7 +455,31 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. - ENDMETHOD. " get_keywords. + SPLIT lv_keywords AT '|' INTO TABLE lt_keywords. + gt_keywords = lt_keywords. " Hash table + + ENDMETHOD. " init_keywords + + METHOD parse_line. "REDEFINITION + + DATA lv_index TYPE i. + + FIELD-SYMBOLS LIKE LINE OF et_matches. + + super->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = et_matches ). + + " Remove non-keywords + LOOP AT et_matches ASSIGNING WHERE token = c_token-keyword. + lv_index = sy-tabix. + IF abap_false = is_keyword( substring( val = iv_line + off = -offset + len = -length ) ). + DELETE et_matches INDEX lv_index. + ENDIF. + ENDLOOP. + + ENDMETHOD. " parse_line. METHOD order_matches. @@ -499,21 +521,23 @@ CLASS lcl_syntax_abap IMPLEMENTATION. CONTINUE. WHEN c_token-text. - -text_tag = substring( val = iv_line off = -offset len = -length ). + -text_tag = substring( val = iv_line + off = -offset + len = -length ). IF lv_prev_token = c_token-text. IF -text_tag = -text_tag. -length = -offset + -length - -offset. CLEAR lv_prev_token. ELSEIF -text_tag = '}' AND -text_tag = '{'. - -length = -offset - -offset - 1. " Shifted } out of highlight - -offset = -offset + 1. " Shifted { out of highlight + -length = -offset - -offset - 1. " Shift } out of scope + -offset = -offset + 1. " Shift { out of scope CLEAR lv_prev_token. ELSEIF -text_tag = '{'. -length = -offset - -offset. CLEAR lv_prev_token. ELSEIF -text_tag = '}'. -length = -offset - -offset. - -offset = -offset + 1. " Shifted } out of highlight + -offset = -offset + 1. " Shift } out of scope CLEAR lv_prev_token. ENDIF. DELETE ct_matches INDEX lv_index. @@ -543,10 +567,6 @@ CLASS lcl_syntax_xml IMPLEMENTATION. super->constructor( ). - c_regex-xml_tag = '[<>]'. "#EC NOTEXT - c_regex-attr = '\s[-a-z:_0-9]+\s*(?==)'. "#EC NOTEXT - c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT - " Initialize instances of regular expressions _add_rule xml_tag. _add_rule attr. @@ -575,13 +595,19 @@ CLASS lcl_syntax_xml IMPLEMENTATION. CASE -token. WHEN c_token-xml_tag. - -text_tag = substring( val = iv_line off = -offset len = -length ). - IF -text_tag = '>' AND lv_prev_token = c_token-xml_tag. " No other matches between two tags + -text_tag = substring( val = iv_line + off = -offset + len = -length ). + + " No other matches between two tags + IF -text_tag = '>' AND lv_prev_token = c_token-xml_tag. lv_state = 'C'. -length = -offset - -offset + -length. DELETE ct_matches INDEX lv_index. CONTINUE. - ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. " Adjust length and offset of closing tag + + " Adjust length and offset of closing tag + ELSEIF -text_tag = '>' AND lv_prev_token <> c_token-xml_tag. lv_state = 'C'. -length = -offset - -offset - -length + -length. -offset = -offset + -length. @@ -677,7 +703,8 @@ CLASS ltcl_syntax_cases IMPLEMENTATION. lo = lcl_syntax_highlighter=>create( iv_filename ). - lt_matches_act = lo->parse_line( iv_line = iv_line ). + lo->parse_line( EXPORTING iv_line = iv_line + IMPORTING et_matches = lt_matches_act ). SORT lt_matches_act BY offset. @@ -1181,9 +1208,10 @@ CLASS ltcl_syntax_basic_logic IMPLEMENTATION. lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT iv_class = lcl_syntax_abap=>c_css-keyword ). - cl_abap_unit_assert=>assert_equals( act = lv_line_act - exp = 'CALL FUNCTION' "#EC NOTEXT - msg = 'Failure during applying of style.' ). "#EC NOTEXT + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = 'CALL FUNCTION' "#EC NOTEXT + msg = 'Failure during applying of style.' ). "#EC NOTEXT ENDMETHOD. " apply_style @@ -1194,16 +1222,18 @@ CLASS ltcl_syntax_basic_logic IMPLEMENTATION. " Call the method with empty parameter and compare results lv_line_act = mo->process_line( iv_line = '' ). - cl_abap_unit_assert=>assert_equals( act = lv_line_act - exp = '' - msg = 'Failure in method process_line.' ). "#EC NOTEXT + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = '' + msg = 'Failure in method process_line.' ). "#EC NOTEXT " Call the method with non-empty line and compare results lv_line_act = mo->process_line( iv_line = '* CALL FUNCTION' ). "#EC NOTEXT - cl_abap_unit_assert=>assert_equals( act = lv_line_act - exp = '* CALL FUNCTION' "#EC NOTEXT - msg = 'Failure in method process_line.' ). "#EC NOTEXT + cl_abap_unit_assert=>assert_equals( + act = lv_line_act + exp = '* CALL FUNCTION' "#EC NOTEXT + msg = 'Failure in method process_line.' ). "#EC NOTEXT ENDMETHOD. " process_line From 79d74c06f16a13e4b1abc67dbf7e0000a855ce57 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 15 Dec 2016 22:24:09 +0200 Subject: [PATCH 05/20] linter fix --- src/zabapgit_syntax_highlighter.prog.abap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 06a5bd184..c80816ab0 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -1076,7 +1076,7 @@ CLASS ltcl_syntax_cases IMPLEMENTATION. ENDMETHOD. " test_xml_03 - METHOD test_xml_04. + METHOD test_xml_04. DATA lv_line TYPE string. @@ -1105,7 +1105,7 @@ CLASS ltcl_syntax_cases IMPLEMENTATION. ENDMETHOD. " test_xml_04 - METHOD test_xml_05. + METHOD test_xml_05. DATA lv_line TYPE string. @@ -1146,6 +1146,7 @@ CLASS ltcl_syntax_cases IMPLEMENTATION. do_test( iv_line = lv_line iv_filename = '*.xml' ). ENDMETHOD. " test_xml_05 + ENDCLASS. " ltcl_syntax_cases IMPLEMENTATION *----------------------------------------------------------------------* From e4ee163858d11c31337c027eeb6cc3df4c82037c Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 16 Dec 2016 07:51:12 +0000 Subject: [PATCH 06/20] bump version to v1.24.7 --- src/zabapgit.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 99d7f4f46..410f97ba6 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.24.6'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.24.7'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) From 4cec7f6094b4e70624327d90583aaf5d8ade4123 Mon Sep 17 00:00:00 2001 From: larshp Date: Fri, 16 Dec 2016 07:56:42 +0000 Subject: [PATCH 07/20] change case, ABAPGit -> abapGit --- src/zabapgit_objects.prog.abap | 2 +- src/zabapgit_services_abapgit.prog.abap | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 30887800b..de9c64f8b 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -768,7 +768,7 @@ CLASS lcl_objects_bridge IMPLEMENTATION. * No exception in class-contructor possible. * Anyway, a shortdump is more appropriate in this case ASSERT 'There must not be' = - |multiple ABAPGit-Plugins for the same object type { + |multiple abapGit-Plugins for the same object type { ls_objtype_map-obj_typ }|. ENDIF. ENDLOOP. diff --git a/src/zabapgit_services_abapgit.prog.abap b/src/zabapgit_services_abapgit.prog.abap index 1b7fb6efa..12fa34282 100644 --- a/src/zabapgit_services_abapgit.prog.abap +++ b/src/zabapgit_services_abapgit.prog.abap @@ -37,7 +37,7 @@ CLASS lcl_services_abapgit DEFINITION FINAL. iv_text TYPE c iv_url TYPE string iv_package TYPE devclass - RAISING lcx_exception. + RAISING lcx_exception. ENDCLASS. "lcl_services_abapgit @@ -78,7 +78,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. RETURN. ENDIF. - lv_text = |Confirm to install current version of ABAPGit to package { c_package_abapgit }|. + lv_text = |Confirm to install current version of abapGit to package { c_package_abapgit }|. do_install( iv_title = lc_title iv_text = lv_text @@ -100,7 +100,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. RETURN. ENDIF. - lv_text = |Confirm to install current version ABAPGit plugins to package { + lv_text = |Confirm to install current version abapGit plugins to package { c_package_plugins }|. do_install( iv_title = lc_title From 4754d3632d6eb48cb5297970f2696ded420c4a66 Mon Sep 17 00:00:00 2001 From: atsy Date: Fri, 16 Dec 2016 11:36:58 +0200 Subject: [PATCH 08/20] ag, agpi instllation adds fav, fix #506 --- src/zabapgit_services_abapgit.prog.abap | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zabapgit_services_abapgit.prog.abap b/src/zabapgit_services_abapgit.prog.abap index 12fa34282..00e8dd053 100644 --- a/src/zabapgit_services_abapgit.prog.abap +++ b/src/zabapgit_services_abapgit.prog.abap @@ -140,6 +140,7 @@ CLASS lcl_services_abapgit IMPLEMENTATION. lo_repo->status( ). " check for errors lo_repo->deserialize( ). + lcl_services_repo=>toggle_favorite( lo_repo->get_key( ) ). ENDIF. COMMIT WORK. From e763228fc53287e3e66f702ffc20d2753eb53447 Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Wed, 21 Dec 2016 10:30:23 +0100 Subject: [PATCH 09/20] Tests dependency isolation for creation --- src/zabapgit_object_clas.prog.abap | 216 ++++++++++++++++++++++++----- src/zabapgit_objects.prog.abap | 2 +- 2 files changed, 181 insertions(+), 37 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 635050282..de70546aa 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -17,6 +17,24 @@ INTERFACE lif_object_oriented_object. is_properties TYPE any RAISING lcx_exception. +* generate_locals +* CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' +* EXPORTING +* clskey = ls_clskey +* force = seox_true +* locals_def = lt_locals_def +* locals_imp = lt_locals_imp +* locals_mac = lt_locals_mac +* locals_testclasses = lt_testclasses +* EXCEPTIONS +* not_existing = 1 +* model_only = 2 +* locals_not_generated = 3 +* locals_not_initialised = 4 +* OTHERS = 5. +* IF sy-subrc <> 0. +* lcx_exception=>raise( 'error from generate_locals' ). +* ENDIF. ENDINTERFACE. CLASS lcl_object_oriented_class DEFINITION. @@ -72,17 +90,27 @@ CLASS lcl_object_oriented_interface IMPLEMENTATION. ENDMETHOD. ENDCLASS. -CLASS lcl_object_oriented_factory DEFINITION. +CLASS lth_oo_factory_injector DEFINITION DEFERRED. + +CLASS lcl_object_oriented_factory DEFINITION + FRIENDS lth_oo_factory_injector. PUBLIC SECTION. CLASS-METHODS: - create + make IMPORTING iv_object_type TYPE tadir-object RETURNING VALUE(ro_object_oriented_object) TYPE REF TO lif_object_oriented_object. + PRIVATE SECTION. + CLASS-DATA: + go_object_oriented_object TYPE REF TO lif_object_oriented_object. ENDCLASS. CLASS lcl_object_oriented_factory IMPLEMENTATION. - METHOD create. + METHOD make. + IF go_object_oriented_object IS BOUND. + ro_object_oriented_object = go_object_oriented_object. + RETURN. + ENDIF. IF iv_object_type = 'CLAS'. CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_class. ELSEIF iv_object_type = 'INTF'. @@ -91,6 +119,18 @@ CLASS lcl_object_oriented_factory IMPLEMENTATION. ENDMETHOD. ENDCLASS. +CLASS lth_oo_factory_injector DEFINITION FOR TESTING. + PUBLIC SECTION. + CLASS-METHODS: + inject + IMPORTING + io_object_oriented_object TYPE REF TO lif_object_oriented_object. +ENDCLASS. +CLASS lth_oo_factory_injector IMPLEMENTATION. + METHOD inject. + lcl_object_oriented_factory=>go_object_oriented_object = io_object_oriented_object. + ENDMETHOD. +ENDCLASS. CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. @@ -1004,51 +1044,32 @@ CLASS lcl_object_clas IMPLEMENTATION. ls_clskey-clsname = ms_item-obj_name. + DATA lo_object_oriented_object TYPE REF TO lif_object_oriented_object. + lo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + CASE ms_item-obj_type. WHEN 'CLAS'. io_xml->read( EXPORTING iv_name = 'VSEOCLASS' CHANGING cg_data = ls_vseoclass ). - CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' + lo_object_oriented_object->create( EXPORTING - devclass = iv_package - overwrite = seox_true + iv_package = iv_package CHANGING - class = ls_vseoclass - EXCEPTIONS - existing = 1 - is_interface = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). - ENDIF. + is_properties = ls_vseoclass + ). WHEN 'INTF'. io_xml->read( EXPORTING iv_name = 'VSEOINTERF' CHANGING cg_data = ls_vseointerf ). - CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' - EXPORTING - devclass = iv_package - overwrite = seox_true - CHANGING - interface = ls_vseointerf - EXCEPTIONS - existing = 1 - is_class = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ). - ENDIF. + lo_object_oriented_object->create( + EXPORTING + iv_package = iv_package + CHANGING + is_properties = ls_vseointerf + ). WHEN OTHERS. ASSERT 0 = 1. @@ -1158,4 +1179,127 @@ CLASS lcl_object_clas IMPLEMENTATION. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. -ENDCLASS. "lcl_object_CLAS IMPLEMENTATION \ No newline at end of file +ENDCLASS. "lcl_object_CLAS IMPLEMENTATION + +CLASS ltd_spy_oo_object DEFINITION FOR TESTING. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object. + DATA: + mv_package TYPE devclass, + mv_overwrite TYPE seox_boolean, + mr_properties TYPE REF TO data. +ENDCLASS. +CLASS ltd_spy_oo_object IMPLEMENTATION. + METHOD lif_object_oriented_object~create. + FIELD-SYMBOLS: TYPE any. + ASSIGN is_properties to . + " = is_properties. + GET reference of into mr_properties. + mv_package = iv_package. + mv_overwrite = iv_overwrite. + ENDMETHOD. +ENDCLASS. + +CLASS ltd_fake_object_files DEFINITION FOR TESTING + INHERITING FROM lcl_objects_files. + PUBLIC SECTION. + METHODS constructor. + METHODS read_abap REDEFINITION. + DATA: + lt_sources TYPE seop_source_string, + lt_local_definitions TYPE seop_source_string, + lt_local_implementations TYPE seop_source_string, + lt_local_macros TYPE seop_source_string, + lt_test_classes TYPE seop_source_string. +ENDCLASS. +CLASS ltd_fake_object_files IMPLEMENTATION. + METHOD read_abap. + CASE iv_extra. + WHEN 'locals_def'. + rt_abap = lt_local_definitions. + WHEN 'locals_imp'. + rt_abap = lt_local_implementations. + WHEN 'macros'. + rt_abap = lt_local_macros. + WHEN 'testclasses'. + rt_abap = lt_test_classes. + WHEN OTHERS. + rt_abap = lt_sources. + RETURN. + ENDCASE. + + cl_abap_unit_assert=>assert_false( iv_error ). + ENDMETHOD. + METHOD constructor. + DATA ls_empty_item TYPE ty_item. + super->constructor( ls_empty_item ). + APPEND 'source' TO me->lt_sources. + APPEND 'definition' TO me->lt_local_definitions. + APPEND 'implementation' TO me->lt_local_implementations. + APPEND 'macro' TO me->lt_local_macros. + APPEND 'test' TO me->lt_test_classes. + ENDMETHOD. + +ENDCLASS. + +CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. + PRIVATE SECTION. + METHODS: + create FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltc_class_deserialization IMPLEMENTATION. + + METHOD create. + DATA spy_oo_object TYPE REF TO ltd_spy_oo_object. + DATA fake_object_files TYPE REF TO ltd_fake_object_files. + CREATE OBJECT fake_object_files. + CREATE OBJECT spy_oo_object. + + lth_oo_factory_injector=>inject( spy_oo_object ). + + DATA lo_class TYPE REF TO lif_object. + CREATE OBJECT lo_class TYPE lcl_object_clas + EXPORTING + is_item = VALUE #( devclass = 'CLAS' obj_name = 'zclass' obj_type = 'CLAS' ) + iv_language = sy-langu. + lo_class->mo_files = fake_object_files. + + DATA xml_input TYPE REF TO lcl_xml_input. + DATA xml_out TYPE REF TO lcl_xml_output. + DATA: ls_class_properties TYPE vseoclass. + ls_class_properties-clsname = 'class_name'. + CREATE OBJECT xml_out. + xml_out->add( + EXPORTING + iv_name = 'VSEOCLASS' + ig_data = ls_class_properties + ). + + CREATE OBJECT xml_input + EXPORTING + iv_xml = xml_out->render( ). + lo_class->deserialize( + iv_package = 'package_name' + io_xml = xml_input + ). + + lcl_objects_activation=>clear( ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mr_properties + exp = ls_class_properties + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mv_overwrite + exp = abap_true + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mv_package + exp = 'package_name' + ). + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index 30887800b..a76058992 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -187,7 +187,7 @@ ENDCLASS. "lcl_objects_activation IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_objects_files DEFINITION FINAL. +CLASS lcl_objects_files DEFINITION . PUBLIC SECTION. METHODS: From 9ade177c49aefd83d34b45fb8ded87c282f19aef Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Wed, 21 Dec 2016 14:18:18 +0100 Subject: [PATCH 10/20] class_abap_deserializing --- src/zabapgit_definitions.prog.abap | 2 + src/zabapgit_object_clas.prog.abap | 433 ++++++++++++++++++++++------- 2 files changed, 334 insertions(+), 101 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 139849bfe..5f0b0e1bd 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -114,6 +114,8 @@ TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. +TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY. + CONSTANTS: BEGIN OF gc_state, " https://git-scm.com/docs/git-status unchanged TYPE char1 VALUE '', added TYPE char1 VALUE 'A', diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index de70546aa..0fe33e381 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -15,31 +15,150 @@ INTERFACE lif_object_oriented_object. iv_overwrite TYPE seox_boolean DEFAULT seox_true CHANGING is_properties TYPE any + RAISING + lcx_exception, + generate_locals + IMPORTING + is_key TYPE seoclskey + iv_force TYPE seox_boolean DEFAULT seox_true + it_local_definitions TYPE seop_source_string OPTIONAL + it_local_implementations TYPE seop_source_string OPTIONAL + it_local_macros TYPE seop_source_string OPTIONAL + it_local_test_classes TYPE seop_source_string OPTIONAL + RAISING + lcx_exception, + deserialize_source + IMPORTING + is_key TYPE seoclskey + it_source TYPE ty_string_tt + RAISING + lcx_exception + cx_sy_dyn_call_error, + update_descriptions + IMPORTING + is_key TYPE seoclskey + it_descriptions TYPE ty_seocompotx_tt, + add_to_activation_list + IMPORTING + is_item TYPE ty_item RAISING lcx_exception. -* generate_locals -* CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' -* EXPORTING -* clskey = ls_clskey -* force = seox_true -* locals_def = lt_locals_def -* locals_imp = lt_locals_imp -* locals_mac = lt_locals_mac -* locals_testclasses = lt_testclasses -* EXCEPTIONS -* not_existing = 1 -* model_only = 2 -* locals_not_generated = 3 -* locals_not_initialised = 4 -* OTHERS = 5. -* IF sy-subrc <> 0. -* lcx_exception=>raise( 'error from generate_locals' ). -* ENDIF. ENDINTERFACE. -CLASS lcl_object_oriented_class DEFINITION. +CLASS lcl_object_oriented_base DEFINITION ABSTRACT. PUBLIC SECTION. INTERFACES: lif_object_oriented_object. + PRIVATE SECTION. + METHODS deserialize_abap_source_old + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception. + + METHODS deserialize_abap_source_new + IMPORTING is_clskey TYPE seoclskey + it_source TYPE ty_string_tt + RAISING lcx_exception + cx_sy_dyn_call_error. +ENDCLASS. + +CLASS lcl_object_oriented_base IMPLEMENTATION. + + METHOD lif_object_oriented_object~create. + "Subclass responsibility + RETURN. + ENDMETHOD. + + METHOD lif_object_oriented_object~deserialize_source. + TRY. + deserialize_abap_source_new( + is_clskey = is_key + it_source = it_source ). + CATCH cx_sy_dyn_call_error. + deserialize_abap_source_old( + is_clskey = is_key + it_source = it_source ). + ENDTRY. + ENDMETHOD. + + METHOD lif_object_oriented_object~generate_locals. + "Subclass responsibility + RETURN. + ENDMETHOD. + + METHOD deserialize_abap_source_old. + "for backwards compatability down to 702 + + 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. + lcx_exception=>raise( 'error from CL_OO_SOURCE' ). + ENDIF. + + TRY. + lo_source->access_permission( seok_access_modify ). + lo_source->set_source( it_source ). + lo_source->save( ). + lo_source->access_permission( seok_access_free ). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'permission error' ). + CATCH cx_oo_source_save_failure. + lcx_exception=>raise( 'save failure' ). + ENDTRY. + + ENDMETHOD. + + METHOD deserialize_abap_source_new. + DATA: lo_factory TYPE REF TO object, + lo_source TYPE REF TO object. + + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_factory. + + CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') + EXPORTING + clif_name = is_clskey-clsname + RECEIVING + result = lo_source. + + TRY. + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'source_new, access permission exception' ). + ENDTRY. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') + EXPORTING + source = it_source. + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). + + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). + + ENDMETHOD. + METHOD lif_object_oriented_object~add_to_activation_list. + lcl_objects_activation=>add_item( is_item ). + ENDMETHOD. + + METHOD lif_object_oriented_object~update_descriptions. + DELETE FROM seocompotx WHERE clsname = is_key-clsname. + INSERT seocompotx FROM TABLE it_descriptions. + ENDMETHOD. +ENDCLASS. + + +CLASS lcl_object_oriented_class DEFINITION + INHERITING FROM lcl_object_oriented_base. + PUBLIC SECTION. + METHODS: + lif_object_oriented_object~create REDEFINITION, + lif_object_oriented_object~generate_locals REDEFINITION. ENDCLASS. CLASS lcl_object_oriented_class IMPLEMENTATION. METHOD lif_object_oriented_object~create. @@ -61,11 +180,32 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). ENDIF. ENDMETHOD. + METHOD lif_object_oriented_object~generate_locals. + CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' + EXPORTING + clskey = is_key + force = iv_force + locals_def = it_local_definitions + locals_imp = it_local_implementations + locals_mac = it_local_macros + locals_testclasses = it_local_test_classes + EXCEPTIONS + not_existing = 1 + model_only = 2 + locals_not_generated = 3 + locals_not_initialised = 4 + OTHERS = 5. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from generate_locals' ). + ENDIF. + ENDMETHOD. ENDCLASS. -CLASS lcl_object_oriented_interface DEFINITION. +CLASS lcl_object_oriented_interface DEFINITION + INHERITING FROM lcl_object_oriented_base. PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. + METHODS: + lif_object_oriented_object~create REDEFINITION. ENDCLASS. CLASS lcl_object_oriented_interface IMPLEMENTATION. @@ -146,7 +286,7 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. - TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY. + DATA mv_skip_testclass TYPE abap_bool. @@ -861,13 +1001,6 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDMETHOD. "serialize_xml METHOD lif_object~deserialize. - -* function group SEOK -* function group SEOQ -* function group SEOP -* class CL_OO_CLASSNAME_SERVICE -* class CL_OO_SOURCE - deserialize_abap( io_xml = io_xml iv_package = iv_package ). @@ -879,7 +1012,6 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDIF. deserialize_docu( io_xml ). - ENDMETHOD. "deserialize METHOD deserialize_sotr. @@ -1076,42 +1208,30 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDCASE. IF ms_item-obj_type = 'CLAS'. - CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' - EXPORTING - clskey = ls_clskey - force = seox_true - locals_def = lt_locals_def - locals_imp = lt_locals_imp - locals_mac = lt_locals_mac - locals_testclasses = lt_testclasses - EXCEPTIONS - not_existing = 1 - model_only = 2 - locals_not_generated = 3 - locals_not_initialised = 4 - OTHERS = 5. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from generate_locals' ). - ENDIF. + lo_object_oriented_object->generate_locals( + is_key = ls_clskey + iv_force = seox_true + it_local_definitions = lt_locals_def + it_local_implementations = lt_locals_imp + it_local_macros = lt_locals_mac + it_local_test_classes = lt_testclasses + ). ENDIF. - TRY. - deserialize_abap_source_new( - is_clskey = ls_clskey - it_source = lt_source ). - CATCH cx_sy_dyn_call_error. - deserialize_abap_source_old( - is_clskey = ls_clskey - it_source = lt_source ). - ENDTRY. + lo_object_oriented_object->deserialize_source( + is_key = ls_clskey + it_source = lt_source + ). io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' CHANGING cg_data = lt_descriptions ). - DELETE FROM seocompotx WHERE clsname = ls_clskey-clsname. - INSERT seocompotx FROM TABLE lt_descriptions. - lcl_objects_activation=>add_item( ms_item ). + lo_object_oriented_object->update_descriptions( + is_key = ls_clskey + it_descriptions = lt_descriptions + ). + lo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. "deserialize METHOD deserialize_abap_source_old. @@ -1185,19 +1305,55 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING. PUBLIC SECTION. INTERFACES: lif_object_oriented_object. DATA: - mv_package TYPE devclass, - mv_overwrite TYPE seox_boolean, - mr_properties TYPE REF TO data. + mv_package TYPE devclass, + mv_overwrite TYPE seox_boolean, + ms_interface_properties TYPE vseointerf, + ms_class_properties TYPE vseoclass, + ms_locals_key TYPE seoclskey, + mt_local_definitions TYPE rswsourcet, + mt_local_implementations TYPE rswsourcet, + mt_local_macros TYPE rswsourcet, + mt_local_test_classes TYPE rswsourcet, + mv_force TYPE seoflag, + ms_deserialize_key TYPE seoclskey, + mt_source TYPE ty_string_tt, + ms_item_to_activate TYPE ty_item, + mt_descriptions TYPE ty_seocompotx_tt, + ms_description_key TYPE seoclskey. ENDCLASS. CLASS ltd_spy_oo_object IMPLEMENTATION. METHOD lif_object_oriented_object~create. - FIELD-SYMBOLS: TYPE any. - ASSIGN is_properties to . - " = is_properties. - GET reference of into mr_properties. - mv_package = iv_package. - mv_overwrite = iv_overwrite. + IF cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. + ms_interface_properties = is_properties. + ELSE. + ms_class_properties = is_properties. + ENDIF. + mv_package = iv_package. + mv_overwrite = iv_overwrite. ENDMETHOD. + METHOD lif_object_oriented_object~generate_locals. + ms_locals_key = is_key. + mt_local_definitions = it_local_definitions. + mt_local_implementations = it_local_implementations. + mt_local_macros = it_local_macros. + mt_local_test_classes = it_local_test_classes. + mv_force = iv_force. + ENDMETHOD. + + METHOD lif_object_oriented_object~deserialize_source. + ms_deserialize_key = is_key. + mt_source = it_source. + ENDMETHOD. + + METHOD lif_object_oriented_object~add_to_activation_list. + ms_item_to_activate = is_item. + ENDMETHOD. + + METHOD lif_object_oriented_object~update_descriptions. + ms_description_key = is_key. + mt_descriptions = it_descriptions. + ENDMETHOD. + ENDCLASS. CLASS ltd_fake_object_files DEFINITION FOR TESTING @@ -1206,25 +1362,25 @@ CLASS ltd_fake_object_files DEFINITION FOR TESTING METHODS constructor. METHODS read_abap REDEFINITION. DATA: - lt_sources TYPE seop_source_string, - lt_local_definitions TYPE seop_source_string, - lt_local_implementations TYPE seop_source_string, - lt_local_macros TYPE seop_source_string, - lt_test_classes TYPE seop_source_string. + mt_sources TYPE seop_source_string, + mt_local_definitions TYPE seop_source_string, + mt_local_implementations TYPE seop_source_string, + mt_local_macros TYPE seop_source_string, + mt_local_test_classes TYPE seop_source_string. ENDCLASS. CLASS ltd_fake_object_files IMPLEMENTATION. METHOD read_abap. CASE iv_extra. WHEN 'locals_def'. - rt_abap = lt_local_definitions. + rt_abap = mt_local_definitions. WHEN 'locals_imp'. - rt_abap = lt_local_implementations. + rt_abap = mt_local_implementations. WHEN 'macros'. - rt_abap = lt_local_macros. + rt_abap = mt_local_macros. WHEN 'testclasses'. - rt_abap = lt_test_classes. + rt_abap = mt_local_test_classes. WHEN OTHERS. - rt_abap = lt_sources. + rt_abap = mt_sources. RETURN. ENDCASE. @@ -1233,11 +1389,11 @@ CLASS ltd_fake_object_files IMPLEMENTATION. METHOD constructor. DATA ls_empty_item TYPE ty_item. super->constructor( ls_empty_item ). - APPEND 'source' TO me->lt_sources. - APPEND 'definition' TO me->lt_local_definitions. - APPEND 'implementation' TO me->lt_local_implementations. - APPEND 'macro' TO me->lt_local_macros. - APPEND 'test' TO me->lt_test_classes. + APPEND 'source' TO me->mt_sources. + APPEND 'definition' TO me->mt_local_definitions. + APPEND 'implementation' TO me->mt_local_implementations. + APPEND 'macro' TO me->mt_local_macros. + APPEND 'test' TO me->mt_local_test_classes. ENDMETHOD. ENDCLASS. @@ -1245,35 +1401,48 @@ ENDCLASS. CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. METHODS: - create FOR TESTING RAISING cx_static_check. + deserialize FOR TESTING RAISING cx_static_check. ENDCLASS. CLASS ltc_class_deserialization IMPLEMENTATION. - METHOD create. + METHOD deserialize. DATA spy_oo_object TYPE REF TO ltd_spy_oo_object. DATA fake_object_files TYPE REF TO ltd_fake_object_files. + DATA xml_input TYPE REF TO lcl_xml_input. + DATA xml_out TYPE REF TO lcl_xml_output. + DATA: ls_class_properties TYPE vseoclass. + DATA lo_class TYPE REF TO lif_object. + DATA ls_description TYPE seocompotx. + DATA lt_descriptions TYPE TABLE OF seocompotx. + CREATE OBJECT fake_object_files. CREATE OBJECT spy_oo_object. lth_oo_factory_injector=>inject( spy_oo_object ). - DATA lo_class TYPE REF TO lif_object. + DATA(ls_item) = VALUE ty_item( devclass = 'package_name' obj_name = 'zcl_class' obj_type = 'CLAS' ). + CREATE OBJECT lo_class TYPE lcl_object_clas EXPORTING - is_item = VALUE #( devclass = 'CLAS' obj_name = 'zclass' obj_type = 'CLAS' ) + is_item = ls_item iv_language = sy-langu. lo_class->mo_files = fake_object_files. - DATA xml_input TYPE REF TO lcl_xml_input. - DATA xml_out TYPE REF TO lcl_xml_output. - DATA: ls_class_properties TYPE vseoclass. - ls_class_properties-clsname = 'class_name'. + + ls_class_properties-clsname = 'zcl_class'. CREATE OBJECT xml_out. xml_out->add( - EXPORTING - iv_name = 'VSEOCLASS' - ig_data = ls_class_properties + iv_name = 'VSEOCLASS' + ig_data = ls_class_properties + ). + + ls_description-clsname = 'zcl_class'. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = lt_descriptions ). CREATE OBJECT xml_input @@ -1284,22 +1453,84 @@ CLASS ltc_class_deserialization IMPLEMENTATION. io_xml = xml_input ). - lcl_objects_activation=>clear( ). - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mr_properties + act = spy_oo_object->ms_class_properties exp = ls_class_properties ). - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mv_overwrite - exp = abap_true - ). + cl_abap_unit_assert=>assert_true( spy_oo_object->mv_overwrite ). cl_abap_unit_assert=>assert_equals( act = spy_oo_object->mv_package exp = 'package_name' ). + + "Local generation + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->ms_locals_key + exp = 'zcl_class' + ). + cl_abap_unit_assert=>assert_true( spy_oo_object->mv_force ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_local_definitions + exp = fake_object_files->mt_local_definitions + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_local_implementations + exp = fake_object_files->mt_local_implementations + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_local_macros + exp = fake_object_files->mt_local_macros + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_local_test_classes + exp = fake_object_files->mt_local_test_classes + ). + + "Deserialization source + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_source + exp = fake_object_files->mt_sources + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->ms_deserialize_key + exp = 'zcl_class' + ). + + "Update descriptions + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_descriptions + exp = lt_descriptions + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->ms_description_key + exp = 'zcl_class' + ). + + "Descriptions + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->mt_descriptions + exp = lt_descriptions + ). + + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->ms_description_key + exp = 'zcl_class' + ). + + "Activation + cl_abap_unit_assert=>assert_equals( + act = spy_oo_object->ms_item_to_activate + exp = ls_item + ). + ENDMETHOD. ENDCLASS. \ No newline at end of file From c0cb1f2a9556844881cd8d3477138160f7772fdd Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Wed, 21 Dec 2016 15:29:27 +0100 Subject: [PATCH 11/20] Breaking into several tests --- src/zabapgit_object_clas.prog.abap | 295 ++++++++++++++++++----------- 1 file changed, 187 insertions(+), 108 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 0fe33e381..29562e8d7 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -1401,136 +1401,215 @@ ENDCLASS. CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. METHODS: - deserialize FOR TESTING RAISING cx_static_check. + setup, + given_a_class_properties + RAISING + lcx_exception, + when_deserializing + RAISING + lcx_exception, + then_should_create_class, + then_it_should_generate_locals, + then_should_deserialize_source, + given_the_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt + RAISING + lcx_exception, + then_shuld_update_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt, + then_it_should_add_activation, + should_create_class FOR TESTING RAISING cx_static_check, + should_generate_locals FOR TESTING RAISING cx_static_check, + should_deserialize_source FOR TESTING RAISING cx_static_check, + should_update_descriptions FOR TESTING RAISING cx_static_check, + should_add_to_activation FOR TESTING RAISING cx_static_check. + + DATA: + mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_class TYPE REF TO lif_object, + ms_class_properties TYPE vseoclass, + ls_item TYPE ty_item. ENDCLASS. CLASS ltc_class_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). - METHOD deserialize. - DATA spy_oo_object TYPE REF TO ltd_spy_oo_object. - DATA fake_object_files TYPE REF TO ltd_fake_object_files. - DATA xml_input TYPE REF TO lcl_xml_input. - DATA xml_out TYPE REF TO lcl_xml_output. - DATA: ls_class_properties TYPE vseoclass. - DATA lo_class TYPE REF TO lif_object. - DATA ls_description TYPE seocompotx. - DATA lt_descriptions TYPE TABLE OF seocompotx. + ls_item-devclass = 'package_name'. + ls_item-obj_name = 'zcl_class'. + ls_item-obj_type = 'CLAS'. - CREATE OBJECT fake_object_files. - CREATE OBJECT spy_oo_object. - - lth_oo_factory_injector=>inject( spy_oo_object ). - - DATA(ls_item) = VALUE ty_item( devclass = 'package_name' obj_name = 'zcl_class' obj_type = 'CLAS' ). - - CREATE OBJECT lo_class TYPE lcl_object_clas + CREATE OBJECT mo_class TYPE lcl_object_clas EXPORTING is_item = ls_item iv_language = sy-langu. - lo_class->mo_files = fake_object_files. + mo_class->mo_files = mo_fake_object_files. + ENDMETHOD. + METHOD should_create_class. + ms_class_properties-clsname = ls_item-obj_name. - ls_class_properties-clsname = 'zcl_class'. - CREATE OBJECT xml_out. - xml_out->add( - iv_name = 'VSEOCLASS' - ig_data = ls_class_properties - ). + given_a_class_properties( ). - ls_description-clsname = 'zcl_class'. + when_deserializing( ). + + then_should_create_class( ). + ENDMETHOD. + + METHOD should_generate_locals. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_generate_locals( ). + ENDMETHOD. + + METHOD should_deserialize_source. + given_a_class_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD should_update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_a_class_properties( ). + + ls_description-clsname = ls_item-obj_name. ls_description-cmpname = 'a_method'. APPEND ls_description TO lt_descriptions. - xml_out->add( - iv_name = 'DESCRIPTIONS' - ig_data = lt_descriptions - ). + given_the_descriptions( lt_descriptions ). - CREATE OBJECT xml_input - EXPORTING - iv_xml = xml_out->render( ). - lo_class->deserialize( - iv_package = 'package_name' - io_xml = xml_input - ). + when_deserializing( ). - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_class_properties - exp = ls_class_properties - ). + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. - cl_abap_unit_assert=>assert_true( spy_oo_object->mv_overwrite ). + METHOD should_add_to_activation. + given_a_class_properties( ). - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mv_package - exp = 'package_name' - ). - - "Local generation - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_locals_key - exp = 'zcl_class' - ). - cl_abap_unit_assert=>assert_true( spy_oo_object->mv_force ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_local_definitions - exp = fake_object_files->mt_local_definitions - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_local_implementations - exp = fake_object_files->mt_local_implementations - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_local_macros - exp = fake_object_files->mt_local_macros - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_local_test_classes - exp = fake_object_files->mt_local_test_classes - ). - - "Deserialization source - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_source - exp = fake_object_files->mt_sources - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_deserialize_key - exp = 'zcl_class' - ). - - "Update descriptions - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_descriptions - exp = lt_descriptions - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_description_key - exp = 'zcl_class' - ). - - "Descriptions - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->mt_descriptions - exp = lt_descriptions - ). - - cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_description_key - exp = 'zcl_class' - ). + when_deserializing( ). "Activation +then_it_should_add_activation( ). + ENDMETHOD. + + METHOD given_a_class_properties. + mo_xml_out->add( + iv_name = 'VSEOCLASS' + ig_data = ms_class_properties + ). + ENDMETHOD. + + + METHOD when_deserializing. + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + mo_class->deserialize( + iv_package = 'package_name' + io_xml = mo_xml_input + ). + ENDMETHOD. + + + METHOD then_should_create_class. + cl_abap_unit_assert=>assert_equals( - act = spy_oo_object->ms_item_to_activate - exp = ls_item + act = mo_spy_oo_object->ms_class_properties + exp = ms_class_properties + ). + + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). ENDMETHOD. + + METHOD then_it_should_generate_locals. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_locals_key + exp = ls_item-obj_name + ). + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_force ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_definitions + exp = mo_fake_object_files->mt_local_definitions + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_implementations + exp = mo_fake_object_files->mt_local_implementations + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_macros + exp = mo_fake_object_files->mt_local_macros + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_test_classes + exp = mo_fake_object_files->mt_local_test_classes + ). + ENDMETHOD. + + + METHOD then_should_deserialize_source. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_source + exp = mo_fake_object_files->mt_sources + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_deserialize_key + exp = ls_item-obj_name + ). + ENDMETHOD. + + + METHOD given_the_descriptions. + mo_xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = it_descriptions + ). + ENDMETHOD. + + + METHOD then_shuld_update_descriptions. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_descriptions + exp = it_descriptions + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_description_key + exp = ls_item-obj_name + ). + ENDMETHOD. + + + METHOD then_it_should_add_activation. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_item_to_activate + exp = ls_item + ). + ENDMETHOD. + ENDCLASS. \ No newline at end of file From 56675067e49cc296a15ecd7257d4c50b13e3a92e Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Wed, 21 Dec 2016 16:03:27 +0100 Subject: [PATCH 12/20] added interface tests --- src/zabapgit_object_clas.prog.abap | 259 ++++++++++++++++++++--------- 1 file changed, 178 insertions(+), 81 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 29562e8d7..feba06bc0 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -1398,42 +1398,98 @@ CLASS ltd_fake_object_files IMPLEMENTATION. ENDCLASS. -CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. - PRIVATE SECTION. - METHODS: - setup, - given_a_class_properties - RAISING - lcx_exception, - when_deserializing - RAISING - lcx_exception, - then_should_create_class, - then_it_should_generate_locals, +CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . + PROTECTED SECTION. + DATA: + mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_oo_object TYPE REF TO lif_object, + ms_item TYPE ty_item. + METHODS: when_deserializing + RAISING + lcx_exception, then_should_deserialize_source, given_the_descriptions IMPORTING it_descriptions TYPE ty_seocompotx_tt RAISING lcx_exception, - then_shuld_update_descriptions - IMPORTING + then_shuld_update_descriptions + IMPORTING it_descriptions TYPE ty_seocompotx_tt, - then_it_should_add_activation, + then_it_should_add_activation. + +ENDCLASS. +CLASS ltc_oo_test IMPLEMENTATION. + + METHOD then_it_should_add_activation. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_item_to_activate + exp = ms_item + ). + ENDMETHOD. + + METHOD then_shuld_update_descriptions. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_descriptions + exp = it_descriptions + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_description_key + exp = ms_item-obj_name + ). + ENDMETHOD. + + METHOD given_the_descriptions. + mo_xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = it_descriptions + ). + ENDMETHOD. + + METHOD then_should_deserialize_source. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_source + exp = mo_fake_object_files->mt_sources + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_deserialize_key + exp = ms_item-obj_name + ). + ENDMETHOD. + + METHOD when_deserializing. + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + mo_oo_object->deserialize( + iv_package = 'package_name' + io_xml = mo_xml_input + ). + ENDMETHOD. +ENDCLASS. + +CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_a_class_properties + RAISING + lcx_exception, + then_should_create_class, + then_it_should_generate_locals, should_create_class FOR TESTING RAISING cx_static_check, should_generate_locals FOR TESTING RAISING cx_static_check, should_deserialize_source FOR TESTING RAISING cx_static_check, should_update_descriptions FOR TESTING RAISING cx_static_check, should_add_to_activation FOR TESTING RAISING cx_static_check. - DATA: - mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, - mo_fake_object_files TYPE REF TO ltd_fake_object_files, - mo_xml_input TYPE REF TO lcl_xml_input, - mo_xml_out TYPE REF TO lcl_xml_output, - mo_class TYPE REF TO lif_object, - ms_class_properties TYPE vseoclass, - ls_item TYPE ty_item. + ms_class_properties TYPE vseoclass. ENDCLASS. CLASS ltc_class_deserialization IMPLEMENTATION. @@ -1443,19 +1499,19 @@ CLASS ltc_class_deserialization IMPLEMENTATION. CREATE OBJECT mo_xml_out. lth_oo_factory_injector=>inject( mo_spy_oo_object ). - ls_item-devclass = 'package_name'. - ls_item-obj_name = 'zcl_class'. - ls_item-obj_type = 'CLAS'. + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. - CREATE OBJECT mo_class TYPE lcl_object_clas + CREATE OBJECT mo_oo_object TYPE lcl_object_clas EXPORTING - is_item = ls_item + is_item = ms_item iv_language = sy-langu. - mo_class->mo_files = mo_fake_object_files. + mo_oo_object->mo_files = mo_fake_object_files. ENDMETHOD. METHOD should_create_class. - ms_class_properties-clsname = ls_item-obj_name. + ms_class_properties-clsname = ms_item-obj_name. given_a_class_properties( ). @@ -1487,14 +1543,14 @@ CLASS ltc_class_deserialization IMPLEMENTATION. given_a_class_properties( ). - ls_description-clsname = ls_item-obj_name. + ls_description-clsname = ms_item-obj_name. ls_description-cmpname = 'a_method'. APPEND ls_description TO lt_descriptions. given_the_descriptions( lt_descriptions ). when_deserializing( ). - then_shuld_update_descriptions( lt_descriptions ). + then_shuld_update_descriptions( lt_descriptions ). ENDMETHOD. METHOD should_add_to_activation. @@ -1502,8 +1558,7 @@ CLASS ltc_class_deserialization IMPLEMENTATION. when_deserializing( ). - "Activation -then_it_should_add_activation( ). + then_it_should_add_activation( ). ENDMETHOD. METHOD given_a_class_properties. @@ -1513,24 +1568,11 @@ then_it_should_add_activation( ). ). ENDMETHOD. - - METHOD when_deserializing. - CREATE OBJECT mo_xml_input - EXPORTING - iv_xml = mo_xml_out->render( ). - mo_class->deserialize( - iv_package = 'package_name' - io_xml = mo_xml_input - ). - ENDMETHOD. - - METHOD then_should_create_class. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_class_properties - exp = ms_class_properties - ). + act = mo_spy_oo_object->ms_class_properties + exp = ms_class_properties + ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). @@ -1538,14 +1580,13 @@ then_it_should_add_activation( ). act = mo_spy_oo_object->mv_package exp = 'package_name' ). - ENDMETHOD. METHOD then_it_should_generate_locals. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_locals_key - exp = ls_item-obj_name + exp = ms_item-obj_name ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_force ). @@ -1569,46 +1610,102 @@ then_it_should_add_activation( ). exp = mo_fake_object_files->mt_local_test_classes ). ENDMETHOD. +ENDCLASS. +CLASS ltc_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_an_interface_properties + RAISING + lcx_exception, + then_should_create_interface, + create_interface FOR TESTING RAISING cx_static_check, + update_descriptions FOR TESTING RAISING cx_static_check, + add_to_activation FOR TESTING RAISING cx_static_check, + deserialize_source FOR TESTING RAISING cx_static_check. + DATA: + ms_interface_properties TYPE vseointerf. +ENDCLASS. +CLASS ltc_interface_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). - METHOD then_should_deserialize_source. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_source - exp = mo_fake_object_files->mt_sources - ). + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_deserialize_key - exp = ls_item-obj_name - ). + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. ENDMETHOD. + METHOD create_interface. + ms_interface_properties-clsname = ms_item-obj_name. + given_an_interface_properties( ). - METHOD given_the_descriptions. + when_deserializing( ). + + then_should_create_interface( ). + ENDMETHOD. + + METHOD update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_an_interface_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD add_to_activation. + given_an_interface_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD deserialize_source. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD given_an_interface_properties. mo_xml_out->add( - iv_name = 'DESCRIPTIONS' - ig_data = it_descriptions - ). - ENDMETHOD. - - - METHOD then_shuld_update_descriptions. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions - ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_description_key - exp = ls_item-obj_name + iv_name = 'VSEOINTERF' + ig_data = ms_interface_properties ). ENDMETHOD. - - METHOD then_it_should_add_activation. + METHOD then_should_create_interface. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_item_to_activate - exp = ls_item + act = mo_spy_oo_object->ms_interface_properties + exp = ms_interface_properties + ). + + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). ENDMETHOD. From dd23247095ccb89ead51cf90f2bc1b57acd38601 Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Thu, 22 Dec 2016 16:07:25 +0100 Subject: [PATCH 13/20] Sotr TextPool Docu --- src/zabapgit_definitions.prog.abap | 114 ++++---- src/zabapgit_object_clas.prog.abap | 416 +++++++++++++++++++++-------- src/zabapgit_objects.prog.abap | 7 - 3 files changed, 370 insertions(+), 167 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index 5f0b0e1bd..3bfde6835 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -18,8 +18,8 @@ TYPES: ty_file_signatures_tt TYPE STANDARD TABLE OF ty_file_signature WITH DEFAU TYPES: ty_file_signatures_ts TYPE SORTED TABLE OF ty_file_signature WITH UNIQUE KEY path filename. TYPES: BEGIN OF ty_file. - INCLUDE TYPE ty_file_signature. -TYPES: data TYPE xstring, + INCLUDE TYPE ty_file_signature. +TYPES: data TYPE xstring, END OF ty_file. TYPES: ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY. @@ -61,11 +61,11 @@ TYPES: BEGIN OF ty_web_asset, TYPES tt_web_assets TYPE STANDARD TABLE OF ty_web_asset WITH DEFAULT KEY. TYPES: BEGIN OF ty_repo_file, - path TYPE string, - filename TYPE string, - is_changed TYPE abap_bool, - rstate TYPE char1, - lstate TYPE char1, + path TYPE string, + filename TYPE string, + is_changed TYPE abap_bool, + rstate TYPE char1, + lstate TYPE char1, END OF ty_repo_file. TYPES tt_repo_files TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY. @@ -101,14 +101,14 @@ TYPES: BEGIN OF ty_tadir, TYPES: ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY. TYPES: BEGIN OF ty_result, - obj_type TYPE tadir-object, - obj_name TYPE tadir-obj_name, - path TYPE string, - filename TYPE string, - package TYPE devclass, - match TYPE sap_bool, - lstate TYPE char1, - rstate TYPE char1, + obj_type TYPE tadir-object, + obj_name TYPE tadir-obj_name, + path TYPE string, + filename TYPE string, + package TYPE devclass, + match TYPE sap_bool, + lstate TYPE char1, + rstate TYPE char1, END OF ty_result. TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. @@ -116,6 +116,20 @@ TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY. +TYPES: BEGIN OF ty_tpool. + INCLUDE TYPE textpool. +TYPES: split TYPE c LENGTH 8. +TYPES: END OF ty_tpool. + +TYPES: ty_tpool_tt TYPE STANDARD TABLE OF ty_tpool WITH DEFAULT KEY. + +TYPES: BEGIN OF ty_sotr, + header TYPE sotr_head, + entries TYPE sotr_text_tt, + END OF ty_sotr. + +TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. + CONSTANTS: BEGIN OF gc_state, " https://git-scm.com/docs/git-status unchanged TYPE char1 VALUE '', added TYPE char1 VALUE 'A', @@ -172,43 +186,43 @@ CONSTANTS: BEGIN OF gc_action, repo_refresh_checksums TYPE string VALUE 'repo_refresh_checksums', repo_toggle_fav TYPE string VALUE 'repo_toggle_fav', - abapgit_home TYPE string VALUE 'abapgit_home', - abapgit_wiki TYPE string VALUE 'abapgit_wiki', - abapgit_install TYPE string VALUE 'abapgit_install', - abapgit_install_pi TYPE string VALUE 'abapgit_install_pi', + abapgit_home TYPE string VALUE 'abapgit_home', + abapgit_wiki TYPE string VALUE 'abapgit_wiki', + abapgit_install TYPE string VALUE 'abapgit_install', + abapgit_install_pi TYPE string VALUE 'abapgit_install_pi', - zip_import TYPE string VALUE 'zip_import', - zip_export TYPE string VALUE 'zip_export', - zip_package TYPE string VALUE 'zip_package', - zip_transport TYPE string VALUE 'zip_transport', - zip_object TYPE string VALUE 'zip_object', + zip_import TYPE string VALUE 'zip_import', + zip_export TYPE string VALUE 'zip_export', + zip_package TYPE string VALUE 'zip_package', + zip_transport TYPE string VALUE 'zip_transport', + zip_object TYPE string VALUE 'zip_object', - git_pull TYPE string VALUE 'git_pull', - git_reset TYPE string VALUE 'git_reset', - git_branch_create TYPE string VALUE 'git_branch_create', - git_branch_switch TYPE string VALUE 'git_branch_switch', - git_branch_delete TYPE string VALUE 'git_branch_delete', - git_commit TYPE string VALUE 'git_commit', + git_pull TYPE string VALUE 'git_pull', + git_reset TYPE string VALUE 'git_reset', + git_branch_create TYPE string VALUE 'git_branch_create', + git_branch_switch TYPE string VALUE 'git_branch_switch', + git_branch_delete TYPE string VALUE 'git_branch_delete', + git_commit TYPE string VALUE 'git_commit', - db_delete TYPE string VALUE 'db_delete', - db_update TYPE string VALUE 'db_update', - db_display TYPE string VALUE 'db_display', - db_edit TYPE string VALUE 'db_edit', - bg_update TYPE string VALUE 'bg_update', + db_delete TYPE string VALUE 'db_delete', + db_update TYPE string VALUE 'db_update', + db_display TYPE string VALUE 'db_display', + db_edit TYPE string VALUE 'db_edit', + bg_update TYPE string VALUE 'bg_update', - go_main TYPE string VALUE 'go_main', - go_explore TYPE string VALUE 'go_explore', - go_db TYPE string VALUE 'go_db', - go_background TYPE string VALUE 'go_background', - go_background_run TYPE string VALUE 'go_background_run', - go_diff TYPE string VALUE 'go_diff', - go_stage TYPE string VALUE 'go_stage', - go_commit TYPE string VALUE 'go_commit', - go_branch_overview TYPE string VALUE 'go_branch_overview', - go_playground TYPE string VALUE 'go_playground', - go_debuginfo TYPE string VALUE 'go_debuginfo', - go_settings TYPE STRING VALUE 'go_settings', - go_tutorial TYPE STRING VALUE 'go_tutorial', - jump TYPE string VALUE 'jump', - jump_pkg TYPE string VALUE 'jump_pkg', + go_main TYPE string VALUE 'go_main', + go_explore TYPE string VALUE 'go_explore', + go_db TYPE string VALUE 'go_db', + go_background TYPE string VALUE 'go_background', + go_background_run TYPE string VALUE 'go_background_run', + go_diff TYPE string VALUE 'go_diff', + go_stage TYPE string VALUE 'go_stage', + go_commit TYPE string VALUE 'go_commit', + go_branch_overview TYPE string VALUE 'go_branch_overview', + go_playground TYPE string VALUE 'go_playground', + go_debuginfo TYPE string VALUE 'go_debuginfo', + go_settings TYPE string VALUE 'go_settings', + go_tutorial TYPE string VALUE 'go_tutorial', + jump TYPE string VALUE 'jump', + jump_pkg TYPE string VALUE 'jump_pkg', END OF gc_action. \ No newline at end of file diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index feba06bc0..b055c09ee 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -34,6 +34,13 @@ INTERFACE lif_object_oriented_object. RAISING lcx_exception cx_sy_dyn_call_error, + insert_text_pool + IMPORTING + iv_class_name TYPE seoclsname + it_text_pool TYPE textpool_table + iv_language TYPE spras + RAISING + lcx_exception, update_descriptions IMPORTING is_key TYPE seoclskey @@ -41,6 +48,19 @@ INTERFACE lif_object_oriented_object. add_to_activation_list IMPORTING is_item TYPE ty_item + RAISING + lcx_exception, + create_sotr + IMPORTING + iv_package TYPE devclass + it_sotr TYPE ty_sotr_tt + RAISING + lcx_exception, + create_documentation + IMPORTING + it_lines TYPE tlinetab + iv_object_name TYPE dokhl-object + iv_language TYPE spras RAISING lcx_exception. ENDINTERFACE. @@ -150,6 +170,20 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. DELETE FROM seocompotx WHERE clsname = is_key-clsname. INSERT seocompotx FROM TABLE it_descriptions. ENDMETHOD. + METHOD lif_object_oriented_object~insert_text_pool. + "Subclass responsibility + RETURN. + ENDMETHOD. + + METHOD lif_object_oriented_object~create_sotr. + "Subclass responsibility + RETURN. + ENDMETHOD. + + METHOD lif_object_oriented_object~create_documentation. + + ENDMETHOD. + ENDCLASS. @@ -158,7 +192,10 @@ CLASS lcl_object_oriented_class DEFINITION PUBLIC SECTION. METHODS: lif_object_oriented_object~create REDEFINITION, - lif_object_oriented_object~generate_locals REDEFINITION. + lif_object_oriented_object~generate_locals REDEFINITION, + lif_object_oriented_object~insert_text_pool REDEFINITION, + lif_object_oriented_object~create_sotr REDEFINITION. + ENDCLASS. CLASS lcl_object_oriented_class IMPLEMENTATION. METHOD lif_object_oriented_object~create. @@ -199,6 +236,83 @@ CLASS lcl_object_oriented_class IMPLEMENTATION. lcx_exception=>raise( 'error from generate_locals' ). ENDIF. ENDMETHOD. + METHOD lif_object_oriented_object~insert_text_pool. + DATA: lv_cp TYPE program. + + lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). + + INSERT TEXTPOOL lv_cp + FROM it_text_pool + LANGUAGE iv_language + STATE 'I'. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). + ENDIF. + + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = lv_cp ). + ENDMETHOD. + + METHOD lif_object_oriented_object~create_sotr. + DATA: lt_sotr TYPE ty_sotr_tt, + lt_objects TYPE sotr_objects, + ls_paket TYPE sotr_pack, + lv_object LIKE LINE OF lt_objects. + + FIELD-SYMBOLS: LIKE LINE OF lt_sotr. + + LOOP AT it_sotr ASSIGNING . + CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' + EXPORTING + object_vector = -header-objid_vec + IMPORTING + objects = lt_objects + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). + ENDIF. + + READ TABLE lt_objects INDEX 1 INTO lv_object. + ASSERT sy-subrc = 0. + + ls_paket-paket = iv_package. + + CALL FUNCTION 'SOTR_CREATE_CONCEPT' + EXPORTING + paket = ls_paket + crea_lan = -header-crea_lan + alias_name = -header-alias_name + object = lv_object + entries = -entries + concept_default = -header-concept + EXCEPTIONS + package_missing = 1 + crea_lan_missing = 2 + object_missing = 3 + paket_does_not_exist = 4 + alias_already_exist = 5 + object_type_not_found = 6 + langu_missing = 7 + identical_context_not_allowed = 8 + text_too_long = 9 + error_in_update = 10 + no_master_langu = 11 + error_in_concept_id = 12 + alias_not_allowed = 13 + tadir_entry_creation_failed = 14 + internal_error = 15 + error_in_correction = 16 + user_cancelled = 17 + no_entry_found = 18 + OTHERS = 19. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). + ENDIF. + ENDLOOP. + ENDMETHOD. + ENDCLASS. CLASS lcl_object_oriented_interface DEFINITION @@ -279,16 +393,8 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. - TYPES: BEGIN OF ty_sotr, - header TYPE sotr_head, - entries TYPE sotr_text_tt, - END OF ty_sotr. - - TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. - - - DATA mv_skip_testclass TYPE abap_bool. + DATA mo_object_oriented_object TYPE REF TO lif_object_oriented_object. METHODS deserialize_abap IMPORTING io_xml TYPE REF TO lcl_xml_input @@ -1001,6 +1107,9 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDMETHOD. "serialize_xml METHOD lif_object~deserialize. + + mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + deserialize_abap( io_xml = io_xml iv_package = iv_package ). @@ -1015,7 +1124,7 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDMETHOD. "deserialize METHOD deserialize_sotr. - + "OTR stands for Online Text Repository DATA: lt_sotr TYPE ty_sotr_tt, lt_objects TYPE sotr_objects, ls_paket TYPE sotr_pack, @@ -1031,65 +1140,16 @@ CLASS lcl_object_clas IMPLEMENTATION. RETURN. ENDIF. - LOOP AT lt_sotr ASSIGNING . - CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' - EXPORTING - object_vector = -header-objid_vec - IMPORTING - objects = lt_objects - EXCEPTIONS - object_not_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). - ENDIF. - - READ TABLE lt_objects INDEX 1 INTO lv_object. - ASSERT sy-subrc = 0. - - ls_paket-paket = iv_package. - - CALL FUNCTION 'SOTR_CREATE_CONCEPT' - EXPORTING - paket = ls_paket - crea_lan = -header-crea_lan - alias_name = -header-alias_name - object = lv_object - entries = -entries - concept_default = -header-concept - EXCEPTIONS - package_missing = 1 - crea_lan_missing = 2 - object_missing = 3 - paket_does_not_exist = 4 - alias_already_exist = 5 - object_type_not_found = 6 - langu_missing = 7 - identical_context_not_allowed = 8 - text_too_long = 9 - error_in_update = 10 - no_master_langu = 11 - error_in_concept_id = 12 - alias_not_allowed = 13 - tadir_entry_creation_failed = 14 - internal_error = 15 - error_in_correction = 16 - user_cancelled = 17 - no_entry_found = 18 - OTHERS = 19. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). - ENDIF. - - ENDLOOP. - + mo_object_oriented_object->create_sotr( + iv_package = iv_package + it_sotr = lt_sotr + ). ENDMETHOD. METHOD deserialize_docu. DATA: lt_lines TYPE tlinetab, - lv_object TYPE dokhl-object. - + lv_object type dokhl-object. io_xml->read( EXPORTING iv_name = 'LINES' CHANGING cg_data = lt_lines ). @@ -1099,20 +1159,11 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDIF. lv_object = ms_item-obj_name. - CALL FUNCTION 'DOCU_UPD' - EXPORTING - id = 'CL' - langu = mv_language - object = lv_object - TABLES - line = lt_lines - EXCEPTIONS - ret_code = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from DOCU_UPD' ). - ENDIF. + mo_object_oriented_object->create_documentation( + it_lines = lt_lines + iv_object_name = lv_object + iv_language = mv_language ). ENDMETHOD. "deserialize_doku METHOD deserialize_textpool. @@ -1132,19 +1183,12 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDIF. lv_clsname = ms_item-obj_name. - lv_cp = cl_oo_classname_service=>get_classpool_name( lv_clsname ). - - INSERT TEXTPOOL lv_cp - FROM lt_tpool - LANGUAGE mv_language - STATE 'I'. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). - ENDIF. - - lcl_objects_activation=>add( iv_type = 'REPT' - iv_name = lv_cp ). + mo_object_oriented_object->insert_text_pool( + iv_class_name = lv_clsname + it_text_pool = lt_tpool + iv_language = mv_language + ). ENDMETHOD. "deserialize_textpool METHOD deserialize_abap. @@ -1176,16 +1220,12 @@ CLASS lcl_object_clas IMPLEMENTATION. ls_clskey-clsname = ms_item-obj_name. - DATA lo_object_oriented_object TYPE REF TO lif_object_oriented_object. - lo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). - - CASE ms_item-obj_type. WHEN 'CLAS'. io_xml->read( EXPORTING iv_name = 'VSEOCLASS' CHANGING cg_data = ls_vseoclass ). - lo_object_oriented_object->create( + mo_object_oriented_object->create( EXPORTING iv_package = iv_package CHANGING @@ -1196,7 +1236,7 @@ CLASS lcl_object_clas IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'VSEOINTERF' CHANGING cg_data = ls_vseointerf ). - lo_object_oriented_object->create( + mo_object_oriented_object->create( EXPORTING iv_package = iv_package CHANGING @@ -1208,7 +1248,7 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDCASE. IF ms_item-obj_type = 'CLAS'. - lo_object_oriented_object->generate_locals( + mo_object_oriented_object->generate_locals( is_key = ls_clskey iv_force = seox_true it_local_definitions = lt_locals_def @@ -1218,7 +1258,7 @@ CLASS lcl_object_clas IMPLEMENTATION. ). ENDIF. - lo_object_oriented_object->deserialize_source( + mo_object_oriented_object->deserialize_source( is_key = ls_clskey it_source = lt_source ). @@ -1226,12 +1266,12 @@ CLASS lcl_object_clas IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' CHANGING cg_data = lt_descriptions ). - lo_object_oriented_object->update_descriptions( + mo_object_oriented_object->update_descriptions( is_key = ls_clskey it_descriptions = lt_descriptions ). - lo_object_oriented_object->add_to_activation_list( is_item = ms_item ). + mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. "deserialize METHOD deserialize_abap_source_old. @@ -1319,7 +1359,16 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING. mt_source TYPE ty_string_tt, ms_item_to_activate TYPE ty_item, mt_descriptions TYPE ty_seocompotx_tt, - ms_description_key TYPE seoclskey. + ms_description_key TYPE seoclskey, + mv_text_pool_class_name TYPE seoclsname, + mt_text_pool TYPE textpool_table, + mv_text_pool_inserted TYPE abap_bool, + mt_sotr TYPE ty_sotr_tt, + mt_sotr_package TYPE devclass, + mv_docu_object_name TYPE dokhl-object, + mv_docu_language TYPE spras, + mt_docu_lines TYPE tlinetab. + ENDCLASS. CLASS ltd_spy_oo_object IMPLEMENTATION. METHOD lif_object_oriented_object~create. @@ -1354,6 +1403,27 @@ CLASS ltd_spy_oo_object IMPLEMENTATION. mt_descriptions = it_descriptions. ENDMETHOD. + METHOD lif_object_oriented_object~insert_text_pool. + mv_text_pool_inserted = abap_true. + mv_text_pool_class_name = iv_class_name. + mt_text_pool = it_text_pool. + cl_abap_unit_assert=>assert_equals( + act = iv_language + exp = sy-langu + ). + ENDMETHOD. + + METHOD lif_object_oriented_object~create_sotr. + mt_sotr = it_sotr. + mt_sotr_package = iv_package. + ENDMETHOD. + + METHOD lif_object_oriented_object~create_documentation. + mv_docu_object_name = iv_object_name. + mv_docu_language = iv_language. + mt_docu_lines = it_lines. + ENDMETHOD. + ENDCLASS. CLASS ltd_fake_object_files DEFINITION FOR TESTING @@ -1419,11 +1489,43 @@ CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . then_shuld_update_descriptions IMPORTING it_descriptions TYPE ty_seocompotx_tt, - then_it_should_add_activation. + then_it_should_add_activation, + given_documentation_in_xml_as + IMPORTING + it_lines TYPE tlinetab + RAISING + lcx_exception, + then_docu_should_be_created + IMPORTING + it_lines TYPE tlinetab. ENDCLASS. CLASS ltc_oo_test IMPLEMENTATION. + METHOD then_docu_should_be_created. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_docu_lines + exp = it_lines + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_object_name + exp = ms_item-obj_name + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_language + exp = sy-langu + ). + ENDMETHOD. + + METHOD given_documentation_in_xml_as. + mo_xml_out->add( + iv_name = 'LINES' + ig_data = it_lines + ). + ENDMETHOD. + METHOD then_it_should_add_activation. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_item_to_activate @@ -1433,9 +1535,9 @@ CLASS ltc_oo_test IMPLEMENTATION. METHOD then_shuld_update_descriptions. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions - ). + act = mo_spy_oo_object->mt_descriptions + exp = it_descriptions + ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_description_key @@ -1487,7 +1589,11 @@ INHERITING FROM ltc_oo_test. should_generate_locals FOR TESTING RAISING cx_static_check, should_deserialize_source FOR TESTING RAISING cx_static_check, should_update_descriptions FOR TESTING RAISING cx_static_check, - should_add_to_activation FOR TESTING RAISING cx_static_check. + should_add_to_activation FOR TESTING RAISING cx_static_check, + no_text_pool_no_insert FOR TESTING RAISING cx_static_check, + insert_text_pool FOR TESTING RAISING cx_static_check, + create_stor_from_xml FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. DATA: ms_class_properties TYPE vseoclass. ENDCLASS. @@ -1610,6 +1716,80 @@ CLASS ltc_class_deserialization IMPLEMENTATION. exp = mo_fake_object_files->mt_local_test_classes ). ENDMETHOD. + METHOD no_text_pool_no_insert. + given_a_class_properties( ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_false( mo_spy_oo_object->mv_text_pool_inserted ). + ENDMETHOD. + + METHOD insert_text_pool. + given_a_class_properties( ). + + DATA lt_pool_external TYPE textpool_table. + DATA ls_pool_external TYPE ty_tpool. + ls_pool_external-id = 'ID'. + ls_pool_external-key = 'KEY'. + APPEND ls_pool_external TO lt_pool_external. + mo_xml_out->add( + iv_name = 'TPOOL' + ig_data = lt_pool_external + ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_text_pool + exp = lt_pool_external + ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_text_pool_class_name + exp = 'zcl_class' + ). + ENDMETHOD. + + METHOD create_stor_from_xml. + DATA: + lt_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + given_a_class_properties( ). + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + mo_xml_out->add( + iv_name = 'SOTR' + ig_data = lt_sotr + ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr + exp = lt_sotr + ). + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr_package + exp = 'package_name' + ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Class Line Doc'. + APPEND ls_line TO lt_lines. + + given_a_class_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. ENDCLASS. CLASS ltc_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT @@ -1624,7 +1804,8 @@ INHERITING FROM ltc_oo_test. create_interface FOR TESTING RAISING cx_static_check, update_descriptions FOR TESTING RAISING cx_static_check, add_to_activation FOR TESTING RAISING cx_static_check, - deserialize_source FOR TESTING RAISING cx_static_check. + deserialize_source FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. DATA: ms_interface_properties TYPE vseointerf. ENDCLASS. @@ -1697,9 +1878,9 @@ CLASS ltc_interface_deserialization IMPLEMENTATION. METHOD then_should_create_interface. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_interface_properties - exp = ms_interface_properties - ). + act = mo_spy_oo_object->ms_interface_properties + exp = ms_interface_properties + ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). @@ -1709,4 +1890,19 @@ CLASS ltc_interface_deserialization IMPLEMENTATION. ). ENDMETHOD. + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Interface Line Doc'. + APPEND ls_line TO lt_lines. + + given_an_interface_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. + ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index a76058992..37f534e4d 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -859,13 +859,6 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY. - TYPES: BEGIN OF ty_tpool. - INCLUDE TYPE textpool. - TYPES: split TYPE c LENGTH 8. - TYPES: END OF ty_tpool. - - TYPES: ty_tpool_tt TYPE STANDARD TABLE OF ty_tpool WITH DEFAULT KEY. - TYPES: BEGIN OF ty_dynpro, header TYPE rpy_dyhead, containers TYPE dycatt_tab, From 7fdcf7aa73b5dda70e7952d6d217cafbc120d5da Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Thu, 22 Dec 2016 16:23:40 +0100 Subject: [PATCH 14/20] Refactoring into INTF class since we have tests --- src/zabapgit_object_clas.prog.abap | 163 +++++++++++++++++------------ 1 file changed, 95 insertions(+), 68 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index b055c09ee..20525d7cc 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -391,21 +391,20 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. - - PRIVATE SECTION. - DATA mv_skip_testclass TYPE abap_bool. - DATA mo_object_oriented_object TYPE REF TO lif_object_oriented_object. - + PROTECTED SECTION. METHODS deserialize_abap IMPORTING io_xml TYPE REF TO lcl_xml_input iv_package TYPE devclass RAISING lcx_exception. - METHODS deserialize_textpool + METHODS deserialize_docu IMPORTING io_xml TYPE REF TO lcl_xml_input RAISING lcx_exception. + DATA mo_object_oriented_object TYPE REF TO lif_object_oriented_object. + PRIVATE SECTION. + DATA mv_skip_testclass TYPE abap_bool. - METHODS deserialize_docu + METHODS deserialize_textpool IMPORTING io_xml TYPE REF TO lcl_xml_input RAISING lcx_exception. @@ -480,16 +479,6 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. ENDCLASS. "lcl_object_dtel DEFINITION -*----------------------------------------------------------------------* -* CLASS lcl_object_intf DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. -* todo, CLAS + INTF to be refactored, see: -* https://github.com/larshp/abapGit/issues/21 -ENDCLASS. "lcl_object_intf DEFINITION - *----------------------------------------------------------------------* * CLASS lcl_object_clas IMPLEMENTATION *----------------------------------------------------------------------* @@ -1113,12 +1102,10 @@ CLASS lcl_object_clas IMPLEMENTATION. deserialize_abap( io_xml = io_xml iv_package = iv_package ). - IF ms_item-obj_type = 'CLAS'. - deserialize_textpool( io_xml ). + deserialize_textpool( io_xml ). - deserialize_sotr( io_xml = io_xml - iv_package = iv_package ). - ENDIF. + deserialize_sotr( io_xml = io_xml + iv_package = iv_package ). deserialize_docu( io_xml ). ENDMETHOD. "deserialize @@ -1149,7 +1136,7 @@ CLASS lcl_object_clas IMPLEMENTATION. METHOD deserialize_docu. DATA: lt_lines TYPE tlinetab, - lv_object type dokhl-object. + lv_object TYPE dokhl-object. io_xml->read( EXPORTING iv_name = 'LINES' CHANGING cg_data = lt_lines ). @@ -1194,7 +1181,6 @@ CLASS lcl_object_clas IMPLEMENTATION. METHOD deserialize_abap. DATA: ls_vseoclass TYPE vseoclass, - ls_vseointerf TYPE vseointerf, lt_source TYPE seop_source_string, lt_locals_def TYPE seop_source_string, lt_locals_imp TYPE seop_source_string, @@ -1220,43 +1206,23 @@ CLASS lcl_object_clas IMPLEMENTATION. ls_clskey-clsname = ms_item-obj_name. - CASE ms_item-obj_type. - WHEN 'CLAS'. - io_xml->read( EXPORTING iv_name = 'VSEOCLASS' - CHANGING cg_data = ls_vseoclass ). + io_xml->read( EXPORTING iv_name = 'VSEOCLASS' + CHANGING cg_data = ls_vseoclass ). - mo_object_oriented_object->create( - EXPORTING - iv_package = iv_package - CHANGING - is_properties = ls_vseoclass - ). - - WHEN 'INTF'. - io_xml->read( EXPORTING iv_name = 'VSEOINTERF' - CHANGING cg_data = ls_vseointerf ). - - mo_object_oriented_object->create( - EXPORTING - iv_package = iv_package - CHANGING - is_properties = ls_vseointerf - ). - - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - IF ms_item-obj_type = 'CLAS'. - mo_object_oriented_object->generate_locals( - is_key = ls_clskey - iv_force = seox_true - it_local_definitions = lt_locals_def - it_local_implementations = lt_locals_imp - it_local_macros = lt_locals_mac - it_local_test_classes = lt_testclasses - ). - ENDIF. + mo_object_oriented_object->create( + EXPORTING + iv_package = iv_package + CHANGING + is_properties = ls_vseoclass + ). + mo_object_oriented_object->generate_locals( + is_key = ls_clskey + iv_force = seox_true + it_local_definitions = lt_locals_def + it_local_implementations = lt_locals_imp + it_local_macros = lt_locals_mac + it_local_test_classes = lt_testclasses + ). mo_object_oriented_object->deserialize_source( is_key = ls_clskey @@ -1341,6 +1307,67 @@ CLASS lcl_object_clas IMPLEMENTATION. ENDCLASS. "lcl_object_CLAS IMPLEMENTATION +*----------------------------------------------------------------------* +* CLASS lcl_object_intf DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. +* todo, CLAS + INTF to be refactored, see: +* https://github.com/larshp/abapGit/issues/21 + PUBLIC SECTION. + METHODS: + lif_object~deserialize REDEFINITION. + PROTECTED SECTION. + METHODS: + deserialize_abap REDEFINITION. +ENDCLASS. "lcl_object_intf DEFINITION +CLASS lcl_object_intf IMPLEMENTATION. + METHOD lif_object~deserialize. + mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + + deserialize_abap( io_xml = io_xml + iv_package = iv_package ). + + deserialize_docu( io_xml ). + ENDMETHOD. + METHOD deserialize_abap. + DATA: ls_vseointerf TYPE vseointerf, + lt_source TYPE seop_source_string, + lt_descriptions TYPE ty_seocompotx_tt, + ls_clskey TYPE seoclskey. + ls_clskey-clsname = ms_item-obj_name. + + lt_source = mo_files->read_abap( ). + + io_xml->read( EXPORTING iv_name = 'VSEOINTERF' + CHANGING cg_data = ls_vseointerf ). + + mo_object_oriented_object->create( + EXPORTING + iv_package = iv_package + CHANGING + is_properties = ls_vseointerf + ). + + mo_object_oriented_object->deserialize_source( + is_key = ls_clskey + it_source = lt_source + ). + + io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' + CHANGING cg_data = lt_descriptions ). + + mo_object_oriented_object->update_descriptions( + is_key = ls_clskey + it_descriptions = lt_descriptions + ). + + mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). + ENDMETHOD. +ENDCLASS. + + CLASS ltd_spy_oo_object DEFINITION FOR TESTING. PUBLIC SECTION. INTERFACES: lif_object_oriented_object. @@ -1490,14 +1517,14 @@ CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . IMPORTING it_descriptions TYPE ty_seocompotx_tt, then_it_should_add_activation, - given_documentation_in_xml_as - IMPORTING - it_lines TYPE tlinetab - RAISING - lcx_exception, - then_docu_should_be_created - IMPORTING - it_lines TYPE tlinetab. + given_documentation_in_xml_as + IMPORTING + it_lines TYPE tlinetab + RAISING + lcx_exception, + then_docu_should_be_created + IMPORTING + it_lines TYPE tlinetab. ENDCLASS. CLASS ltc_oo_test IMPLEMENTATION. From 161f9dac682e73397446aff3dbbdc4057ecc6156 Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 22 Dec 2016 15:39:56 +0000 Subject: [PATCH 15/20] TABL TRAN fixes TABL: make sure MASKLEN contains valid data, or the XML serialization will dump TRAN: allow empty description --- src/zabapgit_object_tabl.prog.abap | 5 +++++ src/zabapgit_object_tran.prog.abap | 5 +---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index fcd1c4dac..8f70c2f35 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -195,6 +195,11 @@ CLASS lcl_object_tabl IMPLEMENTATION. -scrtext_m, -scrtext_l. + IF -masklen = '' OR NOT -masklen CO '0123456789'. +* make sure the field contains valid data, or the XML will dump + CLEAR -masklen. + ENDIF. + IF -comptype = 'E'. * type specified via data element CLEAR: -domname, diff --git a/src/zabapgit_object_tran.prog.abap b/src/zabapgit_object_tran.prog.abap index 5f4b9cbff..9eba8a64a 100644 --- a/src/zabapgit_object_tran.prog.abap +++ b/src/zabapgit_object_tran.prog.abap @@ -387,10 +387,7 @@ CLASS lcl_object_tran IMPLEMENTATION. SELECT SINGLE * FROM tstct INTO ls_tstct WHERE sprsl = mv_language - AND tcode = lv_transaction. "#EC CI_GENBUFF - IF sy-subrc <> 0. - lcx_exception=>raise( 'Transaction description not found' ). - ENDIF. + AND tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF SELECT SINGLE * FROM tstcp INTO ls_tstcp WHERE tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF From eae228744923741d24c538e6d500b3f5631f2e3f Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Thu, 22 Dec 2016 16:40:22 +0100 Subject: [PATCH 16/20] Final cleanup --- src/zabapgit_object_clas.prog.abap | 261 +++++++++-------------------- 1 file changed, 83 insertions(+), 178 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 20525d7cc..49c2b8edf 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -181,7 +181,19 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. ENDMETHOD. METHOD lif_object_oriented_object~create_documentation. - + CALL FUNCTION 'DOCU_UPD' + EXPORTING + id = 'CL' + langu = iv_language + object = iv_object_name + TABLES + line = it_lines + EXCEPTIONS + ret_code = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DOCU_UPD' ). + ENDIF. ENDMETHOD. ENDCLASS. @@ -418,17 +430,6 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. RETURNING VALUE(rt_source) TYPE ty_string_tt RAISING lcx_exception. - METHODS deserialize_abap_source_old - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt - RAISING lcx_exception. - - METHODS deserialize_abap_source_new - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt - RAISING lcx_exception - cx_sy_dyn_call_error. - METHODS serialize_abap_new IMPORTING is_clskey TYPE seoclskey RETURNING VALUE(rt_source) TYPE ty_string_tt @@ -1129,8 +1130,7 @@ CLASS lcl_object_clas IMPLEMENTATION. mo_object_oriented_object->create_sotr( iv_package = iv_package - it_sotr = lt_sotr - ). + it_sotr = lt_sotr ). ENDMETHOD. METHOD deserialize_docu. @@ -1174,37 +1174,36 @@ CLASS lcl_object_clas IMPLEMENTATION. mo_object_oriented_object->insert_text_pool( iv_class_name = lv_clsname it_text_pool = lt_tpool - iv_language = mv_language - ). + iv_language = mv_language ). ENDMETHOD. "deserialize_textpool METHOD deserialize_abap. - DATA: ls_vseoclass TYPE vseoclass, - lt_source TYPE seop_source_string, - lt_locals_def TYPE seop_source_string, - lt_locals_imp TYPE seop_source_string, - lt_locals_mac TYPE seop_source_string, - lt_testclasses TYPE seop_source_string, - lt_descriptions TYPE ty_seocompotx_tt, - ls_clskey TYPE seoclskey. + DATA: ls_vseoclass TYPE vseoclass, + lt_source TYPE seop_source_string, + lt_local_definitions TYPE seop_source_string, + lt_local_implementations TYPE seop_source_string, + lt_local_macros TYPE seop_source_string, + lt_test_classes TYPE seop_source_string, + lt_descriptions TYPE ty_seocompotx_tt, + ls_class_key TYPE seoclskey. lt_source = mo_files->read_abap( ). - lt_locals_def = mo_files->read_abap( iv_extra = 'locals_def' - iv_error = abap_false ). "#EC NOTEXT + lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def' + iv_error = abap_false ). "#EC NOTEXT - lt_locals_imp = mo_files->read_abap( iv_extra = 'locals_imp' - iv_error = abap_false ). "#EC NOTEXT + lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp' + iv_error = abap_false ). "#EC NOTEXT - lt_locals_mac = mo_files->read_abap( iv_extra = 'macros' - iv_error = abap_false ). "#EC NOTEXT + lt_local_macros = mo_files->read_abap( iv_extra = 'macros' + iv_error = abap_false ). "#EC NOTEXT - lt_testclasses = mo_files->read_abap( iv_extra = 'testclasses' - iv_error = abap_false ). "#EC NOTEXT + lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses' + iv_error = abap_false ). "#EC NOTEXT - ls_clskey-clsname = ms_item-obj_name. + ls_class_key-clsname = ms_item-obj_name. io_xml->read( EXPORTING iv_name = 'VSEOCLASS' CHANGING cg_data = ls_vseoclass ). @@ -1213,94 +1212,29 @@ CLASS lcl_object_clas IMPLEMENTATION. EXPORTING iv_package = iv_package CHANGING - is_properties = ls_vseoclass - ). + is_properties = ls_vseoclass ). mo_object_oriented_object->generate_locals( - is_key = ls_clskey + is_key = ls_class_key iv_force = seox_true - it_local_definitions = lt_locals_def - it_local_implementations = lt_locals_imp - it_local_macros = lt_locals_mac - it_local_test_classes = lt_testclasses - ). + it_local_definitions = lt_local_definitions + it_local_implementations = lt_local_implementations + it_local_macros = lt_local_macros + it_local_test_classes = lt_test_classes ). mo_object_oriented_object->deserialize_source( - is_key = ls_clskey - it_source = lt_source - ). + is_key = ls_class_key + it_source = lt_source ). io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' CHANGING cg_data = lt_descriptions ). mo_object_oriented_object->update_descriptions( - is_key = ls_clskey - it_descriptions = lt_descriptions - ). + is_key = ls_class_key + it_descriptions = lt_descriptions ). mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. "deserialize - METHOD deserialize_abap_source_old. -* for backwards compatability down to 702 - - 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. - lcx_exception=>raise( 'error from CL_OO_SOURCE' ). - ENDIF. - - TRY. - lo_source->access_permission( seok_access_modify ). - lo_source->set_source( it_source ). - lo_source->save( ). - lo_source->access_permission( seok_access_free ). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'permission error' ). - CATCH cx_oo_source_save_failure. - lcx_exception=>raise( 'save failure' ). - ENDTRY. - - ENDMETHOD. - - METHOD deserialize_abap_source_new. - - DATA: lo_factory TYPE REF TO object, - lo_source TYPE REF TO object. - - - CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') - RECEIVING - result = lo_factory. - - CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') - EXPORTING - clif_name = is_clskey-clsname - RECEIVING - result = lo_source. - - TRY. - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). - CATCH cx_oo_access_permission. - lcx_exception=>raise( 'source_new, access permission exception' ). - ENDTRY. - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') - EXPORTING - source = it_source. - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). - - CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). - - ENDMETHOD. - METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. @@ -1347,23 +1281,20 @@ CLASS lcl_object_intf IMPLEMENTATION. EXPORTING iv_package = iv_package CHANGING - is_properties = ls_vseointerf - ). + is_properties = ls_vseointerf ). mo_object_oriented_object->deserialize_source( is_key = ls_clskey - it_source = lt_source - ). + it_source = lt_source ). io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS' CHANGING cg_data = lt_descriptions ). mo_object_oriented_object->update_descriptions( is_key = ls_clskey - it_descriptions = lt_descriptions - ). + it_descriptions = lt_descriptions ). - mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). + mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. ENDCLASS. @@ -1399,7 +1330,9 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING. ENDCLASS. CLASS ltd_spy_oo_object IMPLEMENTATION. METHOD lif_object_oriented_object~create. - IF cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. + DATA lv_properties_structure_name TYPE string. + lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. + IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. ms_interface_properties = is_properties. ELSE. ms_class_properties = is_properties. @@ -1436,8 +1369,7 @@ CLASS ltd_spy_oo_object IMPLEMENTATION. mt_text_pool = it_text_pool. cl_abap_unit_assert=>assert_equals( act = iv_language - exp = sy-langu - ). + exp = sy-langu ). ENDMETHOD. METHOD lif_object_oriented_object~create_sotr. @@ -1532,63 +1464,53 @@ CLASS ltc_oo_test IMPLEMENTATION. METHOD then_docu_should_be_created. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_docu_lines - exp = it_lines - ). + exp = it_lines ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_docu_object_name - exp = ms_item-obj_name - ). + exp = ms_item-obj_name ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_docu_language - exp = sy-langu - ). + exp = sy-langu ). ENDMETHOD. METHOD given_documentation_in_xml_as. mo_xml_out->add( iv_name = 'LINES' - ig_data = it_lines - ). + ig_data = it_lines ). ENDMETHOD. METHOD then_it_should_add_activation. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_item_to_activate - exp = ms_item - ). + exp = ms_item ). ENDMETHOD. METHOD then_shuld_update_descriptions. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions - ). + exp = it_descriptions ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_description_key - exp = ms_item-obj_name - ). + exp = ms_item-obj_name ). ENDMETHOD. METHOD given_the_descriptions. mo_xml_out->add( iv_name = 'DESCRIPTIONS' - ig_data = it_descriptions - ). + ig_data = it_descriptions ). ENDMETHOD. METHOD then_should_deserialize_source. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_source - exp = mo_fake_object_files->mt_sources - ). + exp = mo_fake_object_files->mt_sources ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_deserialize_key - exp = ms_item-obj_name - ). + exp = ms_item-obj_name ). ENDMETHOD. METHOD when_deserializing. @@ -1597,8 +1519,7 @@ CLASS ltc_oo_test IMPLEMENTATION. iv_xml = mo_xml_out->render( ). mo_oo_object->deserialize( iv_package = 'package_name' - io_xml = mo_xml_input - ). + io_xml = mo_xml_input ). ENDMETHOD. ENDCLASS. @@ -1697,51 +1618,43 @@ CLASS ltc_class_deserialization IMPLEMENTATION. METHOD given_a_class_properties. mo_xml_out->add( iv_name = 'VSEOCLASS' - ig_data = ms_class_properties - ). + ig_data = ms_class_properties ). ENDMETHOD. METHOD then_should_create_class. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_class_properties - exp = ms_class_properties - ). + exp = ms_class_properties ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_package - exp = 'package_name' - ). + exp = 'package_name' ). ENDMETHOD. METHOD then_it_should_generate_locals. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_locals_key - exp = ms_item-obj_name - ). + exp = ms_item-obj_name ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_force ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_local_definitions - exp = mo_fake_object_files->mt_local_definitions - ). + exp = mo_fake_object_files->mt_local_definitions ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_local_implementations - exp = mo_fake_object_files->mt_local_implementations - ). + exp = mo_fake_object_files->mt_local_implementations ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_local_macros - exp = mo_fake_object_files->mt_local_macros - ). + exp = mo_fake_object_files->mt_local_macros ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_local_test_classes - exp = mo_fake_object_files->mt_local_test_classes - ). + exp = mo_fake_object_files->mt_local_test_classes ). ENDMETHOD. METHOD no_text_pool_no_insert. given_a_class_properties( ). @@ -1752,29 +1665,27 @@ CLASS ltc_class_deserialization IMPLEMENTATION. ENDMETHOD. METHOD insert_text_pool. - given_a_class_properties( ). - - DATA lt_pool_external TYPE textpool_table. - DATA ls_pool_external TYPE ty_tpool. + DATA: lt_pool_external TYPE textpool_table, + ls_pool_external TYPE ty_tpool. ls_pool_external-id = 'ID'. ls_pool_external-key = 'KEY'. APPEND ls_pool_external TO lt_pool_external. + + given_a_class_properties( ). + mo_xml_out->add( iv_name = 'TPOOL' - ig_data = lt_pool_external - ). + ig_data = lt_pool_external ). when_deserializing( ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_text_pool - exp = lt_pool_external - ). + exp = lt_pool_external ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_class_name - exp = 'zcl_class' - ). + exp = 'zcl_class' ). ENDMETHOD. METHOD create_stor_from_xml. @@ -1788,19 +1699,16 @@ CLASS ltc_class_deserialization IMPLEMENTATION. APPEND ls_sotr TO lt_sotr. mo_xml_out->add( iv_name = 'SOTR' - ig_data = lt_sotr - ). + ig_data = lt_sotr ). when_deserializing( ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_sotr - exp = lt_sotr - ). + exp = lt_sotr ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mt_sotr_package - exp = 'package_name' - ). + exp = 'package_name' ). ENDMETHOD. METHOD create_documentation. @@ -1899,22 +1807,19 @@ CLASS ltc_interface_deserialization IMPLEMENTATION. METHOD given_an_interface_properties. mo_xml_out->add( iv_name = 'VSEOINTERF' - ig_data = ms_interface_properties - ). + ig_data = ms_interface_properties ). ENDMETHOD. METHOD then_should_create_interface. cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->ms_interface_properties - exp = ms_interface_properties - ). + exp = ms_interface_properties ). cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_package - exp = 'package_name' - ). + exp = 'package_name' ). ENDMETHOD. METHOD create_documentation. From 8384bd8994215ed3bc0b7969da9b9d36220fe35f Mon Sep 17 00:00:00 2001 From: eduardocopat Date: Fri, 23 Dec 2016 11:19:03 +0100 Subject: [PATCH 17/20] code review --- src/zabapgit_object_clas.prog.abap | 541 ----------------------------- src/zabapgit_unit_test.prog.abap | 540 ++++++++++++++++++++++++++++ 2 files changed, 540 insertions(+), 541 deletions(-) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 49c2b8edf..f2f27ef32 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -1296,545 +1296,4 @@ CLASS lcl_object_intf IMPLEMENTATION. mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). ENDMETHOD. -ENDCLASS. - - -CLASS ltd_spy_oo_object DEFINITION FOR TESTING. - PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. - DATA: - mv_package TYPE devclass, - mv_overwrite TYPE seox_boolean, - ms_interface_properties TYPE vseointerf, - ms_class_properties TYPE vseoclass, - ms_locals_key TYPE seoclskey, - mt_local_definitions TYPE rswsourcet, - mt_local_implementations TYPE rswsourcet, - mt_local_macros TYPE rswsourcet, - mt_local_test_classes TYPE rswsourcet, - mv_force TYPE seoflag, - ms_deserialize_key TYPE seoclskey, - mt_source TYPE ty_string_tt, - ms_item_to_activate TYPE ty_item, - mt_descriptions TYPE ty_seocompotx_tt, - ms_description_key TYPE seoclskey, - mv_text_pool_class_name TYPE seoclsname, - mt_text_pool TYPE textpool_table, - mv_text_pool_inserted TYPE abap_bool, - mt_sotr TYPE ty_sotr_tt, - mt_sotr_package TYPE devclass, - mv_docu_object_name TYPE dokhl-object, - mv_docu_language TYPE spras, - mt_docu_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltd_spy_oo_object IMPLEMENTATION. - METHOD lif_object_oriented_object~create. - DATA lv_properties_structure_name TYPE string. - lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. - IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. - ms_interface_properties = is_properties. - ELSE. - ms_class_properties = is_properties. - ENDIF. - mv_package = iv_package. - mv_overwrite = iv_overwrite. - ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. - ms_locals_key = is_key. - mt_local_definitions = it_local_definitions. - mt_local_implementations = it_local_implementations. - mt_local_macros = it_local_macros. - mt_local_test_classes = it_local_test_classes. - mv_force = iv_force. - ENDMETHOD. - - METHOD lif_object_oriented_object~deserialize_source. - ms_deserialize_key = is_key. - mt_source = it_source. - ENDMETHOD. - - METHOD lif_object_oriented_object~add_to_activation_list. - ms_item_to_activate = is_item. - ENDMETHOD. - - METHOD lif_object_oriented_object~update_descriptions. - ms_description_key = is_key. - mt_descriptions = it_descriptions. - ENDMETHOD. - - METHOD lif_object_oriented_object~insert_text_pool. - mv_text_pool_inserted = abap_true. - mv_text_pool_class_name = iv_class_name. - mt_text_pool = it_text_pool. - cl_abap_unit_assert=>assert_equals( - act = iv_language - exp = sy-langu ). - ENDMETHOD. - - METHOD lif_object_oriented_object~create_sotr. - mt_sotr = it_sotr. - mt_sotr_package = iv_package. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_documentation. - mv_docu_object_name = iv_object_name. - mv_docu_language = iv_language. - mt_docu_lines = it_lines. - ENDMETHOD. - -ENDCLASS. - -CLASS ltd_fake_object_files DEFINITION FOR TESTING - INHERITING FROM lcl_objects_files. - PUBLIC SECTION. - METHODS constructor. - METHODS read_abap REDEFINITION. - DATA: - mt_sources TYPE seop_source_string, - mt_local_definitions TYPE seop_source_string, - mt_local_implementations TYPE seop_source_string, - mt_local_macros TYPE seop_source_string, - mt_local_test_classes TYPE seop_source_string. -ENDCLASS. -CLASS ltd_fake_object_files IMPLEMENTATION. - METHOD read_abap. - CASE iv_extra. - WHEN 'locals_def'. - rt_abap = mt_local_definitions. - WHEN 'locals_imp'. - rt_abap = mt_local_implementations. - WHEN 'macros'. - rt_abap = mt_local_macros. - WHEN 'testclasses'. - rt_abap = mt_local_test_classes. - WHEN OTHERS. - rt_abap = mt_sources. - RETURN. - ENDCASE. - - cl_abap_unit_assert=>assert_false( iv_error ). - ENDMETHOD. - METHOD constructor. - DATA ls_empty_item TYPE ty_item. - super->constructor( ls_empty_item ). - APPEND 'source' TO me->mt_sources. - APPEND 'definition' TO me->mt_local_definitions. - APPEND 'implementation' TO me->mt_local_implementations. - APPEND 'macro' TO me->mt_local_macros. - APPEND 'test' TO me->mt_local_test_classes. - ENDMETHOD. - -ENDCLASS. - -CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . - PROTECTED SECTION. - DATA: - mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, - mo_fake_object_files TYPE REF TO ltd_fake_object_files, - mo_xml_input TYPE REF TO lcl_xml_input, - mo_xml_out TYPE REF TO lcl_xml_output, - mo_oo_object TYPE REF TO lif_object, - ms_item TYPE ty_item. - METHODS: when_deserializing - RAISING - lcx_exception, - then_should_deserialize_source, - given_the_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt - RAISING - lcx_exception, - then_shuld_update_descriptions - IMPORTING - it_descriptions TYPE ty_seocompotx_tt, - then_it_should_add_activation, - given_documentation_in_xml_as - IMPORTING - it_lines TYPE tlinetab - RAISING - lcx_exception, - then_docu_should_be_created - IMPORTING - it_lines TYPE tlinetab. - -ENDCLASS. -CLASS ltc_oo_test IMPLEMENTATION. - - METHOD then_docu_should_be_created. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_docu_lines - exp = it_lines ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_object_name - exp = ms_item-obj_name ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_language - exp = sy-langu ). - ENDMETHOD. - - METHOD given_documentation_in_xml_as. - mo_xml_out->add( - iv_name = 'LINES' - ig_data = it_lines ). - ENDMETHOD. - - METHOD then_it_should_add_activation. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_item_to_activate - exp = ms_item ). - ENDMETHOD. - - METHOD then_shuld_update_descriptions. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions - exp = it_descriptions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_description_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD given_the_descriptions. - mo_xml_out->add( - iv_name = 'DESCRIPTIONS' - ig_data = it_descriptions ). - ENDMETHOD. - - METHOD then_should_deserialize_source. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_source - exp = mo_fake_object_files->mt_sources ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_deserialize_key - exp = ms_item-obj_name ). - ENDMETHOD. - - METHOD when_deserializing. - CREATE OBJECT mo_xml_input - EXPORTING - iv_xml = mo_xml_out->render( ). - mo_oo_object->deserialize( - iv_package = 'package_name' - io_xml = mo_xml_input ). - ENDMETHOD. -ENDCLASS. - -CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_a_class_properties - RAISING - lcx_exception, - then_should_create_class, - then_it_should_generate_locals, - should_create_class FOR TESTING RAISING cx_static_check, - should_generate_locals FOR TESTING RAISING cx_static_check, - should_deserialize_source FOR TESTING RAISING cx_static_check, - should_update_descriptions FOR TESTING RAISING cx_static_check, - should_add_to_activation FOR TESTING RAISING cx_static_check, - no_text_pool_no_insert FOR TESTING RAISING cx_static_check, - insert_text_pool FOR TESTING RAISING cx_static_check, - create_stor_from_xml FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_class_properties TYPE vseoclass. -ENDCLASS. - -CLASS ltc_class_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zcl_class'. - ms_item-obj_type = 'CLAS'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_clas - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD should_create_class. - ms_class_properties-clsname = ms_item-obj_name. - - given_a_class_properties( ). - - when_deserializing( ). - - then_should_create_class( ). - ENDMETHOD. - - METHOD should_generate_locals. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_generate_locals( ). - ENDMETHOD. - - METHOD should_deserialize_source. - given_a_class_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD should_update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_a_class_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD should_add_to_activation. - given_a_class_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD given_a_class_properties. - mo_xml_out->add( - iv_name = 'VSEOCLASS' - ig_data = ms_class_properties ). - ENDMETHOD. - - METHOD then_should_create_class. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_class_properties - exp = ms_class_properties ). - - cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - - METHOD then_it_should_generate_locals. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_locals_key - exp = ms_item-obj_name ). - cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_force ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_definitions - exp = mo_fake_object_files->mt_local_definitions ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_implementations - exp = mo_fake_object_files->mt_local_implementations ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_macros - exp = mo_fake_object_files->mt_local_macros ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_test_classes - exp = mo_fake_object_files->mt_local_test_classes ). - ENDMETHOD. - METHOD no_text_pool_no_insert. - given_a_class_properties( ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_false( mo_spy_oo_object->mv_text_pool_inserted ). - ENDMETHOD. - - METHOD insert_text_pool. - DATA: lt_pool_external TYPE textpool_table, - ls_pool_external TYPE ty_tpool. - ls_pool_external-id = 'ID'. - ls_pool_external-key = 'KEY'. - APPEND ls_pool_external TO lt_pool_external. - - given_a_class_properties( ). - - mo_xml_out->add( - iv_name = 'TPOOL' - ig_data = lt_pool_external ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_text_pool - exp = lt_pool_external ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_text_pool_class_name - exp = 'zcl_class' ). - ENDMETHOD. - - METHOD create_stor_from_xml. - DATA: - lt_sotr TYPE ty_sotr_tt, - ls_sotr LIKE LINE OF lt_sotr. - - given_a_class_properties( ). - - ls_sotr-header-concept = 'HEADER'. - APPEND ls_sotr TO lt_sotr. - mo_xml_out->add( - iv_name = 'SOTR' - ig_data = lt_sotr ). - - when_deserializing( ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr - exp = lt_sotr ). - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Class Line Doc'. - APPEND ls_line TO lt_lines. - - given_a_class_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. -ENDCLASS. - -CLASS ltc_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT -INHERITING FROM ltc_oo_test. - PRIVATE SECTION. - METHODS: - setup, - given_an_interface_properties - RAISING - lcx_exception, - then_should_create_interface, - create_interface FOR TESTING RAISING cx_static_check, - update_descriptions FOR TESTING RAISING cx_static_check, - add_to_activation FOR TESTING RAISING cx_static_check, - deserialize_source FOR TESTING RAISING cx_static_check, - create_documentation FOR TESTING RAISING cx_static_check. - DATA: - ms_interface_properties TYPE vseointerf. -ENDCLASS. -CLASS ltc_interface_deserialization IMPLEMENTATION. - METHOD setup. - CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. - CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). - - ms_item-devclass = 'package_name'. - ms_item-obj_name = 'zif_interface'. - ms_item-obj_type = 'INTF'. - - CREATE OBJECT mo_oo_object TYPE lcl_object_intf - EXPORTING - is_item = ms_item - iv_language = sy-langu. - mo_oo_object->mo_files = mo_fake_object_files. - ENDMETHOD. - - METHOD create_interface. - ms_interface_properties-clsname = ms_item-obj_name. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_create_interface( ). - ENDMETHOD. - - METHOD update_descriptions. - DATA: - ls_description TYPE seocompotx, - lt_descriptions TYPE ty_seocompotx_tt. - - given_an_interface_properties( ). - - ls_description-clsname = ms_item-obj_name. - ls_description-cmpname = 'a_method'. - APPEND ls_description TO lt_descriptions. - given_the_descriptions( lt_descriptions ). - - when_deserializing( ). - - then_shuld_update_descriptions( lt_descriptions ). - ENDMETHOD. - - METHOD add_to_activation. - given_an_interface_properties( ). - - when_deserializing( ). - - then_it_should_add_activation( ). - ENDMETHOD. - - METHOD deserialize_source. - given_an_interface_properties( ). - - when_deserializing( ). - - then_should_deserialize_source( ). - ENDMETHOD. - - METHOD given_an_interface_properties. - mo_xml_out->add( - iv_name = 'VSEOINTERF' - ig_data = ms_interface_properties ). - ENDMETHOD. - - METHOD then_should_create_interface. - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_interface_properties - exp = ms_interface_properties ). - - cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). - - cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package - exp = 'package_name' ). - ENDMETHOD. - - METHOD create_documentation. - DATA: lt_lines TYPE tlinetab, - ls_line TYPE LINE OF tlinetab. - ls_line-tdline = 'Interface Line Doc'. - APPEND ls_line TO lt_lines. - - given_an_interface_properties( ). - - given_documentation_in_xml_as( lt_lines ). - - when_deserializing( ). - - then_docu_should_be_created( lt_lines ). - ENDMETHOD. - ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index dd6c4a514..40318dec2 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -2205,4 +2205,544 @@ CLASS ltcl_persistence_settings IMPLEMENTATION. ENDMETHOD. +ENDCLASS. + + +CLASS ltd_spy_oo_object DEFINITION FOR TESTING. + PUBLIC SECTION. + INTERFACES: lif_object_oriented_object. + DATA: + mv_package TYPE devclass, + mv_overwrite TYPE seox_boolean, + ms_interface_properties TYPE vseointerf, + ms_class_properties TYPE vseoclass, + ms_locals_key TYPE seoclskey, + mt_local_definitions TYPE rswsourcet, + mt_local_implementations TYPE rswsourcet, + mt_local_macros TYPE rswsourcet, + mt_local_test_classes TYPE rswsourcet, + mv_force TYPE seoflag, + ms_deserialize_key TYPE seoclskey, + mt_source TYPE ty_string_tt, + ms_item_to_activate TYPE ty_item, + mt_descriptions TYPE ty_seocompotx_tt, + ms_description_key TYPE seoclskey, + mv_text_pool_class_name TYPE seoclsname, + mt_text_pool TYPE textpool_table, + mv_text_pool_inserted TYPE abap_bool, + mt_sotr TYPE ty_sotr_tt, + mt_sotr_package TYPE devclass, + mv_docu_object_name TYPE dokhl-object, + mv_docu_language TYPE spras, + mt_docu_lines TYPE tlinetab. + +ENDCLASS. +CLASS ltd_spy_oo_object IMPLEMENTATION. + METHOD lif_object_oriented_object~create. + DATA lv_properties_structure_name TYPE string. + lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. + IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. + ms_interface_properties = is_properties. + ELSE. + ms_class_properties = is_properties. + ENDIF. + mv_package = iv_package. + mv_overwrite = iv_overwrite. + ENDMETHOD. + METHOD lif_object_oriented_object~generate_locals. + ms_locals_key = is_key. + mt_local_definitions = it_local_definitions. + mt_local_implementations = it_local_implementations. + mt_local_macros = it_local_macros. + mt_local_test_classes = it_local_test_classes. + mv_force = iv_force. + ENDMETHOD. + + METHOD lif_object_oriented_object~deserialize_source. + ms_deserialize_key = is_key. + mt_source = it_source. + ENDMETHOD. + + METHOD lif_object_oriented_object~add_to_activation_list. + ms_item_to_activate = is_item. + ENDMETHOD. + + METHOD lif_object_oriented_object~update_descriptions. + ms_description_key = is_key. + mt_descriptions = it_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object~insert_text_pool. + mv_text_pool_inserted = abap_true. + mv_text_pool_class_name = iv_class_name. + mt_text_pool = it_text_pool. + cl_abap_unit_assert=>assert_equals( + act = iv_language + exp = sy-langu ). + ENDMETHOD. + + METHOD lif_object_oriented_object~create_sotr. + mt_sotr = it_sotr. + mt_sotr_package = iv_package. + ENDMETHOD. + + METHOD lif_object_oriented_object~create_documentation. + mv_docu_object_name = iv_object_name. + mv_docu_language = iv_language. + mt_docu_lines = it_lines. + ENDMETHOD. + +ENDCLASS. + +CLASS ltd_fake_object_files DEFINITION FOR TESTING + INHERITING FROM lcl_objects_files. + PUBLIC SECTION. + METHODS constructor. + METHODS read_abap REDEFINITION. + DATA: + mt_sources TYPE seop_source_string, + mt_local_definitions TYPE seop_source_string, + mt_local_implementations TYPE seop_source_string, + mt_local_macros TYPE seop_source_string, + mt_local_test_classes TYPE seop_source_string. +ENDCLASS. +CLASS ltd_fake_object_files IMPLEMENTATION. + METHOD read_abap. + CASE iv_extra. + WHEN 'locals_def'. + rt_abap = mt_local_definitions. + WHEN 'locals_imp'. + rt_abap = mt_local_implementations. + WHEN 'macros'. + rt_abap = mt_local_macros. + WHEN 'testclasses'. + rt_abap = mt_local_test_classes. + WHEN OTHERS. + rt_abap = mt_sources. + RETURN. + ENDCASE. + + cl_abap_unit_assert=>assert_false( iv_error ). + ENDMETHOD. + METHOD constructor. + DATA ls_empty_item TYPE ty_item. + super->constructor( ls_empty_item ). + APPEND 'source' TO me->mt_sources. + APPEND 'definition' TO me->mt_local_definitions. + APPEND 'implementation' TO me->mt_local_implementations. + APPEND 'macro' TO me->mt_local_macros. + APPEND 'test' TO me->mt_local_test_classes. + ENDMETHOD. + +ENDCLASS. + +CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT . + PROTECTED SECTION. + DATA: + mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_oo_object TYPE REF TO lif_object, + ms_item TYPE ty_item. + METHODS: when_deserializing + RAISING + lcx_exception, + then_should_deserialize_source, + given_the_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt + RAISING + lcx_exception, + then_shuld_update_descriptions + IMPORTING + it_descriptions TYPE ty_seocompotx_tt, + then_it_should_add_activation, + given_documentation_in_xml_as + IMPORTING + it_lines TYPE tlinetab + RAISING + lcx_exception, + then_docu_should_be_created + IMPORTING + it_lines TYPE tlinetab. + +ENDCLASS. +CLASS ltc_oo_test IMPLEMENTATION. + + METHOD then_docu_should_be_created. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_docu_lines + exp = it_lines ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_object_name + exp = ms_item-obj_name ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_docu_language + exp = sy-langu ). + ENDMETHOD. + + METHOD given_documentation_in_xml_as. + mo_xml_out->add( + iv_name = 'LINES' + ig_data = it_lines ). + ENDMETHOD. + + METHOD then_it_should_add_activation. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_item_to_activate + exp = ms_item ). + ENDMETHOD. + + METHOD then_shuld_update_descriptions. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_descriptions + exp = it_descriptions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_description_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD given_the_descriptions. + mo_xml_out->add( + iv_name = 'DESCRIPTIONS' + ig_data = it_descriptions ). + ENDMETHOD. + + METHOD then_should_deserialize_source. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_source + exp = mo_fake_object_files->mt_sources ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_deserialize_key + exp = ms_item-obj_name ). + ENDMETHOD. + + METHOD when_deserializing. + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + mo_oo_object->deserialize( + iv_package = 'package_name' + io_xml = mo_xml_input ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_a_class_properties + RAISING + lcx_exception, + then_should_create_class, + then_it_should_generate_locals, + should_create_class FOR TESTING RAISING cx_static_check, + should_generate_locals FOR TESTING RAISING cx_static_check, + should_deserialize_source FOR TESTING RAISING cx_static_check, + should_update_descriptions FOR TESTING RAISING cx_static_check, + should_add_to_activation FOR TESTING RAISING cx_static_check, + no_text_pool_no_insert FOR TESTING RAISING cx_static_check, + insert_text_pool FOR TESTING RAISING cx_static_check, + create_stor_from_xml FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_class_properties TYPE vseoclass. +ENDCLASS. + +CLASS ltcl_class_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD should_create_class. + ms_class_properties-clsname = ms_item-obj_name. + + given_a_class_properties( ). + + when_deserializing( ). + + then_should_create_class( ). + ENDMETHOD. + + METHOD should_generate_locals. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_generate_locals( ). + ENDMETHOD. + + METHOD should_deserialize_source. + given_a_class_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD should_update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_a_class_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD should_add_to_activation. + given_a_class_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD given_a_class_properties. + mo_xml_out->add( + iv_name = 'VSEOCLASS' + ig_data = ms_class_properties ). + ENDMETHOD. + + METHOD then_should_create_class. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_class_properties + exp = ms_class_properties ). + + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). + ENDMETHOD. + + + METHOD then_it_should_generate_locals. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_locals_key + exp = ms_item-obj_name ). + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_force ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_definitions + exp = mo_fake_object_files->mt_local_definitions ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_implementations + exp = mo_fake_object_files->mt_local_implementations ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_macros + exp = mo_fake_object_files->mt_local_macros ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_local_test_classes + exp = mo_fake_object_files->mt_local_test_classes ). + ENDMETHOD. + METHOD no_text_pool_no_insert. + given_a_class_properties( ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_false( mo_spy_oo_object->mv_text_pool_inserted ). + ENDMETHOD. + + METHOD insert_text_pool. + DATA: lt_pool_external TYPE textpool_table, + ls_pool_external TYPE ty_tpool. + ls_pool_external-id = 'ID'. + ls_pool_external-key = 'KEY'. + APPEND ls_pool_external TO lt_pool_external. + + given_a_class_properties( ). + + mo_xml_out->add( + iv_name = 'TPOOL' + ig_data = lt_pool_external ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_text_pool + exp = lt_pool_external ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_text_pool_class_name + exp = 'zcl_class' ). + ENDMETHOD. + + METHOD create_stor_from_xml. + DATA: + lt_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + given_a_class_properties( ). + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + mo_xml_out->add( + iv_name = 'SOTR' + ig_data = lt_sotr ). + + when_deserializing( ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr + exp = lt_sotr ). + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mt_sotr_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Class Line Doc'. + APPEND ls_line TO lt_lines. + + given_a_class_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_interface_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + given_an_interface_properties + RAISING + lcx_exception, + then_should_create_interface, + create_interface FOR TESTING RAISING cx_static_check, + update_descriptions FOR TESTING RAISING cx_static_check, + add_to_activation FOR TESTING RAISING cx_static_check, + deserialize_source FOR TESTING RAISING cx_static_check, + create_documentation FOR TESTING RAISING cx_static_check. + DATA: + ms_interface_properties TYPE vseointerf. +ENDCLASS. +CLASS ltcl_interface_deserialization IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_xml_out. + lth_oo_factory_injector=>inject( mo_spy_oo_object ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD create_interface. + ms_interface_properties-clsname = ms_item-obj_name. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_create_interface( ). + ENDMETHOD. + + METHOD update_descriptions. + DATA: + ls_description TYPE seocompotx, + lt_descriptions TYPE ty_seocompotx_tt. + + given_an_interface_properties( ). + + ls_description-clsname = ms_item-obj_name. + ls_description-cmpname = 'a_method'. + APPEND ls_description TO lt_descriptions. + given_the_descriptions( lt_descriptions ). + + when_deserializing( ). + + then_shuld_update_descriptions( lt_descriptions ). + ENDMETHOD. + + METHOD add_to_activation. + given_an_interface_properties( ). + + when_deserializing( ). + + then_it_should_add_activation( ). + ENDMETHOD. + + METHOD deserialize_source. + given_an_interface_properties( ). + + when_deserializing( ). + + then_should_deserialize_source( ). + ENDMETHOD. + + METHOD given_an_interface_properties. + mo_xml_out->add( + iv_name = 'VSEOINTERF' + ig_data = ms_interface_properties ). + ENDMETHOD. + + METHOD then_should_create_interface. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->ms_interface_properties + exp = ms_interface_properties ). + + cl_abap_unit_assert=>assert_true( mo_spy_oo_object->mv_overwrite ). + + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object->mv_package + exp = 'package_name' ). + ENDMETHOD. + + METHOD create_documentation. + DATA: lt_lines TYPE tlinetab, + ls_line TYPE LINE OF tlinetab. + ls_line-tdline = 'Interface Line Doc'. + APPEND ls_line TO lt_lines. + + given_an_interface_properties( ). + + given_documentation_in_xml_as( lt_lines ). + + when_deserializing( ). + + then_docu_should_be_created( lt_lines ). + ENDMETHOD. ENDCLASS. \ No newline at end of file From 66635c89290c3b5a8d8d9b5c5c374ed17b464132 Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 26 Dec 2016 19:16:53 +0000 Subject: [PATCH 18/20] TABL: clear invalid field value --- src/zabapgit_object_tabl.prog.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index 8f70c2f35..857953079 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -170,6 +170,10 @@ CLASS lcl_object_tabl IMPLEMENTATION. ls_dd02v-as4date, ls_dd02v-as4time. + IF ls_dd02v-prozpuff = ''. + CLEAR ls_dd02v-prozpuff. " reset numeric field, so XML does not crash + ENDIF. + CLEAR: ls_dd09l-as4user, ls_dd09l-as4date, ls_dd09l-as4time. From 392c691b337e1c5400adebcf4831e62785c1e89c Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 26 Dec 2016 19:39:52 +0000 Subject: [PATCH 19/20] TABL: clear more --- src/zabapgit_object_tabl.prog.abap | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/zabapgit_object_tabl.prog.abap b/src/zabapgit_object_tabl.prog.abap index 857953079..1875fa2c9 100644 --- a/src/zabapgit_object_tabl.prog.abap +++ b/src/zabapgit_object_tabl.prog.abap @@ -170,8 +170,15 @@ CLASS lcl_object_tabl IMPLEMENTATION. ls_dd02v-as4date, ls_dd02v-as4time. +* reset numeric field, so XML does not crash IF ls_dd02v-prozpuff = ''. - CLEAR ls_dd02v-prozpuff. " reset numeric field, so XML does not crash + CLEAR ls_dd02v-prozpuff. + ENDIF. + IF ls_dd02v-datmin = ''. + CLEAR ls_dd02v-datmin. + ENDIF. + IF ls_dd02v-datmax = ''. + CLEAR ls_dd02v-datmax. ENDIF. CLEAR: ls_dd09l-as4user, From 585f30d589217ded878067a927e2f7b1957c91cf Mon Sep 17 00:00:00 2001 From: larshp Date: Thu, 29 Dec 2016 09:11:00 +0000 Subject: [PATCH 20/20] FUGR: fix texpool METHOD deserialize_textpool moved --- src/zabapgit.prog.abap | 2 +- src/zabapgit_object_clas.prog.abap | 7 +++--- src/zabapgit_object_fugr.prog.abap | 3 +++ src/zabapgit_object_prog.prog.abap | 29 ++----------------------- src/zabapgit_objects.prog.abap | 34 ++++++++++++++++++++++++------ 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 410f97ba6..af05a2383 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.24.7'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.24.8'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index f2f27ef32..7dec96873 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -416,7 +416,7 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. PRIVATE SECTION. DATA mv_skip_testclass TYPE abap_bool. - METHODS deserialize_textpool + METHODS deserialize_tpool IMPORTING io_xml TYPE REF TO lcl_xml_input RAISING lcx_exception. @@ -1103,7 +1103,7 @@ CLASS lcl_object_clas IMPLEMENTATION. deserialize_abap( io_xml = io_xml iv_package = iv_package ). - deserialize_textpool( io_xml ). + deserialize_tpool( io_xml ). deserialize_sotr( io_xml = io_xml iv_package = iv_package ). @@ -1153,7 +1153,7 @@ CLASS lcl_object_clas IMPLEMENTATION. iv_language = mv_language ). ENDMETHOD. "deserialize_doku - METHOD deserialize_textpool. + METHOD deserialize_tpool. DATA: lv_cp TYPE program, lv_clsname TYPE seoclsname, @@ -1175,6 +1175,7 @@ CLASS lcl_object_clas IMPLEMENTATION. iv_class_name = lv_clsname it_text_pool = lt_tpool iv_language = mv_language ). + ENDMETHOD. "deserialize_textpool METHOD deserialize_abap. diff --git a/src/zabapgit_object_fugr.prog.abap b/src/zabapgit_object_fugr.prog.abap index 97aaf4f86..d09713ae7 100644 --- a/src/zabapgit_object_fugr.prog.abap +++ b/src/zabapgit_object_fugr.prog.abap @@ -317,6 +317,9 @@ CLASS lcl_object_fugr IMPLEMENTATION. it_tpool = lt_tpool iv_package = iv_package ). + deserialize_textpool( iv_program = + it_tpool = lt_tpool ). + ENDLOOP. ENDMETHOD. "deserialize_includes diff --git a/src/zabapgit_object_prog.prog.abap b/src/zabapgit_object_prog.prog.abap index d3b29e3c8..c3a32baee 100644 --- a/src/zabapgit_object_prog.prog.abap +++ b/src/zabapgit_object_prog.prog.abap @@ -13,12 +13,6 @@ CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. - PRIVATE SECTION. - - METHODS deserialize_textpool - IMPORTING it_tpool TYPE textpool_table - RAISING lcx_exception. - ENDCLASS. "lcl_object_prog DEFINITION *----------------------------------------------------------------------* @@ -95,26 +89,6 @@ CLASS lcl_object_prog IMPLEMENTATION. ENDMETHOD. "delete - METHOD deserialize_textpool. - - READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS. - IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0. - RETURN. " no action for includes - ENDIF. - - INSERT TEXTPOOL ms_item-obj_name - FROM it_tpool - LANGUAGE mv_language - STATE 'I'. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). - ENDIF. - - lcl_objects_activation=>add( iv_type = 'REPT' - iv_name = ms_item-obj_name ). - - ENDMETHOD. "deserialize_textpool - METHOD lif_object~serialize. serialize_program( io_xml = io_xml @@ -157,7 +131,8 @@ CLASS lcl_object_prog IMPLEMENTATION. deserialize_cua( iv_program_name = lv_program_name is_cua = ls_cua ). - deserialize_textpool( lt_tpool ). + deserialize_textpool( iv_program = ms_item-obj_name + it_tpool = lt_tpool ). ENDMETHOD. "lif_serialize~deserialize diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index dbaa27977..601fb0c4c 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -898,6 +898,11 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. IMPORTING it_dynpros TYPE ty_dynpro_tt RAISING lcx_exception. + METHODS deserialize_textpool + IMPORTING iv_program TYPE programm + it_tpool TYPE textpool_table + RAISING lcx_exception. + METHODS deserialize_cua IMPORTING iv_program_name TYPE programm is_cua TYPE ty_cua @@ -1036,12 +1041,9 @@ CLASS lcl_objects_program IMPLEMENTATION. ENDIF. ENDIF. - IF lines( lt_tpool ) = 1. - READ TABLE lt_tpool INDEX 1 INTO ls_tpool. - ASSERT sy-subrc = 0. - IF ls_tpool-id = 'R' AND ls_tpool-key = '' AND ls_tpool-length = 0. - DELETE lt_tpool INDEX 1. - ENDIF. + READ TABLE lt_tpool WITH KEY id = 'R' INTO ls_tpool. + IF sy-subrc = 0 AND ls_tpool-key = '' AND ls_tpool-length = 0. + DELETE lt_tpool INDEX sy-tabix. ENDIF. lo_xml->add( iv_name = 'TPOOL' @@ -1416,6 +1418,26 @@ CLASS lcl_objects_program IMPLEMENTATION. ENDMETHOD. "read_tpool + METHOD deserialize_textpool. + + READ TABLE it_tpool WITH KEY id = 'R' TRANSPORTING NO FIELDS. + IF ( sy-subrc = 0 AND lines( it_tpool ) = 1 ) OR lines( it_tpool ) = 0. + RETURN. " no action for includes + ENDIF. + + INSERT TEXTPOOL iv_program + FROM it_tpool + LANGUAGE mv_language + STATE 'I'. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). + ENDIF. + + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = iv_program ). + + ENDMETHOD. "deserialize_textpool + METHOD deserialize_cua. DATA: ls_tr_key TYPE trkey.