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 21617e47635..31bf7856e8f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -524,7 +524,6 @@ class ResolveElementCache( private fun constructorAdditionalResolve(resolveSession: ResolveSession, klass: KtClassOrObject, file: KtFile, filter : BindingTraceFilter): BindingTrace { val trace = createDelegatingTrace(klass, filter) - val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(klass) val classDescriptor = resolveSession.resolveToDescriptor(klass) as ClassDescriptor val constructorDescriptor = classDescriptor.unsubstitutedPrimaryConstructor @@ -534,6 +533,7 @@ class ResolveElementCache( val primaryConstructor = klass.primaryConstructor if (primaryConstructor != null) { + val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(primaryConstructor) val bodyResolver = createBodyResolver(resolveSession, trace, file, StatementFilter.NONE) bodyResolver.resolveConstructorParameterDefaultValues(DataFlowInfo.EMPTY, trace, primaryConstructor, constructorDescriptor, scope) diff --git a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt index a8b46cc4015..f758c9783be 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea import com.intellij.psi.PsiDocumentManager import junit.framework.TestCase import org.intellij.lang.annotations.Language +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -34,6 +35,7 @@ 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 +import org.jetbrains.kotlin.types.typeUtil.containsError class ResolveElementCacheTest : KotlinLightCodeInsightFixtureTestCase() { override fun getProjectDescriptor() = KotlinLightProjectDescriptor.INSTANCE @@ -510,6 +512,32 @@ class C(param1: String = "", param2: Int = 0) { assert(bindingContext[BindingContext.REFERENCE_TARGET, nameRef]?.fqNameSafe?.asString() == "kotlin.Int") } + fun testResolveDefaultValueInPrimaryConstructor() { + val file = myFixture.configureByText("Test.kt", """ + class ClassA ( + messenger: ClassB = object : ClassB { + override fun methodOne(param: List) { + } + } + ) + + interface ClassB { + fun methodOne(param: List) + } + """) as KtFile + + val classA = file.declarations[0] as KtClass + val defaultValue = classA.primaryConstructor!!.valueParameters[0].defaultValue as KtObjectLiteralExpression + val methodOne = defaultValue.objectDeclaration.declarations[0] as KtFunction + + val bindingContext = methodOne.analyze(BodyResolveMode.FULL) + + val parameter = methodOne.valueParameters[0] + val parameterDescriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, parameter] as ValueParameterDescriptor + + assert(!parameterDescriptor.type.containsError()) + } + private fun checkResolveMultiple(mode: BodyResolveMode, vararg expressions: KtExpression): BindingContext { val resolutionFacade = expressions.first().getResolutionFacade() val bindingContext = resolutionFacade.analyze(expressions.asList(), mode)