From bed03d8ecd361c58ecbd8155ae58bd816c7c7bf2 Mon Sep 17 00:00:00 2001 From: Markus Amshove Date: Mon, 30 Dec 2024 11:27:38 +0100 Subject: [PATCH] Allow EM, HD and PM on view variables without type (#539) fixes #538 --- .../amshove/natparse/parsing/ViewParser.java | 26 ++++++++++++++----- .../parsing/DefineDataParserShould.java | 13 ++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/libs/natparse/src/main/java/org/amshove/natparse/parsing/ViewParser.java b/libs/natparse/src/main/java/org/amshove/natparse/parsing/ViewParser.java index 21bb4170b..bfa653877 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/parsing/ViewParser.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/parsing/ViewParser.java @@ -111,6 +111,13 @@ private VariableNode variable(GroupNode enclosingGroup) throws ParseError return typedDdmArrayVariable; } + if (peekKind(SyntaxKind.EM) || peekKind(SyntaxKind.HD) || peekKind(SyntaxKind.PM)) + { + consumeEmHdPm(variable); + // The parens we're in is for attributes, not the type, so the type has to be inferred from the DDM. + return typedVariableFromDdm(variable, enclosingGroup); + } + return typedVariable(variable); } @@ -122,6 +129,15 @@ private VariableNode variable(GroupNode enclosingGroup) throws ParseError return typedVariableFromDdm(variable, enclosingGroup); } + private void consumeEmHdPm(VariableNode variable) throws ParseError + { + while (!isAtEnd() && !peekKind(SyntaxKind.RPAREN) && !peekKind(SyntaxKind.END_DEFINE)) + { + consume(variable); + } + consumeMandatory(variable, SyntaxKind.RPAREN); + } + private TypedVariableNode typedVariable(VariableNode variable) throws ParseError { var typedVariable = new TypedVariableNode(variable); @@ -174,14 +190,10 @@ private TypedVariableNode typedVariable(VariableNode variable) throws ParseError type.setDynamicLength(); } - // Consume optional emhdpm + // Consume optional EMHDPM if (consumeOptionally(typedVariable, SyntaxKind.LPAREN)) { - while (!isAtEnd() && peek().kind() != SyntaxKind.RPAREN && peek().kind() != SyntaxKind.END_DEFINE) - { - consume(typedVariable); - } - consumeMandatory(typedVariable, SyntaxKind.RPAREN); + consumeEmHdPm(typedVariable); } typedVariable.setType(type); @@ -239,7 +251,7 @@ private GroupNode group(VariableNode variable) throws ParseError // This is used when there is no type specified in the view. // Type is loaded from DDM. - private VariableNode typedVariableFromDdm(VariableNode variable, GroupNode enclosingGroup) + private VariableNode typedVariableFromDdm(VariableNode variable, GroupNode enclosingGroup) throws ParseError { // unresolved DDM if (view.ddm() == null) diff --git a/libs/natparse/src/test/java/org/amshove/natparse/parsing/DefineDataParserShould.java b/libs/natparse/src/test/java/org/amshove/natparse/parsing/DefineDataParserShould.java index 50215dd43..a2234adb5 100644 --- a/libs/natparse/src/test/java/org/amshove/natparse/parsing/DefineDataParserShould.java +++ b/libs/natparse/src/test/java/org/amshove/natparse/parsing/DefineDataParserShould.java @@ -1500,6 +1500,19 @@ void allowEmHdPmInViews() assertNodeType(view.variables().first(), IGroupNode.class); } + @Test + void allowEmHdPmInViewVariablesWithoutExplicitType() + { + assertParsesWithoutDiagnostics(""" + define data + local + 1 myview view of myddm + 2 withouttype (hd='Header') + 2 withtype (n2) (hd='Header') + end-define + """); + } + @Test void parseViewWithOptionalOf() {