From 4da811b6bbf7fcc926e31725a1e1aa2410ee8d76 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 28 Jul 2014 10:57:05 +0200 Subject: [PATCH] [#3456] Name clash in generated code when Routine argument is called "f" (functions) or "p" (procedures) --- .../java/org/jooq/util/JavaGenerator.java | 33 +++++++++++-------- jOOQ-test/pom.xml | 2 +- .../org/jooq/test/postgres/create.sql | 21 +++++++++++- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index cf34606199..e0157a3dbd 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -2542,6 +2542,7 @@ public class JavaGenerator extends AbstractGenerator { } final String className = getStrategy().getFullJavaClassName(function); + final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f"); out.tab(1).javadoc("Get %s as a field", function.getQualifiedOutputName()); out.tab(1).print("public static %s<%s> %s(", @@ -2564,17 +2565,17 @@ public class JavaGenerator extends AbstractGenerator { } out.println(") {"); - out.tab(2).println("%s f = new %s();", className, className); + out.tab(2).println("%s %s = new %s();", className, localVar, className); for (ParameterDefinition parameter : function.getInParameters()) { final String paramSetter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT); final String paramMember = getStrategy().getJavaMemberName(parameter); - out.tab(2).println("f.%s(%s);", paramSetter, paramMember); + out.tab(2).println("%s.%s(%s);", localVar, paramSetter, paramMember); } out.println(); - out.tab(2).println("return f.as%s();", function.isAggregate() ? "AggregateFunction" : "Field"); + out.tab(2).println("return %s.as%s();", localVar, function.isAggregate() ? "AggregateFunction" : "Field"); out.tab(1).println("}"); } @@ -2662,7 +2663,10 @@ public class JavaGenerator extends AbstractGenerator { final String functionName = function.getQualifiedOutputName(); final String functionType = getJavaType(function.getReturnType()); final String methodName = getStrategy().getJavaMethodName(function, Mode.DEFAULT); + + // [#3456] Local variables should not collide with actual function arguments final String configurationArgument = disambiguateJavaMemberName(function.getInParameters(), "configuration"); + final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f"); out.tab(1).javadoc("Call %s", functionName); out.tab(1).print("public %s%s %s(", @@ -2688,7 +2692,7 @@ public class JavaGenerator extends AbstractGenerator { } out.println(") {"); - out.tab(2).println("%s f = new %s();", className, className); + out.tab(2).println("%s %s = new %s();", className, localVar, className); for (ParameterDefinition parameter : function.getInParameters()) { final String paramSetter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT); @@ -2696,15 +2700,15 @@ public class JavaGenerator extends AbstractGenerator { ? "this" : getStrategy().getJavaMemberName(parameter); - out.tab(2).println("f.%s(%s);", paramSetter, paramMember); + out.tab(2).println("%s.%s(%s);", localVar, paramSetter, paramMember); } out.println(); - out.tab(2).println("f.execute(%s);", instance ? "configuration()" : configurationArgument); + out.tab(2).println("%s.execute(%s);", localVar, instance ? "configuration()" : configurationArgument); // TODO [#956] Find a way to register "SELF" as OUT parameter // in case this is a UDT instance (member) function - out.tab(2).println("return f.getReturnValue();"); + out.tab(2).println("return %s.getReturnValue();", localVar); out.tab(1).println("}"); } @@ -2717,6 +2721,7 @@ public class JavaGenerator extends AbstractGenerator { final String className = getStrategy().getFullJavaClassName(procedure); final String configurationArgument = disambiguateJavaMemberName(procedure.getInParameters(), "configuration"); + final String localVar = disambiguateJavaMemberName(procedure.getInParameters(), "p"); out.tab(1).javadoc("Call %s", procedure.getQualifiedOutputName()); out.print("\tpublic "); @@ -2762,7 +2767,7 @@ public class JavaGenerator extends AbstractGenerator { } out.println(") {"); - out.tab(2).println("%s p = new %s();", className, className); + out.tab(2).println("%s %s = new %s();", className, localVar, className); for (ParameterDefinition parameter : procedure.getInParameters()) { final String setter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT); @@ -2770,11 +2775,11 @@ public class JavaGenerator extends AbstractGenerator { ? "this" : getStrategy().getJavaMemberName(parameter); - out.tab(2).println("p.%s(%s);", setter, arg); + out.tab(2).println("%s.%s(%s);", localVar, setter, arg); } out.println(); - out.tab(2).println("p.execute(%s);", instance ? "configuration()" : configurationArgument); + out.tab(2).println("%s.execute(%s);", localVar, instance ? "configuration()" : configurationArgument); if (procedure.getOutParameters().size() > 0) { final ParameterDefinition parameter = procedure.getOutParameters().get(0); @@ -2787,18 +2792,18 @@ public class JavaGenerator extends AbstractGenerator { // [#3117] Avoid funny call-site ambiguity if this is a UDT that is implemented by an interface if (generateInterfaces() && isUDT) { - out.tab(2).println("from((%s) p.%s());", columnTypeInterface, getter); + out.tab(2).println("from((%s) %s.%s());", columnTypeInterface, localVar, getter); } else { - out.tab(2).println("from(p.%s());", getter); + out.tab(2).println("from(%s.%s());", localVar, getter); } } if (procedure.getOutParameters().size() == 1) { - out.tab(2).println("return p.%s();", getter); + out.tab(2).println("return %s.%s();", localVar, getter); } else if (procedure.getOutParameters().size() > 1) { - out.tab(2).println("return p;"); + out.tab(2).println("return %s;", localVar); } } diff --git a/jOOQ-test/pom.xml b/jOOQ-test/pom.xml index 370b556f8c..fff42428ab 100644 --- a/jOOQ-test/pom.xml +++ b/jOOQ-test/pom.xml @@ -2734,7 +2734,7 @@ org.jooq.util.postgres.PostgresDatabase - t_.*|x_.*|v_.*|m_.*|V_.*|p_.*|f_.*|u_.*|(f|p)[0-9]+|s_.* + t_.*|x_.*|v_.*|m_.*|V_.*|p(_.*)?|f(_.*)?|u_.*|(f|p)[0-9]+|s_.* t_book_details|.*?_seq|_.* false true diff --git a/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql b/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql index 9f4bf56d87..a00ea96861 100644 --- a/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql +++ b/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql @@ -29,6 +29,8 @@ DROP FUNCTION p391( / DROP FUNCTION f_author_exists(author_name VARCHAR);/ DROP FUNCTION f_one();/ +DROP FUNCTION f(f int, f_ int);/ +DROP FUNCTION p(p int, p_ int);/ DROP FUNCTION f_number(n int);/ DROP FUNCTION f317(p1 int, p2 int, p3 int, p4 int);/ DROP FUNCTION p_get_two_cursors(books OUT refcursor, authors OUT refcursor)/ @@ -784,11 +786,28 @@ END; $$ LANGUAGE plpgsql; / +CREATE FUNCTION f (f int, f_ int) +RETURNS INT +AS $$ +BEGIN + RETURN f; +END; +$$ LANGUAGE plpgsql; +/ + +CREATE FUNCTION p (p int, p_ int) +RETURNS VOID +AS $$ +BEGIN +END; +$$ LANGUAGE plpgsql; +/ + CREATE FUNCTION f_one () RETURNS INT AS $$ BEGIN - RETURN 1; + RETURN 1; END; $$ LANGUAGE plpgsql; /