Bug 572330 - [cleanup] "Static inner class" should handle method calls

"Static inner class" should convert inner class to static, even if it
calls methods on expressions.

Given:
private class TopLevelClass {
  private class InnerClass {
    private InnerClass() {
      System.out.println();
    }
  }
}

When:
Applying "Static inner class" cleanup...

Expected:
private class TopLevelClass {
  private static class InnerClass {
    private InnerClass() {
      System.out.println();
    }
  }
}

Actual:
(no change)

Change-Id: Ic4dad40a9f781d28a8e87f1531b3d9979298a04d
Signed-off-by: Fabrice Tiercelin <fabrice.tiercelin@yahoo.fr>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
index 6f8ad16..8558970 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
@@ -15211,6 +15211,7 @@
 				+ "import java.io.File;\n" //
 				+ "import java.util.Arrays;\n" //
 				+ "import java.util.Date;\n" //
+				+ "import java.util.List;\n" //
 				+ "\n" //
 				+ "public class E {\n" //
 				+ "    public class RefactorThisInnerClass {\n" //
@@ -15376,6 +15377,12 @@
 				+ "            return RefactorInnerClassWithQualifiedThisReference.this;\n" //
 				+ "        }\n" //
 				+ "    }\n" //
+				+ "\n" //
+				+ "    public class RefactorInnerClassWithMethodCall {\n" //
+				+ "        public int methodWithStaticMethodCall(List<String> texts) {\n" //
+				+ "            return texts.size();\n" //
+				+ "        }\n" //
+				+ "    }\n" //
 				+ "}\n";
 
 		String expected= "" //
@@ -15386,6 +15393,7 @@
 				+ "import java.io.File;\n" //
 				+ "import java.util.Arrays;\n" //
 				+ "import java.util.Date;\n" //
+				+ "import java.util.List;\n" //
 				+ "\n" //
 				+ "public class E {\n" //
 				+ "    public static class RefactorThisInnerClass {\n" //
@@ -15552,6 +15560,12 @@
 				+ "            return RefactorInnerClassWithQualifiedThisReference.this;\n" //
 				+ "        }\n" //
 				+ "    }\n" //
+				+ "\n" //
+				+ "    public static class RefactorInnerClassWithMethodCall {\n" //
+				+ "        public int methodWithStaticMethodCall(List<String> texts) {\n" //
+				+ "            return texts.size();\n" //
+				+ "        }\n" //
+				+ "    }\n" //
 				+ "}\n";
 
 		// When
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/StaticInnerClassCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/StaticInnerClassCleanUp.java
index 911b75f..e73a388 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/StaticInnerClassCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/StaticInnerClassCleanUp.java
@@ -32,6 +32,7 @@
 import org.eclipse.jdt.core.dom.IExtendedModifier;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.MethodInvocation;
 import org.eclipse.jdt.core.dom.Modifier;
 import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
 import org.eclipse.jdt.core.dom.QualifiedName;
@@ -132,6 +133,15 @@
 						return true;
 					}
 
+					if (node.getLocationInParent() == MethodInvocation.NAME_PROPERTY) {
+						MethodInvocation methodInvocation= (MethodInvocation) node.getParent();
+
+						if (methodInvocation.getExpression() != null) {
+							// The expression will be evaluated instead
+							return true;
+						}
+					}
+
 					IBinding binding= node.resolveBinding();
 					ASTNode root= node.getRoot();