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

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.core.source_3.7.1.v_B76_R37x/org/eclipse/jdt/internal/core/SourceMethod.java

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