diff --git a/libs/natparse/src/main/java/org/amshove/natparse/lexing/Lexer.java b/libs/natparse/src/main/java/org/amshove/natparse/lexing/Lexer.java index ab66c893a..ba0e76cb4 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/lexing/Lexer.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/lexing/Lexer.java @@ -849,6 +849,11 @@ private void consumeAsteriskOrSystemVariable() createAndAdd(SyntaxKind.SV_TIME); return; } + if (scanner.advanceIfIgnoreCase("SUBROUTINE")) + { + createAndAdd(SyntaxKind.SV_SUBROUTINE); + return; + } scanner.rollbackCurrentLexeme(); createAndAddCurrentSingleToken(SyntaxKind.ASTERISK); } diff --git a/libs/natparse/src/main/java/org/amshove/natparse/lexing/SyntaxKind.java b/libs/natparse/src/main/java/org/amshove/natparse/lexing/SyntaxKind.java index e043db7a9..3cbf1f07c 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/lexing/SyntaxKind.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/lexing/SyntaxKind.java @@ -51,6 +51,7 @@ public enum SyntaxKind APPLIC_NAME(false, true, false), INIT_ID(false, true, false), SV_TIME(false, true, false), + SV_SUBROUTINE(false, true, false), TIMX(false, true, false), TIMD(false, false, true), TIMN(false, true, false), diff --git a/libs/natparse/src/main/java/org/amshove/natparse/natural/builtin/BuiltInFunctionTable.java b/libs/natparse/src/main/java/org/amshove/natparse/natural/builtin/BuiltInFunctionTable.java index 0e716918c..8d7c5b975 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/natural/builtin/BuiltInFunctionTable.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/natural/builtin/BuiltInFunctionTable.java @@ -110,6 +110,7 @@ public class BuiltInFunctionTable """, ALPHANUMERIC, 0), modifiableVariable(SyntaxKind.SV_NUMBER, "Get or set the number of record a FIND or HISTOGRAM statement. Uses the innermost statement if no label identifier is passed.", PACKED, 10), modifiableVariable(SyntaxKind.SV_LENGTH, "This system variable returns the currently used length of a field defined as dynamic variable in terms of code units; for A and B format the size of one code unit is 1 byte and for U format the size of one code unit is 2 bytes (UTF-16). *LENGTH(field) applies to dynamic variables only.", INTEGER, 4), + unmodifiableVariable(SyntaxKind.SV_SUBROUTINE, "Returns the name of the current external subroutine. Content will aways be upper case.", ALPHANUMERIC, 32), unmodifiableVariable(SyntaxKind.LINEX, """ Returns the line number of the invocation of this variable. When this variable is used within copycodes, it contains the line numbers of all includes leading to this variable. diff --git a/libs/natparse/src/test/java/org/amshove/natparse/lexing/LexerForSystemVariablesShould.java b/libs/natparse/src/test/java/org/amshove/natparse/lexing/LexerForSystemVariablesShould.java index 4ae3bdfe5..63072496f 100644 --- a/libs/natparse/src/test/java/org/amshove/natparse/lexing/LexerForSystemVariablesShould.java +++ b/libs/natparse/src/test/java/org/amshove/natparse/lexing/LexerForSystemVariablesShould.java @@ -490,4 +490,10 @@ void lexTime() assertTokens("*TIME", token(SyntaxKind.SV_TIME, "*TIME")); } + @Test + void lexSubroutine() + { + assertTokens("*SUBROUTINE", token(SyntaxKind.SV_SUBROUTINE, "*SUBROUTINE")); + } + } diff --git a/libs/natparse/src/test/java/org/amshove/natparse/natural/project/NaturalProjectFileIndexerShould.java b/libs/natparse/src/test/java/org/amshove/natparse/natural/project/NaturalProjectFileIndexerShould.java index 4e180976a..f17b82257 100644 --- a/libs/natparse/src/test/java/org/amshove/natparse/natural/project/NaturalProjectFileIndexerShould.java +++ b/libs/natparse/src/test/java/org/amshove/natparse/natural/project/NaturalProjectFileIndexerShould.java @@ -31,6 +31,12 @@ void indexExternalSubroutines() assertCanFindModule("EXTERNAL-SUBROUTINE", "EXTSUB", NaturalFileType.SUBROUTINE); } + @Test + void indexExternalSubroutinesWithNoDefineDataAndNoSubroutineKeyword() + { + assertCanFindModule("SPECIAL-EXTERNAL", "SUBNODDD", NaturalFileType.SUBROUTINE); + } + @Test void indexFunctions() { diff --git a/libs/natparse/src/test/resources/projects/indexing/Natural-Libraries/LIB/SUBNODDD.NSS b/libs/natparse/src/test/resources/projects/indexing/Natural-Libraries/LIB/SUBNODDD.NSS new file mode 100644 index 000000000..908682309 --- /dev/null +++ b/libs/natparse/src/test/resources/projects/indexing/Natural-Libraries/LIB/SUBNODDD.NSS @@ -0,0 +1,5 @@ +/* External Subroutine with no DEFINE DATA and no SUBROUTINE keyword +DEFINE SPECIAL-EXTERNAL +INPUT *PROGRAM *SUBROUTINE +END-SUBROUTINE +END