diff options
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.java | 185 |
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)); + } } /** |