Lazy resolve: fix scope for primary constructor parameters

For classes on top level scope was getting for file, which may introduce resolution problems with generics

 #KT-8829 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2017-05-05 20:32:45 +03:00
parent dbcf796e90
commit 38eff6966d
2 changed files with 31 additions and 3 deletions
@@ -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)
@@ -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<N> (
messenger: ClassB<N> = object : ClassB<N> {
override fun methodOne(param: List<N>) {
}
}
)
interface ClassB<N> {
fun methodOne(param: List<N>)
}
""") 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)