From a085c93b5e3ab32b563eb34ec5700f625a8c1035 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 18 Aug 2015 21:17:31 +0300 Subject: [PATCH] Light Classes: Fix computation of base type in anonymous light class --- ...tlinLightClassForAnonymousDeclaration.java | 21 ++++++++++++++----- ...nAnonymousObjectWithTypeParametersAfter.kt | 13 ++++++++++++ ...AnonymousObjectWithTypeParametersBefore.kt | 13 ++++++++++++ .../JetChangeSignatureTest.java | 6 ++++++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersAfter.kt create mode 100644 idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersBefore.kt diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForAnonymousDeclaration.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForAnonymousDeclaration.java index bd7d66cbb3b..3c8126bd841 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForAnonymousDeclaration.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinLightClassForAnonymousDeclaration.java @@ -44,12 +44,10 @@ class KotlinLightClassForAnonymousDeclaration extends KotlinLightClassForExplici @NotNull @Override public PsiJavaCodeReferenceElement getBaseClassReference() { - Project project = classOrObject.getProject(); - return JavaPsiFacade.getElementFactory(project).createReferenceElementByFQClassName( - getFirstSupertypeFQName(), GlobalSearchScope.allScope(project) - ); + return JavaPsiFacade.getElementFactory(classOrObject.getProject()).createReferenceElementByType(getBaseClassType()); } + @NotNull private String getFirstSupertypeFQName() { ClassDescriptor descriptor = getDescriptor(); if (descriptor == null) return CommonClassNames.JAVA_LANG_OBJECT; @@ -77,7 +75,20 @@ class KotlinLightClassForAnonymousDeclaration extends KotlinLightClassForExplici if (cachedBaseType != null) type = cachedBaseType.get(); if (type != null && type.isValid()) return type; - type = JavaPsiFacade.getInstance(classOrObject.getProject()).getElementFactory().createType(getBaseClassReference()); + String firstSupertypeFQName = getFirstSupertypeFQName(); + for (PsiClassType superType : getSuperTypes()) { + PsiClass superClass = superType.resolve(); + if (superClass != null && firstSupertypeFQName.equals(superClass.getQualifiedName())) { + type = superType; + break; + } + } + + if (type == null) { + Project project = classOrObject.getProject(); + type = PsiType.getJavaLangObject(PsiManager.getInstance(project), GlobalSearchScope.allScope(project)); + } + cachedBaseType = new SoftReference(type); return type; } diff --git a/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersAfter.kt b/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersAfter.kt new file mode 100644 index 00000000000..21e5850452a --- /dev/null +++ b/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersAfter.kt @@ -0,0 +1,13 @@ +interface X + +interface A { + public fun bar(receiverTypes: Collection): Collection +} + +fun foo(): A { + return object: A { + override fun bar(receiverTypes: Collection): Collection { + throw UnsupportedOperationException() + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersBefore.kt b/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersBefore.kt new file mode 100644 index 00000000000..f7708096a74 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/OverrideInAnonymousObjectWithTypeParametersBefore.kt @@ -0,0 +1,13 @@ +interface X + +interface A { + public fun foo(receiverTypes: Collection): Collection +} + +fun foo(): A { + return object: A { + override fun foo(receiverTypes: Collection): Collection { + throw UnsupportedOperationException() + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java index 40f168a756c..10a86e7726b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java @@ -1300,6 +1300,12 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doJavaTest(new JavaRefactoringProvider()); } + public void testOverrideInAnonymousObjectWithTypeParameters() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.setNewName("bar"); + doTest(changeInfo); + } + private List editors = null; private static final String[] EXTENSIONS = {".kt", ".java"};