[#3456] Name clash in generated code when Routine argument is called "f" (functions) or "p" (procedures)

This commit is contained in:
Lukas Eder 2014-07-28 10:57:05 +02:00
parent 8a7aa8e254
commit 4da811b6bb
3 changed files with 40 additions and 16 deletions

View File

@ -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 <code>%s</code> 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 <code>%s</code>", 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 <code>%s</code>", 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);
}
}

View File

@ -2734,7 +2734,7 @@
</strategy>
<database>
<name>org.jooq.util.postgres.PostgresDatabase</name>
<includes>t_.*|x_.*|v_.*|m_.*|V_.*|p_.*|f_.*|u_.*|(f|p)[0-9]+|s_.*</includes>
<includes>t_.*|x_.*|v_.*|m_.*|V_.*|p(_.*)?|f(_.*)?|u_.*|(f|p)[0-9]+|s_.*</includes>
<excludes>t_book_details|.*?_seq|_.*</excludes>
<dateAsTimestamp>false</dateAsTimestamp>
<unsignedTypes>true</unsignedTypes>

View File

@ -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;
/