Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java')
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java185
1 files changed, 96 insertions, 89 deletions
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java
index 95f6c241..fbd5b2ef 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingComparator.java
@@ -1,17 +1,20 @@
/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
+ * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.dom;
import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.env.IConstants;
import org.eclipse.jdt.internal.compiler.lookup.Binding;
+import org.eclipse.jdt.internal.compiler.lookup.CaptureBinding;
+import org.eclipse.jdt.internal.compiler.lookup.CompilerModifiers;
import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
import org.eclipse.jdt.internal.compiler.lookup.ImportBinding;
import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
@@ -45,13 +48,9 @@ class BindingComparator {
for (int i = 0; i < length; i++) {
TypeVariableBinding typeVariableBinding = bindings[i];
TypeVariableBinding typeVariableBinding2 = otherBindings[i];
- if (CharOperation.equals(typeVariableBinding.sourceName, typeVariableBinding2.sourceName)
- && isEqual(typeVariableBinding.declaringElement, typeVariableBinding2.declaringElement, false)
- && isEqual(typeVariableBinding.superclass, typeVariableBinding2.superclass, false)
- && isEqual(typeVariableBinding.superInterfaces, typeVariableBinding2.superInterfaces, false)) {
- continue;
+ if (!isEqual(typeVariableBinding, typeVariableBinding2)) {
+ return false;
}
- return false;
}
return true;
}
@@ -112,32 +111,30 @@ class BindingComparator {
org.eclipse.jdt.internal.compiler.lookup.MethodBinding methodBinding2,
boolean checkTypeVariables) {
if (checkTypeVariables) {
- return (methodBinding == null && methodBinding2 == null)
- || (CharOperation.equals(methodBinding.selector, methodBinding2.selector)
- && isEqual(methodBinding.returnType, methodBinding2.returnType, false)
- && isEqual(methodBinding.parameters, methodBinding2.parameters, false)
- && isEqual(methodBinding.thrownExceptions, methodBinding2.thrownExceptions, false)
- && isEqual(methodBinding.typeVariables, methodBinding2.typeVariables, false))
- && isEqual(methodBinding.declaringClass, methodBinding2.declaringClass, false);
+ if (!isEqual(methodBinding.typeVariables, methodBinding2.typeVariables, true)
+ || !isEqual(methodBinding.parameters, methodBinding2.parameters, true)) {
+ return false;
+ }
}
return (methodBinding == null && methodBinding2 == null)
|| (CharOperation.equals(methodBinding.selector, methodBinding2.selector)
- && isEqual(methodBinding.returnType, methodBinding2.returnType, false)
- && isEqual(methodBinding.parameters, methodBinding2.parameters, false)
- && isEqual(methodBinding.thrownExceptions, methodBinding2.thrownExceptions, false));
+ && isEqual(methodBinding.returnType, methodBinding2.returnType, checkTypeVariables)
+ && isEqual(methodBinding.thrownExceptions, methodBinding2.thrownExceptions, checkTypeVariables)
+ && isEqual(methodBinding.declaringClass, methodBinding2.declaringClass, true));
}
static boolean isEqual(VariableBinding variableBinding, VariableBinding variableBinding2) {
- return variableBinding.modifiers == variableBinding2.modifiers
+ return (variableBinding.modifiers & CompilerModifiers.AccJustFlag) == (variableBinding2.modifiers & CompilerModifiers.AccJustFlag)
&& CharOperation.equals(variableBinding.name, variableBinding2.name)
- && isEqual(variableBinding.type, variableBinding2.type);
+ && isEqual(variableBinding.type, variableBinding2.type)
+ && (variableBinding.id == variableBinding2.id);
}
static boolean isEqual(FieldBinding fieldBinding, FieldBinding fieldBinding2) {
- return fieldBinding.modifiers == fieldBinding2.modifiers
+ return (fieldBinding.modifiers & CompilerModifiers.AccJustFlag) == (fieldBinding2.modifiers & CompilerModifiers.AccJustFlag)
&& CharOperation.equals(fieldBinding.name, fieldBinding2.name)
- && isEqual(fieldBinding.type, fieldBinding2.type, false)
- && isEqual(fieldBinding.declaringClass, fieldBinding2.declaringClass, false);
+ && isEqual(fieldBinding.type, fieldBinding2.type, true)
+ && isEqual(fieldBinding.declaringClass, fieldBinding2.declaringClass, true);
}
/**
@@ -172,93 +169,103 @@ class BindingComparator {
return true;
}
}
+ // TODO (olivier) should optimize to use switch(binding.kind()) & modifier bitmask comparisons
static boolean isEqual(org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding, org.eclipse.jdt.internal.compiler.lookup.TypeBinding typeBinding2, boolean checkTypeVariables) {
- if (typeBinding == null) {
- return typeBinding2 == null;
- } else if (typeBinding2 == null) {
+ if (typeBinding == typeBinding2)
+ return true;
+ if (typeBinding == null || typeBinding2 == null)
return false;
- } else if (typeBinding.isBaseType()) {
- // base type
- if (!typeBinding2.isBaseType()) {
- return false;
- }
- return typeBinding.id == typeBinding2.id;
- } else if (typeBinding.isArrayType()) {
- // array case
- if (!typeBinding2.isArrayType()) {
- return false;
- }
- return typeBinding.dimensions() == typeBinding2.dimensions()
- && isEqual(typeBinding.leafComponentType(), typeBinding2.leafComponentType(), checkTypeVariables);
- } else {
- // reference type
- ReferenceBinding referenceBinding = (ReferenceBinding) typeBinding;
- if (!(typeBinding2 instanceof ReferenceBinding)) {
- return false;
- }
- ReferenceBinding referenceBinding2 = (ReferenceBinding) typeBinding2;
- if (referenceBinding.isParameterizedType()) {
- if (!referenceBinding2.isParameterizedType()) {
+
+ switch (typeBinding.kind()) {
+ case Binding.BASE_TYPE :
+ if (!typeBinding2.isBaseType()) {
+ return false;
+ }
+ return typeBinding.id == typeBinding2.id;
+
+ case Binding.ARRAY_TYPE :
+ if (!typeBinding2.isArrayType()) {
+ return false;
+ }
+ return typeBinding.dimensions() == typeBinding2.dimensions()
+ && isEqual(typeBinding.leafComponentType(), typeBinding2.leafComponentType(), checkTypeVariables);
+
+ case Binding.PARAMETERIZED_TYPE :
+ if (!typeBinding2.isParameterizedType()) {
return false;
}
- ParameterizedTypeBinding parameterizedTypeBinding = (ParameterizedTypeBinding) referenceBinding;
- ParameterizedTypeBinding parameterizedTypeBinding2 = (ParameterizedTypeBinding) referenceBinding2;
+ ParameterizedTypeBinding parameterizedTypeBinding = (ParameterizedTypeBinding) typeBinding;
+ ParameterizedTypeBinding parameterizedTypeBinding2 = (ParameterizedTypeBinding) typeBinding2;
if (checkTypeVariables) {
if (!isEqual(parameterizedTypeBinding.arguments, parameterizedTypeBinding2.arguments, false)) {
return false;
}
}
- return CharOperation.equals(referenceBinding.compoundName, referenceBinding2.compoundName)
- && (referenceBinding.isInterface() == referenceBinding2.isInterface())
- && (referenceBinding.isEnum() == referenceBinding2.isEnum())
- && (referenceBinding.isAnnotationType() == referenceBinding2.isAnnotationType())
- && (referenceBinding.modifiers == referenceBinding2.modifiers);
- } else if (referenceBinding.isWildcard()) {
- if (!referenceBinding2.isWildcard()) {
+ return CharOperation.equals(parameterizedTypeBinding.compoundName, parameterizedTypeBinding2.compoundName)
+ && (parameterizedTypeBinding.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation))
+ == (parameterizedTypeBinding2.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation));
+
+ case Binding.WILDCARD_TYPE :
+ if (!typeBinding2.isWildcard()) {
return false;
}
- WildcardBinding wildcardBinding = (WildcardBinding) referenceBinding;
- WildcardBinding wildcardBinding2 = (WildcardBinding) referenceBinding2;
- return isEqual(wildcardBinding.bound, wildcardBinding2.bound)
- && wildcardBinding.kind == wildcardBinding2.kind;
- } else if (referenceBinding.isGenericType()) {
- if (!referenceBinding2.isGenericType()) {
+ WildcardBinding wildcardBinding = (WildcardBinding) typeBinding;
+ WildcardBinding wildcardBinding2 = (WildcardBinding) typeBinding2;
+ return isEqual(wildcardBinding.bound, wildcardBinding2.bound, checkTypeVariables)
+ && wildcardBinding.boundKind == wildcardBinding2.boundKind;
+
+ case Binding.TYPE_PARAMETER :
+ if (!(typeBinding2.isTypeVariable())) {
return false;
}
- if (checkTypeVariables) {
- if (!isEqual(referenceBinding.typeVariables(), referenceBinding2.typeVariables(), false)) {
+ if (typeBinding.isCapture()) {
+ if (!(typeBinding2.isCapture())) {
return false;
}
+ CaptureBinding captureBinding = (CaptureBinding) typeBinding;
+ CaptureBinding captureBinding2 = (CaptureBinding) typeBinding2;
+ return isEqual(captureBinding.wildcard, captureBinding2.wildcard, checkTypeVariables);
}
- return CharOperation.equals(referenceBinding.compoundName, referenceBinding2.compoundName)
- && (referenceBinding.isGenericType() == referenceBinding2.isGenericType())
- && (referenceBinding.isRawType() == referenceBinding2.isRawType())
- && (referenceBinding.isInterface() == referenceBinding2.isInterface())
- && (referenceBinding.isEnum() == referenceBinding2.isEnum())
- && (referenceBinding.isAnnotationType() == referenceBinding2.isAnnotationType())
- && (referenceBinding.modifiers == referenceBinding2.modifiers);
- } else if (referenceBinding instanceof TypeVariableBinding) {
- if (!(referenceBinding2 instanceof TypeVariableBinding)) {
- return false;
- }
- TypeVariableBinding typeVariableBinding = (TypeVariableBinding) referenceBinding;
- TypeVariableBinding typeVariableBinding2 = (TypeVariableBinding) referenceBinding2;
+ TypeVariableBinding typeVariableBinding = (TypeVariableBinding) typeBinding;
+ TypeVariableBinding typeVariableBinding2 = (TypeVariableBinding) typeBinding2;
if (checkTypeVariables) {
return CharOperation.equals(typeVariableBinding.sourceName, typeVariableBinding2.sourceName)
&& isEqual(typeVariableBinding.declaringElement, typeVariableBinding2.declaringElement, false)
- && isEqual(typeVariableBinding.superclass, typeVariableBinding2.superclass, false)
- && isEqual(typeVariableBinding.superInterfaces, typeVariableBinding2.superInterfaces, false);
+ && isEqual(typeVariableBinding.superclass(), typeVariableBinding2.superclass(), true)
+ && isEqual(typeVariableBinding.superInterfaces(), typeVariableBinding2.superInterfaces(), true);
} else {
return CharOperation.equals(typeVariableBinding.sourceName, typeVariableBinding2.sourceName);
}
- } else {
+
+ case Binding.GENERIC_TYPE :
+ if (!typeBinding2.isGenericType()) {
+ return false;
+ }
+ ReferenceBinding referenceBinding = (ReferenceBinding) typeBinding;
+ ReferenceBinding referenceBinding2 = (ReferenceBinding) typeBinding2;
+ if (checkTypeVariables) {
+ if (!isEqual(referenceBinding.typeVariables(), referenceBinding2.typeVariables(), true)) {
+ return false;
+ }
+ }
+ return CharOperation.equals(referenceBinding.compoundName, referenceBinding2.compoundName)
+ && (referenceBinding.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation))
+ == (referenceBinding2.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation));
+
+ case Binding.RAW_TYPE :
+ default :
+ if (!(typeBinding2 instanceof ReferenceBinding)) {
+ return false;
+ }
+ referenceBinding = (ReferenceBinding) typeBinding;
+ referenceBinding2 = (ReferenceBinding) typeBinding2;
return CharOperation.equals(referenceBinding.compoundName, referenceBinding2.compoundName)
+ && CharOperation.equals(referenceBinding.constantPoolName(), referenceBinding2.constantPoolName())
+ && (!referenceBinding2.isGenericType())
&& (referenceBinding.isRawType() == referenceBinding2.isRawType())
- && (referenceBinding.isInterface() == referenceBinding2.isInterface())
- && (referenceBinding.isEnum() == referenceBinding2.isEnum())
- && (referenceBinding.isAnnotationType() == referenceBinding2.isAnnotationType())
- && (referenceBinding.modifiers == referenceBinding2.modifiers);
- }
+ && (referenceBinding.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation))
+ == (referenceBinding2.modifiers & (CompilerModifiers.AccJustFlag | IConstants.AccInterface | IConstants.AccEnum | IConstants.AccAnnotation));
+
}
}
/**

Back to the top