diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.abap b/src/syntax/zcl_abapgit_syntax_abap.clas.abap
index 31922f256..1d11098b4 100644
--- a/src/syntax/zcl_abapgit_syntax_abap.clas.abap
+++ b/src/syntax/zcl_abapgit_syntax_abap.clas.abap
@@ -4,21 +4,20 @@ CLASS zcl_abapgit_syntax_abap DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
-
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
+ keyword TYPE string VALUE 'keyword',
+ text TYPE string VALUE 'text',
+ comment TYPE string VALUE 'comment',
END OF c_css,
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
+ keyword TYPE c VALUE 'K',
+ text TYPE c VALUE 'T',
+ comment TYPE c VALUE 'C',
END OF c_token,
BEGIN OF c_regex,
@@ -44,7 +43,7 @@ ENDCLASS.
-CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION.
+CLASS zcl_abapgit_syntax_abap IMPLEMENTATION.
METHOD class_constructor.
@@ -59,7 +58,6 @@ CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION.
super->constructor( ).
" Initialize instances of regular expression
-
add_rule( iv_regex = c_regex-keyword
iv_token = c_token-keyword
iv_style = c_css-keyword ).
@@ -176,26 +174,27 @@ CLASS ZCL_ABAPGIT_SYNTAX_ABAP 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|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'.
+ '|WRITE|WRITER|X|XML|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE' &&
+ '|BINTOHEX|CHAR|CLNT|CONCAT_WITH_SPACE|CURR|DATS|DATS_ADD_DAYS|DATS_ADD_MONTHS' &&
+ '|DATS_DAYS_BETWEEN|DATS_IS_VALID|DEC|END-OF-EDITING|END-TEST-INJECTION|END-TEST-SEAM' &&
+ '|ENDWITH|ENUM|HEXTOBIN|INSTANCE|INSTR|LANG|LTRIM|NUMC|PUSH' &&
+ '|QUAN|RETURNS|RPAD|RTRIM|SSTRING|START-OF-EDITING|TEST-INJECTION|TEST-SEAM|TIMS' &&
+ '|TIMS_IS_VALID|TSTMP_ADD_SECONDS|TSTMP_CURRENT_UTCTIMESTAMP|TSTMP_IS_VALID' &&
+ '|TSTMP_SECONDS_BETWEEN|B|D|DECFLOAT16|DECFLOAT34|F|INT8|N|P|S|STRING|T|UTCLONG|XSTRING' &&
+ '|ABAP_BOOL|ACCP|CUKY|DF16_DEC|DF16_RAW|DF34_DEC|DF34_RAW|FLTP' &&
+ '|INT1|INT2|INT4|LCHR|LRAW|RAWSTRING|DF16_SCL|DF34_SCL' &&
+ '|PREC|VARC|CLIKE|CSEQUENCE|DECFLOAT|NUMERIC|XSEQUENCE|ME|SYST|SY' &&
+ '|BIT-SET|BOOLC|BOOLX|CHAR_OFF|CMAX|CMIN|CONCAT_LINES_OF|CONTAINS|CONTAINS_ANY_NOT_OF' &&
+ '|CONTAINS_ANY_OF|COUNT_ANY_NOT_OF|COUNT_ANY_OF|FIND_ANY_NOT_OF|FIND_ANY_OF|FIND_END' &&
+ '|FROM_MIXED|IPOW|LINE_EXISTS|LINE_INDEX|MATCHES|NMAX|NMIN|REPEAT|RESCALE|REVERSE' &&
+ '|SEGMENT|SHIFT_LEFT|SHIFT_RIGHT|SUBSTRING_AFTER|SUBSTRING_BEFORE|SUBSTRING_FROM|SUBSTRING_TO' &&
+ '|TO_LOWER|TO_MIXED|TO_UPPER|UTCLONG_ADD|UTCLONG_CURRENT|UTCLONG_DIFF|XSDBOOL'.
-* &&
-* '|BINTOHEX|CHAR|CLNT|CONCAT_WITH_SPACE|CUKY|CURR|DATS|DATS_ADD_DAYS|DATS_ADD_MONTHS' &&
-* '|DATS_DAYS_BETWEEN|DATS_IS_VALID|DEC|END-OF-EDITING|END-TEST-INJECTION|END-TEST-SEAM' &&
-* '|ENDWITH|ENUM|FLTP|HEXTOBIN|INSTANCE|INSTR|INT1|INT2|INT4|INT8|LANG|LTRIM|NUMC|PUSH' &&
-* '|QUAN|RETURNS|RPAD|RTRIM|SSTRING|START-OF-EDITING|TEST-INJECTION|TEST-SEAM|TIMS' &&
-* '|TIMS_IS_VALID|TSTMP_ADD_SECONDS|TSTMP_CURRENT_UTCTIMESTAMP|TSTMP_IS_VALID' &&
-* '|TSTMP_SECONDS_BETWEEN|B|D|DECFLOAT16|DECFLOAT34|F|INT8|N|P|S|STRING|T|UTCLONG|XSTRING' &&
-* '|ABAP_BOOL|ACCP|CHAR|CLNT|CUKY|CURR|DATS|DEC|DF16_DEC|DF16_RAW|DF34_DEC|DF34_RAW|FLTP' &&
-* '|INT1|INT2|INT4|INT8|LANG|LCHR|LRAW|NUMC|QUAN|RAWSTRING|SSTRING|TIMS|DF16_SCL|DF34_SCL' &&
-* '|PREC|VARC|CLIKE|CSEQUENCE|DECFLOAT|NUMERIC|XSEQUENCE|ME|SYST|SY' &&
-* '|BIT-SET|BOOLC|BOOLX|CHAR_OFF|CMAX|CMIN|CONCAT_LINES_OF|CONTAINS|CONTAINS_ANY_NOT_OF' &&
-* '|CONTAINS_ANY_OF|COUNT_ANY_NOT_OF|COUNT_ANY_OF|FIND_ANY_NOT_OF|FIND_ANY_OF|FIND_END' &&
-* '|FROM_MIXED|IPOW|LINE_EXISTS|LINE_INDEX|MATCHES|NMAX|NMIN|REPEAT|RESCALE|REVERSE' &&
-* '|SEGMENT|SHIFT_LEFT|SHIFT_RIGHT|SUBSTRING_AFTER|SUBSTRING_BEFORE|SUBSTRING_FROM' &&
-* '|SUBSTRING_TO|TO_LOWER|TO_MIXED|TO_UPPER|UTCLONG_ADD|UTCLONG_CURRENT|UTCLONG_DIFF' &&
-* '|XSDBOOL'.
SPLIT lv_keywords AT '|' INTO TABLE lt_keywords.
+ " remove duplicates to avoid dumps when converting to a hash table
+ SORT lt_keywords BY table_line ASCENDING.
+ DELETE ADJACENT DUPLICATES FROM lt_keywords.
gt_keywords = lt_keywords. " Hash table
ENDMETHOD.
diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap b/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap
new file mode 100644
index 000000000..a325acf54
--- /dev/null
+++ b/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap
@@ -0,0 +1,33 @@
+CLASS ltcl_abapgit_syntax_abap DEFINITION FINAL FOR TESTING
+ DURATION SHORT
+ RISK LEVEL HARMLESS.
+
+ PRIVATE SECTION.
+ DATA:
+ mo_cut TYPE REF TO zcl_abapgit_syntax_abap.
+
+ METHODS:
+ setup,
+ report_header FOR TESTING RAISING cx_static_check.
+
+ENDCLASS.
+
+
+CLASS ltcl_abapgit_syntax_abap IMPLEMENTATION.
+
+ METHOD setup.
+
+ CREATE OBJECT mo_cut.
+
+ ENDMETHOD.
+
+ METHOD report_header.
+
+ cl_abap_unit_assert=>assert_equals(
+ exp = |REPORT zfoo.|
+ act = mo_cut->process_line( |REPORT zfoo.| ) ).
+
+ ENDMETHOD.
+
+
+ENDCLASS.
diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.xml b/src/syntax/zcl_abapgit_syntax_abap.clas.xml
index 9f080f715..23b288e86 100644
--- a/src/syntax/zcl_abapgit_syntax_abap.clas.xml
+++ b/src/syntax/zcl_abapgit_syntax_abap.clas.xml
@@ -10,6 +10,7 @@
X
X
X
+ X