[jOOQ/jOOQ#10377] Inline internal AbstractContext.visit0() to reduce stack trace size

This commit is contained in:
Lukas Eder 2020-07-09 17:40:33 +02:00
parent 41471cf4fd
commit 1958b1d814

View File

@ -211,13 +211,59 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
// Perform the actual visiting, or recurse into the replacement
// -----------------------------------------------------------------
QueryPart original = part;
QueryPart replacement = start(part);
if (replacement != null) {
QueryPartInternal internal = (QueryPartInternal) replacement;
if (original == replacement)
visit0(original);
else
visit0(replacement);
// If this is supposed to be a declaration section and the part isn't
// able to declare anything, then disable declaration temporarily
// We're declaring fields, but "part" does not declare fields
if (declareFields() && !internal.declaresFields()) {
boolean aliases = declareAliases();
declareFields(false);
visit0(internal);
declareFields(true);
declareAliases(aliases);
}
// We're declaring tables, but "part" does not declare tables
else if (declareTables() && !internal.declaresTables()) {
boolean aliases = declareAliases();
declareTables(false);
visit0(internal);
declareTables(true);
declareAliases(aliases);
}
// We're declaring windows, but "part" does not declare windows
else if (declareWindows() && !internal.declaresWindows()) {
declareWindows(false);
visit0(internal);
declareWindows(true);
}
// We're declaring cte, but "part" does not declare cte
else if (declareCTE() && !internal.declaresCTE()) {
declareCTE(false);
visit0(internal);
declareCTE(true);
}
else if (!castModeOverride && castMode() != CastMode.DEFAULT && !internal.generatesCast()) {
CastMode previous = castMode();
castMode(CastMode.DEFAULT);
visit0(internal);
castMode(previous);
}
// We're not declaring, or "part" can declare
else {
visit0(internal);
}
}
end(replacement);
@ -231,6 +277,8 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
protected abstract void visit0(QueryPartInternal internal);
/**
* Emit a clause from a query part being visited.
* <p>
@ -401,68 +449,6 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
}
}
// ------------------------------------------------------------------------
// XXX Context API
// ------------------------------------------------------------------------
private final C visit0(QueryPart part) {
if (part != null) {
QueryPartInternal internal = (QueryPartInternal) part;
// If this is supposed to be a declaration section and the part isn't
// able to declare anything, then disable declaration temporarily
// We're declaring fields, but "part" does not declare fields
if (declareFields() && !internal.declaresFields()) {
boolean aliases = declareAliases();
declareFields(false);
visit0(internal);
declareFields(true);
declareAliases(aliases);
}
// We're declaring tables, but "part" does not declare tables
else if (declareTables() && !internal.declaresTables()) {
boolean aliases = declareAliases();
declareTables(false);
visit0(internal);
declareTables(true);
declareAliases(aliases);
}
// We're declaring windows, but "part" does not declare windows
else if (declareWindows() && !internal.declaresWindows()) {
declareWindows(false);
visit0(internal);
declareWindows(true);
}
// We're declaring cte, but "part" does not declare cte
else if (declareCTE() && !internal.declaresCTE()) {
declareCTE(false);
visit0(internal);
declareCTE(true);
}
else if (!castModeOverride && castMode() != CastMode.DEFAULT && !internal.generatesCast()) {
CastMode previous = castMode();
castMode(CastMode.DEFAULT);
visit0(internal);
castMode(previous);
}
// We're not declaring, or "part" can declare
else {
visit0(internal);
}
}
return (C) this;
}
protected abstract void visit0(QueryPartInternal internal);
@Override
public final boolean declareFields() {
return declareFields;