PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/plug-ins/helios/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMethod.java

https://github.com/vazexqi/CodingSpectator
Java | 349 lines | 234 code | 34 blank | 81 comment | 41 complexity | 3c638b3b2775c3bfbfa371eb7a3e62b6 MD5 | raw file
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2008 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.core;
  12. import org.eclipse.jdt.core.Flags;
  13. import org.eclipse.jdt.core.IJavaElement;
  14. import org.eclipse.jdt.core.IMemberValuePair;
  15. import org.eclipse.jdt.core.IMethod;
  16. import org.eclipse.jdt.core.IType;
  17. import org.eclipse.jdt.core.ITypeParameter;
  18. import org.eclipse.jdt.core.JavaModelException;
  19. import org.eclipse.jdt.core.Signature;
  20. import org.eclipse.jdt.core.compiler.CharOperation;
  21. import org.eclipse.jdt.internal.compiler.lookup.Binding;
  22. import org.eclipse.jdt.internal.core.util.Util;
  23. /**
  24. * @see IMethod
  25. */
  26. public class SourceMethod extends NamedMember implements IMethod {
  27. /**
  28. * The parameter type signatures of the method - stored locally to perform equality test.
  29. * <code>null</code> indicates no parameters.
  30. */
  31. protected String[] parameterTypes;
  32. protected SourceMethod(JavaElement parent, String name, String[] parameterTypes) {
  33. super(parent, name);
  34. // Assertion disabled since bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=179011
  35. // Assert.isTrue(name.indexOf('.') == -1);
  36. if (parameterTypes == null) {
  37. this.parameterTypes= CharOperation.NO_STRINGS;
  38. } else {
  39. this.parameterTypes= parameterTypes;
  40. }
  41. }
  42. protected void closing(Object info) throws JavaModelException {
  43. super.closing(info);
  44. SourceMethodElementInfo elementInfo= (SourceMethodElementInfo)info;
  45. ITypeParameter[] typeParameters= elementInfo.typeParameters;
  46. for (int i= 0, length= typeParameters.length; i < length; i++) {
  47. ((TypeParameter)typeParameters[i]).close();
  48. }
  49. }
  50. public boolean equals(Object o) {
  51. if (!(o instanceof SourceMethod))
  52. return false;
  53. return super.equals(o) && Util.equalArraysOrNull(this.parameterTypes, ((SourceMethod)o).parameterTypes);
  54. }
  55. public IMemberValuePair getDefaultValue() throws JavaModelException {
  56. SourceMethodElementInfo sourceMethodInfo= (SourceMethodElementInfo)getElementInfo();
  57. if (sourceMethodInfo.isAnnotationMethod()) {
  58. return ((SourceAnnotationMethodInfo)sourceMethodInfo).defaultValue;
  59. }
  60. return null;
  61. }
  62. /**
  63. * @see IJavaElement
  64. */
  65. public int getElementType() {
  66. return METHOD;
  67. }
  68. /**
  69. * @see IMethod
  70. */
  71. public String[] getExceptionTypes() throws JavaModelException {
  72. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  73. char[][] exs= info.getExceptionTypeNames();
  74. return CompilationUnitStructureRequestor.convertTypeNamesToSigs(exs);
  75. }
  76. /**
  77. * @see JavaElement#getHandleMemento(StringBuffer)
  78. */
  79. protected void getHandleMemento(StringBuffer buff) {
  80. ((JavaElement)getParent()).getHandleMemento(buff);
  81. char delimiter= getHandleMementoDelimiter();
  82. buff.append(delimiter);
  83. escapeMementoName(buff, getElementName());
  84. for (int i= 0; i < this.parameterTypes.length; i++) {
  85. buff.append(delimiter);
  86. escapeMementoName(buff, this.parameterTypes[i]);
  87. }
  88. if (this.occurrenceCount > 1) {
  89. buff.append(JEM_COUNT);
  90. buff.append(this.occurrenceCount);
  91. }
  92. }
  93. /**
  94. * @see JavaElement#getHandleMemento()
  95. */
  96. protected char getHandleMementoDelimiter() {
  97. return JavaElement.JEM_METHOD;
  98. }
  99. /* (non-Javadoc)
  100. * @see org.eclipse.jdt.core.IMethod#getKey()
  101. */
  102. public String getKey() {
  103. try {
  104. return getKey(this, false/*don't open*/);
  105. } catch (JavaModelException e) {
  106. // happen only if force open is true
  107. return null;
  108. }
  109. }
  110. /**
  111. * @see IMethod
  112. */
  113. public int getNumberOfParameters() {
  114. return this.parameterTypes == null ? 0 : this.parameterTypes.length;
  115. }
  116. /**
  117. * @see IMethod
  118. */
  119. public String[] getParameterNames() throws JavaModelException {
  120. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  121. char[][] names= info.getArgumentNames();
  122. return CharOperation.toStrings(names);
  123. }
  124. /**
  125. * @see IMethod
  126. */
  127. public String[] getParameterTypes() {
  128. return this.parameterTypes;
  129. }
  130. public ITypeParameter getTypeParameter(String typeParameterName) {
  131. return new TypeParameter(this, typeParameterName);
  132. }
  133. public ITypeParameter[] getTypeParameters() throws JavaModelException {
  134. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  135. return info.typeParameters;
  136. }
  137. /**
  138. * @see IMethod#getTypeParameterSignatures()
  139. * @since 3.0
  140. * @deprecated
  141. */
  142. public String[] getTypeParameterSignatures() throws JavaModelException {
  143. ITypeParameter[] typeParameters= getTypeParameters();
  144. int length= typeParameters.length;
  145. String[] typeParameterSignatures= new String[length];
  146. for (int i= 0; i < length; i++) {
  147. TypeParameter typeParameter= (TypeParameter)typeParameters[i];
  148. TypeParameterElementInfo info= (TypeParameterElementInfo)typeParameter.getElementInfo();
  149. char[][] bounds= info.bounds;
  150. if (bounds == null) {
  151. typeParameterSignatures[i]= Signature.createTypeParameterSignature(typeParameter.getElementName(), CharOperation.NO_STRINGS);
  152. } else {
  153. int boundsLength= bounds.length;
  154. char[][] boundSignatures= new char[boundsLength][];
  155. for (int j= 0; j < boundsLength; j++) {
  156. boundSignatures[j]= Signature.createCharArrayTypeSignature(bounds[j], false);
  157. }
  158. typeParameterSignatures[i]= new String(Signature.createTypeParameterSignature(typeParameter.getElementName().toCharArray(), boundSignatures));
  159. }
  160. }
  161. return typeParameterSignatures;
  162. }
  163. /*
  164. * @see JavaElement#getPrimaryElement(boolean)
  165. */
  166. public IJavaElement getPrimaryElement(boolean checkOwner) {
  167. if (checkOwner) {
  168. CompilationUnit cu= (CompilationUnit)getAncestor(COMPILATION_UNIT);
  169. if (cu.isPrimary())
  170. return this;
  171. }
  172. IJavaElement primaryParent= this.parent.getPrimaryElement(false);
  173. return ((IType)primaryParent).getMethod(this.name, this.parameterTypes);
  174. }
  175. public String[] getRawParameterNames() throws JavaModelException {
  176. return getParameterNames();
  177. }
  178. /**
  179. * @see IMethod
  180. */
  181. public String getReturnType() throws JavaModelException {
  182. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  183. return Signature.createTypeSignature(info.getReturnTypeName(), false);
  184. }
  185. /**
  186. * @see IMethod
  187. */
  188. public String getSignature() throws JavaModelException {
  189. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  190. return Signature.createMethodSignature(this.parameterTypes, Signature.createTypeSignature(info.getReturnTypeName(), false));
  191. }
  192. /**
  193. * @see org.eclipse.jdt.internal.core.JavaElement#hashCode()
  194. */
  195. public int hashCode() {
  196. int hash= super.hashCode();
  197. for (int i= 0, length= this.parameterTypes.length; i < length; i++) {
  198. hash= Util.combineHashCodes(hash, this.parameterTypes[i].hashCode());
  199. }
  200. return hash;
  201. }
  202. /**
  203. * @see IMethod
  204. */
  205. public boolean isConstructor() throws JavaModelException {
  206. if (!getElementName().equals(this.parent.getElementName())) {
  207. // faster than reaching the info
  208. return false;
  209. }
  210. SourceMethodElementInfo info= (SourceMethodElementInfo)getElementInfo();
  211. return info.isConstructor();
  212. }
  213. /**
  214. * @see IMethod#isMainMethod()
  215. */
  216. public boolean isMainMethod() throws JavaModelException {
  217. return this.isMainMethod(this);
  218. }
  219. /* (non-Javadoc)
  220. * @see org.eclipse.jdt.core.IMethod#isResolved()
  221. */
  222. public boolean isResolved() {
  223. return false;
  224. }
  225. /**
  226. * @see IMethod#isSimilar(IMethod)
  227. */
  228. public boolean isSimilar(IMethod method) {
  229. return areSimilarMethods(
  230. getElementName(), getParameterTypes(),
  231. method.getElementName(), method.getParameterTypes(),
  232. null);
  233. }
  234. /**
  235. */
  236. public String readableName() {
  237. StringBuffer buffer= new StringBuffer(super.readableName());
  238. buffer.append('(');
  239. int length;
  240. if (this.parameterTypes != null && (length= this.parameterTypes.length) > 0) {
  241. for (int i= 0; i < length; i++) {
  242. buffer.append(Signature.toString(this.parameterTypes[i]));
  243. if (i < length - 1) {
  244. buffer.append(", "); //$NON-NLS-1$
  245. }
  246. }
  247. }
  248. buffer.append(')');
  249. return buffer.toString();
  250. }
  251. public JavaElement resolved(Binding binding) {
  252. SourceRefElement resolvedHandle= new ResolvedSourceMethod(this.parent, this.name, this.parameterTypes, new String(binding.computeUniqueKey()));
  253. resolvedHandle.occurrenceCount= this.occurrenceCount;
  254. return resolvedHandle;
  255. }
  256. /**
  257. * @private Debugging purposes
  258. */
  259. protected void toStringInfo(int tab, StringBuffer buffer, Object info, boolean showResolvedInfo) {
  260. buffer.append(tabString(tab));
  261. if (info == null) {
  262. toStringName(buffer);
  263. buffer.append(" (not open)"); //$NON-NLS-1$
  264. } else if (info == NO_INFO) {
  265. toStringName(buffer);
  266. } else {
  267. SourceMethodElementInfo methodInfo= (SourceMethodElementInfo)info;
  268. int flags= methodInfo.getModifiers();
  269. if (Flags.isStatic(flags)) {
  270. buffer.append("static "); //$NON-NLS-1$
  271. }
  272. if (!methodInfo.isConstructor()) {
  273. buffer.append(methodInfo.getReturnTypeName());
  274. buffer.append(' ');
  275. }
  276. toStringName(buffer, flags);
  277. }
  278. }
  279. protected void toStringName(StringBuffer buffer) {
  280. toStringName(buffer, 0);
  281. }
  282. protected void toStringName(StringBuffer buffer, int flags) {
  283. buffer.append(getElementName());
  284. buffer.append('(');
  285. String[] parameters= getParameterTypes();
  286. int length;
  287. if (parameters != null && (length= parameters.length) > 0) {
  288. boolean isVarargs= Flags.isVarargs(flags);
  289. for (int i= 0; i < length; i++) {
  290. try {
  291. if (i < length - 1) {
  292. buffer.append(Signature.toString(parameters[i]));
  293. buffer.append(", "); //$NON-NLS-1$
  294. } else if (isVarargs) {
  295. // remove array from signature
  296. String parameter= parameters[i].substring(1);
  297. buffer.append(Signature.toString(parameter));
  298. buffer.append(" ..."); //$NON-NLS-1$
  299. } else {
  300. buffer.append(Signature.toString(parameters[i]));
  301. }
  302. } catch (IllegalArgumentException e) {
  303. // parameter signature is malformed
  304. buffer.append("*** invalid signature: "); //$NON-NLS-1$
  305. buffer.append(parameters[i]);
  306. }
  307. }
  308. }
  309. buffer.append(')');
  310. if (this.occurrenceCount > 1) {
  311. buffer.append("#"); //$NON-NLS-1$
  312. buffer.append(this.occurrenceCount);
  313. }
  314. }
  315. }