From a485f24217b21177fb1b48f517083376a4b78c79 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 2 Apr 2014 20:25:38 +0400 Subject: [PATCH] Don't serialize signature to string to check against toString/hashCode/equals --- .../resolver/DescriptorResolverUtils.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java index a56d795ebcc..0d56f27ba93 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java @@ -96,10 +96,14 @@ public final class DescriptorResolverUtils { public static boolean shouldBeInEnumClassObject(@NotNull JavaMethod method) { if (!method.getContainingClass().isEnum()) return false; - String signature = JavaSignatureFormatter.getInstance().formatMethod(method); - - return "values()".equals(signature) || - "valueOf(java.lang.String)".equals(signature); + String name = method.getName().asString(); + if (name.equals("values")) { + return method.getValueParameters().isEmpty(); + } + else if (name.equals("valueOf")) { + return isMethodWithOneParameterWithFqName(method, "java.lang.String"); + } + return false; } public static boolean isObjectMethodInInterface(@NotNull JavaMember member) { @@ -107,10 +111,29 @@ public final class DescriptorResolverUtils { } public static boolean isObjectMethod(@NotNull JavaMethod method) { - String signature = JavaSignatureFormatter.getInstance().formatMethod(method); - return "hashCode()".equals(signature) || - "equals(java.lang.Object)".equals(signature) || - "toString()".equals(signature); + String name = method.getName().asString(); + if (name.equals("toString") || name.equals("hashCode")) { + return method.getValueParameters().isEmpty(); + } + else if (name.equals("equals")) { + return isMethodWithOneParameterWithFqName(method, "java.lang.Object"); + } + return false; + } + + private static boolean isMethodWithOneParameterWithFqName(@NotNull JavaMethod method, @NotNull String fqName) { + List parameters = method.getValueParameters(); + if (parameters.size() == 1) { + JavaType type = parameters.get(0).getType(); + if (type instanceof JavaClassifierType) { + JavaClassifier classifier = ((JavaClassifierType) type).getClassifier(); + if (classifier instanceof JavaClass) { + FqName classFqName = ((JavaClass) classifier).getFqName(); + return classFqName != null && classFqName.asString().equals(fqName); + } + } + } + return false; } @NotNull