From 6fcb1716ebe4fdac7a882089a9e18e76ab88fd4b Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 29 Oct 2018 18:58:56 +0300 Subject: [PATCH] Do additional resolve for inline properties for backend (KT-27460) There's an additional resolve for inline declarations to make backend happy with the passed binding context object. Unlike functions, properties were not processed. #KT-27460 Fixed --- .../kotlin/idea/debugger/DebuggerUtils.kt | 30 ++++++++++++++----- .../inlineProperty/inlineProperty.kt | 3 ++ .../inlineProperty/inlinePropertyDep.kt | 6 ++++ .../BytecodeToolWindowTestGenerated.java | 5 ++++ 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 idea/testData/internal/toolWindow/inlineProperty/inlineProperty.kt create mode 100644 idea/testData/internal/toolWindow/inlineProperty/inlinePropertyDep.kt diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt index 198875872fb..01986dbcf70 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt @@ -24,6 +24,7 @@ import com.sun.jdi.Location import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.idea.KotlinFileTypeFactory import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde @@ -169,7 +170,7 @@ object DebuggerUtils { fullResolveContext: BindingContext? = null ): BindingContext { val project = element.project - val inlineFunctions = HashSet() + val declarationsWithBody = HashSet() val innerContexts = ArrayList() innerContexts.addIfNotNull(fullResolveContext) @@ -216,19 +217,32 @@ object DebuggerUtils { val descriptor = resolvedCall.resultingDescriptor if (descriptor is DeserializedSimpleFunctionDescriptor) return - if (InlineUtil.isInline(descriptor) && (analyzeInlineFunctions || hasReifiedTypeParameters(descriptor))) { - val declaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) - if (declaration != null && declaration is KtNamedFunction && !analyzedElements.contains(declaration)) { - inlineFunctions.add(declaration) + isAdditionalResolveNeededForDescriptor(descriptor) + + if (descriptor is PropertyDescriptor) { + for (accessor in descriptor.accessors) { + isAdditionalResolveNeededForDescriptor(accessor) } } } + + private fun isAdditionalResolveNeededForDescriptor(descriptor: CallableDescriptor) { + if (!(InlineUtil.isInline(descriptor) && (analyzeInlineFunctions || hasReifiedTypeParameters(descriptor)))) { + return + } + + val declaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) + if (declaration != null && declaration is KtDeclarationWithBody && !analyzedElements.contains(declaration)) { + declarationsWithBody.add(declaration) + return + } + } }) analyzedElements.add(element) - if (!inlineFunctions.isEmpty() && deep < 10) { - for (inlineFunction in inlineFunctions) { + if (!declarationsWithBody.isEmpty() && deep < 10) { + for (inlineFunction in declarationsWithBody) { val body = inlineFunction.bodyExpression if (body != null) { innerContexts.add( @@ -243,7 +257,7 @@ object DebuggerUtils { } } - analyzedElements.addAll(inlineFunctions) + analyzedElements.addAll(declarationsWithBody) } return CompositeBindingContext.create(innerContexts) diff --git a/idea/testData/internal/toolWindow/inlineProperty/inlineProperty.kt b/idea/testData/internal/toolWindow/inlineProperty/inlineProperty.kt new file mode 100644 index 00000000000..9a54e30aba9 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineProperty/inlineProperty.kt @@ -0,0 +1,3 @@ +package inlineProperty + +val x = "".foo \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/inlineProperty/inlinePropertyDep.kt b/idea/testData/internal/toolWindow/inlineProperty/inlinePropertyDep.kt new file mode 100644 index 00000000000..978f4a84d09 --- /dev/null +++ b/idea/testData/internal/toolWindow/inlineProperty/inlinePropertyDep.kt @@ -0,0 +1,6 @@ +package inlineProperty + +inline val String.foo: Boolean + get() { + return true + } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java index fdbc728c99a..38054022e82 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java @@ -59,6 +59,11 @@ public class BytecodeToolWindowTestGenerated extends AbstractBytecodeToolWindowT runTest("idea/testData/internal/toolWindow/inlineFunctionReifiedParam/"); } + @TestMetadata("inlineProperty") + public void testInlineProperty() throws Exception { + runTest("idea/testData/internal/toolWindow/inlineProperty/"); + } + @TestMetadata("iteratorFun") public void testIteratorFun() throws Exception { runTest("idea/testData/internal/toolWindow/iteratorFun/");