PageRenderTime 39ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.ui.source_3.7.1.r371_v20110824-0800/org/eclipse/jdt/internal/ui/fix/CodeStyleCleanUp.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 247 lines | 188 code | 27 blank | 32 comment | 88 complexity | 9f7bc2da39021544959ce7e8f3e96c86 MD5 | raw file
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2011 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. *******************************************************************************/
  11. package org.eclipse.jdt.internal.ui.fix;
  12. import java.util.ArrayList;
  13. import java.util.Hashtable;
  14. import java.util.List;
  15. import java.util.Map;
  16. import org.eclipse.core.runtime.CoreException;
  17. import org.eclipse.jdt.core.ICompilationUnit;
  18. import org.eclipse.jdt.core.JavaCore;
  19. import org.eclipse.jdt.core.compiler.IProblem;
  20. import org.eclipse.jdt.core.dom.CompilationUnit;
  21. import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
  22. import org.eclipse.jdt.internal.corext.fix.CodeStyleFix;
  23. import org.eclipse.jdt.ui.cleanup.CleanUpRequirements;
  24. import org.eclipse.jdt.ui.cleanup.ICleanUpFix;
  25. import org.eclipse.jdt.ui.text.java.IProblemLocation;
  26. /**
  27. * Creates fixes which can resolve code style issues
  28. * @see org.eclipse.jdt.internal.corext.fix.CodeStyleFix
  29. */
  30. public class CodeStyleCleanUp extends AbstractMultiFix {
  31. public CodeStyleCleanUp() {
  32. }
  33. public CodeStyleCleanUp(Map<String, String> options) {
  34. super(options);
  35. }
  36. /**
  37. * {@inheritDoc}
  38. */
  39. @Override
  40. public CleanUpRequirements getRequirements() {
  41. boolean requireAST= requireAST();
  42. Map<String, String> requiredOptions= requireAST ? getRequiredOptions() : null;
  43. return new CleanUpRequirements(requireAST, false, false, requiredOptions);
  44. }
  45. private boolean requireAST() {
  46. boolean nonStaticFields= isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS);
  47. boolean nonStaticMethods= isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS);
  48. boolean qualifyStatic= isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS);
  49. return nonStaticFields && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS) ||
  50. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS) ||
  51. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_FIELD) ||
  52. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS) ||
  53. nonStaticMethods && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_ALWAYS) ||
  54. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_METHOD) ||
  55. nonStaticFields && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_IF_NECESSARY) ||
  56. nonStaticMethods && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_IF_NECESSARY);
  57. }
  58. /**
  59. * {@inheritDoc}
  60. */
  61. @Override
  62. protected ICleanUpFix createFix(CompilationUnit compilationUnit) throws CoreException {
  63. if (compilationUnit == null)
  64. return null;
  65. boolean nonStaticFields= isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS);
  66. boolean nonStaticMethods= isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS);
  67. boolean qualifyStatic= isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS);
  68. return CodeStyleFix.createCleanUp(compilationUnit,
  69. nonStaticFields && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS),
  70. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS),
  71. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_FIELD),
  72. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS),
  73. nonStaticMethods && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_ALWAYS),
  74. qualifyStatic && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_METHOD),
  75. nonStaticFields && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_IF_NECESSARY),
  76. nonStaticMethods && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_IF_NECESSARY)
  77. );
  78. }
  79. /**
  80. * {@inheritDoc}
  81. */
  82. @Override
  83. protected ICleanUpFix createFix(CompilationUnit compilationUnit, IProblemLocation[] problems) throws CoreException {
  84. return CodeStyleFix.createCleanUp(compilationUnit, problems,
  85. isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS),
  86. isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS),
  87. isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS));
  88. }
  89. private Map<String, String> getRequiredOptions() {
  90. Map<String, String> result= new Hashtable<String, String>();
  91. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS))
  92. result.put(JavaCore.COMPILER_PB_STATIC_ACCESS_RECEIVER, JavaCore.WARNING);
  93. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS))
  94. result.put(JavaCore.COMPILER_PB_INDIRECT_STATIC_ACCESS, JavaCore.WARNING);
  95. return result;
  96. }
  97. /**
  98. * {@inheritDoc}
  99. */
  100. @Override
  101. public String[] getStepDescriptions() {
  102. List<String> result= new ArrayList<String>();
  103. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS))
  104. result.add(MultiFixMessages.CodeStyleMultiFix_AddThisQualifier_description);
  105. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_ALWAYS))
  106. result.add(MultiFixMessages.CodeStyleCleanUp_QualifyNonStaticMethod_description);
  107. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_IF_NECESSARY))
  108. result.add(MultiFixMessages.CodeStyleCleanUp_removeFieldThis_description);
  109. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_IF_NECESSARY))
  110. result.add(MultiFixMessages.CodeStyleCleanUp_removeMethodThis_description);
  111. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_FIELD))
  112. result.add(MultiFixMessages.CodeStyleMultiFix_QualifyAccessToStaticField);
  113. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_METHOD))
  114. result.add(MultiFixMessages.CodeStyleCleanUp_QualifyStaticMethod_description);
  115. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS))
  116. result.add(MultiFixMessages.CodeStyleMultiFix_ChangeNonStaticAccess_description);
  117. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS))
  118. result.add(MultiFixMessages.CodeStyleMultiFix_ChangeIndirectAccessToStaticToDirect);
  119. return result.toArray(new String[result.size()]);
  120. }
  121. @Override
  122. public String getPreview() {
  123. StringBuffer buf= new StringBuffer();
  124. buf.append("private int value;\n"); //$NON-NLS-1$
  125. buf.append("public int get() {\n"); //$NON-NLS-1$
  126. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS)) {
  127. buf.append(" return this.value + this.value;\n"); //$NON-NLS-1$
  128. } else if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_IF_NECESSARY)) {
  129. buf.append(" return value + value;\n"); //$NON-NLS-1$
  130. } else {
  131. buf.append(" return this.value + value;\n"); //$NON-NLS-1$
  132. }
  133. buf.append("}\n"); //$NON-NLS-1$
  134. buf.append("\n"); //$NON-NLS-1$
  135. buf.append("public int getZero() {\n"); //$NON-NLS-1$
  136. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_ALWAYS)) {
  137. buf.append(" return this.get() - this.get();\n"); //$NON-NLS-1$
  138. } else if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_METHOD_USE_THIS_IF_NECESSARY)) {
  139. buf.append(" return get() - get();\n"); //$NON-NLS-1$
  140. } else {
  141. buf.append(" return this.get() - get();\n"); //$NON-NLS-1$
  142. }
  143. buf.append("}\n"); //$NON-NLS-1$
  144. buf.append("\n"); //$NON-NLS-1$
  145. buf.append("class E {\n"); //$NON-NLS-1$
  146. buf.append(" public static int NUMBER;\n"); //$NON-NLS-1$
  147. buf.append(" public static void set(int i) {\n"); //$NON-NLS-1$
  148. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_FIELD)) {
  149. buf.append(" E.NUMBER= i;\n"); //$NON-NLS-1$
  150. } else {
  151. buf.append(" NUMBER= i;\n"); //$NON-NLS-1$
  152. }
  153. buf.append(" }\n"); //$NON-NLS-1$
  154. buf.append("\n"); //$NON-NLS-1$
  155. buf.append(" public void reset() {\n"); //$NON-NLS-1$
  156. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_METHOD)) {
  157. buf.append(" E.set(0);\n"); //$NON-NLS-1$
  158. } else {
  159. buf.append(" set(0);\n"); //$NON-NLS-1$
  160. }
  161. buf.append(" }\n"); //$NON-NLS-1$
  162. buf.append("}\n"); //$NON-NLS-1$
  163. buf.append("\n"); //$NON-NLS-1$
  164. buf.append("class ESub extends E {\n"); //$NON-NLS-1$
  165. buf.append(" public void reset() {\n"); //$NON-NLS-1$
  166. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS)) {
  167. buf.append(" E.NUMBER= 0;\n"); //$NON-NLS-1$
  168. } else {
  169. buf.append(" ESub.NUMBER= 0;\n"); //$NON-NLS-1$
  170. }
  171. buf.append(" }\n"); //$NON-NLS-1$
  172. buf.append("}\n"); //$NON-NLS-1$
  173. buf.append("\n"); //$NON-NLS-1$
  174. buf.append("public void dec() {\n"); //$NON-NLS-1$
  175. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS)) {
  176. buf.append(" E.NUMBER--;\n"); //$NON-NLS-1$
  177. } else {
  178. buf.append(" (new E()).NUMBER--;\n"); //$NON-NLS-1$
  179. }
  180. buf.append("}\n"); //$NON-NLS-1$
  181. return buf.toString();
  182. }
  183. /**
  184. * {@inheritDoc}
  185. */
  186. public boolean canFix(ICompilationUnit compilationUnit, IProblemLocation problem) {
  187. if (IProblem.UnqualifiedFieldAccess == problem.getProblemId())
  188. return isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS);
  189. if (CodeStyleFix.isIndirectStaticAccess(problem))
  190. return isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS);
  191. if (CodeStyleFix.isNonStaticAccess(problem))
  192. return isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS);
  193. return false;
  194. }
  195. /**
  196. * {@inheritDoc}
  197. */
  198. @Override
  199. public int computeNumberOfFixes(CompilationUnit compilationUnit) {
  200. int result= 0;
  201. IProblem[] problems= compilationUnit.getProblems();
  202. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS))
  203. result+= getNumberOfProblems(problems, IProblem.UnqualifiedFieldAccess);
  204. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_SUBTYPE_ACCESS)) {
  205. for (int i=0;i<problems.length;i++) {
  206. int id= problems[i].getID();
  207. if (id == IProblem.IndirectAccessToStaticField || id == IProblem.IndirectAccessToStaticMethod)
  208. result++;
  209. }
  210. }
  211. if (isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS) && isEnabled(CleanUpConstants.MEMBER_ACCESSES_STATIC_QUALIFY_WITH_DECLARING_CLASS_INSTANCE_ACCESS)) {
  212. for (int i=0;i<problems.length;i++) {
  213. int id= problems[i].getID();
  214. if (id == IProblem.NonStaticAccessToStaticField || id == IProblem.NonStaticAccessToStaticMethod)
  215. result++;
  216. }
  217. }
  218. return result;
  219. }
  220. }