From aa14928245ed98565dcd4e7f6d21b1a573d76a56 Mon Sep 17 00:00:00 2001 From: Jorge Bay Gondra Date: Fri, 1 Dec 2017 12:52:15 +0100 Subject: [PATCH] Gremlin.Net: fix generation of Constant() and Fold() steps --- .travis.yml | 2 +- gremlin-dotnet/glv/generate.groovy | 58 +++++++++++++------ .../Process/Traversal/GraphTraversal.cs | 4 +- .../src/Gremlin.Net/Process/Traversal/__.cs | 4 +- 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/.travis.yml b/.travis.yml index b626b17bce6..9b7029c4c7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,4 +15,4 @@ before_install: jobs: include: - script: "mvn clean install -Dci" - - script: "touch gremlin-dotnet/src/.glv && touch gremlin-dotnet/test/.glv && mvn clean install -pl :gremlin-dotnet-tests -P gremlin-dotnet -DskipIntegrationTests=false" \ No newline at end of file + - script: "touch gremlin-dotnet/src/.glv && touch gremlin-dotnet/test/.glv && mvn clean install -pl :gremlin-dotnet,:gremlin-dotnet-tests -P gremlin-dotnet -DskipIntegrationTests=false" \ No newline at end of file diff --git a/gremlin-dotnet/glv/generate.groovy b/gremlin-dotnet/glv/generate.groovy index ad2211633ea..52ca165ce1c 100644 --- a/gremlin-dotnet/glv/generate.groovy +++ b/gremlin-dotnet/glv/generate.groovy @@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.P import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ import org.apache.tinkerpop.gremlin.structure.Direction import java.lang.reflect.Modifier +import java.lang.reflect.TypeVariable def toCSharpTypeMap = ["Long": "long", "Integer": "int", @@ -115,8 +116,17 @@ def getJavaParameterTypeNames = { method -> } } -def toCSharpParamString = { param -> - csharpParamTypeName = toCSharpType(param.type.simpleName) +def toCSharpParamString = { param, genTypeName -> + String csharpParamTypeName = genTypeName; + if (csharpParamTypeName == null){ + csharpParamTypeName = toCSharpType(param.type.simpleName) + } + else if (csharpParamTypeName == "M") { + csharpParamTypeName = "object"; + } + else if (csharpParamTypeName == "A" || csharpParamTypeName == "B") { + csharpParamTypeName = "E2"; + } "${csharpParamTypeName} ${param.name}" } @@ -131,22 +141,32 @@ def getCSharpParamTypeString = { method -> }.join(",") } -def getCSharpParamString = { method -> +def getCSharpParamString = { method, useGenericParams -> def parameters = method.parameters; if (parameters.length == 0) - return "" + return "" + + def genericTypes = method.getGenericParameterTypes(); def csharpParameters = parameters. - init(). - collect { param -> - toCSharpParamString(param) - }; - def lastCSharpParam = ""; - if (method.isVarArgs()) - lastCSharpParam += "params "; - lastCSharpParam += toCSharpParamString(parameters.last()) - csharpParameters += lastCSharpParam - csharpParamString = csharpParameters.join(", ") - csharpParamString + toList().indexed(). + collect { index, param -> + String genTypeName = null + if (useGenericParams) { + def genType = genericTypes[index] + if (genType instanceof TypeVariable) { + genTypeName = ((TypeVariable)genType).name + } + } + toCSharpParamString(param, genTypeName) + }. + toArray(); + + if (method.isVarArgs()) { + def lastIndex = csharpParameters.length-1; + csharpParameters[lastIndex] = "params " + csharpParameters[lastIndex]; + } + + csharpParameters.join(", ") } def getParamNames = { parameters -> @@ -209,7 +229,7 @@ def binding = ["pmethods": P.class.getMethods(). sort { a, b -> a.name <=> b.name ?: getJavaParamTypeString(a) <=> getJavaParamTypeString(b) }. unique { a,b -> a.name <=> b.name ?: getCSharpParamTypeString(a) <=> getCSharpParamTypeString(b) }. collect { javaMethod -> - def parameters = getCSharpParamString(javaMethod) + def parameters = getCSharpParamString(javaMethod, false) def paramNames = getParamNames(javaMethod.parameters) return ["methodName": javaMethod.name, "parameters":parameters, "paramNames":paramNames] }, @@ -220,7 +240,7 @@ def binding = ["pmethods": P.class.getMethods(). unique { a,b -> a.name <=> b.name ?: getCSharpParamTypeString(a) <=> getCSharpParamTypeString(b) }. collect { javaMethod -> def typeArguments = javaMethod.genericReturnType.actualTypeArguments.collect{t -> ((java.lang.Class)t).simpleName} - def parameters = getCSharpParamString(javaMethod) + def parameters = getCSharpParamString(javaMethod, false) def paramNames = getParamNames(javaMethod.parameters) return ["methodName": javaMethod.name, "typeArguments": typeArguments, "parameters":parameters, "paramNames":paramNames] }, @@ -235,7 +255,7 @@ def binding = ["pmethods": P.class.getMethods(). def t1 = toCSharpType(typeNames[0]) def t2 = toCSharpType(typeNames[1]) def tParam = getCSharpGenericTypeParam(t2) - def parameters = getCSharpParamString(javaMethod) + def parameters = getCSharpParamString(javaMethod, true) def paramNames = getParamNames(javaMethod.parameters) return ["methodName": javaMethod.name, "t1":t1, "t2":t2, "tParam":tParam, "parameters":parameters, "paramNames":paramNames] }, @@ -255,7 +275,7 @@ def binding = ["pmethods": P.class.getMethods(). t2 = specificTypes[0] tParam = specificTypes.size() > 1 ? "<" + specificTypes[1] + ">" : "" } - def parameters = getCSharpParamString(javaMethod) + def parameters = getCSharpParamString(javaMethod, true) def paramNames = getParamNames(javaMethod.parameters) def callGenericTypeArg = hasMethodNoGenericCounterPartInGraphTraversal(javaMethod) ? "" : tParam def graphTraversalT2 = getGraphTraversalT2ForT2(t2) diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs index 601e3813ffa..e3eb1900c08 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs @@ -420,7 +420,7 @@ public GraphTraversal< S , E > Coin (double probability) /// /// Adds the constant step to this . /// - public GraphTraversal< S , E2 > Constant (object e) + public GraphTraversal< S , E2 > Constant (E2 e) { Bytecode.AddStep("constant", e); return Wrap< S , E2 >(this); @@ -559,7 +559,7 @@ public GraphTraversal< S , IList > Fold () /// /// Adds the fold step to this . /// - public GraphTraversal< S , E2 > Fold (object seed, object foldFunction) + public GraphTraversal< S , E2 > Fold (E2 seed, object foldFunction) { Bytecode.AddStep("fold", seed, foldFunction); return Wrap< S , E2 >(this); diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs index c9ced7b3c3c..1788badc1f5 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs @@ -289,7 +289,7 @@ public static GraphTraversal Coin(double probability) /// /// Spawns a and adds the constant step to that traversal. /// - public static GraphTraversal Constant(object a) + public static GraphTraversal Constant(E2 a) { return new GraphTraversal().Constant(a); } @@ -413,7 +413,7 @@ public static GraphTraversal> Fold() /// /// Spawns a and adds the fold step to that traversal. /// - public static GraphTraversal Fold(object seed, object foldFunction) + public static GraphTraversal Fold(E2 seed, object foldFunction) { return new GraphTraversal().Fold(seed, foldFunction); }