From 57088238c43768d7bc1e5a706260e46ebf3748c5 Mon Sep 17 00:00:00 2001 From: Johan Maasing Date: Tue, 8 Apr 2025 20:57:31 +0200 Subject: [PATCH] Diplcate datatype check --- .../dsl/ast/EndpointsVisitorTransformer.java | 66 +++++++++++-------- test01.endpoints | 6 +- 2 files changed, 42 insertions(+), 30 deletions(-) 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 51b0854..e75282e 100644 --- a/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java +++ b/parser/src/main/java/nu/zoom/dsl/ast/EndpointsVisitorTransformer.java @@ -5,13 +5,15 @@ import nu.zoom.dsl.parser.EndpointsParser; import org.antlr.v4.runtime.tree.TerminalNode; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; 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 HashSet dataTypes = new HashSet<>(); public EndpointsVisitorTransformer() { } @@ -36,6 +38,13 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor segments = ctx @@ -45,37 +54,30 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor getText(segment.IDENTIFIER(), segment.VALUE()) ).toList(); - EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; - TerminalNode typeReference = requestBodyContext.IDENTIFIER() ; - extractEndpoint(ctx, typeReference, segments); + extractEndpoint(ctx, 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 { - EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; - String requestTypeName = null ; - // request can be either a named type declaration, an anonymous type declaration or a type reference - if (requestBodyContext.namedTypeDeclaration() != null) { - var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); - requestTypeName = compoundTypeNode.name() ; - this.dataTypes.add(compoundTypeNode); - } else if (requestBodyContext.typeDeclaration() != null) { - var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ; - requestTypeName = segments.getLast() + "Request" ; - this.dataTypes.add(new TypeNode(requestTypeName, typeFields)); - } else if (requestBodyContext.IDENTIFIER() != null) { - requestTypeName = requestBodyContext.IDENTIFIER().getText() ; - } - if (requestTypeName == null) { - throw new ParseException("Unable to create the request body data type" + ctx.toStringTree()) ; - } - var endpoint = new EndpointNode(new PathsNode(segments), requestTypeName); - this.endpoints.add(endpoint); + private void extractEndpoint(EndpointsParser.EndpointContext ctx, List segments) { + EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; + String requestTypeName = null ; + // request can be either a named type declaration, an anonymous type declaration or a type reference + if (requestBodyContext.namedTypeDeclaration() != null) { + var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); + requestTypeName = compoundTypeNode.name() ; + // We don't save the datattype, it will be handled by the child visitor that finds a named datatype + } else if (requestBodyContext.typeDeclaration() != null) { + var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ; + requestTypeName = segments.getLast() + "Request" ; + addDatatType(new TypeNode(requestTypeName, typeFields)); + } else if (requestBodyContext.IDENTIFIER() != null) { + requestTypeName = requestBodyContext.IDENTIFIER().getText() ; } + if (requestTypeName == null) { + throw new ParseException("Unable to create the request body data type for " + segments.stream().collect(Collectors.joining())) ; + } + var endpoint = new EndpointNode(new PathsNode(segments), requestTypeName); + this.endpoints.add(endpoint); } private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) { @@ -100,4 +102,12 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor t.name().equals(type.name())).findAny().isPresent()) { + throw new ParseException("Duplicate datatype '" + type.name()+ "'") ; + } else { + this.dataTypes.add(type); + } + } } diff --git a/test01.endpoints b/test01.endpoints index aa8ff9a..a148a57 100644 --- a/test01.endpoints +++ b/test01.endpoints @@ -1,5 +1,7 @@ +{ some: configvalue, someother:value } + AType(data: List[String]) /some/endpoint <- SomeType(foo:String) -/some/other/endpoint <- SomeOtherType(bar:Seq[Embedded]) -/yet/other/endpoint <- (bar:Seq[Embedded]) \ No newline at end of file +/some/other/endpoint <- (bar:Seq[Embedded]) +/yet/other/endpoint2 <- (bar2:Seq[AType]) \ No newline at end of file