/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
+ * All rights reserved. This program and the accompanying materials
* 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-v10.html
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
import java.util.Hashtable;
import net.sourceforge.phpdt.core.compiler.CharOperation;
+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.Constant;
import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation;
-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 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) {
this.sourceName = scope.referenceContext.name;
this.scope = scope;
- computeId();
+// computeId();
}
private void addDefaultAbstractMethod(MethodBinding abstractMethod) {
MethodBinding defaultAbstract = new MethodBinding(
if (synthetics[FIELD] == null) {
synthetics[FIELD] = new Hashtable(5);
}
-
+
FieldBinding synthField = (FieldBinding) synthetics[FIELD].get(actualOuterLocalVariable);
if (synthField == null) {
synthField = new SyntheticFieldBinding(
- CharOperation.concat(SyntheticArgumentBinding.OuterLocalPrefix, actualOuterLocalVariable.name),
- actualOuterLocalVariable.type,
- AccPrivate | AccFinal ,//| AccSynthetic,
- this,
+ CharOperation.concat(SyntheticArgumentBinding.OuterLocalPrefix, actualOuterLocalVariable.name),
+ actualOuterLocalVariable.type,
+ AccPrivate | AccFinal ,//| AccSynthetic,
+ this,
Constant.NotAConstant,
synthetics[FIELD].size());
synthetics[FIELD].put(actualOuterLocalVariable, synthField);
break;
}
}
- }
+ }
return synthField;
}
/* Add a new synthetic field for a class literal access.
break;
}
}
- }
+ }
return synthField;
}
if (accessors == null) {
accessMethod = new SyntheticAccessMethodBinding(targetField, isReadAccess, this);
synthetics[METHOD].put(targetField, accessors = new SyntheticAccessMethodBinding[2]);
- accessors[isReadAccess ? 0 : 1] = accessMethod;
+ accessors[isReadAccess ? 0 : 1] = accessMethod;
} else {
if ((accessMethod = accessors[isReadAccess ? 0 : 1]) == null) {
accessMethod = new SyntheticAccessMethodBinding(targetField, isReadAccess, this);
if (accessors == null) {
accessMethod = new SyntheticAccessMethodBinding(targetMethod, isSuperAccess, this);
synthetics[METHOD].put(targetMethod, accessors = new SyntheticAccessMethodBinding[2]);
- accessors[isSuperAccess ? 0 : 1] = accessMethod;
+ accessors[isSuperAccess ? 0 : 1] = accessMethod;
} else {
if ((accessMethod = accessors[isSuperAccess ? 0 : 1]) == null) {
accessMethod = new SyntheticAccessMethodBinding(targetMethod, isSuperAccess, this);
int newSize = fields.length - failed;
if (newSize == 0)
return fields = NoFields;
-
+
FieldBinding[] newFields = new FieldBinding[newSize];
for (int i = 0, n = 0, max = fields.length; i < max; i++)
if (fields[i] != null)
}
if (newFields != null){
System.arraycopy(newFields, 0, fields = new FieldBinding[count], 0, count);
- }
+ }
throw e;
}
return fields;
}
}
}
-
+
if (foundProblem || count > 1) {
for (int m = methods.length; --m >= 0;) {
MethodBinding method = methods[m];
}
}
}
-
+
if (failed > 0) {
int newSize = methods.length - failed;
if (newSize == 0)
return methods = NoMethods;
-
+
MethodBinding[] newMethods = new MethodBinding[newSize];
for (int i = 0, n = 0, max = methods.length; i < max; i++)
if (methods[i] != null)
}
if (newMethods != null){
System.arraycopy(newMethods, 0, methods = new MethodBinding[count], 0, count);
- }
+ }
modifiers ^= AccUnresolved;
throw e;
- }
+ }
return NoMethods;
}
/* Answer the synthetic field for <actualOuterLocalVariable>
*/
public FieldBinding getSyntheticField(LocalVariableBinding actualOuterLocalVariable) {
-
+
if (synthetics == null || synthetics[FIELD] == null) return null;
return (FieldBinding) synthetics[FIELD].get(actualOuterLocalVariable);
}
try {
if ((modifiers & AccUnresolved) == 0)
return methods;
-
+
int failed = 0;
for (int m = 0, max = methods.length; m < max; m++) {
if (resolveTypesFor(methods[m]) == null) {
failed++;
}
}
-
+
for (int m = methods.length; --m >= 0;) {
MethodBinding method = methods[m];
if (method != null) {
}
}
}
-
+
if (failed > 0) {
int newSize = methods.length - failed;
if (newSize == 0) {
methods = newMethods;
}
}
-
+
// handle forward references to potential default abstract methods
addDefaultAbstractMethods();
} catch(AbortCompilation e){
}
if (newMethods != null){
System.arraycopy(newMethods, 0, methods = new MethodBinding[count], 0, count);
- }
+ }
modifiers ^= AccUnresolved;
throw e;
- }
+ }
modifiers ^= AccUnresolved;
return methods;
}
return superInterfaces;
}
public SyntheticAccessMethodBinding[] syntheticAccessMethods() {
-
+
if (synthetics == null || synthetics[METHOD] == null || synthetics[METHOD].size() == 0) return null;
// difficult to compute size up front because of the embedded arrays so assume there is only 1
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)
+ if (methodAccessors[0] != null)
+ bindings[index++] = methodAccessors[0]; // super access
+ if (methodAccessors[1] != null)
bindings[index++] = methodAccessors[1]; // normal access
} else {
if (fieldAccessors[1] != null) numberOfAccessors++;
if (index + numberOfAccessors > bindings.length)
System.arraycopy(bindings, 0, (bindings = new SyntheticAccessMethodBinding[index + numberOfAccessors]), 0, index);
- if (fieldAccessors[0] != null)
+ if (fieldAccessors[0] != null)
bindings[index++] = fieldAccessors[0]; // read access
- if (fieldAccessors[1] != null)
+ if (fieldAccessors[1] != null)
bindings[index++] = fieldAccessors[1]; // write access
}
}
* Answer the collection of synthetic fields to append into the classfile
*/
public FieldBinding[] syntheticFields() {
-
+
if (synthetics == null) return null;
int fieldSize = synthetics[FIELD] == null ? 0 : synthetics[FIELD].size();
// class T { class M{}}
// class S extends T { class N extends M {}} --> need to use S as a default enclosing instance for the super constructor call in N().
if (!onlyExactMatch){
- Enumeration enum = synthetics[FIELD].elements();
- while (enum.hasMoreElements()) {
- field = (FieldBinding) enum.nextElement();
+ Enumeration e = synthetics[FIELD].elements();
+ while (e.hasMoreElements()) {
+ field = (FieldBinding) e.nextElement();
if (CharOperation.prefixEquals(SyntheticArgumentBinding.EnclosingInstancePrefix, field.name)
&& targetEnclosingType.isSuperclassOf((ReferenceBinding) field.type))
return field;