| 386 | //-------------------------------------------------------------------------- |
| 387 | |
| 388 | private static final class CacheKey { |
| 389 | private static final Comparator<Class> INTERFACE_COMPARATOR = (o1, o2) -> { |
| 390 | // Traits order *must* be preserved |
| 391 | // See GROOVY-7285 |
| 392 | if (Traits.isTrait(o1)) return -1; |
| 393 | if (Traits.isTrait(o2)) return 1; |
| 394 | return o1.getName().compareTo(o2.getName()); |
| 395 | }; |
| 396 | private final ClassReference baseClass; |
| 397 | private final ClassReference delegateClass; |
| 398 | private final Set<String> methods; |
| 399 | private final ClassReference[] interfaces; |
| 400 | private final boolean emptyMethods; |
| 401 | private final boolean useDelegate; |
| 402 | |
| 403 | private CacheKey(final Class baseClass, final Class delegateClass, final Set<String> methods, final Class[] interfaces, final boolean emptyMethods, final boolean useDelegate) { |
| 404 | this.baseClass = new ClassReference(baseClass); |
| 405 | this.delegateClass = new ClassReference(delegateClass); |
| 406 | this.methods = methods; |
| 407 | this.emptyMethods = emptyMethods; |
| 408 | this.useDelegate = useDelegate; |
| 409 | final int interfaceCount = interfaces.length; |
| 410 | if (interfaces != null) { |
| 411 | Class[] interfacesCopy = new Class[interfaceCount]; |
| 412 | System.arraycopy(interfaces, 0, interfacesCopy, 0, interfaceCount); |
| 413 | Arrays.sort(interfacesCopy, INTERFACE_COMPARATOR); |
| 414 | ClassReference[] interfaceReferences = new ClassReference[interfaceCount]; |
| 415 | for (int i = 0, n = interfacesCopy.length; i < n; i++) { |
| 416 | interfaceReferences[i] = new ClassReference(interfacesCopy[i]); |
| 417 | } |
| 418 | this.interfaces = interfaceReferences; |
| 419 | } else { |
| 420 | this.interfaces = null; |
| 421 | } |
| 422 | } |
| 423 | |
| 424 | /** {@inheritDoc} */ |
| 425 | @Override |
| 426 | public boolean equals(final Object o) { |
| 427 | if (this == o) return true; |
| 428 | if (o == null || getClass() != o.getClass()) return false; |
| 429 | |
| 430 | final CacheKey cacheKey = (CacheKey) o; |
| 431 | |
| 432 | if (emptyMethods != cacheKey.emptyMethods) return false; |
| 433 | if (useDelegate != cacheKey.useDelegate) return false; |
| 434 | if (!Objects.equals(delegateClass, cacheKey.delegateClass)) return false; |
| 435 | if (!Objects.equals(baseClass, cacheKey.baseClass)) return false; |
| 436 | if (!Arrays.equals(interfaces, cacheKey.interfaces)) return false; |
| 437 | if (!Objects.equals(methods, cacheKey.methods)) return false; |
| 438 | |
| 439 | return true; |
| 440 | } |
| 441 | |
| 442 | /** {@inheritDoc} */ |
| 443 | @Override |
| 444 | public int hashCode() { |
| 445 | return Objects.hash(emptyMethods, useDelegate, delegateClass, baseClass, Arrays.hashCode(interfaces), methods); |