Diplcate datatype check

This commit is contained in:
Johan Maasing 2025-04-08 20:57:31 +02:00
parent 67eb11ae3e
commit 57088238c4
2 changed files with 42 additions and 30 deletions

View file

@ -5,13 +5,15 @@ import nu.zoom.dsl.parser.EndpointsParser;
import org.antlr.v4.runtime.tree.TerminalNode; import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsParser.DocumentContext> { public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsParser.DocumentContext> {
private final ArrayList<EndpointNode> endpoints = new ArrayList<>(); private final ArrayList<EndpointNode> endpoints = new ArrayList<>();
private final ArrayList<ConfigItemNode> config = new ArrayList<>(); private final ArrayList<ConfigItemNode> config = new ArrayList<>();
private final ArrayList<TypeNode> dataTypes = new ArrayList<>(); private final HashSet<TypeNode> dataTypes = new HashSet<>();
public EndpointsVisitorTransformer() { public EndpointsVisitorTransformer() {
} }
@ -36,6 +38,13 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP
return super.visitConfigitem(ctx); return super.visitConfigitem(ctx);
} }
@Override
public EndpointsParser.DocumentContext visitNamedTypeDeclaration(EndpointsParser.NamedTypeDeclarationContext ctx) {
var type = extractCompoundTypeNode(ctx);
addDatatType(type);
return super.visitChildren(ctx);
}
@Override @Override
public EndpointsParser.DocumentContext visitEndpoint(EndpointsParser.EndpointContext ctx) { public EndpointsParser.DocumentContext visitEndpoint(EndpointsParser.EndpointContext ctx) {
List<String> segments = ctx List<String> segments = ctx
@ -45,37 +54,30 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP
.map( .map(
segment -> getText(segment.IDENTIFIER(), segment.VALUE()) segment -> getText(segment.IDENTIFIER(), segment.VALUE())
).toList(); ).toList();
EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; extractEndpoint(ctx, segments);
TerminalNode typeReference = requestBodyContext.IDENTIFIER() ;
extractEndpoint(ctx, typeReference, segments);
return super.visitEndpoint(ctx); return super.visitEndpoint(ctx);
} }
private void extractEndpoint(EndpointsParser.EndpointContext ctx, TerminalNode typeReference, List<String> segments) { private void extractEndpoint(EndpointsParser.EndpointContext ctx, List<String> segments) {
if (typeReference != null) { EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ;
var endpoint = new EndpointNode(new PathsNode(segments), typeReference.getText()); String requestTypeName = null ;
this.endpoints.add(endpoint); // request can be either a named type declaration, an anonymous type declaration or a type reference
} else { if (requestBodyContext.namedTypeDeclaration() != null) {
EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ; var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration());
String requestTypeName = null ; requestTypeName = compoundTypeNode.name() ;
// request can be either a named type declaration, an anonymous type declaration or a type reference // We don't save the datattype, it will be handled by the child visitor that finds a named datatype
if (requestBodyContext.namedTypeDeclaration() != null) { } else if (requestBodyContext.typeDeclaration() != null) {
var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration()); var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ;
requestTypeName = compoundTypeNode.name() ; requestTypeName = segments.getLast() + "Request" ;
this.dataTypes.add(compoundTypeNode); addDatatType(new TypeNode(requestTypeName, typeFields));
} else if (requestBodyContext.typeDeclaration() != null) { } else if (requestBodyContext.IDENTIFIER() != null) {
var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ; requestTypeName = requestBodyContext.IDENTIFIER().getText() ;
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);
} }
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) { private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) {
@ -100,4 +102,12 @@ public class EndpointsVisitorTransformer extends EndpointsBaseVisitor<EndpointsP
((identifier != null) ? identifier.getText() : "") + ((identifier != null) ? identifier.getText() : "") +
((value != null) ? value.getText() : ""); ((value != null) ? value.getText() : "");
} }
private void addDatatType(TypeNode type) throws ParseException {
if (this.dataTypes.stream().filter(t -> t.name().equals(type.name())).findAny().isPresent()) {
throw new ParseException("Duplicate datatype '" + type.name()+ "'") ;
} else {
this.dataTypes.add(type);
}
}
} }

View file

@ -1,5 +1,7 @@
{ some: configvalue, someother:value }
AType(data: List[String]) AType(data: List[String])
/some/endpoint <- SomeType(foo:String) /some/endpoint <- SomeType(foo:String)
/some/other/endpoint <- SomeOtherType(bar:Seq[Embedded]) /some/other/endpoint <- (bar:Seq[Embedded])
/yet/other/endpoint <- (bar:Seq[Embedded]) /yet/other/endpoint2 <- (bar2:Seq[AType])