Bug 574588 - fix NPE in "Convert StringBuffer to StringBuilder" cleanup

- fix MethodDeclaration visitor in StringBufferToStringBuilderFixCore
  to handle when return type comes back null as in the case of a
  constructor
- add testing of private constructors to CleanUpTest1d5 and ensure
  an all change will modify StringBuffer parameters
- add testing of private constructors to CleanUpTest16

Change-Id: Id4b7b877ec862356733fb807eaee40e5d3aa1cd1
Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de>
Signed-off-by: Jeff Johnston <jjohnstn@redhat.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/182758
Tested-by: JDT Bot <jdt-bot@eclipse.org>
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/StringBufferToStringBuilderFixCore.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/StringBufferToStringBuilderFixCore.java
index 9d65bca..ba6128a 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/StringBufferToStringBuilderFixCore.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/StringBufferToStringBuilderFixCore.java
@@ -131,13 +131,14 @@
 
 		@Override
 		public boolean visit(final MethodDeclaration visited) {
-			Type returnType= visited.getReturnType2();
-			ITypeBinding returnTypeBinding= returnType.resolveBinding();
 			IMethodBinding methodBinding= visited.resolveBinding();
-			if (methodBinding == null || returnTypeBinding == null) {
+			if (methodBinding == null) {
 				return true;
 			}
-			checkType(returnType);
+			Type returnType= visited.getReturnType2();
+			if (returnType != null) {
+				checkType(returnType);
+			}
 			for (Object obj : visited.parameters()) {
 				SingleVariableDeclaration parm= (SingleVariableDeclaration)obj;
 				Type type= parm.getType();
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
index 2e9f06a..6f64edb 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
@@ -449,6 +449,8 @@
 				+ "package test1;\n" //
 				+ "\n" //
 				+ "public class TestStringBuilderCleanup extends SuperClass {\n" //
+				+ "    private TestStringBuilderCleanup(){\n" //
+				+ "    }\n" //
 				+ "    public record K(StringBuffer comp1) {\n" //
 				+ "        public static StringBuffer field1;\n" //
 				+ "        public static StringBuffer field2;\n" //
@@ -469,6 +471,8 @@
 				+ "package test1;\n" //
 				+ "\n" //
 				+ "public class TestStringBuilderCleanup extends SuperClass {\n" //
+				+ "    private TestStringBuilderCleanup(){\n" //
+				+ "    }\n" //
 				+ "    public record K(StringBuffer comp1) {\n" //
 				+ "        public static StringBuffer field1;\n" //
 				+ "        public static StringBuffer field2;\n" //
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
index a90358c..f944e5b 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
@@ -3887,6 +3887,25 @@
 	}
 
 	@Test
+	public void testDoNotConvertStringBufferToStringBuilder() throws Exception {
+		// test bug 574588 NPE on private constructor
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
+
+		String sample= "" //
+				+ "package test1;\n" //
+				+ "\n" //
+				+ "public class TestStringBuilderCleanup {\n" //
+				+ "    private TestStringBuilderCleanup(){\n" //
+				+ "    }\n" //
+				+ "}\n";
+		ICompilationUnit cu1= pack1.createCompilationUnit("TestStringBuilderCleanup.java", sample, false, null);
+
+		enable(CleanUpConstants.STRINGBUFFER_TO_STRINGBUILDER);
+
+		assertRefactoringHasNoChange(new ICompilationUnit[] { cu1 });
+	}
+
+	@Test
 	public void testConvertStringBufferToStringBuilderAll() throws Exception {
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
 		String sample0= "" //
@@ -3894,6 +3913,9 @@
 				+ "\n" //
 				+ "public class SuperClass {\n" //
 				+ "    public StringBuffer field0;\n" //
+				+ "    private SuperClass(StringBuffer a) {\n" //
+				+ "        this.field0 = a;\n" //
+				+ "    }\n" //
 				+ "    public void method0(StringBuffer parm) {\n" //
 				+ "        System.out.println(parm.toString());\n" //
 				+ "    }\n" //
@@ -3977,6 +3999,9 @@
 				+ "\n" //
 				+ "public class SuperClass {\n" //
 				+ "    public StringBuilder field0;\n" //
+				+ "    private SuperClass(StringBuilder a) {\n" //
+				+ "        this.field0 = a;\n" //
+				+ "    }\n" //
 				+ "    public void method0(StringBuilder parm) {\n" //
 				+ "        System.out.println(parm.toString());\n" //
 				+ "    }\n" //