From 2a46a9263021c5d9d253022f1615ff00903a031a Mon Sep 17 00:00:00 2001 From: Johan Maasing Date: Mon, 7 Apr 2025 19:41:13 +0200 Subject: [PATCH] Allow comments, unnamed type declarations for request / response bodies --- .../antlr4/nu/zoom/dsl/parser/Endpoints.g4 | 50 +++++++++++-------- .../nu/zoom/dsl/ast/CompoundTypeNode.java | 6 --- .../java/nu/zoom/dsl/ast/DocumentNode.java | 2 +- .../dsl/ast/EndpointsVisitorTransformer.java | 35 +++++++------ .../main/java/nu/zoom/dsl/ast/TypeNode.java | 7 +++ 5 files changed, 54 insertions(+), 46 deletions(-) delete mode 100644 parser/src/main/java/nu/zoom/dsl/ast/CompoundTypeNode.java create mode 100644 parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java diff --git a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 index e3bf2c5..52edd2e 100644 --- a/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 +++ b/parser/src/main/antlr4/nu/zoom/dsl/parser/Endpoints.g4 @@ -1,24 +1,32 @@ grammar Endpoints; -document : generatorconfig? (compoundType|endpoint)* ; -generatorconfig : '{' (configitem)? (',' configitem)* '}'; -configitem : configkey ':' configvalue ; -configkey : IDENTIFIER ; -configvalue : (IDENTIFIER|VALUE) ; -compoundType : compoundTypeName compoundFields ; -compoundTypeName : IDENTIFIER ; -compoundFields : '(' compoundField (',' compoundField)* ')' ; -compoundField : fieldName ':' fieldType ; -fieldName : IDENTIFIER ; -fieldType : IDENTIFIER ; -endpoint : path '=<' (compoundType | IDENTIFIER) ; -path : (pathSegment)+ ; -pathSegment : '/' (IDENTIFIER|VALUE) ; +document : generatorconfig? (namedTypeDeclaration|endpoint)* ; +generatorconfig : '{' (configitem)? (',' configitem)* '}'; +configitem : configkey ':' configvalue ; +configkey : IDENTIFIER ; +configvalue : (IDENTIFIER|VALUE) ; +namedTypeDeclaration : typeName typeDeclaration ; +typeName : IDENTIFIER ; +typeDeclaration : typeName? '(' typeField (',' typeField)* ')' ; +typeField : fieldName ':' fieldType ; +fieldName : IDENTIFIER ; +fieldType : IDENTIFIER ; +requestBody : REQUEST_PREFIX (namedTypeDeclaration | typeDeclaration | IDENTIFIER) ; +responseBody : RESPONSE_PREFIX (namedTypeDeclaration | typeDeclaration | IDENTIFIER) ; +endpoint : path requestBody responseBody?; +path : (pathSegment)+ ; +pathSegment : SLASH (IDENTIFIER|VALUE) ; -fragment DIGIT : [0-9] ; -fragment LOWERCASE : [a-z] ; -fragment UPPERCASE : [A-Z] ; -fragment GENERICS : '['|']'|'<'|'>' ; -WS : [ \t\n\r]+ -> skip; -IDENTIFIER : (LOWERCASE | UPPERCASE) (LOWERCASE | UPPERCASE | DIGIT | GENERICS)* ; -VALUE : ~[ ,{}:()/="#';*]+ ; +fragment DIGIT : [0-9] ; +fragment LOWERCASE : [a-z] ; +fragment UPPERCASE : [A-Z] ; +fragment GENERICS : '['|']'|'<'|'>' ; +fragment COMMENT_BEGIN : '/*' ; +fragment COMMENT_END : '*/' ; +WS : [ \t\n\r]+ -> skip; +COMMENT : COMMENT_BEGIN ~[/]* COMMENT_END -> skip; +REQUEST_PREFIX : '<-' ; +RESPONSE_PREFIX : '->' ; +SLASH : '/' ; +IDENTIFIER : (LOWERCASE | UPPERCASE) (LOWERCASE | UPPERCASE | DIGIT | GENERICS)* ; +VALUE : ~[ ,{}:()/="#';*\n\r\t]+ ; diff --git a/parser/src/main/java/nu/zoom/dsl/ast/CompoundTypeNode.java b/parser/src/main/java/nu/zoom/dsl/ast/CompoundTypeNode.java deleted file mode 100644 index d5218fc..0000000 --- a/parser/src/main/java/nu/zoom/dsl/ast/CompoundTypeNode.java +++ /dev/null @@ -1,6 +0,0 @@ -package nu.zoom.dsl.ast; - -import java.util.List; - -public record CompoundTypeNode(String name, List fields) { -} diff --git a/parser/src/main/java/nu/zoom/dsl/ast/DocumentNode.java b/parser/src/main/java/nu/zoom/dsl/ast/DocumentNode.java index 0f29bdd..49b5aaf 100644 --- a/parser/src/main/java/nu/zoom/dsl/ast/DocumentNode.java +++ b/parser/src/main/java/nu/zoom/dsl/ast/DocumentNode.java @@ -4,6 +4,6 @@ import java.util.List; public record DocumentNode( List configItems, - List typeDefinitions, + List typeDefinitions, List endpoints) { } diff --git a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java index e5892c1..556a23c 100644 --- a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java +++ b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java @@ -6,11 +6,12 @@ import org.antlr.v4.runtime.tree.TerminalNode; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class EndpointsVisitorTransformer extends EndpointsBaseVisitor { private final ArrayList endpoints = new ArrayList<>(); private final ArrayList config = new ArrayList<>(); - private final ArrayList dataTypes = new ArrayList<>(); + private final ArrayList dataTypes = new ArrayList<>(); public EndpointsVisitorTransformer() { } @@ -23,7 +24,7 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor getDataTypes() { + public List getDataTypes() { return List.copyOf(dataTypes); } @@ -35,12 +36,6 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor segments = ctx @@ -50,26 +45,30 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor getText(segment.IDENTIFIER(), segment.VALUE()) ).toList(); - TerminalNode typeReference = ctx.IDENTIFIER(); + EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; + TerminalNode typeReference = requestBodyContext.IDENTIFIER() ; + extractEndpoint(ctx, typeReference, segments); + return super.visitEndpoint(ctx); + } + + private void extractEndpoint(EndpointsParser.EndpointContext ctx, TerminalNode typeReference, List segments) { if (typeReference != null) { var endpoint = new EndpointNode(new PathsNode(segments), typeReference.getText()); this.endpoints.add(endpoint); } else { - var compoundTypeNode = extractCompoundTypeNode(ctx.compoundType()); - var endpoint = new EndpointNode(new PathsNode(segments), compoundTypeNode.name()); - //this.dataTypes.add(compoundTypeNode); + var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); + var endpoint = new EndpointNode(new PathsNode(segments), compoundTypeNode.name().orElseThrow()); this.endpoints.add(endpoint); } - return super.visitEndpoint(ctx); } - private CompoundTypeNode extractCompoundTypeNode(EndpointsParser.CompoundTypeContext ctx) { - String typeName = ctx.compoundTypeName().getText(); - List fields = extractTypeFields(ctx.compoundFields().compoundField()); - return new CompoundTypeNode(typeName, fields); + private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) { + String typeName = ctx.typeName().getText(); + List fields = extractTypeFields(ctx.typeDeclaration().typeField()); + return new TypeNode(Optional.of(typeName), fields); } - private List extractTypeFields(List compoundFieldContexts) { + private List extractTypeFields(List compoundFieldContexts) { return compoundFieldContexts.stream().map( ctx -> new FieldNode( ctx.fieldName().getText(), diff --git a/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java new file mode 100644 index 0000000..1e76b1a --- /dev/null +++ b/parser/src/main/java/nu/zoom/dsl/ast/TypeNode.java @@ -0,0 +1,7 @@ +package nu.zoom.dsl.ast; + +import java.util.List; +import java.util.Optional; + +public record TypeNode(Optional name, List fields) { +}