From c78d3bb3394ebaf8d0d286f81c064dd5352e4931 Mon Sep 17 00:00:00 2001
From: sbcgua
Date: Mon, 12 Dec 2016 14:29:45 +0200
Subject: [PATCH 01/15] W3xx remove filesize finetune, fixes #495
---
src/zabapgit_css_common.w3mi.xml | 12 ---
src/zabapgit_js_common.w3mi.xml | 12 ---
src/zabapgit_object_w3xx.prog.abap | 119 +++++++++++++--------------
src/zabapgit_repo.prog.abap | 5 +-
src/zabapgit_repo_impl.prog.abap | 36 +++++++-
src/zabapgit_services_repo.prog.abap | 8 +-
src/zabapgit_view_repo.prog.abap | 4 +-
7 files changed, 102 insertions(+), 94 deletions(-)
diff --git a/src/zabapgit_css_common.w3mi.xml b/src/zabapgit_css_common.w3mi.xml
index ddab44689..10d1ffd0d 100644
--- a/src/zabapgit_css_common.w3mi.xml
+++ b/src/zabapgit_css_common.w3mi.xml
@@ -17,24 +17,12 @@
filename
~wwwtmp.css
-
- MI
- ZABAPGIT_CSS_COMMON
- filesize
- 12615
-
MI
ZABAPGIT_CSS_COMMON
mimetype
text/css
-
- MI
- ZABAPGIT_CSS_COMMON
- version
-
-
diff --git a/src/zabapgit_js_common.w3mi.xml b/src/zabapgit_js_common.w3mi.xml
index 7860ae90e..51f904696 100644
--- a/src/zabapgit_js_common.w3mi.xml
+++ b/src/zabapgit_js_common.w3mi.xml
@@ -17,24 +17,12 @@
filename
common.js
-
- MI
- ZABAPGIT_JS_COMMON
- filesize
- 6500
-
MI
ZABAPGIT_JS_COMMON
mimetype
text/javascript
-
- MI
- ZABAPGIT_JS_COMMON
- version
-
-
diff --git a/src/zabapgit_object_w3xx.prog.abap b/src/zabapgit_object_w3xx.prog.abap
index f1c17f50d..c14bdc062 100644
--- a/src/zabapgit_object_w3xx.prog.abap
+++ b/src/zabapgit_object_w3xx.prog.abap
@@ -12,13 +12,20 @@ CLASS lcl_object_w3super DEFINITION INHERITING FROM lcl_objects_super ABSTRACT.
PUBLIC SECTION.
INTERFACES lif_object.
- TYPES: ty_wwwparams_tt TYPE STANDARD TABLE OF wwwparams WITH DEFAULT KEY.
+ TYPES ty_wwwparams_tt TYPE STANDARD TABLE OF wwwparams WITH DEFAULT KEY.
- METHODS:
- constructor
- IMPORTING
- is_item TYPE ty_item
- iv_language TYPE spras.
+ CONSTANTS: BEGIN OF c_param_names,
+ version TYPE w3_name VALUE 'version',
+ fileext TYPE w3_name VALUE 'fileextension',
+ filesize TYPE w3_name VALUE 'filesize',
+ filename TYPE w3_name VALUE 'filename',
+ mimetype TYPE w3_name VALUE 'mimetype',
+ END OF c_param_names.
+
+ METHODS constructor
+ IMPORTING
+ is_item TYPE ty_item
+ iv_language TYPE spras.
PROTECTED SECTION.
@@ -33,18 +40,19 @@ CLASS lcl_object_w3super DEFINITION INHERITING FROM lcl_objects_super ABSTRACT.
RETURNING VALUE(rv_ext) TYPE string
RAISING lcx_exception.
- METHODS patch_size
- IMPORTING iv_size TYPE i OPTIONAL " Overwrite if given
- EXPORTING ev_size TYPE i " Return size as integer
+ METHODS normalize_params
+ IMPORTING iv_size TYPE i
CHANGING ct_params TYPE ty_wwwparams_tt " Param table to patch
RAISING lcx_exception.
- METHODS patch_filename
+ METHODS strip_params
CHANGING ct_params TYPE ty_wwwparams_tt
RAISING lcx_exception.
- METHODS clear_version
- CHANGING ct_params TYPE ty_wwwparams_tt
+ METHODS find_param
+ IMPORTING it_params TYPE ty_wwwparams_tt
+ iv_name TYPE w3_name
+ RETURNING VALUE(rv_value) TYPE string
RAISING lcx_exception.
ENDCLASS. "lcl_object_W3SUPER DEFINITION
@@ -145,15 +153,9 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot read W3xx data' ).
ENDIF.
- " Condense size string + get size to local integer
- patch_size( IMPORTING ev_size = lv_size
- CHANGING ct_params = lt_w3params ).
-
- " Remove file path (for security concerns)
- patch_filename( CHANGING ct_params = lt_w3params ).
-
- " Clear version
- clear_version( CHANGING ct_params = lt_w3params ).
+ lv_size = find_param( it_params = lt_w3params iv_name = c_param_names-filesize ).
+ " Clean params (remove version, filesize & clear filename from path)
+ strip_params( CHANGING ct_params = lt_w3params ).
CASE ms_key-relid.
WHEN 'MI'.
@@ -264,11 +266,9 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Wrong W3xx type' ).
ENDCASE.
- " Update size of file (for the case file was actually changed remotely)
- " Will also trigger "stage" at next sync if remote XML
- " was not updated with the new file size
- patch_size( EXPORTING iv_size = lv_size
- CHANGING ct_params = lt_w3params ).
+ " Update size of file based on actual data file size, prove param object name
+ normalize_params( EXPORTING iv_size = lv_size
+ CHANGING ct_params = lt_w3params ).
CALL FUNCTION 'WWWPARAMS_UPDATE'
TABLES
@@ -368,67 +368,60 @@ CLASS lcl_object_w3super IMPLEMENTATION.
METHOD get_ext.
- FIELD-SYMBOLS LIKE LINE OF it_params.
-
- READ TABLE it_params ASSIGNING WITH KEY name = 'fileextension'.
-
- IF sy-subrc > 0.
- lcx_exception=>raise( |W3xx: Cannot find file ext for { ms_key-objid }| ).
- ENDIF.
-
- rv_ext = -value.
+ rv_ext = find_param( it_params = it_params iv_name = c_param_names-fileext ).
SHIFT rv_ext LEFT DELETING LEADING '.'.
ENDMETHOD. " get_ext.
- METHOD patch_size.
+ METHOD normalize_params.
FIELD-SYMBOLS LIKE LINE OF ct_params.
- READ TABLE ct_params ASSIGNING WITH KEY name = 'filesize'.
-
- IF sy-subrc > 0.
- lcx_exception=>raise( |W3xx: Cannot find file size for { ms_key-objid }| ).
+ " Ensure filesize param exists
+ READ TABLE ct_params ASSIGNING WITH KEY name = c_param_names-filesize.
+ IF sy-subrc <> 0.
+ APPEND INITIAL LINE TO ct_params ASSIGNING .
+ -name = c_param_names-filesize.
ENDIF.
- IF iv_size IS NOT INITIAL.
- -value = iv_size.
- ENDIF.
- CONDENSE -value.
+ LOOP AT ct_params ASSIGNING .
+ -relid = ms_key-relid. " Ensure param key = object key
+ -objid = ms_key-objid.
+ IF -name = c_param_names-filesize. " Patch filesize = real file size
+ -value = iv_size.
+ CONDENSE -value.
+ ENDIF.
+ ENDLOOP.
- ev_size = -value.
+ ENDMETHOD. " normalize_params.
- ENDMETHOD. " patch_size.
-
- METHOD patch_filename.
+ METHOD strip_params.
FIELD-SYMBOLS LIKE LINE OF ct_params.
- READ TABLE ct_params ASSIGNING WITH KEY name = 'filename'.
-
- IF sy-subrc > 0.
- lcx_exception=>raise( |W3xx: Cannot find file name for { ms_key-objid }| ).
- ENDIF.
-
- " Remove path
+ " Remove path from filename
+ find_param( it_params = ct_params iv_name = c_param_names-filename ). " Check exists
+ READ TABLE ct_params ASSIGNING WITH KEY name = c_param_names-filename.
-value = lcl_path=>get_filename_from_syspath( |{ -value }| ).
- ENDMETHOD. " patch_filename.
+ " Clear version & filesize
+ DELETE ct_params WHERE name = c_param_names-version.
+ DELETE ct_params WHERE name = c_param_names-filesize.
- METHOD clear_version.
+ ENDMETHOD. " strip_params.
- FIELD-SYMBOLS LIKE LINE OF ct_params.
+ METHOD find_param.
- READ TABLE ct_params ASSIGNING WITH KEY name = 'version'.
+ FIELD-SYMBOLS LIKE LINE OF it_params.
+ READ TABLE it_params ASSIGNING WITH KEY name = iv_name.
IF sy-subrc > 0.
- lcx_exception=>raise( |W3xx: Cannot find version for { ms_key-objid }| ).
+ lcx_exception=>raise( |W3xx: Cannot find { iv_name } for { ms_key-objid }| ).
ENDIF.
- " Clear version
- CLEAR -value.
+ rv_value = -value.
- ENDMETHOD. " clear_version.
+ ENDMETHOD. " find_param.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap
index bc9646648..6d6eb40b5 100644
--- a/src/zabapgit_repo.prog.abap
+++ b/src/zabapgit_repo.prog.abap
@@ -46,6 +46,8 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv.
update_local_checksums
IMPORTING it_files TYPE ty_file_signatures_tt
RAISING lcx_exception,
+ rebuild_local_checksums
+ RAISING lcx_exception,
is_offline
RETURNING VALUE(rv_offline) TYPE abap_bool
RAISING lcx_exception.
@@ -118,8 +120,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL.
RETURNING VALUE(rt_results) TYPE ty_results_tt
RAISING lcx_exception,
reset_status,
- rebuild_local_checksums
- RAISING lcx_exception,
+ rebuild_local_checksums REDEFINITION,
push
IMPORTING is_comment TYPE ty_comment
io_stage TYPE REF TO lcl_stage
diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap
index ed9bc0599..4953a8fa1 100644
--- a/src/zabapgit_repo_impl.prog.abap
+++ b/src/zabapgit_repo_impl.prog.abap
@@ -243,7 +243,7 @@ CLASS lcl_repo_online IMPLEMENTATION.
ENDMETHOD.
- METHOD rebuild_local_checksums.
+ METHOD rebuild_local_checksums. "REMOTE
DATA: lt_remote TYPE ty_files_tt,
lt_local TYPE ty_files_item_tt,
@@ -639,6 +639,40 @@ CLASS lcl_repo IMPLEMENTATION.
rv_yes = ms_data-write_protect.
ENDMETHOD. "is_write_protected
+ METHOD rebuild_local_checksums. "LOCAL (BASE)
+
+ DATA: lt_local TYPE ty_files_item_tt,
+ ls_last_item TYPE ty_item,
+ lt_checksums TYPE lcl_persistence_repo=>ty_local_checksum_tt.
+
+ FIELD-SYMBOLS: LIKE LINE OF lt_checksums,
+ LIKE LINE OF -files,
+ LIKE LINE OF lt_local.
+
+ lt_local = get_files_local( ).
+
+ DELETE lt_local " Remove non-code related files except .abapgit
+ WHERE item IS INITIAL
+ AND NOT ( file-path = gc_root_dir AND file-filename = gc_dot_abapgit ).
+
+ SORT lt_local BY item.
+
+ LOOP AT lt_local ASSIGNING .
+ IF ls_last_item <> -item OR sy-tabix = 1. " First or New item reached ?
+ APPEND INITIAL LINE TO lt_checksums ASSIGNING .
+ -item = -item.
+ ls_last_item = -item.
+ ENDIF.
+
+ APPEND INITIAL LINE TO -files ASSIGNING .
+ MOVE-CORRESPONDING -file TO .
+
+ ENDLOOP.
+
+ set( it_checksums = lt_checksums ).
+
+ ENDMETHOD. " rebuild_local_checksums.
+
ENDCLASS. "lcl_repo IMPLEMENTATION
*----------------------------------------------------------------------*
diff --git a/src/zabapgit_services_repo.prog.abap b/src/zabapgit_services_repo.prog.abap
index 0a4858a85..2c9863854 100644
--- a/src/zabapgit_services_repo.prog.abap
+++ b/src/zabapgit_services_repo.prog.abap
@@ -265,16 +265,20 @@ CLASS lcl_services_repo IMPLEMENTATION.
DATA: lv_answer TYPE c,
lv_question TYPE string,
- lo_repo TYPE REF TO lcl_repo_online.
+ lo_repo TYPE REF TO lcl_repo.
lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ).
- lv_question = 'This will rebuild and overwrite local repo checksums.'
+ lv_question = 'This will rebuild and overwrite local repo checksums.'.
+
+ IF lo_repo->is_offline( ) = abap_false.
+ lv_question = lv_question
&& ' The logic: if local and remote file differs then:'
&& ' if remote branch is ahead then assume changes are remote,'
&& ' else (branches are equal) assume changes are local.'
&& ' This will lead to incorrect state for files changed on both sides.'
&& ' Please make sure you don''t have ones like that.'.
+ ENDIF.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Warning'
diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap
index 70d53ac4d..e71d0064a 100644
--- a/src/zabapgit_view_repo.prog.abap
+++ b/src/zabapgit_view_repo.prog.abap
@@ -260,12 +260,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ).
lo_tb_advanced->add( iv_txt = 'Make off-line'
iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ).
- lo_tb_advanced->add( iv_txt = 'Update local checksums'
- iv_act = |{ gc_action-repo_refresh_checksums }?{ lv_key }| ).
ELSE.
lo_tb_advanced->add( iv_txt = 'Make on-line'
iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ).
ENDIF.
+ lo_tb_advanced->add( iv_txt = 'Update local checksums'
+ iv_act = |{ gc_action-repo_refresh_checksums }?{ lv_key }| ).
lo_tb_advanced->add( iv_txt = 'Remove'
iv_act = |{ gc_action-repo_remove }?{ lv_key }| ).
lo_tb_advanced->add( iv_txt = 'Uninstall'
From 77cea07806842a8bc9b71cad5188528a20562b6f Mon Sep 17 00:00:00 2001
From: sbcgua
Date: Mon, 12 Dec 2016 21:22:04 +0200
Subject: [PATCH 02/15] tutorial minor tuning #469
---
src/zabapgit_css_common.w3mi.data.css | 1 +
src/zabapgit_view_tutorial.prog.abap | 15 ++++++---------
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css
index d326d2f69..f81327870 100644
--- a/src/zabapgit_css_common.w3mi.data.css
+++ b/src/zabapgit_css_common.w3mi.data.css
@@ -597,6 +597,7 @@ div.tutorial {
}
div.tutorial hr { border-color: #CCC; }
+div.tutorial li { margin: 2px 0px }
div.tutorial h1 {
font-size: 18pt;
color: #404040;
diff --git a/src/zabapgit_view_tutorial.prog.abap b/src/zabapgit_view_tutorial.prog.abap
index e264ac50c..d7ea7f729 100644
--- a/src/zabapgit_view_tutorial.prog.abap
+++ b/src/zabapgit_view_tutorial.prog.abap
@@ -31,14 +31,6 @@ CLASS lcl_gui_view_tutorial IMPLEMENTATION.
_add 'Tutorial
'.
_add '
'.
- _add 'Repository list and favorites
'.
- _add ''.
- _add '- To choose a repo press
at the favorite bar. '.
- _add '- To add a repo as favorite'.
- _add ' click
icon at repo toolbar. '.
- _add '
'.
-
-
_add 'Adding and cloning repos
'.
_add ''.
_add `- To clone a remote repo (e.g. from github) click `.
@@ -51,8 +43,13 @@ CLASS lcl_gui_view_tutorial IMPLEMENTATION.
_add ' or just serialize as a zip file
'.
_add '
'.
- _add 'abapGit related repositories
'.
+ _add 'Repository list and favorites
'.
+ _add ''.
+ _add '- To choose a repo press
at the favorite bar. '.
+ _add '- To favorite a repo click
icon at repo toolbar. '.
+ _add '
'.
+ _add 'abapGit related repositories
'.
_add ''.
_add '- '.
ro_html->add_anchor( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ).
From 8447e0cc2da14251ee2cbad423b118af85c638e2 Mon Sep 17 00:00:00 2001
From: Fabio Zuber
Date: Tue, 13 Dec 2016 17:18:31 +0100
Subject: [PATCH 03/15] refactor commit author regex fixes #410
---
src/zabapgit_definitions.prog.abap | 3 ++-
src/zabapgit_page_branch_overview.prog.abap | 2 +-
src/zabapgit_page_merge.prog.abap | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap
index 139849bfe..6cccf90c5 100644
--- a/src/zabapgit_definitions.prog.abap
+++ b/src/zabapgit_definitions.prog.abap
@@ -156,7 +156,8 @@ CONSTANTS: gc_newline TYPE abap_char1 VALUE cl_abap_char_utilities=>newline.
CONSTANTS: gc_english TYPE spras VALUE 'E'.
CONSTANTS: gc_root_dir TYPE string VALUE '/',
- gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT.
+ gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT,
+ gc_author_regex TYPE string VALUE '^([\w\s\.@\-_1-9]+) <(.*)> (\d{10}) .\d{4}$' ##NO_TEXT.
CONSTANTS: BEGIN OF gc_action,
repo_clone TYPE string VALUE 'repo_clone',
diff --git a/src/zabapgit_page_branch_overview.prog.abap b/src/zabapgit_page_branch_overview.prog.abap
index 1c820ea70..0873eea5c 100644
--- a/src/zabapgit_page_branch_overview.prog.abap
+++ b/src/zabapgit_page_branch_overview.prog.abap
@@ -193,7 +193,7 @@ CLASS lcl_branch_overview IMPLEMENTATION.
SPLIT ls_raw-body AT gc_newline INTO ls_commit-message lv_trash.
* unix time stamps are in same time zone, so ignore the zone,
- FIND REGEX '^([\w\s\.@]+) <(.*)> (\d{10}) .\d{4}$' IN ls_raw-author
+ FIND REGEX gc_author_regex IN ls_raw-author
SUBMATCHES
ls_commit-author
ls_commit-email
diff --git a/src/zabapgit_page_merge.prog.abap b/src/zabapgit_page_merge.prog.abap
index df5f4c004..c415d02eb 100644
--- a/src/zabapgit_page_merge.prog.abap
+++ b/src/zabapgit_page_merge.prog.abap
@@ -283,7 +283,7 @@ CLASS lcl_merge IMPLEMENTATION.
-commit = lv_commit.
-tree = ls_commit-tree.
-body = ls_commit-body.
- FIND REGEX '^[\w\s]+ <.*> (\d{10}) .\d{4}$' IN ls_commit-author
+ FIND REGEX gc_author_regex IN ls_commit-author
SUBMATCHES -time ##NO_TEXT.
ASSERT sy-subrc = 0.
ENDLOOP.
From 29f0a9646cbd1340f43da76b4b0c3fe9106ee730 Mon Sep 17 00:00:00 2001
From: TheWirtschaftsmann
Date: Tue, 13 Dec 2016 17:59:02 +0200
Subject: [PATCH 04/15] 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'.' &&
- ' '.
+ 'call' && "#EC NOTEXT
+ ' function' && "#EC NOTEXT
+ ' 'FM_NAME'.' && "#EC NOTEXT
+ ' '. "#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 = ''
- msg = 'Failure in method process_line.' ).
+ exp = '' "#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 05/15] 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 = '' "#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 06/15] 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 = '' "#EC NOTEXT
- msg = 'Failure in method process_line.' ). "#EC NOTEXT
+ cl_abap_unit_assert=>assert_equals(
+ act = lv_line_act
+ exp = '' "#EC NOTEXT
+ msg = 'Failure in method process_line.' ). "#EC NOTEXT
ENDMETHOD. " process_line
From 94cb868745462df37ece024990b580ecd9e83a7c Mon Sep 17 00:00:00 2001
From: nununo
Date: Thu, 15 Dec 2016 11:20:44 +0100
Subject: [PATCH 07/15] Dynamicaly accessing fields for 702 compatibility The
following fields still don't exist in structure s_controller in version 702:
-controller_exceptions -controller_exception_texts
So we remove any direct reference to them and access them dynamically
This required changes in 3 places of class LCL_OBJECT_WDYN.
---
src/zabapgit_object_wdyn.prog.abap | 164 +++++++++++++++++++++++------
1 file changed, 133 insertions(+), 31 deletions(-)
diff --git a/src/zabapgit_object_wdyn.prog.abap b/src/zabapgit_object_wdyn.prog.abap
index 41e34d645..7176f0395 100644
--- a/src/zabapgit_object_wdyn.prog.abap
+++ b/src/zabapgit_object_wdyn.prog.abap
@@ -57,7 +57,19 @@ CLASS lcl_object_wdyn DEFINITION INHERITING FROM lcl_objects_super FINAL.
delta_view
IMPORTING is_view TYPE wdy_md_view_meta_data
RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object
- RAISING lcx_exception.
+ RAISING lcx_exception,
+ add_fm_param_exporting
+ IMPORTING name TYPE string
+ value TYPE any
+ RETURNING value(rs_param) TYPE abap_func_parmbind,
+ add_fm_param_tables
+ IMPORTING name TYPE string
+ value TYPE ANY TABLE
+ RETURNING value(rs_param) TYPE abap_func_parmbind,
+ add_fm_exception
+ IMPORTING name TYPE string
+ value TYPE i
+ RETURNING value(rs_exception) TYPE abap_func_excpbind.
ENDCLASS. "lcl_object_wdyn DEFINITION
@@ -156,7 +168,11 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_obj_old TYPE svrs2_versionable_object.
FIELD-SYMBOLS: LIKE LINE OF mt_components,
- LIKE LINE OF mt_sources.
+ LIKE LINE OF mt_sources,
+ TYPE ANY TABLE,
+ TYPE ANY TABLE,
+ TYPE ANY TABLE,
+ TYPE ANY TABLE.
ls_key-component_name = is_controller-definition-component_name.
@@ -205,8 +221,22 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_obj_old-wdyc-cnode = is_controller-context_nodes.
ls_obj_old-wdyc-cattr = is_controller-context_attributes.
ls_obj_old-wdyc-cmapp = is_controller-context_mappings.
- ls_obj_old-wdyc-excp = is_controller-controller_exceptions.
- ls_obj_old-wdyc-excpt = is_controller-controller_exception_texts.
+* Version 702 doesn't have these two attributes so we
+* use them dynamically for downward compatibility
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE is_controller TO .
+ IF sy-subrc = 0.
+ ASSIGN COMPONENT 'EXCP' OF STRUCTURE ls_obj_old-wdyc TO .
+ IF sy-subrc = 0.
+ = .
+ ENDIF.
+ ENDIF.
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS_TEXTS' OF STRUCTURE is_controller TO .
+ IF sy-subrc = 0.
+ ASSIGN COMPONENT 'EXCPT' OF STRUCTURE ls_obj_old-wdyc TO .
+ IF sy-subrc = 0.
+ = .
+ ENDIF.
+ ENDIF.
ls_obj_old-wdyc-fgrps = is_controller-fieldgroups.
CALL FUNCTION 'SVRS_MAKE_OBJECT_DELTA'
@@ -359,33 +389,72 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
lt_sources TYPE TABLE OF wdy_ctlr_compo_source_vrs,
lt_definition TYPE TABLE OF wdy_controller,
lt_psmodilog TYPE TABLE OF smodilog,
- lt_psmodisrc TYPE TABLE OF smodisrc.
+ lt_psmodisrc TYPE TABLE OF smodisrc,
+ lt_fm_param TYPE abap_func_parmbind_tab,
+ lt_fm_exception TYPE abap_func_excpbind_tab.
+ FIELD-SYMBOLS: TYPE ANY TABLE,
+ TYPE ANY TABLE.
+
+* Calling FM dynamically because version 702 has less parameters
+
+* FM parameters
+ INSERT add_fm_param_exporting( name = 'CONTROLLER_KEY'
+ value = is_key ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_exporting( name = 'GET_ALL_TRANSLATIONS'
+ value = abap_false ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'DEFINITION'
+ value = lt_definition ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'DESCRIPTIONS'
+ value = rs_controller-descriptions ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_USAGES'
+ value = rs_controller-controller_usages ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENTS'
+ value = lt_components ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENT_SOURCES'
+ value = lt_sources ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENT_TEXTS'
+ value = rs_controller-controller_component_texts ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_PARAMETERS'
+ value = rs_controller-controller_parameters ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_PARAMETER_TEXTS'
+ value = rs_controller-controller_parameter_texts ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTEXT_NODES'
+ value = rs_controller-context_nodes ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTEXT_ATTRIBUTES'
+ value = rs_controller-context_attributes ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'CONTEXT_MAPPINGS'
+ value = rs_controller-context_mappings ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'FIELDGROUPS'
+ value = rs_controller-fieldgroups ) INTO TABLE lt_fm_param.
+* Version 702 doesn't have these two attributes so we
+* use them dynamically for downward compatibility
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE rs_controller TO .
+ IF sy-subrc = 0.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_EXCEPTIONS'
+ value = ) INTO TABLE lt_fm_param.
+ ENDIF.
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTION_TEXTS' OF STRUCTURE rs_controller TO .
+ IF sy-subrc = 0.
+ INSERT add_fm_param_tables( name = 'CONTROLLER_EXCEPTION_TEXTS'
+ value = ) INTO TABLE lt_fm_param.
+ ENDIF.
+ INSERT add_fm_param_tables( name = 'PSMODILOG'
+ value = lt_psmodilog ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables( name = 'PSMODISRC'
+ value = lt_psmodisrc ) INTO TABLE lt_fm_param.
+
+* FM exceptions
+ INSERT add_fm_exception( name = 'NOT_EXISTING'
+ value = 1 ) INTO TABLE lt_fm_exception.
+ INSERT add_fm_exception( name = 'OTHERS'
+ value = 2 ) INTO TABLE lt_fm_exception.
CALL FUNCTION 'WDYC_GET_OBJECT'
- EXPORTING
- controller_key = is_key
- get_all_translations = abap_false
- TABLES
- definition = lt_definition
- descriptions = rs_controller-descriptions
- controller_usages = rs_controller-controller_usages
- controller_components = lt_components
- controller_component_sources = lt_sources
- controller_component_texts = rs_controller-controller_component_texts
- controller_parameters = rs_controller-controller_parameters
- controller_parameter_texts = rs_controller-controller_parameter_texts
- context_nodes = rs_controller-context_nodes
- context_attributes = rs_controller-context_attributes
- context_mappings = rs_controller-context_mappings
- fieldgroups = rs_controller-fieldgroups
- controller_exceptions = rs_controller-controller_exceptions
- controller_exception_texts = rs_controller-controller_exception_texts
- psmodilog = lt_psmodilog " not optional in all versions
- psmodisrc = lt_psmodisrc " not optional in all versions
- EXCEPTIONS
- not_existing = 1
- OTHERS = 2.
+ PARAMETER-TABLE
+ lt_fm_param
+ EXCEPTION-TABLE
+ lt_fm_exception.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from WDYC_GET_OBJECT' ).
ENDIF.
@@ -523,7 +592,9 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_view_key TYPE wdy_md_view_key.
FIELD-SYMBOLS: LIKE LINE OF lt_objects,
- LIKE LINE OF rs_component-ctlr_metadata.
+ LIKE LINE OF rs_component-ctlr_metadata,
+ TYPE ANY TABLE,
+ TYPE ANY TABLE.
CLEAR mt_components.
CLEAR mt_sources.
@@ -561,8 +632,16 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
SORT -context_attributes.
SORT -context_mappings.
SORT -fieldgroups.
- SORT -controller_exceptions.
- SORT -controller_exception_texts.
+* Version 702 doesn't have these two attributes so we
+* use them dynamically for downward compatibility
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE TO .
+ IF sy-subrc = 0.
+ SORT .
+ ENDIF.
+ ASSIGN COMPONENT 'CONTROLLER_EXCEPTION_TEXTS' OF STRUCTURE TO .
+ IF sy-subrc = 0.
+ SORT .
+ ENDIF.
ENDLOOP.
SORT mt_components BY
@@ -578,6 +657,29 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ENDMETHOD. "read
+ METHOD add_fm_param_exporting.
+
+ rs_param-kind = abap_func_exporting.
+ rs_param-name = name.
+ GET REFERENCE OF value INTO rs_param-value.
+
+ ENDMETHOD. "add_fm_param_exporting
+
+ METHOD add_fm_param_tables.
+
+ rs_param-kind = abap_func_tables.
+ rs_param-name = name.
+ GET REFERENCE OF value INTO rs_param-value.
+
+ ENDMETHOD. "add_fm_param_tables
+
+ METHOD add_fm_exception.
+
+ rs_exception-name = name.
+ rs_exception-value = value.
+
+ ENDMETHOD. "add_fm_exception
+
METHOD lif_object~serialize.
DATA: ls_component TYPE wdy_component_metadata.
From 1ee92803d69e7fbcfc7cbb822474c5779f370a74 Mon Sep 17 00:00:00 2001
From: larshp
Date: Thu, 15 Dec 2016 10:56:44 +0000
Subject: [PATCH 08/15] bump version to v1.24.6
---
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 ef48a5c98..99d7f4f46 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.5'. "#EC NOTEXT
+ gc_abap_version TYPE string VALUE 'v1.24.6'. "#EC NOTEXT
********************************************************************************
* The MIT License (MIT)
From 4acf442e3c7c36164c300722f5cb13e1ea9c8608 Mon Sep 17 00:00:00 2001
From: larshp
Date: Thu, 15 Dec 2016 11:10:39 +0000
Subject: [PATCH 09/15] WDYN: fix dump, overwriting protected field
---
src/zabapgit_object_wdyn.prog.abap | 104 +++++++++++++++++------------
1 file changed, 60 insertions(+), 44 deletions(-)
diff --git a/src/zabapgit_object_wdyn.prog.abap b/src/zabapgit_object_wdyn.prog.abap
index 7176f0395..6701477cc 100644
--- a/src/zabapgit_object_wdyn.prog.abap
+++ b/src/zabapgit_object_wdyn.prog.abap
@@ -61,15 +61,15 @@ CLASS lcl_object_wdyn DEFINITION INHERITING FROM lcl_objects_super FINAL.
add_fm_param_exporting
IMPORTING name TYPE string
value TYPE any
- RETURNING value(rs_param) TYPE abap_func_parmbind,
+ RETURNING VALUE(rs_param) TYPE abap_func_parmbind,
add_fm_param_tables
IMPORTING name TYPE string
- value TYPE ANY TABLE
- RETURNING value(rs_param) TYPE abap_func_parmbind,
+ CHANGING value TYPE ANY TABLE
+ RETURNING VALUE(rs_param) TYPE abap_func_parmbind,
add_fm_exception
IMPORTING name TYPE string
value TYPE i
- RETURNING value(rs_exception) TYPE abap_func_excpbind.
+ RETURNING VALUE(rs_exception) TYPE abap_func_excpbind.
ENDCLASS. "lcl_object_wdyn DEFINITION
@@ -167,8 +167,8 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_obj_new TYPE svrs2_versionable_object,
ls_obj_old TYPE svrs2_versionable_object.
- FIELD-SYMBOLS: LIKE LINE OF mt_components,
- LIKE LINE OF mt_sources,
+ FIELD-SYMBOLS: LIKE LINE OF mt_components,
+ LIKE LINE OF mt_sources,
TYPE ANY TABLE,
TYPE ANY TABLE,
TYPE ANY TABLE,
@@ -385,10 +385,10 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
METHOD read_controller.
- DATA: lt_components TYPE TABLE OF wdy_ctlr_compo_vrs,
- lt_sources TYPE TABLE OF wdy_ctlr_compo_source_vrs,
- lt_definition TYPE TABLE OF wdy_controller,
- lt_psmodilog TYPE TABLE OF smodilog,
+ DATA: lt_components TYPE TABLE OF wdy_ctlr_compo_vrs,
+ lt_sources TYPE TABLE OF wdy_ctlr_compo_source_vrs,
+ lt_definition TYPE TABLE OF wdy_controller,
+ lt_psmodilog TYPE TABLE OF smodilog,
lt_psmodisrc TYPE TABLE OF smodisrc,
lt_fm_param TYPE abap_func_parmbind_tab,
lt_fm_exception TYPE abap_func_excpbind_tab.
@@ -403,46 +403,62 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
value = is_key ) INTO TABLE lt_fm_param.
INSERT add_fm_param_exporting( name = 'GET_ALL_TRANSLATIONS'
value = abap_false ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'DEFINITION'
- value = lt_definition ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'DESCRIPTIONS'
- value = rs_controller-descriptions ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_USAGES'
- value = rs_controller-controller_usages ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENTS'
- value = lt_components ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENT_SOURCES'
- value = lt_sources ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_COMPONENT_TEXTS'
- value = rs_controller-controller_component_texts ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_PARAMETERS'
- value = rs_controller-controller_parameters ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTROLLER_PARAMETER_TEXTS'
- value = rs_controller-controller_parameter_texts ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTEXT_NODES'
- value = rs_controller-context_nodes ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTEXT_ATTRIBUTES'
- value = rs_controller-context_attributes ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'CONTEXT_MAPPINGS'
- value = rs_controller-context_mappings ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'FIELDGROUPS'
- value = rs_controller-fieldgroups ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'DEFINITION'
+ CHANGING value = lt_definition ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'DESCRIPTIONS'
+ CHANGING value = rs_controller-descriptions ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_USAGES'
+ CHANGING value = rs_controller-controller_usages ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_COMPONENTS'
+ CHANGING value = lt_components ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_COMPONENT_SOURCES'
+ CHANGING value = lt_sources ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_COMPONENT_TEXTS'
+ CHANGING value = rs_controller-controller_component_texts ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_PARAMETERS'
+ CHANGING value = rs_controller-controller_parameters ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_PARAMETER_TEXTS'
+ CHANGING value = rs_controller-controller_parameter_texts ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTEXT_NODES'
+ CHANGING value = rs_controller-context_nodes ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTEXT_ATTRIBUTES'
+ CHANGING value = rs_controller-context_attributes ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTEXT_MAPPINGS'
+ CHANGING value = rs_controller-context_mappings ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'FIELDGROUPS'
+ CHANGING value = rs_controller-fieldgroups ) INTO TABLE lt_fm_param.
* Version 702 doesn't have these two attributes so we
* use them dynamically for downward compatibility
ASSIGN COMPONENT 'CONTROLLER_EXCEPTIONS' OF STRUCTURE rs_controller TO .
IF sy-subrc = 0.
- INSERT add_fm_param_tables( name = 'CONTROLLER_EXCEPTIONS'
- value = ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_EXCEPTIONS'
+ CHANGING value = ) INTO TABLE lt_fm_param.
ENDIF.
ASSIGN COMPONENT 'CONTROLLER_EXCEPTION_TEXTS' OF STRUCTURE rs_controller TO .
IF sy-subrc = 0.
- INSERT add_fm_param_tables( name = 'CONTROLLER_EXCEPTION_TEXTS'
- value = ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'CONTROLLER_EXCEPTION_TEXTS'
+ CHANGING value = ) INTO TABLE lt_fm_param.
ENDIF.
- INSERT add_fm_param_tables( name = 'PSMODILOG'
- value = lt_psmodilog ) INTO TABLE lt_fm_param.
- INSERT add_fm_param_tables( name = 'PSMODISRC'
- value = lt_psmodisrc ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'PSMODILOG'
+ CHANGING value = lt_psmodilog ) INTO TABLE lt_fm_param.
+ INSERT add_fm_param_tables(
+ EXPORTING name = 'PSMODISRC'
+ CHANGING value = lt_psmodisrc ) INTO TABLE lt_fm_param.
* FM exceptions
INSERT add_fm_exception( name = 'NOT_EXISTING'
@@ -591,8 +607,8 @@ CLASS lcl_object_wdyn IMPLEMENTATION.
ls_component_key TYPE wdy_md_component_key,
ls_view_key TYPE wdy_md_view_key.
- FIELD-SYMBOLS: LIKE LINE OF lt_objects,
- LIKE LINE OF rs_component-ctlr_metadata,
+ FIELD-SYMBOLS: LIKE LINE OF lt_objects,
+ LIKE LINE OF rs_component-ctlr_metadata,