diff --git a/README.md b/README.md index a649ab40..a62fba77 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Colorization and configuration supports for multiple languages for the Monaco Ed ![monaco-languages](https://cloud.githubusercontent.com/assets/5047891/15938606/1fd4bac6-2e74-11e6-8839-d455da8bc8a7.gif) +* abap * apex * azcli * bat diff --git a/scripts/bundle.js b/scripts/bundle.js index bb99c435..c9185650 100644 --- a/scripts/bundle.js +++ b/scripts/bundle.js @@ -21,6 +21,7 @@ const BUNDLED_FILE_HEADER = [ ].join('\n'); bundleOne('monaco.contribution'); +bundleOne('abap/abap'); bundleOne('bat/bat'); bundleOne('css/css'); bundleOne('coffee/coffee'); diff --git a/src/abap/abap.contribution.ts b/src/abap/abap.contribution.ts new file mode 100644 index 00000000..d84fff80 --- /dev/null +++ b/src/abap/abap.contribution.ts @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { registerLanguage } from '../_.contribution'; + +registerLanguage({ + id: 'abap', + extensions: ['.abap'], + aliases: ['abap', 'ABAP'], + loader: () => import('./abap') +}); diff --git a/src/abap/abap.test.ts b/src/abap/abap.test.ts new file mode 100644 index 00000000..fc3b5bfd --- /dev/null +++ b/src/abap/abap.test.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { testTokenization } from '../test/testRunner'; + +testTokenization('abap', [ + [{ + line: '* comment', + tokens: [ + { startIndex: 0, type: 'comment.abap' } + ] + }], + [{ + line: ' " comment', + tokens: [ + { startIndex: 0, type: '' }, + { startIndex: 1, type: 'comment.abap' } + ] + }], + [{ + line: 'write hello.', + tokens: [ + { startIndex: 0, type: 'keyword.abap' }, + { startIndex: 5, type: '' }, + { startIndex: 6, type: 'identifier.abap' }, + { startIndex: 11, type: 'delimiter.abap' } + ] + }], + [{ + line: 'IF 2 = 3.', + tokens: [ + { startIndex: 0, type: 'keyword.abap' }, + { startIndex: 2, type: '' }, + { startIndex: 3, type: 'number.abap' }, + { startIndex: 4, type: '' }, + { startIndex: 5, type: 'operator.abap' }, + { startIndex: 6, type: '' }, + { startIndex: 7, type: 'number.abap' }, + { startIndex: 8, type: 'delimiter.abap' } + ] + }], + [{ + line: '\'hello\'', + tokens: [ + { startIndex: 0, type: 'string.abap' }, + ] + }], + [{ + line: '|hello|', + tokens: [ + { startIndex: 0, type: 'string.abap' }, + ] + }], + [{ + line: 'write: hello, world.', + tokens: [ + { startIndex: 0, type: 'keyword.abap' }, + { startIndex: 5, type: 'delimiter.abap' }, + { startIndex: 6, type: '' }, + { startIndex: 7, type: 'identifier.abap' }, + { startIndex: 12, type: 'delimiter.abap' }, + { startIndex: 13, type: '' }, + { startIndex: 14, type: 'identifier.abap' }, + { startIndex: 19, type: 'delimiter.abap' }, + ] + }], + [{ + line: 'method_call( param ).', + tokens: [ + { startIndex: 0, type: 'identifier.abap' }, + { startIndex: 11, type: 'delimiter.parenthesis.abap' }, + { startIndex: 12, type: '' }, + { startIndex: 13, type: 'identifier.abap' }, + { startIndex: 18, type: '' }, + { startIndex: 19, type: 'delimiter.parenthesis.abap' }, + { startIndex: 20, type: 'delimiter.abap' }, + ] + }], + [{ + line: '\'he\'\' llo\'', + tokens: [ + { startIndex: 0, type: 'string.abap' }, + ] + }], + [{ + line: '|hel\\|lo|', + tokens: [ + { startIndex: 0, type: 'string.abap' }, + ] + }], +]); diff --git a/src/abap/abap.ts b/src/abap/abap.ts new file mode 100644 index 00000000..00bdf670 --- /dev/null +++ b/src/abap/abap.ts @@ -0,0 +1,113 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; +import ILanguage = monaco.languages.IMonarchLanguage; + +export const conf: IRichLanguageConfiguration = { + comments: { + lineComment: '*', + }, + brackets: [ + ['[', ']'], + ['(', ')'] + ], +}; + +const abapKeywords = [ + 'abstract','add','add-corresponding','adjacent','alias','aliases','all','append','appending','ascending','as','assert','assign','assigned','assigning','association','authority-check', + 'back','begin','binary','block','bound','break-point','by','byte', + 'class', 'call','cast','changing','check','class-data','class-method','class-methods','clear','close','cnt','collect','commit','cond','character', + 'corresponding','communication','component','compute','concatenate','condense','constants','conv','count', + 'controls','convert','create','currency', + 'data','descending','default','define','deferred','delete','describe','detail','display','divide','divide-corresponding','display-mode','duplicates', + 'deleting', + 'editor-call','end','endexec','endfunction','ending','endmodule','end-of-definition','end-of-page','end-of-selection','end-test-injection','end-test-seam','exit-command','endclass','endmethod','endform','endinterface', + 'endprovide','endselect','endtry','endwhile','enum','event','events','exec','exit','export', + 'exporting','extract','exception','exceptions', + 'field-symbols','field-groups','field','first','fetch','fields','format','frame','free','from','function','find','for','found','function-pool', + 'generate','get', + 'handle','hide','hashed', + 'include','import','importing','index','infotypes','initial','initialization', + 'id','is','in','interface','interfaces','init','input','insert','instance','into', + 'key', + 'left-justified','leave','like','line','line-count','line-size','load','local','log-point','length','left','leading','lower', + 'matchcode','method','mesh','message','message-id','methods','modify','module','move','move-corresponding','multiply','multiply-corresponding','match', + 'new','new-line','new-page','new-section','next','no','no-gap','no-gaps','no-sign','no-zero','non-unique','number', + 'occurrence','object','obligatory','of','output','overlay','optional','others','occurrences','occurs','offset','options', + 'pack','parameters','perform','places','position','print-control','private','program','protected','provide','public','put', + 'radiobutton','raising','ranges','receive','receiving','redefinition','reduce','reference','refresh','regex','reject','results','requested', + 'ref','replace','report','reserve','restore','result','return','returning','right-justified','rollback','read','read-only','rp-provide-from-last','run', + 'scan','screen','scroll','search','select','select-options','selection-screen','stamp','source','subkey', + 'separated','set','shift','single','skip','sort','sorted','split','standard','stamp','starting','start-of-selection','sum','subtract-corresponding','statics','step','stop','structure','submatches','submit','subtract','summary','supplied','suppress','section','syntax-check','syntax-trace','system-call','switch', + 'tables','table','task','testing','test-seam','test-injection','then','time','times','title','titlebar','to','top-of-page','trailing','transfer','transformation','translate','transporting','types','type','type-pool','type-pools', + 'unassign','unique','uline','unpack','update','upper','using', + 'value', + 'when','while','window','write','where','with','work', + 'at','case','catch','continue','do','elseif','else','endat','endcase','enddo','endif','endloop','endon','if','loop','on','raise','try', + 'abs','sign','ceil','floor','trunc','frac','acos','asin','atan','cos','sin','tan','cosh','sinh','tanh','exp','log','log10','sqrt','strlen','xstrlen','charlen','lines','numofchar','dbmaxlen','round','rescale','nmax','nmin','cmax','cmin','boolc','boolx','xsdbool','contains','contains_any_of','contains_any_not_of','matches','line_exists','ipow','char_off','count','count_any_of','count_any_not_of','distance','condense','concat_lines_of','escape','find','find_end','find_any_of','find_any_not_of','insert','match','repeat','replace','reverse','segment','shift_left','shift_right','substring','substring_after','substring_from','substring_before','substring_to','to_upper','to_lower','to_mixed','from_mixed','translate','bit-set','line_index', + 'definition','implementation','public','inheriting','final' + ]; + +export const language = { + defaultToken: 'invalid', + ignoreCase: true, + tokenPostfix: '.abap', + keywords: abapKeywords, + + typeKeywords: [ + 'abap_bool','string','xstring','any','clike','csequence','numeric', + 'xsequence','c','n','i','p','f','d','t','x' + ], + + operators: [ + '+', '-', '/', '*', + '=', '<', '>', '<=', '>=', '<>', '><', '=<', '=>', + 'EQ', 'NE', 'GE', 'LE', + 'CS', 'CN', 'CA', 'CO', 'CP', 'NS', 'NA', 'NP', + ], + + symbols: /[=>