in paimon-common/src/main/java/org/apache/paimon/codegen/codesplit/FunctionSplitter.java [144:247]
public Void visitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
if (!"void".equals(ctx.typeTypeOrVoid().getText())) {
return null;
}
long methodBodyLength = CodeSplitUtil.getContextTextLength(ctx.methodBody().block());
if (methodBodyLength < maxMethodLength) {
return null;
}
if (ctx.methodBody().block().blockStatement() == null
|| ctx.methodBody().block().blockStatement().size() <= 1) {
return null;
}
List<String> splitFuncBodies = new ArrayList<>();
List<JavaParser.BlockStatementContext> blockStatementContexts = new ArrayList<>();
// function real parameters
LinkedHashSet<String> declarations = new LinkedHashSet<>();
new JavaParserBaseVisitor<Void>() {
@Override
public Void visitFormalParameter(JavaParser.FormalParameterContext ctx) {
declarations.add(ctx.variableDeclaratorId().getText());
return null;
}
}.visit(ctx);
// function definition
String type = CodeSplitUtil.getContextString(ctx.typeTypeOrVoid());
String functionName = ctx.IDENTIFIER().getText();
String parameters = CodeSplitUtil.getContextString(ctx.formalParameters());
for (JavaParser.BlockStatementContext blockStatementContext :
ctx.methodBody().block().blockStatement()) {
blockStatementContexts.add(blockStatementContext);
splitFuncBodies.add(CodeSplitUtil.getContextString(blockStatementContext));
}
List<String> mergedCodeBlocks = getMergedCodeBlocks(splitFuncBodies);
List<String> newSplitMethods = new ArrayList<>();
List<String> newSplitMethodCalls = new ArrayList<>();
String methodQualifier = "";
if (ctx.THROWS() != null) {
methodQualifier =
" throws " + CodeSplitUtil.getContextString(ctx.qualifiedNameList());
}
String hasReturnedVarName = boolVarNames.get(classCount).get(functionName + parameters);
if (hasReturnedVarName != null) {
rewriter.insertAfter(
ctx.methodBody().block().start,
String.format("\n%s = false;", hasReturnedVarName));
}
for (String methodBody : mergedCodeBlocks) {
long counter = CodeSplitUtil.getCounter().getAndIncrement();
// void f_splitXX(int x, String y)
String splitMethodDef =
type
+ " "
+ functionName
+ "_split"
+ counter
+ parameters
+ methodQualifier;
String newSplitMethod = splitMethodDef + " {\n" + methodBody + "\n}\n";
String newSplitMethodCall =
functionName
+ "_split"
+ counter
+ "("
+ String.join(", ", declarations)
+ ");\n";
if (hasReturnedVarName != null && newSplitMethod.contains(hasReturnedVarName)) {
newSplitMethodCall +=
String.format("if (%s) { return; }\n", hasReturnedVarName);
}
newSplitMethods.add(newSplitMethod);
newSplitMethodCalls.add(newSplitMethodCall);
}
for (int i = 0; i < blockStatementContexts.size(); i++) {
if (i < newSplitMethods.size()) {
rewriter.replace(
blockStatementContexts.get(i).start,
blockStatementContexts.get(i).stop,
newSplitMethodCalls.get(i));
rewriter.insertAfter(ctx.getParent().stop, "\n" + newSplitMethods.get(i));
} else {
rewriter.delete(
blockStatementContexts.get(i).start,
blockStatementContexts.get(i).stop);
}
}
return null;
}