diff --git a/java.editor/src/org/netbeans/modules/java/editor/codegen/GeneratorUtils.java b/java.editor/src/org/netbeans/modules/java/editor/codegen/GeneratorUtils.java --- a/java.editor/src/org/netbeans/modules/java/editor/codegen/GeneratorUtils.java +++ b/java.editor/src/org/netbeans/modules/java/editor/codegen/GeneratorUtils.java @@ -124,6 +124,28 @@ return copy.getTreeMaker().insertClassMember((ClassTree)path.getLeaf(), idx, member); } + /** + * Inserts the new method immediately after the parent method that calls it. + * This follows the Java coding guidelines: "methods should be grouped by functionality rather than by scope or accessibility." + * @param copy + * @param path + * @param newMethod + * @param parentMethod + * @return + */ + public static ClassTree insertMethodAfterPreviousMethod(WorkingCopy copy, TreePath path, Tree newMethod, Tree parentMethod) { + assert path.getLeaf().getKind() == Tree.Kind.CLASS; + assert newMethod.getKind() == Tree.Kind.METHOD; + int idx = 0; + for (Tree tree : ((ClassTree)path.getLeaf()).getMembers()) { + idx++; + if (tree.equals(parentMethod)) { + break; + } + } + return copy.getTreeMaker().insertClassMember((ClassTree)path.getLeaf(), idx, newMethod); + } + public static List findUndefs(CompilationInfo info, TypeElement impl) { if (ERR.isLoggable(ErrorManager.INFORMATIONAL)) ERR.log(ErrorManager.INFORMATIONAL, "findUndefs(" + info + ", " + impl + ")"); diff --git a/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceHint.java b/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceHint.java --- a/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceHint.java +++ b/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceHint.java @@ -1800,10 +1800,12 @@ MethodTree method = make.Method(mods, name, returnTypeTree, Collections.emptyList(), formalArguments, thrown, make.Block(methodStatements, false), null); TreePath pathToClass = findClass(block); + TreePath pathToParentMethod = findMethod(block); assert pathToClass != null; + assert pathToParentMethod != null; - ClassTree nueClass = GeneratorUtils.insertClassMember(copy, pathToClass, method); + ClassTree nueClass = GeneratorUtils.insertMethodAfterPreviousMethod(copy, pathToClass, method, pathToParentMethod.getLeaf()); copy.rewrite(pathToClass.getLeaf(), nueClass); copy.rewrite(statements, make.Block(nueStatements, statements.isStatic()));