diff --git a/src/content/docs/developing/testing/writing.mdx b/src/content/docs/developing/testing/writing.mdx index 9e21535..b402b52 100644 --- a/src/content/docs/developing/testing/writing.mdx +++ b/src/content/docs/developing/testing/writing.mdx @@ -65,7 +65,7 @@ One notable preference is the **Show Test Stub Preview** which controls whether In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` copybook to your test suite: -```rpgle +```RPGLE /include qinclude,TESTCASE ``` @@ -78,12 +78,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop This procedure can be used to set up test data or allocate resources before the first test case is started. **Syntax** - ```rpgle + ```RPGLE + **free setUpSuite(); ``` **Example** - ```rpgle + ```RPGLE + **free dcl-proc setUpSuite export; // Setup test suite code here end-proc; @@ -96,12 +98,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop This procedure is called for each test case. **Syntax** - ```rpgle + ```RPGLE + **free setUp(); ``` **Example** - ```rpgle + ```RPGLE + **free dcl-proc setUp export; // Setup test case code here end-proc; @@ -114,12 +118,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop This procedure can be used to remove test data or deallocate resources after the last test case has been executed. **Syntax** - ```rpgle + ```RPGLE + **free tearDownSuite(); ``` **Example** - ```rpgle + ```RPGLE + **free dcl-proc tearDownSuite export; // Tear down test suite code here end-proc; @@ -132,12 +138,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop This procedure is called for each test case. **Syntax** - ```rpgle + ```RPGLE + **free tearDown(); ``` **Example** - ```rpgle + ```RPGLE + **free dcl-proc tearDown export; // Tear down test case code here end-proc; @@ -157,12 +165,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop The assertion fails, if both values are different. If the `message` parameter is specified, it is appeneded to the log. **Syntax** - ```rpgle - assertEqual( 'expected' : 'actual' [: 'message' ); + ```RPGLE + **free + assertEqual( 'expected' : 'actual' : 'message' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass assertEqual( 'Hello' : 'Hello' ); assertEqual( 123 : 123 ); @@ -182,12 +192,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop If the `message` parameter is specified, it is appeneded to the log. **Syntax** - ```rpgle - assertThat( expected : actual : matcher [: message ); + ```RPGLE + **free + assertThat( expected : actual : matcher : message ); ``` **Example** - ```rpgle + ```RPGLE + **free assertThat( actual : %paddr('matcher') : pUserData ); ``` @@ -198,12 +210,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop If the `fieldName` parameter is specified, the message is prefixed with `fieldName:`. **Syntax** - ```rpgle - nEqual( expected : actual [: 'fieldName' ); + ```RPGLE + **free + nEqual( expected : actual : 'fieldName' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass nEqual( *off : 1=2 ); @@ -218,12 +232,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop When the assertion fails, the value of `message` is added to the test report. **Syntax** - ```rpgle + ```RPGLE + **free assert( booleanExpression : 'message' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass assert( 1=1 : 'Impossible to fail' ); @@ -237,12 +253,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Produces an error and appends the specified `message` to the test report. The test case is terminated. **Syntax** - ```rpgle + ```RPGLE + **free fail( 'message' ); ``` **Example** - ```rpgle + ```RPGLE + **free monitor; produceAnException(doFailure); @@ -259,12 +277,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Checks whether the job log contains the specified message ID between *NOW* and `timeLimit`. The value of `timeLimit` should be created with the `getFullTimeStamp()` utility. **Syntax** - ```rpgle + ```RPGLE + **free assertJobLogContains( msgId : timeLimit ); ``` **Example** - ```rpgle + ```RPGLE + **free testStartTime = getFullTimeStamp(); sndMCH1211Msg(); @@ -282,12 +302,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop * The value of `timeLimit` should be created with the `getFullTimeStamp()` utility. **Syntax** - ```rpgle - assertMessageQueueContains( userOrQueue : library [: msgId [: msgText [: msgHelp : timeLimit ); + ```RPGLE + **free + assertMessageQueueContains( userOrQueue : library : msgId : msgText : msgHelp : timeLimit ); ``` **Example** - ```rpgle + ```RPGLE + **free testStartTime = getFullTimeStamp(); sndToMSGQ(); @@ -311,12 +333,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop If the `fieldName` parameter is specified, the message is prefixed with `fieldName:`. **Syntax** - ```rpgle - aEqual( 'expected' : 'actual' [: 'fieldName' ); + ```RPGLE + **free + aEqual( 'expected' : 'actual' : 'fieldName' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass aEqual( 'Hello' : 'Hello' ); @@ -331,12 +355,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop If the `fieldName` parameter is specified, the message is prefixed with `fieldName:`. **Syntax** - ```rpgle - iEqual( expected : actual [: 'fieldName' ); + ```RPGLE + **free + iEqual( expected : actual : 'fieldName' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass iEqual( 123 : 123 ); @@ -351,12 +377,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop If the `fieldName` parameter is specified, the message is prefixed with `fieldName:`. **Syntax** - ```rpgle - nEqual( expected : actual [: 'fieldName' ); + ```RPGLE + **free + nEqual( expected : actual : 'fieldName' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass nEqual( *off : 1=2 ); @@ -371,12 +399,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop When the assertion fails, the value of `message` is added to the test report. **Syntax** - ```rpgle + ```RPGLE + **free assert( booleanExpression : 'message' ); ``` **Example** - ```rpgle + ```RPGLE + **free // ✅ Pass assert( 1=1 : 'Impossible to fail' ); @@ -390,12 +420,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Produces an error and appends the specified `message` to the test report. The test case is terminated. **Syntax** - ```rpgle + ```RPGLE + **free fail( 'message' ); ``` **Example** - ```rpgle + ```RPGLE + **free monitor; produceAnException(doFailure); @@ -412,12 +444,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Checks whether the job log contains the specified message ID between *NOW* and `timeLimit`. The value of `timeLimit` should be created with the `getFullTimeStamp()` utility. **Syntax** - ```rpgle + ```RPGLE + **free assertJobLogContains( msgId : timeLimit ); ``` **Example** - ```rpgle + ```RPGLE + **free testStartTime = getFullTimeStamp(); sndMCH1211Msg(); @@ -435,12 +469,14 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop * The value of `timeLimit` should be created with the `getFullTimeStamp()` utility. **Syntax** - ```rpgle - assertMessageQueueContains( userOrQueue : library [: msgId [: msgText [: msgHelp : timeLimit ); + ```RPGLE + **free + assertMessageQueueContains( userOrQueue : library : msgId : msgText : msgHelp : timeLimit ); ``` **Example** - ```rpgle + ```RPGLE + **free testStartTime = getFullTimeStamp(); sndToMSGQ(); @@ -468,17 +504,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Returns the full current timestamp, without rounding the microseconds like `%timestamp()` does. **Syntax** - ```rpgle + ```RPGLE + **free getFullTimeStamp(); ``` **Return value** - ```rpgle + ``` timestamp ``` **Example** - ```rpgle + ```RPGLE + **free tmStmp = getFullTimeStamp(); ``` @@ -489,17 +527,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop When the job resumes the original status message is restored. **Syntax** - ```rpgle - waitSeconds( seconds [: message ) + ```RPGLE + **free + waitSeconds( seconds : message ) ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free waitSeconds(3 : 'Waiting 3 seconds ...'); ``` @@ -509,8 +549,9 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Retrieves the latest `*ESCAPE` message from the job log. Usually called within the `on-error` section of a `monitor` block. **Syntax** - ```rpgle - getMonitoredMessage( [: doRmvMsg ); + ```RPGLE + **free + getMonitoredMessage( : doRmvMsg ); ``` **Return value** @@ -524,7 +565,8 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop * `specNb` - Sender: statement number **Example** - ```rpgle + ```RPGLE + **free monitor; a = 10; b = 0; @@ -547,17 +589,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop This procedure is automatically called by the RPGUnit, before executing a unit test. Use this procedure with care. **Syntax** - ```rpgle + ```RPGLE + **free setLowMessageKey( msgKey ); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free setLowMessageKey(msgKey); ``` @@ -572,17 +616,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Displays a given status message in the status line at the bottom of the screen. **Syntax** - ```rpgle + ```RPGLE + **free displayStatusMessage( message ); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free displayStatusMessage('Hello World!'); ``` @@ -592,17 +638,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Replaces the current status message with the previous message. **Syntax** - ```rpgle + ```RPGLE + **free restoreStatusMessage(); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free // Display status message. displayStatusMessage('Hello World!'); @@ -619,17 +667,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Clears (removes) the status message that is currently being displayed at the bottom of the screen. **Syntax** - ```rpgle + ```RPGLE + **free clearStatusMessage(); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free clearStatusMessage(); ``` @@ -644,17 +694,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Uses `CLRPFM` to remove the data from `member` of file `file`. The file must be stored in `*CURLIB`. **Syntax** - ```rpgle - clrpfm( fileName [: memberName ); + ```RPGLE + **free + clrpfm( fileName : memberName ); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free clrpfm( 'MYFILE' : 'MYMEMBER' ); ``` @@ -664,17 +716,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Uses `RCLACTGRP` to reclaim the activation group specified at parameter `activationGroup`. **Syntax** - ```rpgle + ```RPGLE + **free rclActGrp( activationGroupName ); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free rclActGrp( '*ELIGIBLE' ); ``` @@ -684,17 +738,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Uses the `QCMDEXC` API to execute the CL command specified at parameter `command`. **Syntax** - ```rpgle + ```RPGLE + **free runCmd( command ); ``` **Return value** - ```rpgle + ``` void ``` **Example** - ```rpgle + ```RPGLE + **free runCmd( 'ALCOBJ OBJ((*CURLIB/FILE *FILE *EXCL))' ); ``` @@ -709,17 +765,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Returns the source type of a given source member. **Syntax** - ```rpgle + ```RPGLE + **free getMemberType( sourceFile : library : member ); ``` **Return value** - ```rpgle + ``` char(10) ``` **Example** - ```rpgle + ```RPGLE + **free srcType = getMemberType('QINCLUDE': 'RPGUNIT': 'ASSERT'); ``` @@ -729,17 +787,19 @@ In order to use the APIs provided by RPGUnit, you need to add the `TESTCASE` cop Returns the source type of a given stream file. **Syntax** - ```rpgle + ```RPGLE + **free getStmfType( srcStmf ); ``` **Return value** - ```rpgle + ``` char(10) ``` **Example** - ```rpgle + ```RPGLE + **free srcType = getStmfType('/home/dev/mypgm.rpgle'); ``` diff --git a/src/content/docs/tips/seuColours.mdx b/src/content/docs/tips/seuColours.mdx index 86c335a..0ce009e 100644 --- a/src/content/docs/tips/seuColours.mdx +++ b/src/content/docs/tips/seuColours.mdx @@ -14,7 +14,7 @@ This is because SEU uses the 5250 protocol to render colour information to the s Christian Jorgensen has written a stored procedure that can do the cleanup of those source members, which we recommend to everyone to use. -```SQL +```sql create or replace procedure Remove_SEU_colour_codes( Lib varchar(10), Fil varchar(10), Mbr varchar(10) ) @@ -32,6 +32,6 @@ end You call it like this: -```SQL +```sql call Remove_SEU_colour_codes( LIB => '', FIL => '', MBR => '' ) ``` \ No newline at end of file diff --git a/src/content/docs/workshop/db2i/index.mdx b/src/content/docs/workshop/db2i/index.mdx index dda1725..3a6965b 100644 --- a/src/content/docs/workshop/db2i/index.mdx +++ b/src/content/docs/workshop/db2i/index.mdx @@ -905,7 +905,7 @@ To create a new member, navigate to the Object Browser, add a `*SRCPF` filter to -```rpgle +```RPGLE **free dcl-s mystatement varchar(100); diff --git a/src/content/docs/workshop/git/index.mdx b/src/content/docs/workshop/git/index.mdx index fbadfa4..38a8651 100644 --- a/src/content/docs/workshop/git/index.mdx +++ b/src/content/docs/workshop/git/index.mdx @@ -221,7 +221,7 @@ Next, you can create your first program. -```rpgle +```RPGLE **free dcl-s mytext char(20); @@ -273,7 +273,7 @@ When developing locally, 'member style' includes are no longer used for `/COPY` -```rpgle +```RPGLE **free dcl-c MYLABEL 'Hello from the world'; @@ -289,7 +289,7 @@ dcl-c MYLABEL 'Hello from the world'; -```rpgle +```RPGLE **free /copy 'qrpgleref/constants.rpgleinc' @@ -352,7 +352,7 @@ Since the repository has been created, any new changes that are made (be it modi -```rpgle +```RPGLE **free dcl-c MYLABEL 'Hello from the lab'; @@ -653,7 +653,7 @@ This assumes `department` exists and is on your library list. -```rpgle +```RPGLE **free ctl-opt dftactgrp(*no); @@ -701,7 +701,7 @@ Next, we're going to create two new files. One `.sqlrpgle` program named `UPDDEP -```rpgle +```RPGLE **free ctl-opt dftactgrp(*no); diff --git a/src/syntaxes/rpgle.tmLanguage.json b/src/syntaxes/rpgle.tmLanguage.json index 3d6ca74..c99f38e 100644 --- a/src/syntaxes/rpgle.tmLanguage.json +++ b/src/syntaxes/rpgle.tmLanguage.json @@ -4,13 +4,16 @@ "patterns": [ { "name": "rpgle.free.allfree", - "begin": "(?i)(?=(\\s*\\*\\*(FREE)))", + "begin": "", "end": "(E-\\*-O-\\*-F)", "patterns": [ { "name": "keyword.other.rpgle.free.precompiler.allfree", - "match": "(?i)^\\s*\\*\\*FREE" + "match": "(?i)^\\*\\*FREE" }, + { + "include": "#ctarrays" + }, { "include": "#freeSQL" }, @@ -20,7 +23,7 @@ { "include": "#freeformat" } - ] + ] }, { "name": "comment.line.rpgle.fixed", @@ -114,15 +117,15 @@ }, { "name": "support.function.rpgle.sql", - "match": "[a-zA-Z_][a-zA-Z0-9_]*(?=\\()" + "match": "[a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ]*(?=\\()" }, { "name": "constant.language.rpgle.sql.schema", - "match": "[a-zA-Z_][a-zA-Z0-9_]*(\\.|\\/)[a-zA-Z_][a-zA-Z0-9_]*" + "match": "[a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ]*(\\.|\\/)[a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ]*" }, { "name": "variable.parameter.rpgle.sql", - "match": "[:][a-zA-Z_@#][a-zA-Z0-9_@#\\.]*" + "match": "[:][a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ\\.]*" }, { "name": "keyword.operator.rpgle.sql.reserved", @@ -141,7 +144,7 @@ "patterns": [ { "name": "string.other.rpgle.ctarray", - "begin": "(\\*{2})", + "begin": "^(\\*{2}(\\ |CTDATA))", "end": "" } ] @@ -160,7 +163,7 @@ "patterns": [ { "name": "variable.other.rpgle.free.definition.identifier", - "begin": "[a-zA-Z_][a-zA-Z0-9_]*", + "begin": "[a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ]*", "end": "(?=\n)", "patterns": [ { @@ -189,7 +192,7 @@ }, { "name": "entity.name.function.rpgle.free.control.keywords", - "match": "(?i)\\b(VALIDATE|USRPRF|TRUNCNBR|TIMFMT|THREAD|TEXT|STGMDL|SRTSEQ|REQPREXP|PRFDTA|PGMINFO|OPTION|OPTIMIZE|OPENOPT|NOMAIN|MAIN|LANGID|INTPREC|INDENT|GENLVL|FTRANS|FORMSALIGN|FLTDIV|FIXNBR|EXTBININT|EXPROPTS|ENBPFRCOL|DFTNAME|DFTACTGRP|DECPREC|DECEDIT|DEBUG|DATFMT|DATEDIT|DCLOPT|CVTOPT|CURSYM|COPYRIGHT|COPYNEST|CHARCOUNTTYPES|CHARCOUNT|CCSIDCVT|CCSID|BNDDIR|AUT|ALWNULL|ALTSEQ|ACTGRP|ALLOC)\\b" + "match": "(?i)\\b(VALIDATE|USRPRF|TRUNCNBR|TIMFMT|THREAD|TEXT|STGMDL|SRTSEQ|REQPREXP|PRFDTA|PGMINFO|OPTION|OPTIMIZE|OPENOPT|NOMAIN|MAIN|LANGID|INTPREC|INDENT|GENLVL|FTRANS|FORMSALIGN|FLTDIV|FIXNBR|EXTBININT|EXPROPTS|ENBPFRCOL|DFTNAME|DFTACTGRP|DECPREC|DECEDIT|DEBUG|DATFMT|DATEYY|DATEDIT|DCLOPT|CVTOPT|CURSYM|COPYRIGHT|COPYNEST|CHARCOUNTTYPES|CHARCOUNT|CCSIDCVT|CCSID|BNDDIR|AUT|ALWNULL|ALTSEQ|ACTGRP|ALLOC)\\b" } ] }, @@ -233,6 +236,27 @@ } ] }, + { + "name": "rpgle.free.definition.complex-single", + "begin": "(?i)(?=(\\b(DCL\\-)(PR|DS)\\b))", + "end": "\n", + "patterns": [ + { + "name": "storage.type.rpgle.free.definition.complex-single.dcl", + "match": "(?i)\\b(DCL\\-)(PR|DS)\\b" + }, + { + "name": "storage.type.rpgle.free.definition.complex-single.end", + "match": "(?i)\\b(END\\-)(PR|DS)\\b" + }, + { + "include": "#freedefkeywords" + }, + { + "include": "#rpglecommon" + } + ] + }, { "name": "rpgle.free.definition.complex", "begin": "(?i)(?=(\\b(DCL\\-)(DS|ENUM|PROC|PR|PI)\\b))", @@ -249,9 +273,9 @@ { "include": "#freedefkeywords" }, - { - "include": "#freeidentifiers" - }, + { + "include": "#freeidentifiers" + }, { "include": "#rpglecommon" } @@ -263,7 +287,7 @@ }, { "name": "keyword.other.rpgle.free", - "match": "(?i)\\b(Z\\-SUB|Z\\-ADD|XML\\-SAX|XML\\-INTO|XLATE|XFOOT|WRITE|WHEN-IN|WHEN-IS|WHEN|UPDATE|UNLOCK|TIME|TESTZ|TESTN|TESTB|TEST|TAG|SUBST|SUBDUR|SUB|SQRT|SQLSTATE|SQLCODE|SORTA|SND\\-MSG|SHTDN|SETON|SETOFF|SETLL|SETGT|SELECT|SCAN|ROLBK|RETURN|RESET|REL|REALLOC|READPE|READP|READE|READC|READ|POST|PLIST|PARM|OUT|OTHER|OR|OPEN|ON\\-EXIT|ON\\-EXCP|ON\\-ERROR|OCCUR|NEXT|MVR|MULT|MOVEL|MOVEA|MOVE|MONITOR|MLLZO|MLHZO|MHLZO|MHHZO|LOOKUP|LEAVESR|LEAVE|KLIST|KFLD|ITER|IN|IF|GOTO|FORCE|FOR\\-EACH|FOR|FEOD|EXTRCT|EXSR|EXFMT|EXCEPT|EVAL-CORR|EVALR|EVAL|ENDSR|ENDMON|ENDFOR|ENDIF|ENDDO|ENDCS|ENDWH|ENDSL|END|ELSEIF|ELSE|DUMP|DSPLY|DOW|DOU|DO|DIV|DELETE|DEFINE|DEALLOC|DATA-INTO|COMP|COMMIT|CLOSE|CLEAR|CHECKR|CHECK|CHAIN|CAT|CAS|CALLP|CALLB|CALL|CAB|BITON|BITOFF|BEGSR|AND|ALLOC|ADDUR|ADD|ACQ)\\b" + "match": "(?i)\\b(Z\\-SUB|Z\\-ADD|XML\\-SAX|XML\\-INTO|XLATE|XFOOT|WRITE|WHEN-IN|WHEN-IS|WHEN|UPDATE|UNLOCK|TIME|TESTZ|TESTN|TESTB|TEST|TAG|SUBST|SUBDUR|SUB|SQRT|SQLSTATE|SQLCODE|SORTA|SND\\-MSG|SHTDN|SETON|SETOFF|SETLL|SETGT|SELECT|SCAN|ROLBK|RETURN|RESET|REL|REALLOC|READPE|READP|READE|READC|READ|POST|PLIST|PARM|OUT|OTHER|OR|OPEN|ON\\-EXIT|ON\\-EXCP|ON\\-ERROR|OCCUR|NEXT|MVR|MULT|MOVEL|MOVEA|MOVE|MONITOR|MLLZO|MLHZO|MHLZO|MHHZO|LOOKUP|LEAVESR|LEAVE|KLIST|KFLD|ITER|IN|IF|GOTO|FORCE|FOR\\-EACH|FOR|FEOD|EXTRCT|EXSR|EXFMT|EXCEPT|EVAL-CORR|EVALR|EVAL|ENDSR|ENDMON|ENDFOR|ENDIF|ENDDO|ENDCS|ENDWH|ENDSL|END|ELSEIF|ELSE|DUMP|DSPLY|DOW|DOU|DO|DIV|DELETE|DEFINE|DEALLOC|DATA-INTO|DATA-GEN|COMP|COMMIT|CLOSE|CLEAR|CHECKR|CHECK|CHAIN|CAT|CAS|CALLP|CALLB|CALL|CAB|BITON|BITOFF|BEGSR|AND|ALLOC|ADDUR|ADD|ACQ)\\b" }, { "include": "#freeidentifiers" @@ -579,7 +603,7 @@ }, { "name": "variable.other", - "match": "((?i)[@#a-zA-Z_][@#a-zA-Z0-9_]*)|\\(|\\)|\\%" + "match": "((?i)[a-zA-Z_#@$§ÆØÅÄ֣ѥàÐŞİ][a-zA-Z0-9_#@$§ÆØÅÄ֣ѥàÐŞİ]*)|\\(|\\)|\\%" } ] }, @@ -592,7 +616,7 @@ }, { "name": "keyword.other.rpgle.fixed.c.operation", - "match": "(?i)(?<=((?<=^.{5}C).{19}))(Z\\-SUB|Z\\-ADD|XML\\-SAX|XML\\-INTO|XLATE|XFOOT|WRITE|WHEN|UPDATE|UNLOCK|TIME|TESTZ|TESTN|TESTB|TEST|TAG|SUBST|SUBDUR|SUB|SQRT|SORTA|SHTDN|SETON|SETOFF|SETLL|SETGT|SELECT|SCAN|ROLBK|RETURN|RESET|REL|REALLOC|READPE|READP|READE|READC|READ|POST|PLIST|PARM|OUT|OTHER|OR|OPEN|ON\\-EXIT|ON\\-ERROR|OCCUR|NEXT|MVR|MULT|MOVEL|MOVEA|MOVE|MONITOR|MLLZO|MLHZO|MHLZO|MHHZO|LOOKUP|LEAVESR|LEAVE|KLIST|KFLD|ITER|IN|IF|GOTO|FORCE|FOR|FEOD|EXTRCT|EXSR|EXFMT|EXCEPT|EVAL-CORR|EVALR|EVAL|ENDFOR|ENDSR|ENDIF|ENDDO|ENDCS|ENDWH|ENDSL|END|ELSEIF|ELSE|DUMP|DSPLY|DOW|DOU|DO|DIV|DELETE|DEFINE|DEALLOC|DATA-INTO|COMP|COMMIT|CLOSE|CLEAR|CHECKR|CHECK|CHAIN|CAT|CAS|CALLP|CALLB|CALL|CAB|BITON|BITOFF|BEGSR|AND|ALLOC|ADDUR|ADD|ACQ)" + "match": "(?i)(?<=((?<=^.{5}C).{19}))(Z\\-SUB|Z\\-ADD|XML\\-SAX|XML\\-INTO|XLATE|XFOOT|WRITE|WHEN|UPDATE|UNLOCK|TIME|TESTZ|TESTN|TESTB|TEST|TAG|SUBST|SUBDUR|SUB|SQRT|SORTA|SHTDN|SETON|SETOFF|SETLL|SETGT|SELECT|SCAN|ROLBK|RETURN|RESET|REL|REALLOC|READPE|READP|READE|READC|READ|POST|PLIST|PARM|OUT|OTHER|OR|OPEN|ON\\-EXIT|ON\\-ERROR|OCCUR|NEXT|MVR|MULT|MOVEL|MOVEA|MOVE|MONITOR|MLLZO|MLHZO|MHLZO|MHHZO|LOOKUP|LEAVESR|LEAVE|KLIST|KFLD|ITER|IN|IF|GOTO|FORCE|FOR|FEOD|EXTRCT|EXSR|EXFMT|EXCEPT|EVAL-CORR|EVALR|EVAL|ENDFOR|ENDSR|ENDIF|ENDDO|ENDCS|ENDWH|ENDSL|END|ELSEIF|ELSE|DUMP|DSPLY|DOW|DOU|DO|DIV|DELETE|DEFINE|DEALLOC|DATA-INTO|DATA-GEN|COMP|COMMIT|CLOSE|CLEAR|CHECKR|CHECK|CHAIN|CAT|CAS|CALLP|CALLB|CALL|CAB|BITON|BITOFF|BEGSR|AND|ALLOC|ADDUR|ADD|ACQ)" }, { "name": "constant.language.rpgle.fixed.c.len", @@ -875,7 +899,7 @@ }, { "name": "support.function.rpgle.bif", - "match": "[%](?i)(YEARS|XML|XLATE|XFOOT|UPPER|UNSH|UNS|UCS2|TRIMR|TRIML|TRIM|TLOOKUPLT|TLOOKUPLE|TLOOKUPGT|TLOOKUPGE|TLOOKUP|TIMESTAMP|TIME|THIS|TARGET|SUBST|SUBDT|SUBARR|STR|STATUS|SQRT|SPLIT|SIZE|SHTDN|SECONDS|SCANRPL|SCANR|SCAN|RIGHT|REPLACE|REM|REALLOC|RANGE|PROC|PASSED|PARSER|PARMNUM|PARMS|PADDR|OPEN|OMITTED|OCCUR|NULLIND|MSG|MSECONDS|MONTHS|MINUTES|MINARR|MIN|MAXARR|MAX|LOWER|LOOKUPLT|LOOKUPLE|LOOKUPGT|LOOKUPGE|LOOKUP|LIST|LEN|LEFT|KDS|INTH|INT|HOURS|HANDLER|GRAPH|FOUND|FLOAT|FIELDS|ERROR|EQUAL|EOF|ELEM|EDITW|EDITFLT|EDITC|DIV|DIFF|DECPOS|DECH|DEC|DAYS|DATE|DATA|CONCATARR|CONCAT|CHECKR|CHECK|CHARCOUNT|CHAR|BITXOR|BITOR|BITNOT|BITAND|ALLOC|ADDR|ABS)" + "match": "[%](?i)(YEARS|XML|XLATE|XFOOT|UPPER|UNSH|UNS|UCS2|TRIMR|TRIML|TRIM|TLOOKUPLT|TLOOKUPLE|TLOOKUPGT|TLOOKUPGE|TLOOKUP|TIMESTAMP|TIME|THIS|TARGET|SUBST|SUBDT|SUBARR|STR|STATUS|SQRT|SPLIT|SIZE|SHTDN|SECONDS|SCANRPL|SCANR|SCAN|RIGHT|REPLACE|REM|REALLOC|RANGE|PROC|PASSED|PARSER|PARMNUM|PARMS|PADDR|OPEN|OMITTED|OCCUR|NULLIND|MSG|MSECONDS|MONTHS|MINUTES|MINARR|MIN|MAXARR|MAX|LOWER|LOVAL|LOOKUPLT|LOOKUPLE|LOOKUPGT|LOOKUPGE|LOOKUP|LIST|LEN|LEFT|KDS|INTH|INT|HOURS|HIVAL|HANDLER|GRAPH|GEN|FOUND|FLOAT|FIELDS|ERROR|EQUAL|EOF|ELEM|EDITW|EDITFLT|EDITC|DIV|DIFF|DECPOS|DECH|DEC|DAYS|DATE|DATA|CONCATARR|CONCAT|CHECKR|CHECK|CHARCOUNT|CHAR|BITXOR|BITOR|BITNOT|BITAND|ALLOC|ADDR|ABS)" } ] },