Diplcate datatype check
This commit is contained in:
parent
67eb11ae3e
commit
57088238c4
2 changed files with 42 additions and 30 deletions
|
@ -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,38 +54,31 @@ 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) {
|
|
||||||
var endpoint = new EndpointNode(new PathsNode(segments), typeReference.getText());
|
|
||||||
this.endpoints.add(endpoint);
|
|
||||||
} else {
|
|
||||||
EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ;
|
EndpointsParser.RequestBodyContext requestBodyContext = ctx.requestBody() ;
|
||||||
String requestTypeName = null ;
|
String requestTypeName = null ;
|
||||||
// request can be either a named type declaration, an anonymous type declaration or a type reference
|
// request can be either a named type declaration, an anonymous type declaration or a type reference
|
||||||
if (requestBodyContext.namedTypeDeclaration() != null) {
|
if (requestBodyContext.namedTypeDeclaration() != null) {
|
||||||
var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration());
|
var compoundTypeNode = extractCompoundTypeNode(ctx.requestBody().namedTypeDeclaration());
|
||||||
requestTypeName = compoundTypeNode.name() ;
|
requestTypeName = compoundTypeNode.name() ;
|
||||||
this.dataTypes.add(compoundTypeNode);
|
// We don't save the datattype, it will be handled by the child visitor that finds a named datatype
|
||||||
} else if (requestBodyContext.typeDeclaration() != null) {
|
} else if (requestBodyContext.typeDeclaration() != null) {
|
||||||
var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ;
|
var typeFields = extractTypeFields(requestBodyContext.typeDeclaration().typeField()) ;
|
||||||
requestTypeName = segments.getLast() + "Request" ;
|
requestTypeName = segments.getLast() + "Request" ;
|
||||||
this.dataTypes.add(new TypeNode(requestTypeName, typeFields));
|
addDatatType(new TypeNode(requestTypeName, typeFields));
|
||||||
} else if (requestBodyContext.IDENTIFIER() != null) {
|
} else if (requestBodyContext.IDENTIFIER() != null) {
|
||||||
requestTypeName = requestBodyContext.IDENTIFIER().getText() ;
|
requestTypeName = requestBodyContext.IDENTIFIER().getText() ;
|
||||||
}
|
}
|
||||||
if (requestTypeName == null) {
|
if (requestTypeName == null) {
|
||||||
throw new ParseException("Unable to create the request body data type" + ctx.toStringTree()) ;
|
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);
|
var endpoint = new EndpointNode(new PathsNode(segments), requestTypeName);
|
||||||
this.endpoints.add(endpoint);
|
this.endpoints.add(endpoint);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) {
|
private TypeNode extractCompoundTypeNode(EndpointsParser.NamedTypeDeclarationContext ctx) {
|
||||||
String typeName = ctx.typeName().getText();
|
String typeName = ctx.typeName().getText();
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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])
|
Loading…
Add table
Reference in a new issue