This is an automated email from the ASF dual-hosted git repository. colegreer pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit e67d491d7f263f7d73b28ef5c1ed0304467a41e2 Merge: 32a7fa51a1 746fd637d5 Author: Cole-Greer <[email protected]> AuthorDate: Mon May 5 19:56:43 2025 -0700 Merge branch '3.8-dev' CHANGELOG.asciidoc | 1 + docs/src/upgrade/release-3.8.x.asciidoc | 20 ++ .../gremlin/language/grammar/ArgumentVisitor.java | 94 +++----- .../grammar/DefaultGremlinBaseVisitor.java | 46 ++-- .../language/grammar/GenericLiteralVisitor.java | 111 ++++----- .../grammar/ParseTreeContextCastHelper.java | 4 +- .../language/grammar/StructureElementVisitor.java | 4 +- .../language/grammar/TraversalMethodVisitor.java | 135 +++++------ .../grammar/TraversalPredicateVisitor.java | 32 ++- .../grammar/TraversalSourceSelfMethodVisitor.java | 12 +- .../grammar/TraversalSourceSpawnMethodVisitor.java | 14 +- .../language/grammar/TraversalStrategyVisitor.java | 2 +- .../translator/AnonymizedTranslatorVisitor.java | 8 +- .../translator/DotNetTranslateVisitor.java | 84 +++---- .../language/translator/GoTranslateVisitor.java | 10 +- .../translator/GroovyTranslateVisitor.java | 63 ++++- .../language/translator/JavaTranslateVisitor.java | 26 +-- .../translator/JavascriptTranslateVisitor.java | 10 +- .../translator/PythonTranslateVisitor.java | 10 +- .../language/translator/TranslateVisitor.java | 6 +- .../language/grammar/ArgumentVisitorTest.java | 6 +- .../grammar/GeneralLiteralVisitorTest.java | 4 +- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 5 + gremlin-go/driver/cucumber/gremlin.go | 5 + gremlin-language/src/main/antlr4/Gremlin.g4 | 253 ++++++++++----------- 25 files changed, 458 insertions(+), 507 deletions(-) diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/ArgumentVisitor.java index 26a3d4edcd,178baf1ea8..c90b741606 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/ArgumentVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/ArgumentVisitor.java @@@ -99,13 -96,8 +98,13 @@@ public class ArgumentVisitor extends De /** * Wrapper for visit function for {@code Map} types. */ - public Map parseMap(final GremlinParser.GenericLiteralMapNullableArgumentContext ctx) { - Object literalOrVar = visitGenericLiteralMapNullableArgument(ctx); + public Map parseMap(final GremlinParser.GenericMapNullableArgumentContext ctx) { - return (Map) visitGenericMapNullableArgument(ctx); ++ Object literalOrVar = visitGenericMapNullableArgument(ctx); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) { + return ((GValue<Map>) literalOrVar).get(); + } else { + return (Map) literalOrVar; + } } /** @@@ -281,15 -211,18 +250,18 @@@ } } - @Override - public Object visitGenericLiteralMapNullableArgument(final GremlinParser.GenericLiteralMapNullableArgumentContext ctx) { - if (ctx.nullLiteral() != null) { - return null; - } else if (ctx.genericLiteralMap() != null) { - return antlr.genericVisitor.visitGenericLiteralMap(ctx.genericLiteralMap()); - } else { - return visitVariable(ctx.variable()); + /** + * Parse a string literal varargs, and return a string array + */ - public String[] parseStringVarargs(final GremlinParser.StringNullableArgumentVarargsContext varargsArgumentContext) { ++ public GValue<String>[] parseStringVarargs(final GremlinParser.StringNullableArgumentVarargsContext varargsArgumentContext) { + if (varargsArgumentContext == null || varargsArgumentContext.stringNullableArgument() == null) { - return new String[0]; ++ return new GValue[0]; } + return varargsArgumentContext.stringNullableArgument() + .stream() + .filter(Objects::nonNull) + .map(antlr.argumentVisitor::parseString) - .toArray(String[]::new); ++ .toArray(GValue[]::new); } @Override diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java index fd42b946a3,cf3946e550..87c0a328b6 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java @@@ -1302,11 -1290,7 +1298,11 @@@ public class DefaultGremlinBaseVisitor< /** * {@inheritDoc} */ - @Override public T visitGenericLiteralMap(final GremlinParser.GenericLiteralMapContext ctx) { notImplemented(ctx); return null; } + @Override public T visitGenericMapLiteral(final GremlinParser.GenericMapLiteralContext ctx) { notImplemented(ctx); return null; } + /** + * {@inheritDoc} + */ + @Override public T visitNullableGenericLiteralMap(final GremlinParser.NullableGenericLiteralMapContext ctx) { notImplemented(ctx); return null; } /** * {@inheritDoc} */ diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java index 5b08dd36a5,91cc91b7c5..4910b7739b --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GenericLiteralVisitor.java @@@ -691,32 -680,4 +680,18 @@@ public class GenericLiteralVisitor exte else return StringEscapeUtils.unescapeJava(stripQuotes(ctx.getText())); } + + @Override - public Object[] visitStringLiteralVarargs(final GremlinParser.StringLiteralVarargsContext ctx) { ++ public Object[] visitStringNullableLiteralVarargs(final GremlinParser.StringNullableLiteralVarargsContext ctx) { + if (ctx == null) { + return new Object[0]; + } + return ctx.children + .stream() + .filter(Objects::nonNull) - .filter(p -> p instanceof GremlinParser.StringNullableArgumentContext) - .map(p -> (GremlinParser.StringNullableArgumentContext) p) - .map(antlr.argumentVisitor::visitStringNullableArgument) ++ .filter(p -> p instanceof GremlinParser.StringNullableLiteralContext) ++ .map(p -> (GremlinParser.StringNullableLiteralContext) p) ++ .map(antlr.genericVisitor::visitStringNullableLiteral) + .toArray(Object[]::new); + } - - /** - * Parse a string literal varargs, and return a string array - */ - public String[] parseStringVarargsLiterals(final GremlinParser.StringLiteralVarargsLiteralsContext varargsContext) { - if (varargsContext == null || varargsContext.stringNullableLiteral() == null) { - return new String[0]; - } - return varargsContext.stringNullableLiteral() - .stream() - .filter(Objects::nonNull) - .map(antlr.genericVisitor::parseString) - .toArray(String[]::new); - } } diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java index 30bc01f94d,6a45f660ff..552504a372 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java @@@ -104,11 -96,7 +104,11 @@@ public class TraversalMethodVisitor ext */ @Override public GraphTraversal visitTraversalMethod_mergeV_Map(final GremlinParser.TraversalMethod_mergeV_MapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapNullableArgument(ctx.genericLiteralMapNullableArgument()); - return this.graphTraversal.mergeV(antlr.argumentVisitor.parseMap(ctx.genericMapNullableArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return graphTraversal.mergeV((GValue<Map<Object, Object>>) literalOrVar); + else + return graphTraversal.mergeV((Map) literalOrVar); } /** @@@ -140,13 -128,7 +140,13 @@@ */ @Override public GraphTraversal visitTraversalMethod_mergeE_Map(final GremlinParser.TraversalMethod_mergeE_MapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapNullableArgument(ctx.genericLiteralMapNullableArgument()); - return this.graphTraversal.mergeE(antlr.argumentVisitor.parseMap(ctx.genericMapNullableArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return graphTraversal.mergeE((GValue<Map<Object, Object>>) literalOrVar); + else if (GValue.valueInstanceOf(literalOrVar, GType.UNKNOWN) && ((GValue) literalOrVar).get() == null) + return graphTraversal.mergeE(GValue.ofMap(((GValue) literalOrVar).getName(), null)); + else + return graphTraversal.mergeE((Map) literalOrVar); } /** @@@ -483,11 -460,7 +483,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_combine_Object(final GremlinParser.TraversalMethod_combine_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.combine(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.combine((GValue<Object>) literalOrVar); + else + return graphTraversal.combine(literalOrVar); } /** @@@ -573,19 -535,7 +573,19 @@@ */ @Override public GraphTraversal visitTraversalMethod_difference_Object(final GremlinParser.TraversalMethod_difference_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.difference(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.difference((GValue<Object>) literalOrVar); + else + return graphTraversal.difference(literalOrVar); + } + + /** + * {@inheritDoc} + */ + @Override + public Traversal visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) { + return graphTraversal.discard(); } /** @@@ -593,11 -543,7 +593,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_disjunct_Object(final GremlinParser.TraversalMethod_disjunct_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.disjunct(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.disjunct((GValue<Object>) literalOrVar); + else + return graphTraversal.disjunct(literalOrVar); } /** @@@ -802,32 -736,10 +802,32 @@@ @Override public GraphTraversal visitTraversalMethod_hasLabel_String_String(final GremlinParser.TraversalMethod_hasLabel_String_StringContext ctx) { if (ctx.getChildCount() == 4) { - return graphTraversal.hasLabel(antlr.argumentVisitor.parseString(ctx.stringNullableArgument())); + final Object literalOrVar = antlr.argumentVisitor.visitStringNullableArgument(ctx.stringNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.STRING)) + return graphTraversal.hasLabel((GValue) literalOrVar); + else + return graphTraversal.hasLabel((String) literalOrVar); } else { - return graphTraversal.hasLabel(antlr.argumentVisitor.parseString(ctx.stringNullableArgument()), - antlr.argumentVisitor.parseStringVarargs(ctx.stringNullableArgumentVarargs())); + Object literalOrVar = antlr.argumentVisitor.visitStringNullableArgument(ctx.stringNullableArgument()); - Object[] literalOrVars = antlr.argumentVisitor.parseStringVarargs(ctx.stringLiteralVarargsArgument()); ++ Object[] literalOrVars = antlr.argumentVisitor.parseStringVarargs(ctx.stringNullableArgumentVarargs()); + + if (null == literalOrVar) literalOrVar = GValue.ofString(null, null); + + // if any are GValue then they all need to be GValue to call hasLabel + if (literalOrVar instanceof GValue || Arrays.stream(literalOrVars).anyMatch(lov -> lov instanceof GValue)) { + literalOrVar = GValue.ensureGValue(literalOrVar); + literalOrVars = GValue.ensureGValues(literalOrVars); + } + + // since we normalized above to gvalue or literal we can just test the first arg for gvalue-ness + if (GValue.valueInstanceOf(literalOrVar, GType.STRING)) { + final GValue[] gvalueLiteralOrVars = literalOrVars == null ? null : Arrays.stream(literalOrVars).map(o -> (GValue) o).toArray(GValue[]::new); + return graphTraversal.hasLabel((GValue) literalOrVar, (GValue[]) gvalueLiteralOrVars); + } else { + // convert object array to string array + final String[] stringLiteralOrVars = literalOrVars == null ? null : Arrays.stream(literalOrVars).map(o -> (String) o).toArray(String[]::new); + return graphTraversal.hasLabel((String) literalOrVar, stringLiteralOrVars); + } } } @@@ -887,16 -799,9 +887,16 @@@ */ @Override public GraphTraversal visitTraversalMethod_has_String_String_Object(final GremlinParser.TraversalMethod_has_String_String_ObjectContext ctx) { - return graphTraversal.has(antlr.argumentVisitor.parseString(ctx.stringNullableArgument()), - antlr.genericVisitor.parseString(ctx.stringNullableLiteral()), - antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); + final Object literalOrVar = antlr.argumentVisitor.visitStringNullableArgument(ctx.stringNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.STRING)) { + return graphTraversal.has((GValue) literalOrVar, + antlr.genericVisitor.parseString(ctx.stringNullableLiteral()), - antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument())); ++ antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); + } else { + return graphTraversal.has((String) literalOrVar, + antlr.genericVisitor.parseString(ctx.stringNullableLiteral()), - antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument())); ++ antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); + } } /** @@@ -973,7 -871,7 +973,7 @@@ */ @Override public GraphTraversal visitTraversalMethod_in(final GremlinParser.TraversalMethod_inContext ctx) { - return graphTraversal.in(antlr.argumentVisitor.parseStringVarargs(ctx.stringLiteralVarargsArgument())); - return graphTraversal.in(antlr.genericVisitor.parseStringVarargs(ctx.stringNullableLiteralVarargs())); ++ return graphTraversal.in(antlr.argumentVisitor.parseStringVarargs(ctx.stringNullableArgumentVarargs())); } /** @@@ -981,7 -879,7 +981,7 @@@ */ @Override public GraphTraversal visitTraversalMethod_inE(final GremlinParser.TraversalMethod_inEContext ctx) { - return graphTraversal.inE(antlr.argumentVisitor.parseStringVarargs(ctx.stringLiteralVarargsArgument())); - return graphTraversal.inE(antlr.genericVisitor.parseStringVarargs(ctx.stringNullableLiteralVarargs())); ++ return graphTraversal.inE(antlr.argumentVisitor.parseStringVarargs(ctx.stringNullableArgumentVarargs())); } /** @@@ -989,11 -887,7 +989,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_intersect_Object(final GremlinParser.TraversalMethod_intersect_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.intersect(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.intersect((GValue<Object>) literalOrVar); + else + return graphTraversal.intersect(literalOrVar); } /** @@@ -1140,7 -1024,7 +1140,7 @@@ } else if (ctx.ioOptionsValues() != null) { o = WithOptionsVisitor.instance().visitIoOptionsValues(ctx.ioOptionsValues()); } else { - o = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - o = antlr.argumentVisitor.parseObject(ctx.genericArgument()); ++ o = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); } return graphTraversal.with(k, o); } @@@ -1204,11 -1088,7 +1204,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_merge_Object(final GremlinParser.TraversalMethod_merge_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.merge(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.merge((GValue<Object>) literalOrVar); + else + return graphTraversal.merge(literalOrVar); } /** @@@ -1248,11 -1128,8 +1248,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_option_Object_Traversal(final GremlinParser.TraversalMethod_option_Object_TraversalContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.option(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()), - antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue) + return graphTraversal.option((GValue) literalOrVar, antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); + else + return graphTraversal.option(literalOrVar, antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); } /** @@@ -1268,11 -1145,9 +1268,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_option_Merge_Map(final GremlinParser.TraversalMethod_option_Merge_MapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapNullableArgument(ctx.genericLiteralMapNullableArgument()); - return graphTraversal.option( - TraversalEnumParser.parseTraversalEnumFromContext(Merge.class, ctx.traversalMerge()), - (Map) antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return graphTraversal.option(TraversalEnumParser.parseTraversalEnumFromContext(Merge.class, ctx.traversalMerge()), (GValue<Map>) literalOrVar); + else + return graphTraversal.option(TraversalEnumParser.parseTraversalEnumFromContext(Merge.class, ctx.traversalMerge()), (Map) literalOrVar); } /** @@@ -1406,11 -1283,7 +1408,11 @@@ */ @Override public GraphTraversal visitTraversalMethod_product_Object(final GremlinParser.TraversalMethod_product_ObjectContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()); - return graphTraversal.product(antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()); + if (literalOrVar instanceof GValue && ((GValue) literalOrVar).getType().isCollection()) + return graphTraversal.product((GValue<Object>) literalOrVar); + else + return graphTraversal.product(literalOrVar); } /** @@@ -1788,7 -1619,7 +1790,7 @@@ public GraphTraversal visitTraversalMethod_toE(final GremlinParser.TraversalMethod_toEContext ctx) { return graphTraversal.toE( TraversalEnumParser.parseTraversalEnumFromContext(Direction.class, ctx.traversalDirection()), - antlr.argumentVisitor.parseStringVarargs(ctx.stringLiteralVarargsArgument())); - antlr.genericVisitor.parseStringVarargs(ctx.stringNullableLiteralVarargs())); ++ antlr.argumentVisitor.parseStringVarargs(ctx.stringNullableArgumentVarargs())); } /** @@@ -1907,10 -1727,10 +1910,10 @@@ @Override public GraphTraversal visitTraversalMethod_valueMap_boolean_String(final GremlinParser.TraversalMethod_valueMap_boolean_StringContext ctx) { if (ctx.getChildCount() == 4) { - return graphTraversal.valueMap((boolean) antlr.genericVisitor.visitBooleanLiteral(ctx.booleanLiteral())); + return graphTraversal.valueMap(antlr.genericVisitor.parseBoolean(ctx.booleanLiteral())); } else { - return graphTraversal.valueMap(antlr.genericVisitor.parseBoolean(ctx.booleanLiteral()), - antlr.genericVisitor.parseStringVarargsLiterals(ctx.stringLiteralVarargsLiterals())); + return graphTraversal.valueMap((boolean) antlr.genericVisitor.visitBooleanLiteral(ctx.booleanLiteral()), + antlr.genericVisitor.parseStringVarargs(ctx.stringNullableLiteralVarargs())); } } @@@ -1985,11 -1821,8 +1988,11 @@@ */ @Override public Traversal visitTraversalMethod_call_string_map(final GremlinParser.TraversalMethod_call_string_mapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapArgument(ctx.genericLiteralMapArgument()); - return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), - antlr.argumentVisitor.parseMap(ctx.genericMapArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapArgument(ctx.genericMapArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (GValue<Map>) literalOrVar); + else + return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (Map) literalOrVar); } /** @@@ -2006,11 -1839,9 +2009,11 @@@ */ @Override public Traversal visitTraversalMethod_call_string_map_traversal(final GremlinParser.TraversalMethod_call_string_map_traversalContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapArgument(ctx.genericLiteralMapArgument()); - return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), - antlr.argumentVisitor.parseMap(ctx.genericMapArgument()), - antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapArgument(ctx.genericMapArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (GValue<Map>) literalOrVar, antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); + else + return graphTraversal.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (Map) literalOrVar, antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal())); } /** diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java index 63c87aa6f9,96cb97258d..f3a1f10e6f --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java @@@ -89,11 -89,11 +89,11 @@@ public class TraversalSourceSelfMethodV public GraphTraversalSource visitTraversalSourceSelfMethod_withSideEffect(final GremlinParser.TraversalSourceSelfMethod_withSideEffectContext ctx) { if (ctx.getChildCount() < 8) { // with 4 children withSideEffect() was called without a reducer specified. - return source.withSideEffect(antlr.argumentVisitor.parseString(ctx.stringArgument()), + return source.withSideEffect(antlr.genericVisitor.parseString(ctx.stringLiteral()), - antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument())); + antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); } else { - return source.withSideEffect(antlr.argumentVisitor.parseString(ctx.stringArgument()), + return source.withSideEffect(antlr.genericVisitor.parseString(ctx.stringLiteral()), - antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument()), + antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument()), TraversalEnumParser.parseTraversalEnumFromContext(Operator.class, ctx.traversalBiFunction().traversalOperator())); } } @@@ -138,10 -138,10 +138,10 @@@ @Override public GraphTraversalSource visitTraversalSourceSelfMethod_with(final GremlinParser.TraversalSourceSelfMethod_withContext ctx) { if (ctx.getChildCount() == 4) { - return source.with(antlr.argumentVisitor.parseString(ctx.stringArgument())); + return source.with(antlr.genericVisitor.parseString(ctx.stringLiteral())); } else { - return source.with(antlr.argumentVisitor.parseString(ctx.stringArgument()), + return source.with(antlr.genericVisitor.parseString(ctx.stringLiteral()), - antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument())); + antlr.argumentVisitor.visitGenericArgument(ctx.genericArgument())); } } } diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSpawnMethodVisitor.java index 4c57cd4a67,e75685ee24..89f4ba910d --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSpawnMethodVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSpawnMethodVisitor.java @@@ -131,13 -119,7 +131,13 @@@ public class TraversalSourceSpawnMethod */ @Override public GraphTraversal visitTraversalSourceSpawnMethod_mergeV_Map(final GremlinParser.TraversalSourceSpawnMethod_mergeV_MapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapNullableArgument(ctx.genericLiteralMapNullableArgument()); - return this.traversalSource.mergeV(antlr.argumentVisitor.parseMap(ctx.genericMapNullableArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return this.traversalSource.mergeV((GValue) literalOrVar); + else if (GValue.valueInstanceOf(literalOrVar, GType.UNKNOWN) && ((GValue) literalOrVar).get() == null) + return this.traversalSource.mergeV((GValue) GValue.ofMap(((GValue) literalOrVar).getName(), null)); + else + return this.traversalSource.mergeV((Map) literalOrVar); } /** @@@ -161,13 -143,7 +161,13 @@@ */ @Override public GraphTraversal visitTraversalSourceSpawnMethod_mergeE_Map(final GremlinParser.TraversalSourceSpawnMethod_mergeE_MapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapNullableArgument(ctx.genericLiteralMapNullableArgument()); - return this.traversalSource.mergeE(antlr.argumentVisitor.parseMap(ctx.genericMapNullableArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapNullableArgument(ctx.genericMapNullableArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return this.traversalSource.mergeE((GValue) literalOrVar); + else if (GValue.valueInstanceOf(literalOrVar, GType.UNKNOWN) && ((GValue) literalOrVar).get() == null) + return this.traversalSource.mergeE((GValue) GValue.ofMap(((GValue) literalOrVar).getName(), null)); + else + return this.traversalSource.mergeE((Map) literalOrVar); } /** @@@ -191,11 -167,8 +191,11 @@@ */ @Override public GraphTraversal visitTraversalSourceSpawnMethod_call_string_map(final GremlinParser.TraversalSourceSpawnMethod_call_string_mapContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapArgument(ctx.genericLiteralMapArgument()); - return this.traversalSource.call(antlr.argumentVisitor.parseString(ctx.stringArgument()), - antlr.argumentVisitor.parseMap(ctx.genericMapArgument())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapArgument(ctx.genericMapArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return this.traversalSource.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (GValue<Map>) literalOrVar); + else + return this.traversalSource.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (Map) literalOrVar); } /** @@@ -212,11 -185,9 +212,11 @@@ */ @Override public GraphTraversal visitTraversalSourceSpawnMethod_call_string_map_traversal(final GremlinParser.TraversalSourceSpawnMethod_call_string_map_traversalContext ctx) { - final Object literalOrVar = antlr.argumentVisitor.visitGenericLiteralMapArgument(ctx.genericLiteralMapArgument()); - return this.traversalSource.call(antlr.argumentVisitor.parseString(ctx.stringArgument()), - antlr.argumentVisitor.parseMap(ctx.genericMapArgument()), - anonymousVisitor.visitNestedTraversal(ctx.nestedTraversal())); ++ final Object literalOrVar = antlr.argumentVisitor.visitGenericMapArgument(ctx.genericMapArgument()); + if (GValue.valueInstanceOf(literalOrVar, GType.MAP)) + return this.traversalSource.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (GValue<Map>) literalOrVar, anonymousVisitor.visitNestedTraversal(ctx.nestedTraversal())); + else + return this.traversalSource.call(antlr.genericVisitor.parseString(ctx.stringLiteral()), (Map) literalOrVar, anonymousVisitor.visitNestedTraversal(ctx.nestedTraversal())); } /** diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java index cfec1ba268,23fe336e43..575af5cd8f --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java @@@ -327,10 -313,10 +313,10 @@@ public class DotNetTranslateVisitor ext final String step = ctx.getChild(0).getText(); sb.append(convertToPascalCase(step)); sb.append("<object>").append("("); - visit(ctx.stringArgument()); + visit(ctx.stringLiteral()); sb.append(", "); sb.append("(IDictionary<object, object>) "); - visit(ctx.genericLiteralMapArgument()); + visit(ctx.genericMapArgument()); sb.append(")"); return null; } @@@ -353,10 -339,10 +339,10 @@@ final String step = ctx.getChild(0).getText(); sb.append(convertToPascalCase(step)); sb.append("<object>").append("("); - visit(ctx.stringArgument()); + visit(ctx.stringLiteral()); sb.append(", "); sb.append("(IDictionary<object, object>) "); - visit(ctx.genericLiteralMapArgument()); + visit(ctx.genericMapArgument()); sb.append(", "); sb.append("(ITraversal) "); visit(ctx.nestedTraversal()); @@@ -738,41 -724,10 +724,41 @@@ sb.append(")"); return null; } else { - return super.visitTraversalMethod_hasLabel_String_String(ctx); + final String step = ctx.getChild(0).getText(); + sb.append(convertToPascalCase(step)); + sb.append("("); + tryAppendCastToString(ctx.stringNullableArgument()); + visit(ctx.stringNullableArgument()); + + // more arguments to come - if (!ctx.stringLiteralVarargsArgument().stringNullableArgument().isEmpty()) { - ctx.stringLiteralVarargsArgument().stringNullableArgument().forEach(sna -> { ++ if (!ctx.stringNullableArgumentVarargs().stringNullableArgument().isEmpty()) { ++ ctx.stringNullableArgumentVarargs().stringNullableArgument().forEach(sna -> { + sb.append(", "); + tryAppendCastToString(sna); + visit(sna); + }); + } + + sb.append(")"); + return null; } } + @Override - public Void visitStringLiteralVarargs(final GremlinParser.StringLiteralVarargsContext ctx) { ++ public Void visitStringNullableLiteralVarargs(final GremlinParser.StringNullableLiteralVarargsContext ctx) { + for (int ix = 0; ix < ctx.getChildCount(); ix++) { + final ParseTree pt = ctx.getChild(ix); + if (pt instanceof GremlinParser.StringNullableArgumentContext) { + GremlinParser.StringNullableArgumentContext sna = (GremlinParser.StringNullableArgumentContext) pt; + tryAppendCastToString(sna); + visit(sna); + } else { + visit(pt); + } + }; + return null; + } + @Override public Void visitTraversalMethod_index(final GremlinParser.TraversalMethod_indexContext ctx) { return handleGenerics(ctx); @@@ -900,24 -855,9 +886,24 @@@ return null; } + @Override + public Void visitTraversalMethod_option_Object_Traversal(final GremlinParser.TraversalMethod_option_Object_TraversalContext ctx) { - if (ctx.genericLiteralArgument().genericLiteral() != null && ctx.genericLiteralArgument().genericLiteral().traversalMerge() != null) { ++ if (ctx.genericArgument().genericLiteral() != null && ctx.genericArgument().genericLiteral().traversalMerge() != null) { + visit(ctx.getChild(0)); + sb.append("("); - visit(ctx.genericLiteralArgument()); ++ visit(ctx.genericArgument()); + sb.append(", "); + sb.append("(ITraversal) "); + visit(ctx.nestedTraversal()); + sb.append(")"); + return null; + } else { + return super.visitTraversalMethod_option_Object_Traversal(ctx); + } + } + @Override public Void visitTraversalMethod_option_Merge_Traversal(final GremlinParser.TraversalMethod_option_Merge_TraversalContext ctx) { - // call is ambiguous without an explicit cast visit(ctx.getChild(0)); sb.append("("); visit(ctx.traversalMerge()); diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java index 3430537ad1,ccf1402706..a6a7901fb9 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java @@@ -188,40 -184,13 +188,40 @@@ public class GroovyTranslateVisitor ext return handleInject(ctx); } - /* - * very special handling for inject with second `null` argument like g.inject(1, null) + @Override + public Void visitTraversalMethod_hasLabel_String_String(final GremlinParser.TraversalMethod_hasLabel_String_StringContext ctx) { + // special handling for resolving ambiguous invocations of the hasLabel() step. coerces to the string form + if (ctx.getChildCount() > 4 && ctx.getChild(2).getText().equals("null")) { - final GremlinParser.StringLiteralVarargsArgumentContext varArgs = ctx.stringLiteralVarargsArgument(); ++ final GremlinParser.StringNullableArgumentVarargsContext varArgs = ctx.stringNullableArgumentVarargs(); + sb.append(ctx.getChild(0).getText()); + sb.append("((String) null, "); + + for (int i = 0; i < varArgs.getChildCount(); i += 2) { + if (varArgs.getChild(i).getText().equals("null")) { + sb.append("(String) null"); + } else { + visit(varArgs.getChild(i)); + } + + if (i < varArgs.getChildCount() - 1) { + sb.append(", "); + } + } + + sb.append(")"); + return null; + } + + return visitChildren(ctx); + } + + /** + * Special handling for inject with second `null` argument like g.inject(1, null) * inject() ends up being ambiguous with groovy's jdk extension of inject(Object initialValue, Closure closure) */ private Void handleInject(final ParserRuleContext ctx) { - if (ctx.getChildCount() > 3 && ctx.getChild(2) instanceof GenericLiteralVarargsContext) { - final GenericLiteralVarargsContext varArgs = (GenericLiteralVarargsContext) ctx.getChild(2); - if (ctx.getChildCount() > 3 && ctx.getChild(2) instanceof GremlinParser.GenericLiteralVarargsContext) { - final GremlinParser.GenericLiteralVarargsContext varArgs = (GremlinParser.GenericLiteralVarargsContext) ctx.getChild(2); ++ if (ctx.getChildCount() > 3 && ctx.getChild(2) instanceof GremlinParser.GenericArgumentVarargsContext) { ++ final GremlinParser.GenericArgumentVarargsContext varArgs = (GremlinParser.GenericArgumentVarargsContext) ctx.getChild(2); if (varArgs.getChildCount() > 2 && "null".equals(varArgs.getChild(2).getText())) { sb.append(ctx.getChild(0).getText()); sb.append("("); @@@ -244,4 -213,4 +244,55 @@@ return visitChildren(ctx); } ++ ++ @Override ++ public Void visitTraversalMethod_option_Merge_Map(final GremlinParser.TraversalMethod_option_Merge_MapContext ctx){ ++ sb.append("option("); ++ visit(ctx.traversalMerge()); ++ sb.append(", "); ++ tryCastMapNullableArgument(ctx.genericMapNullableArgument()); ++ sb.append(")"); ++ return null; ++ } ++ ++ @Override ++ public Void visitTraversalMethod_mergeV_Map(final GremlinParser.TraversalMethod_mergeV_MapContext ctx){ ++ sb.append("mergeV("); ++ tryCastMapNullableArgument(ctx.genericMapNullableArgument()); ++ sb.append(")"); ++ return null; ++ } ++ ++ @Override ++ public Void visitTraversalSourceSpawnMethod_mergeV_Map(final GremlinParser.TraversalSourceSpawnMethod_mergeV_MapContext ctx){ ++ sb.append("mergeV("); ++ tryCastMapNullableArgument(ctx.genericMapNullableArgument()); ++ sb.append(")"); ++ return null; ++ } ++ ++ @Override ++ public Void visitTraversalMethod_mergeE_Map(final GremlinParser.TraversalMethod_mergeE_MapContext ctx){ ++ sb.append("mergeE("); ++ tryCastMapNullableArgument(ctx.genericMapNullableArgument()); ++ sb.append(")"); ++ return null; ++ } ++ ++ @Override ++ public Void visitTraversalSourceSpawnMethod_mergeE_Map(final GremlinParser.TraversalSourceSpawnMethod_mergeE_MapContext ctx){ ++ sb.append("mergeE("); ++ tryCastMapNullableArgument(ctx.genericMapNullableArgument()); ++ sb.append(")"); ++ return null; ++ } ++ ++ private void tryCastMapNullableArgument(GremlinParser.GenericMapNullableArgumentContext ctx) { ++ if (ctx.genericMapNullableLiteral() != null ++ && ctx.genericMapNullableLiteral().nullLiteral() != null) { ++ sb.append("(Map) null"); ++ } else { ++ visit(ctx); ++ } ++ } } diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java index 372f9c1ef8,8211b16121..eaf830d094 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java @@@ -103,8 -103,30 +103,8 @@@ public class PythonTranslateVisitor ext return null; } - @Override - public Void visitTraversalSourceSelfMethod_withoutStrategies(final GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ctx) { - sb.append(SymbolHelper.toPython(ctx.getChild(0).getText())).append("(*["); - visit(ctx.classType()); - - if (ctx.classTypeList() != null && ctx.classTypeList().getChildCount() > 0) { - sb.append(", "); - visit(ctx.classTypeList()); - } - - sb.append("])"); - return null; - } - - @Override - public Void visitClassType(final GremlinParser.ClassTypeContext ctx) { - final Optional<? extends Class<? extends TraversalStrategy>> strategy = TraversalStrategies.GlobalCache.getRegisteredStrategyClass(ctx.getText()); - final String fqcn = strategy.map(Class::getName).orElse(ctx.getText()); - sb.append("GremlinType('").append(fqcn).append("')"); - return null; - } - @Override - public Void visitGenericLiteralMap(final GremlinParser.GenericLiteralMapContext ctx) { + public Void visitGenericMapLiteral(final GremlinParser.GenericMapLiteralContext ctx) { sb.append("{ "); for (int i = 0; i < ctx.mapEntry().size(); i++) { final GremlinParser.MapEntryContext mapEntryContext = ctx.mapEntry(i); diff --cc gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 690f2750fc,bf205d5068..7e908ef14f --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@@ -1703,8 -1686,8 +1703,13 @@@ namespace Gremlin.Net.IntegrationTest.G {"g_VX1X_out_out_out_tree", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Out().Out().Out().Tree<object>()}}, {"g_VX1X_outE_inV_bothE_otherV_tree", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).OutE().InV().BothE().OtherV().Tree<object>()}}, {"g_VX1X_outE_inV_bothE_otherV_tree_byXnameX_byXlabelX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).OutE().InV().BothE().OtherV().Tree<object>().By("name").By(T.Label)}}, ++<<<<<<< HEAD + {"g_injectXUUIDX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479"))}}, ++>>>>>>> 3.8-dev ++======= + {"g_injectXUUIDX47af10b_58cc_4372_a567_0f02b2f3d479XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.Parse("f47af10b-58cc-4372-a567-0f02b2f3d479"))}}, + {"g_injectXUUIDXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(Guid.NewGuid())}}, +>>>>>>> 3.8-dev }; public static ITraversal UseTraversal(string scenarioName, GraphTraversalSource g, IDictionary<string, object> parameters) diff --cc gremlin-go/driver/cucumber/gremlin.go index 934010d1da,8d6dc28d90..9d4fe35f8b --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@@ -1677,8 -1656,8 +1677,13 @@@ var translationMap = map[string][]func( "g_VX1X_out_out_out_tree": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Out().Out().Out().Tree()}}, "g_VX1X_outE_inV_bothE_otherV_tree": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).OutE().InV().BothE().OtherV().Tree()}}, "g_VX1X_outE_inV_bothE_otherV_tree_byXnameX_byXlabelX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).OutE().InV().BothE().OtherV().Tree().By("name").By(gremlingo.T.Label)}}, ++<<<<<<< HEAD + "g_injectXUUIDX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(uuid.MustParse("f47af10b-58cc-4372-a567-0f02b2f3d479"))}}, +>>>>>>> 3.8-dev ++======= + "g_injectXUUIDX47af10b_58cc_4372_a567_0f02b2f3d479XX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(uuid.MustParse("f47af10b-58cc-4372-a567-0f02b2f3d479"))}}, + "g_injectXUUIDXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(uuid.New())}}, ++>>>>>>> 3.8-dev } func GetTraversal(scenarioName string, g *gremlingo.GraphTraversalSource, parameters map[string]interface{}) (*gremlingo.GraphTraversal, error) { diff --cc gremlin-language/src/main/antlr4/Gremlin.g4 index 9d71e117c7,3d5be8a698..030a2b7402 --- a/gremlin-language/src/main/antlr4/Gremlin.g4 +++ b/gremlin-language/src/main/antlr4/Gremlin.g4 @@@ -80,8 -80,8 +80,8 @@@ traversalSourceSelfMethod_withSac ; traversalSourceSelfMethod_withSideEffect - : K_WITHSIDEEFFECT LPAREN stringLiteral COMMA genericLiteralArgument RPAREN - | K_WITHSIDEEFFECT LPAREN stringLiteral COMMA genericLiteralArgument COMMA traversalBiFunction RPAREN - : K_WITHSIDEEFFECT LPAREN stringArgument COMMA genericArgument RPAREN - | K_WITHSIDEEFFECT LPAREN stringArgument COMMA genericArgument COMMA traversalBiFunction RPAREN ++ : K_WITHSIDEEFFECT LPAREN stringLiteral COMMA genericArgument RPAREN ++ | K_WITHSIDEEFFECT LPAREN stringLiteral COMMA genericArgument COMMA traversalBiFunction RPAREN ; traversalSourceSelfMethod_withStrategies @@@ -93,8 -93,8 +93,8 @@@ traversalSourceSelfMethod_withoutStrate ; traversalSourceSelfMethod_with - : K_WITH LPAREN stringArgument RPAREN - | K_WITH LPAREN stringArgument COMMA genericArgument RPAREN + : K_WITH LPAREN stringLiteral RPAREN - | K_WITH LPAREN stringLiteral COMMA genericLiteralArgument RPAREN ++ | K_WITH LPAREN stringLiteral COMMA genericArgument RPAREN ; traversalSourceSpawnMethod @@@ -149,10 -149,10 +149,10 @@@ traversalSourceSpawnMethod_merge traversalSourceSpawnMethod_call : K_CALL LPAREN RPAREN #traversalSourceSpawnMethod_call_empty - | K_CALL LPAREN stringArgument RPAREN #traversalSourceSpawnMethod_call_string - | K_CALL LPAREN stringArgument COMMA genericMapArgument RPAREN #traversalSourceSpawnMethod_call_string_map - | K_CALL LPAREN stringArgument COMMA nestedTraversal RPAREN #traversalSourceSpawnMethod_call_string_traversal - | K_CALL LPAREN stringArgument COMMA genericMapArgument COMMA nestedTraversal RPAREN #traversalSourceSpawnMethod_call_string_map_traversal + | K_CALL LPAREN stringLiteral RPAREN #traversalSourceSpawnMethod_call_string - | K_CALL LPAREN stringLiteral COMMA genericLiteralMapArgument RPAREN #traversalSourceSpawnMethod_call_string_map ++ | K_CALL LPAREN stringLiteral COMMA genericMapArgument RPAREN #traversalSourceSpawnMethod_call_string_map + | K_CALL LPAREN stringLiteral COMMA nestedTraversal RPAREN #traversalSourceSpawnMethod_call_string_traversal - | K_CALL LPAREN stringLiteral COMMA genericLiteralMapArgument COMMA nestedTraversal RPAREN #traversalSourceSpawnMethod_call_string_map_traversal ++ | K_CALL LPAREN stringLiteral COMMA genericMapArgument COMMA nestedTraversal RPAREN #traversalSourceSpawnMethod_call_string_map_traversal ; traversalSourceSpawnMethod_union @@@ -467,15 -466,11 +467,15 @@@ traversalMethod_dedu ; traversalMethod_difference - : K_DIFFERENCE LPAREN genericLiteralArgument RPAREN #traversalMethod_difference_Object + : K_DIFFERENCE LPAREN genericArgument RPAREN #traversalMethod_difference_Object ; +traversalMethod_discard + : 'discard' LPAREN RPAREN + ; + traversalMethod_disjunct - : K_DISJUNCT LPAREN genericLiteralArgument RPAREN #traversalMethod_disjunct_Object + : K_DISJUNCT LPAREN genericArgument RPAREN #traversalMethod_disjunct_Object ; traversalMethod_drop @@@ -580,11 -575,11 +580,11 @@@ traversalMethod_identit ; traversalMethod_in - : K_IN LPAREN stringLiteralVarargsArgument RPAREN - : K_IN LPAREN stringNullableLiteralVarargs RPAREN ++ : K_IN LPAREN stringNullableArgumentVarargs RPAREN ; traversalMethod_inE - : K_INE LPAREN stringLiteralVarargsArgument RPAREN - : K_INE LPAREN stringNullableLiteralVarargs RPAREN ++ : K_INE LPAREN stringNullableArgumentVarargs RPAREN ; traversalMethod_intersect @@@ -884,7 -878,7 +883,7 @@@ traversalMethod_t ; traversalMethod_toE - : K_TOE LPAREN traversalDirection (COMMA stringLiteralVarargsArgument)? RPAREN - : K_TOE LPAREN traversalDirection (COMMA stringNullableLiteralVarargs)? RPAREN ++ : K_TOE LPAREN traversalDirection (COMMA stringNullableArgumentVarargs)? RPAREN ; traversalMethod_toLower @@@ -1506,13 -1497,8 +1502,13 @@@ genericMapNullableArgumen | variable ; +nullableGenericLiteralMap - : genericLiteralMap ++ : genericMapLiteral + | nullLiteral + ; + structureVertexArgument - : structureVertex + : structureVertexLiteral | variable ;
