Organized imports
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / Member.java
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
7  * 
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.core;
12
13 import java.util.ArrayList;
14
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;
24
25
26 /**
27  * @see IMember
28  */
29
30 public abstract class Member extends SourceRefElement implements IMember {
31         protected Member(JavaElement parent, String name) {
32                 super(parent, name);
33         }
34 protected boolean areSimilarMethods(
35         String name1, String[] params1, 
36         String name2, String[] params2,
37         String[] simpleNames1) {
38                 
39         if (name1.equals(name2)) {
40                 int params1Length = params1.length;
41                 if (params1Length == params2.length) {
42                         for (int i = 0; i < params1Length; i++) {
43                                 String simpleName1 = 
44                                         simpleNames1 == null ? 
45                                                 Signature.getSimpleName(Signature.toString(params1[i])) :
46                                                 simpleNames1[i];
47                                 String simpleName2 = Signature.getSimpleName(Signature.toString(params2[i]));
48                                 if (!simpleName1.equals(simpleName2)) {
49                                         return false;
50                                 }
51                         }
52                         return true;
53                 }
54         }
55         return false;
56 }
57 /**
58  * Converts a field constant from the compiler's representation
59  * to the Java Model constant representation (Number or String).
60  */
61 //protected static Object convertConstant(Constant constant) {
62 //      if (constant == null)
63 //              return null;
64 //      if (constant == Constant.NotAConstant) {
65 //              return null;
66 //      }
67 //      switch (constant.typeID()) {
68 //              case TypeIds.T_boolean :
69 //                      return constant.booleanValue() ? Boolean.TRUE : Boolean.FALSE;
70 //              case TypeIds.T_byte :
71 //                      return new Byte(constant.byteValue());
72 //              case TypeIds.T_char :
73 //                      return new Character(constant.charValue());
74 //              case TypeIds.T_double :
75 //                      return new Double(constant.doubleValue());
76 //              case TypeIds.T_float :
77 //                      return new Float(constant.floatValue());
78 //              case TypeIds.T_int :
79 //                      return new Integer(constant.intValue());
80 //              case TypeIds.T_long :
81 //                      return new Long(constant.longValue());
82 //              case TypeIds.T_short :
83 //                      return new Short(constant.shortValue());
84 //              case TypeIds.T_String :
85 //                      return constant.stringValue();
86 //              default :
87 //                      return null;
88 //      }
89 //}
90 /**
91  * @see JavaElement#equalsDOMNode
92  */
93 protected boolean equalsDOMNode(IDOMNode node) throws JavaModelException {
94         return getElementName().equals(node.getName());
95 }
96 /*
97  * Helper method for SourceType.findMethods and BinaryType.findMethods
98  */
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.toString(parameters[i]));
106         }
107         ArrayList list = new ArrayList();
108         next: for (int i = 0, length = methods.length; i < length; i++) {
109                 IMethod existingMethod = methods[i];
110                 if (this.areSimilarMethods(
111                                 elementName,
112                                 parameters,
113                                 existingMethod.getElementName(),
114                                 existingMethod.getParameterTypes(),
115                                 simpleNames)) {
116                         list.add(existingMethod);
117                 }
118         }
119         int size = list.size();
120         if (size == 0) {
121                 return null;
122         } else {
123                 IMethod[] result = new IMethod[size];
124                 list.toArray(result);
125                 return result;
126         }
127 }
128 /**
129  * @see IMember
130  */
131 //public IClassFile getClassFile() {
132 //      return ((JavaElement)getParent()).getClassFile();
133 //}
134 /**
135  * @see IMember
136  */
137 public IType getDeclaringType() {
138         JavaElement parentElement = (JavaElement)getParent();
139         if (parentElement.getElementType() == TYPE) {
140                 return (IType) parentElement;
141         }
142         return null;
143 }
144 /**
145  * @see IMember
146  */
147 public int getFlags() throws JavaModelException {
148         MemberElementInfo info = (MemberElementInfo) getElementInfo();
149         return info.getModifiers();
150 }
151 /**
152  * @see JavaElement#getHandleMemento()
153  */
154 protected char getHandleMementoDelimiter() {
155         return JavaElement.JEM_TYPE;
156 }
157 /*
158  * Returns the outermost context defining a local element. Per construction, it can only be a
159  * method/field/initializarer member; thus, returns null if this member is already a top-level type or member type.
160  * e.g for X.java/X/Y/foo()/Z/bar()/T, it will return X.java/X/Y/foo()
161  */
162 public Member getOuterMostLocalContext() {
163         IJavaElement current = this;
164         Member lastLocalContext = null;
165         parentLoop: while (true) {
166                 switch (current.getElementType()) {
167                         case CLASS_FILE:
168                         case COMPILATION_UNIT:
169                                 break parentLoop; // done recursing
170                         case TYPE:
171                                 // cannot be a local context
172                                 break;
173                         case INITIALIZER:
174                         case FIELD:
175                         case METHOD:
176                                  // these elements can define local members
177                                 lastLocalContext = (Member) current;
178                                 break;
179                 }               
180                 current = current.getParent();
181         } 
182         return lastLocalContext;
183 }
184 /**
185  * @see IMember
186  */
187 public ISourceRange getNameRange() throws JavaModelException {
188         MemberElementInfo info= (MemberElementInfo)getElementInfo();
189         return new SourceRange(info.getNameSourceStart(), info.getNameSourceEnd() - info.getNameSourceStart() + 1);
190 }
191 /**
192  * @see IMember
193  */
194 public IType getType(String typeName, int count) {
195         if (isBinary()) {
196                 throw new IllegalArgumentException("Not a source member " + toStringWithAncestors()); //$NON-NLS-1$
197         } else {
198                 SourceType type = new SourceType(this, typeName);
199                 type.occurrenceCount = count;
200                 return type;
201         }
202 }
203 /**
204  * @see IMember
205  */
206 public boolean isBinary() {
207         return false;
208 }
209 protected boolean isMainMethod(IMethod method) throws JavaModelException {
210         if ("main".equals(method.getElementName()) && Signature.SIG_VOID.equals(method.getReturnType())) { //$NON-NLS-1$
211                 int flags= method.getFlags();
212                 if (Flags.isStatic(flags) && Flags.isPublic(flags)) {
213                         String[] paramTypes= method.getParameterTypes();
214                         if (paramTypes.length == 1) {
215                                 String name=  Signature.toString(paramTypes[0]);
216                                 return "String[]".equals(Signature.getSimpleName(name)); //$NON-NLS-1$
217                         }
218                 }
219         }
220         return false;
221 }
222 /**
223  * @see IJavaElement
224  */
225 public boolean isReadOnly() {
226         return false; //getClassFile() != null;
227 }
228 /**
229  */
230 public String readableName() {
231
232         IJavaElement declaringType = getDeclaringType();
233         if (declaringType != null) {
234                 String declaringName = ((JavaElement) getDeclaringType()).readableName();
235                 StringBuffer buffer = new StringBuffer(declaringName);
236                 buffer.append('.');
237                 buffer.append(this.getElementName());
238                 return buffer.toString();
239         } else {
240                 return super.readableName();
241         }
242 }
243 /**
244  * Updates the name range for this element.
245  */
246 protected void updateNameRange(int nameStart, int nameEnd) {
247         try {
248                 MemberElementInfo info = (MemberElementInfo) getElementInfo();
249                 info.setNameSourceStart(nameStart);
250                 info.setNameSourceEnd(nameEnd);
251         } catch (JavaModelException npe) {
252                 return;
253         }
254 }
255 }