1 /*******************************************************************************
2 * Copyright (c) 2000, 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package net.sourceforge.phpdt.internal.core;
13 import java.util.ArrayList;
15 import net.sourceforge.phpdt.core.Flags;
16 import net.sourceforge.phpdt.core.IJavaElement;
17 import net.sourceforge.phpdt.core.IMember;
18 import net.sourceforge.phpdt.core.IMethod;
19 import net.sourceforge.phpdt.core.ISourceRange;
20 import net.sourceforge.phpdt.core.IType;
21 import net.sourceforge.phpdt.core.JavaModelException;
22 import net.sourceforge.phpdt.core.Signature;
23 import net.sourceforge.phpdt.core.jdom.IDOMNode;
29 public abstract class Member extends SourceRefElement implements IMember {
30 protected Member(JavaElement parent, String name) {
34 protected boolean areSimilarMethods(String name1, String[] params1,
35 String name2, String[] params2, String[] simpleNames1) {
37 if (name1.equals(name2)) {
38 int params1Length = params1.length;
39 if (params1Length == params2.length) {
40 for (int i = 0; i < params1Length; i++) {
41 String simpleName1 = simpleNames1 == null ? Signature
42 .getSimpleName(Signature.toString(params1[i]))
44 String simpleName2 = Signature.getSimpleName(Signature
45 .toString(params2[i]));
46 if (!simpleName1.equals(simpleName2)) {
57 * Converts a field constant from the compiler's representation to the Java
58 * Model constant representation (Number or String).
60 // protected static Object convertConstant(Constant constant) {
61 // if (constant == null)
63 // if (constant == Constant.NotAConstant) {
66 // switch (constant.typeID()) {
67 // case TypeIds.T_boolean :
68 // return constant.booleanValue() ? Boolean.TRUE : Boolean.FALSE;
69 // case TypeIds.T_byte :
70 // return new Byte(constant.byteValue());
71 // case TypeIds.T_char :
72 // return new Character(constant.charValue());
73 // case TypeIds.T_double :
74 // return new Double(constant.doubleValue());
75 // case TypeIds.T_float :
76 // return new Float(constant.floatValue());
77 // case TypeIds.T_int :
78 // return new Integer(constant.intValue());
79 // case TypeIds.T_long :
80 // return new Long(constant.longValue());
81 // case TypeIds.T_short :
82 // return new Short(constant.shortValue());
83 // case TypeIds.T_String :
84 // return constant.stringValue();
90 * @see JavaElement#equalsDOMNode
92 protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException {
93 return getElementName().equals(node.getName());
97 * Helper method for SourceType.findMethods and BinaryType.findMethods
99 protected IMethod[] findMethods(IMethod method, IMethod[] methods) {
100 String elementName = method.getElementName();
101 String[] parameters = method.getParameterTypes();
102 int paramLength = parameters.length;
103 String[] simpleNames = new String[paramLength];
104 for (int i = 0; i < paramLength; i++) {
105 simpleNames[i] = Signature.getSimpleName(Signature
106 .toString(parameters[i]));
108 ArrayList list = new ArrayList();
109 next: for (int i = 0, length = methods.length; i < length; i++) {
110 IMethod existingMethod = methods[i];
111 if (this.areSimilarMethods(elementName, parameters, existingMethod
112 .getElementName(), existingMethod.getParameterTypes(),
114 list.add(existingMethod);
117 int size = list.size();
121 IMethod[] result = new IMethod[size];
122 list.toArray(result);
130 // public IClassFile getClassFile() {
131 // return ((JavaElement)getParent()).getClassFile();
136 public IType getDeclaringType() {
137 JavaElement parentElement = (JavaElement) getParent();
138 if (parentElement.getElementType() == TYPE) {
139 return (IType) parentElement;
147 public int getFlags() throws JavaModelException {
148 MemberElementInfo info = (MemberElementInfo) getElementInfo();
149 return info.getModifiers();
153 * @see JavaElement#getHandleMemento()
155 protected char getHandleMementoDelimiter() {
156 return JavaElement.JEM_TYPE;
160 * Returns the outermost context defining a local element. Per construction,
161 * it can only be a method/field/initializarer member; thus, returns null if
162 * this member is already a top-level type or member type. e.g for
163 * X.java/X/Y/foo()/Z/bar()/T, it will return X.java/X/Y/foo()
165 public Member getOuterMostLocalContext() {
166 IJavaElement current = this;
167 Member lastLocalContext = null;
168 parentLoop: while (true) {
169 switch (current.getElementType()) {
171 case COMPILATION_UNIT:
172 break parentLoop; // done recursing
174 // cannot be a local context
179 // these elements can define local members
180 lastLocalContext = (Member) current;
183 current = current.getParent();
185 return lastLocalContext;
191 public ISourceRange getNameRange() throws JavaModelException {
192 MemberElementInfo info = (MemberElementInfo) getElementInfo();
193 return new SourceRange(info.getNameSourceStart(), info
195 - info.getNameSourceStart() + 1);
201 public IType getType(String typeName, int count) {
203 throw new IllegalArgumentException(
204 "Not a source member " + toStringWithAncestors()); //$NON-NLS-1$
206 SourceType type = new SourceType(this, typeName);
207 type.occurrenceCount = count;
215 public boolean isBinary() {
219 protected boolean isMainMethod(IMethod method) throws JavaModelException {
220 if ("main".equals(method.getElementName()) && Signature.SIG_VOID.equals(method.getReturnType())) { //$NON-NLS-1$
221 int flags = method.getFlags();
222 if (Flags.isStatic(flags) && Flags.isPublic(flags)) {
223 String[] paramTypes = method.getParameterTypes();
224 if (paramTypes.length == 1) {
225 String name = Signature.toString(paramTypes[0]);
226 return "String[]".equals(Signature.getSimpleName(name)); //$NON-NLS-1$
236 public boolean isReadOnly() {
237 return false; // getClassFile() != null;
242 public String readableName() {
244 IJavaElement declaringType = getDeclaringType();
245 if (declaringType != null) {
246 String declaringName = ((JavaElement) getDeclaringType())
248 StringBuffer buffer = new StringBuffer(declaringName);
250 buffer.append(this.getElementName());
251 return buffer.toString();
253 return super.readableName();
258 * Updates the name range for this element.
260 protected void updateNameRange(int nameStart, int nameEnd) {
262 MemberElementInfo info = (MemberElementInfo) getElementInfo();
263 info.setNameSourceStart(nameStart);
264 info.setNameSourceEnd(nameEnd);
265 } catch (JavaModelException npe) {