Merged "Open PHP Declaration" and "Open Include File" into one action "Open Declarati...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / lookup / SourceTypeBinding.java
index 51d892a..97f6ed8 100644 (file)
@@ -1,30 +1,30 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
- ******************************************************************************/
+ *******************************************************************************/
 package net.sourceforge.phpdt.internal.compiler.lookup;
 
 import java.util.Enumeration;
 import java.util.Hashtable;
 
-import net.sourceforge.phpdt.internal.compiler.ast.AbstractMethodDeclaration;
-import net.sourceforge.phpdt.internal.compiler.ast.Argument;
-import net.sourceforge.phpdt.internal.compiler.ast.AssertStatement;
-import net.sourceforge.phpdt.internal.compiler.ast.ConstructorDeclaration;
-import net.sourceforge.phpdt.internal.compiler.ast.FieldDeclaration;
-import net.sourceforge.phpdt.internal.compiler.ast.MethodDeclaration;
-import net.sourceforge.phpdt.internal.compiler.ast.TypeDeclaration;
-import net.sourceforge.phpdt.internal.compiler.ast.TypeReference;
-import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions;
+import net.sourceforge.phpdt.core.compiler.CharOperation;
 import net.sourceforge.phpdt.internal.compiler.impl.Constant;
 import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation;
-import net.sourceforge.phpdt.internal.compiler.util.CharOperation;
+import net.sourceforge.phpeclipse.internal.compiler.ast.AbstractMethodDeclaration;
+import net.sourceforge.phpeclipse.internal.compiler.ast.Argument;
+import net.sourceforge.phpeclipse.internal.compiler.ast.AssertStatement;
+import net.sourceforge.phpeclipse.internal.compiler.ast.ConstructorDeclaration;
+import net.sourceforge.phpeclipse.internal.compiler.ast.FieldDeclaration;
+import net.sourceforge.phpeclipse.internal.compiler.ast.MethodDeclaration;
+import net.sourceforge.phpeclipse.internal.compiler.ast.TypeDeclaration;
+import net.sourceforge.phpeclipse.internal.compiler.ast.TypeReference;
+
 
 public class SourceTypeBinding extends ReferenceBinding {
        public ReferenceBinding superclass;
@@ -35,13 +35,14 @@ public class SourceTypeBinding extends ReferenceBinding {
 
        public ClassScope scope;
 
-       // Synthetics are separated into 4 categories: methods, fields, class literals and changed declaring class bindings
+       // Synthetics are separated into 4 categories: methods, super methods, fields, class literals and changed declaring class bindings
        public final static int METHOD = 0;
        public final static int FIELD = 1;
        public final static int CLASS_LITERAL = 2;
        public final static int CHANGED_DECLARING_CLASS = 3;
        
        Hashtable[] synthetics;
+       
 protected SourceTypeBinding() {
 }
 public SourceTypeBinding(char[][] compoundName, PackageBinding fPackage, ClassScope scope) {
@@ -52,7 +53,7 @@ public SourceTypeBinding(char[][] compoundName, PackageBinding fPackage, ClassSc
        this.sourceName = scope.referenceContext.name;
        this.scope = scope;
 
-       computeId();
+//     computeId();
 }
 private void addDefaultAbstractMethod(MethodBinding abstractMethod) {
        MethodBinding defaultAbstract = new MethodBinding(
@@ -74,7 +75,7 @@ public void addDefaultAbstractMethods() {
        tagBits |= KnowsDefaultAbstractMethods;
 
        if (isClass() && isAbstract()) {
-               if (fPackage.environment.options.targetJDK >= CompilerOptions.JDK1_2) return; // no longer added for post 1.2 targets
+//             if (fPackage.environment.options.targetJDK >= CompilerOptions.JDK1_2) return; // no longer added for post 1.2 targets
 
                ReferenceBinding[][] interfacesToVisit = new ReferenceBinding[5][];
                int lastPosition = 0;
@@ -120,7 +121,7 @@ public FieldBinding addSyntheticField(LocalVariableBinding actualOuterLocalVaria
                synthField = new SyntheticFieldBinding(
                        CharOperation.concat(SyntheticArgumentBinding.OuterLocalPrefix, actualOuterLocalVariable.name), 
                        actualOuterLocalVariable.type, 
-                       AccPrivate | AccFinal | AccSynthetic, 
+                       AccPrivate | AccFinal ,//| AccSynthetic, 
                        this, 
                        Constant.NotAConstant,
                        synthetics[FIELD].size());
@@ -170,7 +171,7 @@ public FieldBinding addSyntheticField(ReferenceBinding enclosingType) {
                                SyntheticArgumentBinding.EnclosingInstancePrefix,
                                String.valueOf(enclosingType.depth()).toCharArray()),
                        enclosingType,
-                       AccPrivate | AccFinal | AccSynthetic,
+                       AccDefault | AccFinal,// | AccSynthetic,
                        this,
                        Constant.NotAConstant,
                        synthetics[FIELD].size());
@@ -209,7 +210,7 @@ public FieldBinding addSyntheticField(TypeBinding targetType, BlockScope blockSc
                synthField = new SyntheticFieldBinding(
                        ("class$" + synthetics[CLASS_LITERAL].size()).toCharArray(), //$NON-NLS-1$
                        blockScope.getJavaLangClass(),
-                       AccDefault | AccStatic | AccSynthetic,
+                       AccDefault | AccStatic,// | AccSynthetic,
                        this,
                        Constant.NotAConstant,
                        synthetics[CLASS_LITERAL].size());
@@ -247,10 +248,10 @@ public FieldBinding addSyntheticField(AssertStatement assertStatement, BlockScop
                synthField = new SyntheticFieldBinding(
                        "$assertionsDisabled".toCharArray(), //$NON-NLS-1$
                        BooleanBinding,
-                       AccDefault | AccStatic | AccSynthetic | AccFinal,
+                       AccDefault | AccStatic | AccFinal,//| AccSynthetic | AccFinal,
                        this,
                        Constant.NotAConstant,
-                       0);
+                       synthetics[FIELD].size());
                synthetics[FIELD].put("assertionEmulation", synthField); //$NON-NLS-1$
        }
        // ensure there is not already such a field defined by the user
@@ -305,10 +306,11 @@ public SyntheticAccessMethodBinding addSyntheticMethod(FieldBinding targetField,
        return accessMethod;
 }
 /* Add a new synthetic access method for access to <targetMethod>.
+ * Must distinguish access method used for super access from others (need to use invokespecial bytecode)
        Answer the new method or the existing method if one already existed.
 */
 
-public SyntheticAccessMethodBinding addSyntheticMethod(MethodBinding targetMethod) {
+public SyntheticAccessMethodBinding addSyntheticMethod(MethodBinding targetMethod, boolean isSuperAccess) {
 
        if (synthetics == null) {
                synthetics = new Hashtable[4];
@@ -317,10 +319,17 @@ public SyntheticAccessMethodBinding addSyntheticMethod(MethodBinding targetMetho
                synthetics[METHOD] = new Hashtable(5);
        }
 
-       SyntheticAccessMethodBinding accessMethod = (SyntheticAccessMethodBinding) synthetics[METHOD].get(targetMethod);
-       if (accessMethod == null) {
-               accessMethod = new SyntheticAccessMethodBinding(targetMethod, this);
-               synthetics[METHOD].put(targetMethod, accessMethod);
+       SyntheticAccessMethodBinding accessMethod = null;
+       SyntheticAccessMethodBinding[] accessors = (SyntheticAccessMethodBinding[]) synthetics[METHOD].get(targetMethod);
+       if (accessors == null) {
+               accessMethod = new SyntheticAccessMethodBinding(targetMethod, isSuperAccess, this);
+               synthetics[METHOD].put(targetMethod, accessors = new SyntheticAccessMethodBinding[2]);
+               accessors[isSuperAccess ? 0 : 1] = accessMethod;                
+       } else {
+               if ((accessMethod = accessors[isSuperAccess ? 0 : 1]) == null) {
+                       accessMethod = new SyntheticAccessMethodBinding(targetMethod, isSuperAccess, this);
+                       accessors[isSuperAccess ? 0 : 1] = accessMethod;
+               }
        }
        return accessMethod;
 }
@@ -341,7 +350,9 @@ void faultInTypesForFieldsAndMethods() {
 // NOTE: the type of each field of a source type is resolved when needed
 
 public FieldBinding[] fields() {
-       
+       if (fields==null) {
+               fields = new FieldBinding[0];
+       }
        try {
                int failed = 0;
                for (int f = 0, max = fields.length; f < max; f++) {
@@ -880,12 +891,24 @@ public SyntheticAccessMethodBinding[] syntheticAccessMethods() {
        SyntheticAccessMethodBinding[] bindings = new SyntheticAccessMethodBinding[1];
        Enumeration fieldsOrMethods = synthetics[METHOD].keys();
        while (fieldsOrMethods.hasMoreElements()) {
+
                Object fieldOrMethod = fieldsOrMethods.nextElement();
+
                if (fieldOrMethod instanceof MethodBinding) {
-                       if (index + 1 > bindings.length)
-                               System.arraycopy(bindings, 0, (bindings = new SyntheticAccessMethodBinding[index + 1]), 0, index);
-                       bindings[index++] = (SyntheticAccessMethodBinding) synthetics[METHOD].get(fieldOrMethod);
+
+                       SyntheticAccessMethodBinding[] methodAccessors = (SyntheticAccessMethodBinding[]) synthetics[METHOD].get(fieldOrMethod);
+                       int numberOfAccessors = 0;
+                       if (methodAccessors[0] != null) numberOfAccessors++;
+                       if (methodAccessors[1] != null) numberOfAccessors++;
+                       if (index + numberOfAccessors > bindings.length)
+                               System.arraycopy(bindings, 0, (bindings = new SyntheticAccessMethodBinding[index + numberOfAccessors]), 0, index);
+                       if (methodAccessors[0] != null) 
+                               bindings[index++] = methodAccessors[0]; // super access 
+                       if (methodAccessors[1] != null) 
+                               bindings[index++] = methodAccessors[1]; // normal access
+
                } else {
+
                        SyntheticAccessMethodBinding[] fieldAccessors = (SyntheticAccessMethodBinding[]) synthetics[METHOD].get(fieldOrMethod);
                        int numberOfAccessors = 0;
                        if (fieldAccessors[0] != null) numberOfAccessors++;
@@ -893,9 +916,9 @@ public SyntheticAccessMethodBinding[] syntheticAccessMethods() {
                        if (index + numberOfAccessors > bindings.length)
                                System.arraycopy(bindings, 0, (bindings = new SyntheticAccessMethodBinding[index + numberOfAccessors]), 0, index);
                        if (fieldAccessors[0] != null) 
-                               bindings[index++] = fieldAccessors[0];
+                               bindings[index++] = fieldAccessors[0]; // read access
                        if (fieldAccessors[1] != null) 
-                               bindings[index++] = fieldAccessors[1];
+                               bindings[index++] = fieldAccessors[1]; // write access
                }
        }
 
@@ -1018,7 +1041,7 @@ void verifyMethods(MethodVerifier verifier) {
 *      or null if one does not exist.
 */
 
-public FieldBinding getSyntheticField(ReferenceBinding targetEnclosingType, BlockScope scope, boolean onlyExactMatch) {
+public FieldBinding getSyntheticField(ReferenceBinding targetEnclosingType, boolean onlyExactMatch) {
 
        if (synthetics == null || synthetics[FIELD] == null) return null;
        FieldBinding field = (FieldBinding) synthetics[FIELD].get(targetEnclosingType);
@@ -1031,7 +1054,7 @@ public FieldBinding getSyntheticField(ReferenceBinding targetEnclosingType, Bloc
                Enumeration enum = synthetics[FIELD].elements();
                while (enum.hasMoreElements()) {
                        field = (FieldBinding) enum.nextElement();
-                       if (CharOperation.startsWith(field.name, SyntheticArgumentBinding.EnclosingInstancePrefix)
+                       if (CharOperation.prefixEquals(SyntheticArgumentBinding.EnclosingInstancePrefix, field.name)
                                && targetEnclosingType.isSuperclassOf((ReferenceBinding) field.type))
                                        return field;
                }