diff --git a/src/abap/abap.test.ts b/src/abap/abap.test.ts index 4318aa57..a0da5a41 100644 --- a/src/abap/abap.test.ts +++ b/src/abap/abap.test.ts @@ -121,7 +121,7 @@ testTokenization('abap', [ { startIndex: 6, type: '' }, { startIndex: 7, type: 'keyword.abap' }, { startIndex: 9, type: '' }, - { startIndex: 10, type: 'keyword.abap' }, + { startIndex: 10, type: 'operator.abap' }, { startIndex: 13, type: '' }, { startIndex: 14, type: 'keyword.abap' }, { startIndex: 21, type: 'delimiter.abap' } diff --git a/src/abap/abap.ts b/src/abap/abap.ts index eb61ad7f..04ecc1be 100644 --- a/src/abap/abap.ts +++ b/src/abap/abap.ts @@ -3,6 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------------------------- + * Based on SAP ABAP Application Server 7.54 + * Reference: + * https://help.sap.com/doc/abapdocu_754_index_htm/7.54/en-US/index.htm?file=abenabap_words.htm + *--------------------------------------------------------------------------------------------*/ + import type { languages } from '../fillers/monaco-editor-core'; export const conf: languages.LanguageConfiguration = { @@ -16,410 +22,920 @@ export const conf: languages.LanguageConfiguration = { }; const abapKeywords = [ + // words + 'abap-source', + 'abbreviated', 'abstract', + 'accept', + 'accepting', + 'according', + 'activation', + 'actual', 'add', 'add-corresponding', 'adjacent', + 'after', 'alias', 'aliases', + 'align', 'all', + 'allocate', + 'alpha', + 'analysis', + 'analyzer', 'append', + 'appendage', 'appending', - 'ascending', + 'application', + 'archive', + 'area', + 'arithmetic', 'as', + 'ascending', + 'aspect', 'assert', 'assign', 'assigned', 'assigning', 'association', + 'asynchronous', + 'at', + 'attributes', + 'authority', 'authority-check', + 'avg', 'back', + 'background', + 'backup', + 'backward', + 'badi', + 'base', + 'before', 'begin', + 'big', 'binary', + 'bintohex', + 'bit', + 'black', + 'blank', + 'blanks', + 'blob', 'block', + 'blocks', + 'blue', 'bound', + 'boundaries', + 'bounds', + 'boxed', 'break-point', + 'buffer', 'by', + 'bypassing', 'byte', - 'class', + 'byte-order', 'call', + 'calling', + 'case', 'cast', + 'casting', + 'catch', + 'center', + 'centered', + 'chain', + 'chain-input', + 'chain-request', + 'change', 'changing', + 'channels', + 'character', + 'char-to-hex', 'check', + 'checkbox', + 'ci_', + 'circular', + 'class', + 'class-coding', 'class-data', - 'class-method', + 'class-events', 'class-methods', + 'class-pool', + 'cleanup', 'clear', + 'client', + 'clob', + 'clock', 'close', - 'cnt', + 'coalesce', + 'code', + 'coding', + 'col_background', + 'col_group', + 'col_heading', + 'col_key', + 'col_negative', + 'col_normal', + 'col_positive', + 'col_total', 'collect', + 'color', + 'column', + 'columns', + 'comment', + 'comments', 'commit', - 'cond', - 'character', - 'corresponding', + 'common', 'communication', + 'comparing', 'component', + 'components', + 'compression', 'compute', + 'concat', + 'concat_with_space', 'concatenate', - 'condense', + 'cond', + 'condition', + 'connect', + 'connection', 'constants', - 'conv', - 'count', + 'context', + 'contexts', + 'continue', + 'control', 'controls', + 'conv', + 'conversion', 'convert', + 'copies', + 'copy', + 'corresponding', + 'country', + 'cover', + 'cpi', 'create', + 'creating', + 'critical', 'currency', + 'currency_conversion', + 'current', + 'cursor', + 'cursor-selection', + 'customer', + 'customer-function', + 'dangerous', 'data', - 'descending', + 'database', + 'datainfo', + 'dataset', + 'date', + 'dats_add_days', + 'dats_add_months', + 'dats_days_between', + 'dats_is_valid', + 'daylight', + 'dd/mm/yy', + 'dd/mm/yyyy', + 'ddmmyy', + 'deallocate', + 'decimal_shift', + 'decimals', + 'declarations', + 'deep', 'default', - 'define', 'deferred', + 'define', + 'defining', + 'definition', 'delete', + 'deleting', + 'demand', + 'department', + 'descending', 'describe', + 'destination', 'detail', + 'dialog', + 'directory', + 'disconnect', 'display', + 'display-mode', + 'distinct', 'divide', 'divide-corresponding', - 'display-mode', + 'division', + 'do', + 'dummy', + 'duplicate', 'duplicates', - 'deleting', + 'duration', + 'during', + 'dynamic', + 'dynpro', + 'edit', 'editor-call', + 'else', + 'elseif', + 'empty', + 'enabled', + 'enabling', + 'encoding', 'end', + 'endat', + 'endcase', + 'endcatch', + 'endchain', + 'endclass', + 'enddo', + 'endenhancement', + 'end-enhancement-section', 'endexec', + 'endform', 'endfunction', + 'endian', + 'endif', 'ending', + 'endinterface', + 'end-lines', + 'endloop', + 'endmethod', 'endmodule', 'end-of-definition', + 'end-of-editing', + 'end-of-file', 'end-of-page', 'end-of-selection', - 'end-test-injection', - 'end-test-seam', - 'exit-command', - 'endclass', - 'endmethod', - 'endform', - 'endinterface', + 'endon', 'endprovide', 'endselect', + 'end-test-injection', + 'end-test-seam', 'endtry', 'endwhile', + 'endwith', + 'engineering', + 'enhancement', + 'enhancement-point', + 'enhancements', + 'enhancement-section', + 'entries', + 'entry', 'enum', + 'environment', + 'errormessage', + 'errors', + 'escaping', 'event', 'events', + 'exact', + 'except', + 'exception', + 'exceptions', + 'exception-table', + 'exclude', + 'excluding', 'exec', + 'execute', + 'exists', 'exit', + 'exit-command', + 'expand', + 'expanding', + 'expiration', + 'explicit', + 'exponent', 'export', 'exporting', + 'extend', + 'extended', + 'extension', 'extract', - 'exception', - 'exceptions', - 'form', - 'field-symbols', - 'field-groups', - 'field', - 'first', + 'fail', 'fetch', + 'field', + 'field-groups', 'fields', + 'field-symbol', + 'field-symbols', + 'file', + 'filter', + 'filters', + 'filter-table', + 'final', + 'first', + 'first-line', + 'fixed-point', + 'fkeq', + 'fkge', + 'flush', + 'font', + 'for', + 'form', 'format', + 'forward', + 'found', 'frame', + 'frames', 'free', + 'friends', 'from', 'function', - 'find', - 'for', - 'found', + 'functionality', 'function-pool', + 'further', + 'gaps', 'generate', 'get', + 'giving', + 'gkeq', + 'gkge', + 'global', + 'grant', + 'green', + 'group', + 'groups', 'handle', - 'hide', + 'handler', + 'harmless', 'hashed', - 'include', + 'having', + 'hdb', + 'header', + 'headers', + 'heading', + 'head-lines', + 'help-id', + 'help-request', + 'hextobin', + 'hide', + 'high', + 'hint', + 'hold', + 'hotspot', + 'icon', + 'id', + 'identification', + 'identifier', + 'ids', + 'if', + 'ignore', + 'ignoring', + 'immediately', + 'implementation', + 'implementations', + 'implemented', + 'implicit', 'import', 'importing', + 'inactive', + 'incl', + 'include', + 'includes', + 'including', + 'increment', 'index', + 'index-line', 'infotypes', + 'inheriting', + 'init', 'initial', 'initialization', - 'id', - 'is', - 'in', - 'interface', - 'interfaces', - 'init', + 'inner', + 'inout', 'input', - 'insert', 'instance', + 'instances', + 'instr', + 'intensified', + 'interface', + 'interface-pool', + 'interfaces', + 'internal', + 'intervals', 'into', - 'implemented', + 'inverse', + 'inverted-date', + 'is', + 'iso', + 'job', + 'join', + 'keep', + 'keeping', + 'kernel', 'key', - 'left-justified', + 'keys', + 'keywords', + 'kind', + 'language', + 'last', + 'late', + 'layout', + 'leading', 'leave', + 'left', + 'left-justified', + 'leftplus', + 'leftspace', + 'legacy', + 'length', + 'let', + 'level', + 'levels', 'like', 'line', 'line-count', + 'linefeed', + 'line-selection', 'line-size', + 'list', + 'listbox', + 'list-processing', + 'little', + 'llang', 'load', + 'load-of-program', + 'lob', 'local', + 'locale', + 'locator', + 'logfile', + 'logical', 'log-point', - 'length', - 'left', - 'leading', + 'long', + 'loop', + 'low', 'lower', + 'lpad', + 'lpi', + 'ltrim', + 'mail', + 'main', + 'major-id', + 'mapping', + 'margin', + 'mark', + 'mask', 'matchcode', - 'method', + 'max', + 'maximum', + 'medium', + 'members', + 'memory', 'mesh', 'message', 'message-id', + 'messages', + 'messaging', + 'method', 'methods', + 'min', + 'minimum', + 'minor-id', + 'mm/dd/yy', + 'mm/dd/yyyy', + 'mmddyy', + 'mode', + 'modif', + 'modifier', 'modify', 'module', 'move', 'move-corresponding', 'multiply', 'multiply-corresponding', - 'match', - 'mode', - 'not', + 'name', + 'nametab', + 'native', + 'nested', + 'nesting', 'new', 'new-line', 'new-page', 'new-section', 'next', 'no', + 'node', + 'nodes', + 'no-display', + 'no-extension', 'no-gap', 'no-gaps', + 'no-grouping', + 'no-heading', + 'non-unicode', + 'non-unique', + 'no-scrolling', 'no-sign', + 'no-title', + 'no-topofpage', 'no-zero', - 'non-unique', + 'null', 'number', - 'occurrence', 'object', + 'objects', 'obligatory', - 'of', - 'output', - 'overlay', - 'optional', - 'others', + 'occurrence', 'occurrences', 'occurs', + 'of', + 'off', 'offset', + 'ole', + 'on', + 'only', + 'open', + 'option', + 'optional', 'options', + 'order', + 'other', + 'others', + 'out', + 'outer', + 'output', + 'output-length', + 'overflow', + 'overlay', 'pack', + 'package', + 'pad', + 'padding', + 'page', + 'pages', + 'parameter', 'parameters', + 'parameter-table', + 'part', + 'partially', + 'pattern', + 'percentage', 'perform', + 'performing', + 'person', + 'pf1', + 'pf10', + 'pf11', + 'pf12', + 'pf13', + 'pf14', + 'pf15', + 'pf2', + 'pf3', + 'pf4', + 'pf5', + 'pf6', + 'pf7', + 'pf8', + 'pf9', + 'pf-status', + 'pink', 'places', + 'pool', + 'pos_high', + 'pos_low', 'position', + 'pragmas', + 'precompiled', + 'preferred', + 'preserving', + 'primary', + 'print', 'print-control', + 'priority', 'private', + 'procedure', + 'process', 'program', + 'property', 'protected', 'provide', 'public', + 'push', + 'pushbutton', 'put', - 'partially', + 'queue-only', + 'quickinfo', 'radiobutton', + 'raise', 'raising', + 'range', 'ranges', + 'read', + 'reader', + 'read-only', 'receive', + 'received', + 'receiver', 'receiving', + 'red', 'redefinition', 'reduce', + 'reduced', + 'ref', 'reference', 'refresh', 'regex', 'reject', - 'results', - 'requested', - 'ref', - 'replace', + 'remote', + 'renaming', + 'replacement', + 'replacing', 'report', + 'request', + 'requested', 'reserve', - 'restore', + 'reset', + 'resolution', + 'respecting', + 'responsible', 'result', + 'results', + 'resumable', + 'resume', + 'retry', 'return', + 'returncode', 'returning', + 'returns', + 'right', 'right-justified', + 'rightplus', + 'rightspace', + 'risk', + 'rmc_communication_failure', + 'rmc_invalid_status', + 'rmc_system_failure', + 'role', 'rollback', - 'read', - 'read-only', - 'rp-provide-from-last', + 'rows', + 'rpad', + 'rtrim', 'run', + 'sap', + 'sap-spool', + 'saving', + 'scale_preserving', + 'scale_preserving_scientific', 'scan', - 'screen', + 'scientific', + 'scientific_with_leading_zero', 'scroll', + 'scroll-boundary', + 'scrolling', 'search', + 'secondary', + 'seconds', + 'section', 'select', - 'select-options', + 'selection', + 'selections', 'selection-screen', - 'stamp', - 'source', - 'subkey', - 'subscreen', + 'selection-set', + 'selection-sets', + 'selection-table', + 'select-options', + 'send', + 'separate', 'separated', 'set', + 'shared', 'shift', + 'short', + 'shortdump-id', + 'sign_as_postfix', 'single', + 'size', 'skip', + 'skipping', + 'smart', + 'some', 'sort', + 'sortable', 'sorted', + 'source', + 'specified', 'split', - 'standard', + 'spool', + 'spots', + 'sql', + 'sqlscript', + 'stable', 'stamp', + 'standard', 'starting', + 'start-of-editing', 'start-of-selection', - 'sum', - 'subtract-corresponding', + 'state', + 'statement', + 'statements', + 'static', 'statics', - 'step', + 'statusinfo', + 'step-loop', 'stop', 'structure', + 'structures', + 'style', + 'subkey', 'submatches', 'submit', + 'subroutine', + 'subscreen', 'subtract', + 'subtract-corresponding', + 'suffix', + 'sum', 'summary', + 'summing', 'supplied', + 'supply', 'suppress', - 'section', + 'switch', + 'switchstates', + 'symbol', + 'syncpoints', + 'syntax', 'syntax-check', 'syntax-trace', 'system-call', - 'switch', + 'system-exceptions', + 'system-exit', + 'tab', + 'tabbed', 'tables', - 'table', + 'tableview', + 'tabstrip', + 'target', 'task', + 'tasks', + 'test', 'testing', - 'test-seam', 'test-injection', + 'test-seam', + 'text', + 'textpool', 'then', + 'throw', 'time', 'times', + 'timestamp', + 'timezone', + 'tims_is_valid', 'title', 'titlebar', + 'title-lines', 'to', + 'tokenization', + 'tokens', + 'top-lines', 'top-of-page', + 'trace-file', + 'trace-table', 'trailing', + 'transaction', 'transfer', 'transformation', - 'translate', 'transporting', - 'types', + 'trmac', + 'truncate', + 'truncation', + 'try', + 'tstmp_add_seconds', + 'tstmp_current_utctimestamp', + 'tstmp_is_valid', + 'tstmp_seconds_between', 'type', 'type-pool', 'type-pools', - 'tabbed', + 'types', + 'uline', 'unassign', + 'under', + 'unicode', + 'union', 'unique', - 'uline', + 'unit_conversion', + 'unix', 'unpack', + 'until', + 'unwind', + 'up', 'update', 'upper', - 'using', + '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', - 'write', - 'where', + 'windows', 'with', + 'with-heading', + 'without', + 'with-title', + 'word', 'work', - 'at', - 'case', - 'catch', - 'continue', - 'do', - 'elseif', - 'else', - 'endat', - 'endcase', - 'enddo', - 'endif', - 'endloop', - 'endon', - 'if', - 'loop', - 'on', - 'raise', - 'try', - // built-in: + 'write', + 'writer', + 'xml', + 'xsd', + 'yellow', + 'yes', + 'yymmdd', + 'zero', + 'zone', + // built-ins 'abs', - 'sign', - 'ceil', - 'floor', - 'trunc', - 'frac', 'acos', 'asin', 'atan', - 'cos', - 'sin', - 'tan', - 'cosh', - 'sinh', - 'tanh', - 'exp', - 'log', - 'log10', - 'sqrt', - 'strlen', - 'xstrlen', + 'bit-set', + 'boolc', + 'boolx', + 'ceil', + 'char_off', 'charlen', - 'lines', - 'numofchar', - 'dbmaxlen', - 'round', - 'rescale', - 'nmax', - 'nmin', 'cmax', 'cmin', - 'boolc', - 'boolx', - 'xsdbool', + 'concat_lines_of', + 'condense', 'contains', - 'contains_any_of', 'contains_any_not_of', - 'matches', - 'line_exists', - 'ipow', - 'char_off', + 'contains_any_of', + 'cos', + 'cosh', 'count', - 'count_any_of', 'count_any_not_of', + 'count_any_of', + 'dbmaxlen', 'distance', - 'condense', - 'concat_lines_of', 'escape', + 'exp', 'find', - 'find_end', - 'find_any_of', 'find_any_not_of', + 'find_any_of', + 'find_end', + 'floor', + 'frac', + 'from_mixed', 'insert', + 'ipow', + 'line_exists', + 'line_index', + 'lines', + 'log', + 'log10', 'match', + 'matches', + 'nmax', + 'nmin', + 'numofchar', 'repeat', 'replace', + 'rescale', 'reverse', + 'round', 'segment', 'shift_left', 'shift_right', + 'sign', + 'sin', + 'sinh', + 'sqrt', + 'strlen', 'substring', 'substring_after', - 'substring_from', 'substring_before', + 'substring_from', 'substring_to', - 'to_upper', + 'tan', + 'tanh', 'to_lower', 'to_mixed', - 'from_mixed', + 'to_upper', 'translate', - 'bit-set', - 'line_index', - 'definition', - 'implementation', - 'public', - 'inheriting', - 'final' + 'trunc', + 'utclong_add', // since 7.54 + 'utclong_current', // since 7.54 + 'utclong_diff', // since 7.54 + 'xsdbool', + 'xstrlen' ]; export const language = { @@ -429,52 +945,141 @@ export const language = { keywords: abapKeywords, typeKeywords: [ - 'abap_bool', + // built-in data types + 'b', + 'c', + 'd', + 'decfloat16', + 'decfloat34', + 'f', + 'i', + 'int8', // since 7.54 + 'n', + 'p', + 's', 'string', + 't', + 'utclong', // since 7.54 + 'x', 'xstring', + // generic data types 'any', 'clike', 'csequence', + 'decfloat', 'numeric', + 'simple', 'xsequence', - 'c', - 'n', - 'i', - 'p', - 'f', - 'd', - 't', - 'x' + // generic table types + 'table', + // 'any table', + 'hashed', // 'hashed table', + 'index', // 'index table', + 'sorted', // 'sorted table', + 'standard', // 'standard table', + // ddic data types + 'accp', + 'char', + 'clnt', + 'cuky', + 'curr', + 'dats', + 'dec', + 'df16_dec', + 'df16_raw', + 'df34_dec', + 'df34_raw', + 'fltp', + 'int1', + 'int2', + 'int4', + // 'int8', built-in since 7.54 + 'lang', + 'lchr', + 'lraw', + 'numc', + 'quan', + 'raw', + 'rawstring', + 'sstring', + 'tims', + 'unit', + // ddic data types (obsolete) + 'df16_scl', + 'df34_scl', + 'prec', + 'varc', + // special data types + 'abap_bool', + 'space', + 'me', + 'syst', + 'sy', + 'screen' ], operators: [ + // arithmetic operators ' +', ' -', '/', '*', + '**', + 'div', + 'mod', + // assignment operators '=', + '#', + '@', + // concat operators + '&', + '&&', + // bit operators + 'bit-and', + 'bit-not', + 'bit-or', + 'bit-xor', + 'm', + 'o', + 'z', + // boolean operators + 'and', + 'equiv', + 'not', + 'or', + // comparison operators ' < ', ' > ', '<=', '>=', '<>', - '><', - '=<', - '=>', - '#', - '@', - 'EQ', - 'NE', - 'GE', - 'LE', - 'CS', - 'CN', - 'CA', - 'CO', - 'CP', - 'NS', - 'NA', - 'NP' + '><', // obsolete + '=<', // obsolete + '=>', // obsolete + 'between', + 'bt', + 'byte-ca', + 'byte-cn', + 'byte-co', + 'byte-cs', + 'byte-na', + 'byte-ns', + 'ca', + 'cn', + 'co', + 'cp', + 'cs', + 'eq', // obsolete + 'ge', // obsolete + 'gt', // obsolete + 'in', + 'le', // obsolete + 'lt', // obsolete + 'na', + 'nb', + 'ne', // obsolete + 'np', + 'ns' ], symbols: /[=>{ cases: { '@typeKeywords': 'keyword', '@keywords': 'keyword', + '@operators': 'operator', '@default': 'identifier' } } @@ -499,6 +1105,7 @@ export const language = { [/[:,.]/, 'delimiter'], [/[{}()\[\]]/, '@brackets'], + [/@symbols/, { cases: { '@operators': 'operator', '@default': '' } }], [/'/, { token: 'string', bracket: '@open', next: '@stringquote' }],