diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/DataFlowInfoUtilForCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/DataFlowInfoUtilForCompletion.kt deleted file mode 100644 index d50efdf57e6..00000000000 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/DataFlowInfoUtilForCompletion.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2010-2015 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea.completion - -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue -import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.descriptors.VariableDescriptor -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory -import org.jetbrains.kotlin.resolve.calls.smartcasts.IdentifierInfo - -fun renderDataFlowValue(value: DataFlowValue): String? { - // If it is not a stable identifier, there's no point in rendering it - if (!value.isPredictable) return null - - fun renderId(identifierInfo: IdentifierInfo): String? = with (identifierInfo) { - when (this) { - is DataFlowValueFactory.ExpressionIdentifierInfo -> expression.text - is IdentifierInfo.Receiver -> (this.value as? ImplicitReceiver)?.declarationDescriptor?.name?.let { "this@$it" } - is IdentifierInfo.Variable -> variable.name.asString() - is IdentifierInfo.PackageOrClass -> (descriptor as? PackageViewDescriptor)?.let { it.fqName.asString() } - is IdentifierInfo.Qualified -> renderId(receiverInfo) + "." + renderId(selectorInfo) - else -> null - } - } - - return renderId(value.identifierInfo) -} diff --git a/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt b/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt index 852339e79a2..085b1a87bc3 100644 --- a/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/DataFlowValueRenderingTest.kt @@ -19,18 +19,37 @@ package org.jetbrains.kotlin import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.idea.completion.renderDataFlowValue import org.jetbrains.kotlin.test.KotlinTestUtils import com.intellij.openapi.util.io.FileUtil import java.io.File import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue +import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory +import org.jetbrains.kotlin.resolve.calls.smartcasts.IdentifierInfo +import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver abstract class AbstractDataFlowValueRenderingTest: KotlinLightCodeInsightFixtureTestCase() { + + private fun IdentifierInfo.render(): String? = when (this) { + is DataFlowValueFactory.ExpressionIdentifierInfo -> expression.text + is IdentifierInfo.Receiver -> (value as? ImplicitReceiver)?.declarationDescriptor?.name?.let { "this@$it" } + is IdentifierInfo.Variable -> variable.name.asString() + is IdentifierInfo.PackageOrClass -> (descriptor as? PackageViewDescriptor)?.let { it.fqName.asString() } + is IdentifierInfo.Qualified -> receiverInfo.render() + "." + selectorInfo.render() + else -> null + } + + private fun DataFlowValue.render() = + // If it is not a stable identifier, there's no point in rendering it + if (!isPredictable) null + else identifierInfo.render() + override fun getTestDataPath() : String { return PluginTestCaseBase.getTestDataPathBase() + "/dataFlowValueRendering/" } @@ -49,7 +68,7 @@ abstract class AbstractDataFlowValueRenderingTest: KotlinLightCodeInsightFixture val info = expression.analyze().getDataFlowInfo(expression) val allValues = (info.completeTypeInfo.keySet() + info.completeNullabilityInfo.keys).toSet() - val actual = allValues.mapNotNull { renderDataFlowValue(it) }.sorted().joinToString("\n") + val actual = allValues.mapNotNull { it.render() }.sorted().joinToString("\n") KotlinTestUtils.assertEqualsToFile(File(FileUtil.getNameWithoutExtension(fileName) + ".txt"), actual) }