From 3d5d2d8258d27061be8cbc8b7a02d57ccda65688 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 26 Oct 2016 20:06:11 +0300 Subject: [PATCH] KT-14376 ClassCastException from object with vals #KT-14376 Fixed --- .../kotlin/idea/project/ResolveElementCache.kt | 4 ++-- .../jetbrains/kotlin/idea/ResolveElementCacheTest.kt | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 6138aa9a336..2c5ccdf4264 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -300,7 +300,7 @@ class ResolveElementCache( is KtAnonymousInitializer -> initializerAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter) - is KtPrimaryConstructor -> constructorAdditionalResolve(resolveSession, resolveElement.parent as KtClass, file, bodyResolveMode.bindingTraceFilter) + is KtPrimaryConstructor -> constructorAdditionalResolve(resolveSession, resolveElement.parent as KtClassOrObject, file, bodyResolveMode.bindingTraceFilter) is KtSecondaryConstructor -> secondaryConstructorAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter) @@ -523,7 +523,7 @@ class ResolveElementCache( return trace } - private fun constructorAdditionalResolve(resolveSession: ResolveSession, klass: KtClass, file: KtFile, filter : BindingTraceFilter): BindingTrace { + private fun constructorAdditionalResolve(resolveSession: ResolveSession, klass: KtClassOrObject, file: KtFile, filter : BindingTraceFilter): BindingTrace { val trace = createDelegatingTrace(klass, filter) val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(klass) diff --git a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt index 6bdc1cd6dea..dff0b916fee 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt @@ -24,13 +24,16 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.imports.importableFqName +import org.jetbrains.kotlin.idea.search.usagesSearch.constructor import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class ResolveElementCacheTest : KotlinLightCodeInsightFixtureTestCase() { @@ -501,6 +504,13 @@ class C(param1: String = "", param2: Int = 0) { } } + fun testKT14376() { + val file = myFixture.configureByText("Test.kt", "object Obj(val x: Int)") as KtFile + val nameRef = file.findDescendantOfType()!! + val bindingContext = nameRef.analyze(BodyResolveMode.PARTIAL) + assert(bindingContext[BindingContext.REFERENCE_TARGET, nameRef]?.fqNameSafe?.asString() == "kotlin.Int") + } + private fun checkResolveMultiple(mode: BodyResolveMode, vararg expressions: KtExpression): BindingContext { val resolutionFacade = expressions.first().getResolutionFacade() val bindingContext = resolutionFacade.analyze(expressions.asList(), mode)