#224, implementation of beacons

This commit is contained in:
atsy 2016-05-28 22:17:46 +03:00
parent 251e53b7cc
commit 355c629d43

View File

@ -2468,15 +2468,16 @@ CLASS lcl_diff DEFINITION FINAL.
update TYPE c LENGTH 1 VALUE 'U',
END OF c_diff.
TYPES: BEGIN OF ty_diff,
local_line TYPE c LENGTH 6,
local TYPE string,
result TYPE c LENGTH 1,
remote_line TYPE c LENGTH 6,
remote TYPE string,
short TYPE abap_bool,
END OF ty_diff.
TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY.
TYPES: BEGIN OF ty_diff,
local_line TYPE c LENGTH 6,
local TYPE string,
result TYPE c LENGTH 1,
remote_line TYPE c LENGTH 6,
remote TYPE string,
short TYPE abap_bool,
beacon TYPE i,
END OF ty_diff.
TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY.
TYPES: BEGIN OF ty_count,
insert TYPE i,
@ -2484,6 +2485,8 @@ CLASS lcl_diff DEFINITION FINAL.
update TYPE i,
END OF ty_count.
DATA mt_beacons TYPE ty_string_tt READ-ONLY.
* assumes data is UTF8 based with newlines
* only works with lines up to 255 characters
METHODS constructor
@ -2497,8 +2500,8 @@ CLASS lcl_diff DEFINITION FINAL.
RETURNING VALUE(rs_count) TYPE ty_count.
PRIVATE SECTION.
DATA mt_diff TYPE ty_diffs_tt.
DATA ms_stats TYPE ty_count.
DATA mt_diff TYPE ty_diffs_tt.
DATA ms_stats TYPE ty_count.
CLASS-METHODS:
unpack
@ -2518,6 +2521,7 @@ CLASS lcl_diff DEFINITION FINAL.
METHODS:
calculate_line_num_and_stats,
map_beacons,
shortlist.
ENDCLASS. "lcl_diff DEFINITION
@ -2604,7 +2608,7 @@ CLASS lcl_diff IMPLEMENTATION.
ENDLOOP.
ENDIF.
ENDMETHOD.
ENDMETHOD. " shortlist
METHOD calculate_line_num_and_stats.
@ -2641,7 +2645,50 @@ CLASS lcl_diff IMPLEMENTATION.
ENDLOOP.
ENDMETHOD.
ENDMETHOD. " calculate_line_num_and_stats
METHOD map_beacons.
DATA: lv_beacon TYPE i,
lv_offs TYPE i,
lv_code_line TYPE string,
lo_regex TYPE REF TO cl_abap_regex,
lt_regex_set TYPE TABLE OF REF TO cl_abap_regex.
FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
DEFINE _add_regex.
CREATE OBJECT lo_regex
EXPORTING pattern = &1
ignore_case = abap_true.
APPEND lo_regex TO lt_regex_set.
END-OF-DEFINITION.
_add_regex '^\s*(CLASS|FORM|MODULE|REPORT)\s'.
_add_regex '^\s*START-OF-'.
_add_regex '^\s*INITIALIZATION(\s|\.)'.
LOOP AT mt_diff ASSIGNING <ls_diff>.
<ls_diff>-beacon = lv_beacon.
LOOP AT lt_regex_set INTO lo_regex.
FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-local.
IF sy-subrc = 0. " Match
lv_code_line = <ls_diff>-local.
" Get rid of comments
FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs.
IF sy-subrc = 0.
lv_code_line = lv_code_line(lv_offs).
ENDIF.
APPEND lv_code_line TO mt_beacons.
lv_beacon = sy-tabix.
<ls_diff>-beacon = lv_beacon.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD. " map_beacons
METHOD constructor.
@ -2663,7 +2710,7 @@ CLASS lcl_diff IMPLEMENTATION.
it_delta = lt_delta ).
calculate_line_num_and_stats( ).
map_beacons( ).
shortlist( ).
ENDMETHOD. "diff
@ -2726,7 +2773,7 @@ CLASS lcl_diff IMPLEMENTATION.
ENDIF.
ENDDO.
ENDMETHOD.
ENDMETHOD. " render
ENDCLASS. "lcl_diff IMPLEMENTATION
@ -18647,6 +18694,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
lv_attr_remote TYPE string,
lv_anchor_count LIKE sy-tabix,
lv_href TYPE string,
lv_beacon TYPE string,
lv_insert_nav TYPE abap_bool.
FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
@ -18661,13 +18709,17 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDIF.
IF lv_insert_nav = abap_true. " Insert separator line with navigation
lv_insert_nav = abap_false.
IF <ls_diff>-beacon > 0.
READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX <ls_diff>-beacon.
ELSE.
lv_beacon = '---'.
ENDIF.
ro_html->add( '<tr class="diff_nav_line">').
ro_html->add( '<td class="num"></td>' ).
ro_html->add( |<td colspan="4">@@ { <ls_diff>-local_line }, { <ls_diff>-remote_line }</td>| ).
ro_html->add( |<td colspan="4">@@ { <ls_diff>-local_line } @@ { lv_beacon }</td>| ).
ro_html->add( '</tr>' ).
lv_insert_nav = abap_false.
ENDIF.
lv_local = escape( val = <ls_diff>-local format = cl_abap_format=>e_html_attr ).