@@ -28,15 +28,15 @@ CLASS zcl_highlighter_abap DEFINITION
28
28
29
29
PROTECTED SECTION .
30
30
31
- CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line .
31
+ CLASS-DATA keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line .
32
32
33
33
CLASS-METHODS init_keywords.
34
34
35
35
CLASS-METHODS is_keyword
36
36
IMPORTING
37
- iv_chunk TYPE string
37
+ chunk TYPE string
38
38
RETURNING
39
- VALUE (rv_yes ) TYPE abap_bool .
39
+ VALUE (result ) TYPE abap_bool .
40
40
41
41
METHODS order_matches REDEFINITION .
42
42
@@ -62,27 +62,24 @@ CLASS zcl_highlighter_abap IMPLEMENTATION.
62
62
super ->constructor( ).
63
63
64
64
" Initialize instances of regular expression
65
- add_rule( iv_regex = c_regex-keyword
66
- iv_token = c_token-keyword
67
- iv_style = c_css-keyword ).
65
+ add_rule( regex = c_regex-keyword
66
+ token = c_token-keyword
67
+ style = c_css-keyword ).
68
68
69
- add_rule( iv_regex = c_regex-comment
70
- iv_token = c_token-comment
71
- iv_style = c_css-comment ).
69
+ add_rule( regex = c_regex-comment
70
+ token = c_token-comment
71
+ style = c_css-comment ).
72
72
73
- add_rule( iv_regex = c_regex-text
74
- iv_token = c_token-text
75
- iv_style = c_css-text ).
73
+ add_rule( regex = c_regex-text
74
+ token = c_token-text
75
+ style = c_css-text ).
76
76
77
77
ENDMETHOD .
78
78
79
79
80
80
METHOD init_keywords .
81
81
82
- DATA : lv_keywords TYPE string ,
83
- lt_keywords TYPE STANDARD TABLE OF string .
84
-
85
- lv_keywords =
82
+ DATA (list ) =
86
83
'&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING' &&
87
84
'|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' &&
88
85
'|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' &&
@@ -195,114 +192,102 @@ CLASS zcl_highlighter_abap IMPLEMENTATION.
195
192
'|TO_LOWER|TO_MIXED|TO_UPPER|UTCLONG_ADD|UTCLONG_CURRENT|UTCLONG_DIFF|XSDBOOL' .
196
193
197
194
198
- SPLIT lv_keywords AT '|' INTO TABLE lt_keywords.
195
+ SPLIT list AT '|' INTO TABLE DATA (keyword_list ).
196
+
199
197
" remove duplicates to avoid dumps when converting to a hash table
200
- SORT lt_keywords BY table_line ASCENDING .
201
- DELETE ADJACENT DUPLICATES FROM lt_keywords.
202
- gt_keywords = lt_keywords. " Hash table
198
+ SORT keyword_list BY table_line ASCENDING .
199
+ DELETE ADJACENT DUPLICATES FROM keyword_list.
200
+
201
+ keywords = keyword_list. " Hash table
203
202
204
203
ENDMETHOD .
205
204
206
205
207
206
METHOD is_keyword .
208
207
209
- DATA lv_str TYPE string .
210
-
211
- lv_str = to_upper ( iv_chunk ).
212
- READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS .
213
- rv_yes = boolc ( sy -subrc = 0 ).
208
+ result = xsdbool ( line_exists ( keywords[ table_line = to_upper ( chunk ) ] ) ).
214
209
215
210
ENDMETHOD .
216
211
217
212
218
213
METHOD order_matches .
219
214
220
- DATA :
221
- lv_index TYPE sy-tabix,
222
- lv_line_len TYPE i ,
223
- lv_prev_token TYPE c .
215
+ FIELD-SYMBOLS <prev_match> TYPE ty_match.
224
216
225
- FIELD-SYMBOLS :
226
- <ls_prev> TYPE ty_match,
227
- <ls_match> TYPE ty_match.
217
+ SORT matches BY offset .
228
218
229
- SORT ct_matches BY offset .
219
+ DATA (line_len ) = strlen ( line ).
220
+ DATA (prev_token ) = '' .
230
221
231
- lv_line_len = strlen ( iv_line ).
232
-
233
- LOOP AT ct_matches ASSIGNING <ls_match> .
234
- lv_index = sy -tabix .
222
+ LOOP AT matches ASSIGNING FIELD-SYMBOL (<match> ).
223
+ DATA (index ) = sy -tabix .
235
224
236
225
" Delete matches after open text match
237
- IF lv_prev_token = c_token-text AND <ls_match > -token <> c_token-text.
238
- DELETE ct_matches INDEX lv_index .
226
+ IF prev_token = c_token-text AND <match > -token <> c_token-text.
227
+ DELETE matches INDEX index .
239
228
CONTINUE .
240
229
ENDIF .
241
230
242
- CASE <ls_match > -token.
231
+ CASE <match > -token.
243
232
WHEN c_token-keyword.
244
- IF <ls_match > -offset > 0
245
- AND substring ( val = iv_line
246
- off = ( <ls_match > -offset - 1 )
233
+ IF <match > -offset > 0
234
+ AND substring ( val = line
235
+ off = ( <match > -offset - 1 )
247
236
len = 1 ) CA '-<' .
248
237
" Delete match if keyword is part of structure or field symbol
249
- DELETE ct_matches INDEX lv_index .
238
+ DELETE matches INDEX index .
250
239
CONTINUE .
251
240
ENDIF .
252
241
253
242
WHEN c_token-comment.
254
- <ls_match > -length = lv_line_len - <ls_match > -offset.
255
- DELETE ct_matches FROM lv_index + 1 .
243
+ <match > -length = line_len - <match > -offset.
244
+ DELETE matches FROM index + 1 .
256
245
CONTINUE .
257
246
258
247
WHEN c_token-text.
259
- <ls_match > -text_tag = substring ( val = iv_line
260
- off = <ls_match > -offset
261
- len = <ls_match > -length ).
262
- IF lv_prev_token = c_token-text.
263
- IF <ls_match > -text_tag = <ls_prev > -text_tag.
264
- <ls_prev > -length = <ls_match > -offset + <ls_match > -length - <ls_prev > -offset.
265
- CLEAR lv_prev_token .
266
- ELSEIF <ls_prev > -text_tag = '}' AND <ls_match > -text_tag = '{' .
267
- <ls_prev > -length = <ls_match > -offset - <ls_prev > -offset - 1 . " Shift } out of scope
268
- <ls_prev > -offset = <ls_prev > -offset + 1 . " Shift { out of scope
269
- CLEAR lv_prev_token .
270
- ELSEIF <ls_match > -text_tag = '{' .
271
- <ls_prev > -length = <ls_match > -offset - <ls_prev > -offset.
272
- CLEAR lv_prev_token .
273
- ELSEIF <ls_prev > -text_tag = '}' .
274
- <ls_prev > -length = <ls_match > -offset - <ls_prev > -offset.
275
- <ls_prev > -offset = <ls_prev > -offset + 1 . " Shift } out of scope
276
- CLEAR lv_prev_token .
248
+ <match > -text_tag = substring ( val = line
249
+ off = <match > -offset
250
+ len = <match > -length ).
251
+ IF prev_token = c_token-text.
252
+ IF <match > -text_tag = <prev_match > -text_tag.
253
+ <prev_match > -length = <match > -offset + <match > -length - <prev_match > -offset.
254
+ CLEAR prev_token .
255
+ ELSEIF <prev_match > -text_tag = '}' AND <match > -text_tag = '{' .
256
+ <prev_match > -length = <match > -offset - <prev_match > -offset - 1 . " Shift } out of scope
257
+ <prev_match > -offset = <prev_match > -offset + 1 . " Shift { out of scope
258
+ CLEAR prev_token .
259
+ ELSEIF <match > -text_tag = '{' .
260
+ <prev_match > -length = <match > -offset - <prev_match > -offset.
261
+ CLEAR prev_token .
262
+ ELSEIF <prev_match > -text_tag = '}' .
263
+ <prev_match > -length = <match > -offset - <prev_match > -offset.
264
+ <prev_match > -offset = <prev_match > -offset + 1 . " Shift } out of scope
265
+ CLEAR prev_token .
277
266
ENDIF .
278
- DELETE ct_matches INDEX lv_index .
267
+ DELETE matches INDEX index .
279
268
CONTINUE .
280
269
ENDIF .
281
270
282
271
ENDCASE .
283
272
284
- lv_prev_token = <ls_match > -token.
285
- ASSIGN <ls_match > TO <ls_prev > .
273
+ prev_token = <match > -token.
274
+ ASSIGN <match > TO <prev_match > .
286
275
ENDLOOP .
287
276
288
277
ENDMETHOD .
289
278
290
279
291
280
METHOD parse_line . "REDEFINITION
292
281
293
- DATA lv_index TYPE i .
294
-
295
- FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
296
-
297
- rt_matches = super ->parse_line( iv_line ).
282
+ result = super ->parse_line( line ).
298
283
299
284
" Remove non-keywords
300
- LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
301
- lv_index = sy -tabix .
302
- IF abap_false = is_keyword( substring ( val = iv_line
303
- off = <ls_match > -offset
304
- len = <ls_match > -length ) ).
305
- DELETE rt_matches INDEX lv_index .
285
+ LOOP AT result ASSIGNING FIELD-SYMBOL ( <match> ) WHERE token = c_token-keyword.
286
+ DATA ( tabix ) = sy -tabix .
287
+ IF NOT is_keyword( substring ( val = line
288
+ off = <match > -offset
289
+ len = <match > -length ) ).
290
+ DELETE result INDEX tabix .
306
291
ENDIF .
307
292
ENDLOOP .
308
293
0 commit comments