From c6a9c36275034c486aab850f619654dad646ce09 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 22 Nov 2017 18:09:21 +0300 Subject: [PATCH] Analyze Data Flow: Support cross-language analysis #KT-16833 Fixed --- .../kotlin/asJava/lightClassUtils.kt | 2 +- .../KotlinLightCodeInsightFixtureTestCase.kt | 3 + ...thJdkAndRuntimeLightProjectDescriptor.java | 7 ++ .../findUsages/KotlinReferenceUsageInfo.kt | 4 + .../kotlin/idea/findUsages/findUsageUtils.kt | 48 ++++++-- .../handlers/KotlinFindUsagesHandler.kt | 10 +- .../kotlin/idea/slicer/KotlinSliceProvider.kt | 8 +- .../jetbrains/kotlin/idea/slicer/Slicer.kt | 115 +++++++++++++----- .../slicer/inflow/delegateToJavaGetter.java | 11 ++ .../slicer/inflow/delegateToJavaGetter.kt | 8 ++ .../delegateToJavaGetter.leafGroups.txt | 5 + .../delegateToJavaGetter.nullnessGroups.txt | 3 + .../inflow/delegateToJavaGetter.results.txt | 4 + .../diamondHierarchyJKMiddleClassFun.java | 15 +++ .../diamondHierarchyJKMiddleClassFun.kt | 12 ++ ...ndHierarchyJKMiddleClassFun.leafGroups.txt | 10 ++ ...erarchyJKMiddleClassFun.nullnessGroups.txt | 3 + ...amondHierarchyJKMiddleClassFun.results.txt | 5 + .../diamondHierarchyJKMiddleInterfaceFun.java | 15 +++ .../diamondHierarchyJKMiddleInterfaceFun.kt | 12 ++ ...erarchyJKMiddleInterfaceFun.leafGroups.txt | 10 ++ ...chyJKMiddleInterfaceFun.nullnessGroups.txt | 3 + ...dHierarchyJKMiddleInterfaceFun.results.txt | 5 + .../diamondHierarchyJKRootInterfaceFun.java | 15 +++ .../diamondHierarchyJKRootInterfaceFun.kt | 12 ++ ...HierarchyJKRootInterfaceFun.leafGroups.txt | 15 +++ ...archyJKRootInterfaceFun.nullnessGroups.txt | 3 + ...ondHierarchyJKRootInterfaceFun.results.txt | 6 + idea/testData/slicer/inflow/funParamerer.java | 6 + idea/testData/slicer/inflow/funParamerer.kt | 1 + .../slicer/inflow/funParamerer.leafGroups.txt | 10 +- .../inflow/funParamerer.nullnessGroups.txt | 5 +- .../slicer/inflow/funParamerer.results.txt | 14 ++- .../inflow/funParamererWithDefault.java | 6 + .../slicer/inflow/funParamererWithDefault.kt | 1 + .../funParamererWithDefault.leafGroups.txt | 16 ++- ...funParamererWithDefault.nullnessGroups.txt | 5 +- .../funParamererWithDefault.results.txt | 13 +- .../inflow/overridingFunctionResult.java | 5 + .../overridingFunctionResult.leafGroups.txt | 5 + .../overridingFunctionResult.results.txt | 1 + .../slicer/inflow/overridingParameter.java | 5 + .../inflow/overridingParameter.leafGroups.txt | 5 + .../inflow/overridingParameter.results.txt | 1 + .../overridingPropertyGetterResult.java | 5 + ...rridingPropertyGetterResult.leafGroups.txt | 5 + ...overridingPropertyGetterResult.results.txt | 1 + .../inflow/overridingPropertyResult.java | 5 + .../overridingPropertyResult.leafGroups.txt | 5 + .../overridingPropertyResult.results.txt | 1 + .../inflow/primaryConstructorParameter.java | 14 +++ .../inflow/primaryConstructorParameter.kt | 2 +- ...primaryConstructorParameter.leafGroups.txt | 11 +- ...aryConstructorParameter.nullnessGroups.txt | 5 +- .../primaryConstructorParameter.results.txt | 8 +- ...rimaryConstructorParameterWithDefault.java | 14 +++ .../primaryConstructorParameterWithDefault.kt | 2 +- ...tructorParameterWithDefault.leafGroups.txt | 17 ++- ...torParameterWithDefault.nullnessGroups.txt | 5 +- ...onstructorParameterWithDefault.results.txt | 7 +- .../inflow/secondaryConstructorParameter.java | 14 +++ .../inflow/secondaryConstructorParameter.kt | 2 +- ...condaryConstructorParameter.leafGroups.txt | 11 +- ...aryConstructorParameter.nullnessGroups.txt | 5 +- .../secondaryConstructorParameter.results.txt | 8 +- ...ondaryConstructorParameterWithDefault.java | 14 +++ ...econdaryConstructorParameterWithDefault.kt | 2 +- ...tructorParameterWithDefault.leafGroups.txt | 17 ++- ...torParameterWithDefault.nullnessGroups.txt | 5 +- ...onstructorParameterWithDefault.results.txt | 7 +- .../slicer/inflow/settersViaJavaDelegate.java | 15 +++ .../slicer/inflow/settersViaJavaDelegate.kt | 19 +++ .../settersViaJavaDelegate.leafGroups.txt | 12 ++ .../settersViaJavaDelegate.nullnessGroups.txt | 3 + .../inflow/settersViaJavaDelegate.results.txt | 6 + idea/testData/slicer/inflow/topLevelVal.java | 5 + idea/testData/slicer/inflow/topLevelVar.java | 6 + .../slicer/inflow/topLevelVar.leafGroups.txt | 4 + .../slicer/inflow/topLevelVar.results.txt | 1 + idea/testData/slicer/inflow/valParameter.java | 10 ++ .../slicer/inflow/valParameter.leafGroups.txt | 9 ++ .../slicer/inflow/valParameter.results.txt | 3 + idea/testData/slicer/inflow/varParameter.java | 11 ++ .../slicer/inflow/varParameter.leafGroups.txt | 13 ++ .../slicer/inflow/varParameter.results.txt | 4 + .../slicer/outflow/callArgumentKJK.java | 6 + .../slicer/outflow/callArgumentKJK.kt | 11 ++ .../outflow/callArgumentKJK.results.txt | 10 ++ ...efaultExplicitPrimaryConstructorCalls.java | 13 ++ .../defaultExplicitPrimaryConstructorCalls.kt | 15 +++ ...xplicitPrimaryConstructorCalls.results.txt | 9 ++ .../diamondHierarchyJKLeafClassFun.java | 13 ++ .../outflow/diamondHierarchyJKLeafClassFun.kt | 12 ++ ...diamondHierarchyJKLeafClassFun.results.txt | 22 ++++ .../diamondHierarchyJKMiddleClassFun.java | 15 +++ .../diamondHierarchyJKMiddleClassFun.kt | 12 ++ ...amondHierarchyJKMiddleClassFun.results.txt | 12 ++ .../diamondHierarchyJKMiddleInterfaceFun.java | 15 +++ .../diamondHierarchyJKMiddleInterfaceFun.kt | 12 ++ ...dHierarchyJKMiddleInterfaceFun.results.txt | 12 ++ .../slicer/outflow/functionCalls.java | 5 + idea/testData/slicer/outflow/functionCalls.kt | 4 +- .../slicer/outflow/functionCalls.results.txt | 7 +- .../jvmFieldMemberPropertyJavaUsages.java | 5 + .../jvmFieldMemberPropertyJavaUsages.kt | 5 + ...mFieldMemberPropertyJavaUsages.results.txt | 3 + .../slicer/outflow/memberPropertyUsages.java | 5 + .../outflow/memberPropertyUsages.results.txt | 1 + .../overridingFunctionResultWithJava.java | 11 ++ .../overridingFunctionResultWithJava.kt | 11 ++ ...erridingFunctionResultWithJava.results.txt | 10 ++ .../outflow/primaryConstructorCalls.java | 9 ++ .../primaryConstructorCalls.results.txt | 2 + .../outflow/secondaryConstructorCalls.java | 9 ++ .../secondaryConstructorCalls.results.txt | 2 + .../outflow/topLevelPropertyUsages.java | 5 + .../topLevelPropertyUsages.results.txt | 1 + .../testData/slicer/outflow/valParameter.java | 5 + .../slicer/outflow/valParameter.results.txt | 1 + .../testData/slicer/outflow/varParameter.java | 6 + .../slicer/outflow/varParameter.results.txt | 1 + .../kotlin/idea/slicer/AbstractSlicerTest.kt | 7 +- .../SlicerLeafGroupingTestGenerated.java | 30 +++++ .../SlicerNullnessGroupingTestGenerated.java | 30 +++++ .../idea/slicer/SlicerTreeTestGenerated.java | 72 +++++++++++ 125 files changed, 1109 insertions(+), 108 deletions(-) create mode 100644 idea/testData/slicer/inflow/delegateToJavaGetter.java create mode 100644 idea/testData/slicer/inflow/delegateToJavaGetter.kt create mode 100644 idea/testData/slicer/inflow/delegateToJavaGetter.leafGroups.txt create mode 100644 idea/testData/slicer/inflow/delegateToJavaGetter.nullnessGroups.txt create mode 100644 idea/testData/slicer/inflow/delegateToJavaGetter.results.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.java create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.leafGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.nullnessGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.results.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.java create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.leafGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.nullnessGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.results.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.java create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.leafGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.nullnessGroups.txt create mode 100644 idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.results.txt create mode 100644 idea/testData/slicer/inflow/funParamerer.java create mode 100644 idea/testData/slicer/inflow/funParamererWithDefault.java create mode 100644 idea/testData/slicer/inflow/overridingFunctionResult.java create mode 100644 idea/testData/slicer/inflow/overridingParameter.java create mode 100644 idea/testData/slicer/inflow/overridingPropertyGetterResult.java create mode 100644 idea/testData/slicer/inflow/overridingPropertyResult.java create mode 100644 idea/testData/slicer/inflow/primaryConstructorParameter.java create mode 100644 idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.java create mode 100644 idea/testData/slicer/inflow/secondaryConstructorParameter.java create mode 100644 idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.java create mode 100644 idea/testData/slicer/inflow/settersViaJavaDelegate.java create mode 100644 idea/testData/slicer/inflow/settersViaJavaDelegate.kt create mode 100644 idea/testData/slicer/inflow/settersViaJavaDelegate.leafGroups.txt create mode 100644 idea/testData/slicer/inflow/settersViaJavaDelegate.nullnessGroups.txt create mode 100644 idea/testData/slicer/inflow/settersViaJavaDelegate.results.txt create mode 100644 idea/testData/slicer/inflow/topLevelVal.java create mode 100644 idea/testData/slicer/inflow/topLevelVar.java create mode 100644 idea/testData/slicer/inflow/valParameter.java create mode 100644 idea/testData/slicer/inflow/varParameter.java create mode 100644 idea/testData/slicer/outflow/callArgumentKJK.java create mode 100644 idea/testData/slicer/outflow/callArgumentKJK.kt create mode 100644 idea/testData/slicer/outflow/callArgumentKJK.results.txt create mode 100644 idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.java create mode 100644 idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.kt create mode 100644 idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.results.txt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.java create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.kt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.results.txt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.java create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.kt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.results.txt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.java create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.kt create mode 100644 idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.results.txt create mode 100644 idea/testData/slicer/outflow/functionCalls.java create mode 100644 idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.java create mode 100644 idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.kt create mode 100644 idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.results.txt create mode 100644 idea/testData/slicer/outflow/memberPropertyUsages.java create mode 100644 idea/testData/slicer/outflow/overridingFunctionResultWithJava.java create mode 100644 idea/testData/slicer/outflow/overridingFunctionResultWithJava.kt create mode 100644 idea/testData/slicer/outflow/overridingFunctionResultWithJava.results.txt create mode 100644 idea/testData/slicer/outflow/primaryConstructorCalls.java create mode 100644 idea/testData/slicer/outflow/secondaryConstructorCalls.java create mode 100644 idea/testData/slicer/outflow/topLevelPropertyUsages.java create mode 100644 idea/testData/slicer/outflow/valParameter.java create mode 100644 idea/testData/slicer/outflow/varParameter.java diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index 18452b6471a..3ed91c7b6c9 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -59,7 +59,7 @@ fun KtElement.toLightElements(): List = when (this) { is KtClassOrObject -> listOfNotNull(toLightClass()) is KtNamedFunction, - is KtSecondaryConstructor -> LightClassUtil.getLightClassMethods(this as KtFunction) + is KtConstructor<*> -> LightClassUtil.getLightClassMethods(this as KtFunction) is KtProperty -> LightClassUtil.getLightClassPropertyMethods(this).allDeclarations is KtPropertyAccessor -> listOfNotNull(LightClassUtil.getLightClassAccessorMethod(this)) is KtParameter -> mutableListOf().also { elements -> diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt index d47cd91a77f..e7da92fcd78 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt @@ -125,6 +125,9 @@ abstract class KotlinLightCodeInsightFixtureTestCase : KotlinLightCodeInsightFix else if (InTextDirectivesUtils.isDirectiveDefined(fileText, "RUNTIME_WITH_FULL_JDK")) { return KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE_FULL_JDK } + else if (InTextDirectivesUtils.isDirectiveDefined(fileText, "RUNTIME_WITH_REFLECT")) { + return KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE_WITH_REFLECT + } else if (InTextDirectivesUtils.isDirectiveDefined(fileText, "RUNTIME") || InTextDirectivesUtils.isDirectiveDefined(fileText, "WITH_RUNTIME")) { return KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE diff --git a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinWithJdkAndRuntimeLightProjectDescriptor.java b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinWithJdkAndRuntimeLightProjectDescriptor.java index 66f1c1ace72..be836bab207 100644 --- a/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinWithJdkAndRuntimeLightProjectDescriptor.java +++ b/idea/idea-test-framework/src/org/jetbrains/kotlin/idea/test/KotlinWithJdkAndRuntimeLightProjectDescriptor.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.test; import com.intellij.openapi.projectRoots.Sdk; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime; +import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.utils.PathUtil; import java.io.File; @@ -43,6 +44,12 @@ public class KotlinWithJdkAndRuntimeLightProjectDescriptor extends KotlinJdkAndL PathUtil.getKotlinPathsForDistDirectory().getKotlinTestPath()) ); + @NotNull + public static final KotlinWithJdkAndRuntimeLightProjectDescriptor INSTANCE_WITH_REFLECT = new KotlinWithJdkAndRuntimeLightProjectDescriptor( + Arrays.asList(ForTestCompileRuntime.runtimeJarForTests(), + ForTestCompileRuntime.reflectJarForTests()) + ); + @NotNull public static final KotlinWithJdkAndRuntimeLightProjectDescriptor INSTANCE_FULL_JDK = new KotlinWithJdkAndRuntimeLightProjectDescriptor() { @Override diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt index 9f64cd4b80f..66018565ca3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt @@ -27,4 +27,8 @@ class KotlinReferenceUsageInfo(reference: PsiReference) : UsageInfo(reference) { val element = element ?: return null return element.references.singleOrNull { it::class.java == referenceType } } +} + +class KotlinReferencePreservingUsageInfo(private val reference: PsiReference) : UsageInfo(reference) { + override fun getReference() = reference } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/findUsageUtils.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/findUsageUtils.kt index e1357c537a3..903887f089f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/findUsageUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/findUsageUtils.kt @@ -16,25 +16,49 @@ package org.jetbrains.kotlin.idea.findUsages +import com.intellij.find.findUsages.FindUsagesManager import com.intellij.find.findUsages.FindUsagesOptions +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference +import com.intellij.psi.impl.light.LightMemberReference import com.intellij.usageView.UsageInfo +import com.intellij.usages.UsageViewManager +import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.asJava.toLightElements +import org.jetbrains.kotlin.idea.references.KtReference +import org.jetbrains.kotlin.psi.KtConstructor import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.utils.SmartList -fun KtDeclaration.processAllExactUsages( +fun PsiElement.processAllExactUsages( options: () -> FindUsagesOptions, processor: (UsageInfo) -> Unit ) { - val findUsagesHandler = KotlinFindUsagesHandlerFactory(project).createFindUsagesHandler(this, true) - findUsagesHandler.processElementUsages( - this, - { - if (it.reference?.isReferenceTo(this) ?: false) { - processor(it) - } - true - }, - options() - ) + fun elementsToCheckReferenceAgainst(reference: PsiReference): List { + if (reference is KtReference || this !is KtDeclaration) return listOf(this) + return SmartList().also { list -> + list += this + list += toLightElements() + if (this is KtConstructor<*>) { + getContainingClassOrObject().toLightClass()?.let { list += it } + } + } + } + + val project = project + FindUsagesManager(project, UsageViewManager.getInstance(project)) + .getFindUsagesHandler(this, true) + ?.processElementUsages( + this, + { + val reference = it.reference ?: return@processElementUsages true + if (reference is LightMemberReference || elementsToCheckReferenceAgainst(reference).any { reference.isReferenceTo(it) }) { + processor(it) + } + true + }, + options() + ) } fun KtDeclaration.processAllUsages( diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindUsagesHandler.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindUsagesHandler.kt index 8f9f9be4695..d7385420f27 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindUsagesHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindUsagesHandler.kt @@ -21,12 +21,14 @@ import com.intellij.find.findUsages.FindUsagesOptions import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import com.intellij.psi.PsiReference +import com.intellij.psi.impl.light.LightMemberReference import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.SearchScope import com.intellij.usageView.UsageInfo import com.intellij.util.CommonProcessors import com.intellij.util.Processor import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory +import org.jetbrains.kotlin.idea.findUsages.KotlinReferencePreservingUsageInfo import org.jetbrains.kotlin.idea.findUsages.KotlinReferenceUsageInfo import org.jetbrains.kotlin.idea.util.application.runReadAction import java.util.* @@ -118,7 +120,13 @@ abstract class KotlinFindUsagesHandler(psiElement: T, val LOG = Logger.getInstance(KotlinFindUsagesHandler::class.java) internal fun processUsage(processor: Processor, ref: PsiReference): Boolean = - processor.processIfNotNull { if (ref.element.isValid) KotlinReferenceUsageInfo(ref) else null } + processor.processIfNotNull { + when { + ref is LightMemberReference -> KotlinReferencePreservingUsageInfo(ref) + ref.element.isValid -> KotlinReferenceUsageInfo(ref) + else -> null + } + } internal fun processUsage(processor: Processor, element: PsiElement): Boolean = processor.processIfNotNull { if (element.isValid) UsageInfo(element) else null } diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt index 02b5486af51..0b5b0c16f63 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt @@ -35,7 +35,7 @@ import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.isNullabilityFlexible -class KotlinSliceProvider : SliceLanguageSupportProvider { +class KotlinSliceProvider : SliceLanguageSupportProvider, SliceUsageTransformer { companion object { val LEAF_ELEMENT_EQUALITY = object : SliceLeafEquality() { override fun substituteElement(element: PsiElement) = (element as? KtReference)?.resolve() ?: element @@ -71,6 +71,11 @@ class KotlinSliceProvider : SliceLanguageSupportProvider { override fun createRootUsage(element: PsiElement, params: SliceAnalysisParams) = KotlinSliceUsage(element, params) + override fun transform(usage: SliceUsage): Collection? { + if (usage is KotlinSliceUsage) return null + return listOf(KotlinSliceUsage(usage.element, usage.parent, 0, false)) + } + override fun getExpressionAtCaret(atCaret: PsiElement?, dataFlowToThis: Boolean): KtExpression? { val element = atCaret?.parentsWithSelf @@ -78,6 +83,7 @@ class KotlinSliceProvider : SliceLanguageSupportProvider { it is KtProperty || it is KtParameter || it is KtDeclarationWithBody || + (it is KtClass && !it.hasExplicitPrimaryConstructor()) || (it is KtExpression && it !is KtDeclaration) } ?.let { KtPsiUtil.safeDeparenthesize(it as KtExpression) } ?: return null diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 75d18e5ccae..a57f12b4a55 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -18,10 +18,15 @@ package org.jetbrains.kotlin.idea.slicer import com.intellij.analysis.AnalysisScope import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector.Access +import com.intellij.lang.java.JavaLanguage +import com.intellij.psi.PsiCall import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.impl.light.LightMemberReference import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.SearchScope import com.intellij.psi.search.searches.ReferencesSearch +import com.intellij.slicer.JavaSliceUsage import com.intellij.slicer.SliceUsage import com.intellij.usageView.UsageInfo import com.intellij.util.Processor @@ -54,8 +59,8 @@ import org.jetbrains.kotlin.idea.references.ReferenceAccess import org.jetbrains.kotlin.idea.references.readWriteAccessWithFullExpression import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest import org.jetbrains.kotlin.idea.search.declarationsSearch.searchOverriders -import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReadWriteAccessDetector +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext @@ -68,19 +73,19 @@ import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.util.OperatorNameConventions import java.util.* -private fun KtDeclaration.processHierarchyDownward(scope: SearchScope, processor: KtDeclaration.() -> Unit) { +private fun PsiElement.processHierarchyDownward(scope: SearchScope, processor: PsiElement.() -> Unit) { processor() HierarchySearchRequest(this, scope).searchOverriders().forEach { - (it.namedUnwrappedElement as? KtDeclaration)?.processor() + it.namedUnwrappedElement?.processor() } } -private fun KtDeclaration.processHierarchyUpward(scope: AnalysisScope, processor: KtDeclaration.() -> Unit) { +private fun KtDeclaration.processHierarchyUpward(scope: AnalysisScope, processor: PsiElement.() -> Unit) { processor() val descriptor = unsafeResolveToDescriptor() as? CallableMemberDescriptor ?: return DescriptorUtils .getAllOverriddenDescriptors(descriptor) - .mapNotNull { it.source.getPsi() as? KtDeclaration } + .mapNotNull { it.source.getPsi() } .filter { scope.contains(it) } .forEach(processor) } @@ -157,7 +162,7 @@ class InflowSlicer( processor: Processor, parentUsage: KotlinSliceUsage ) : Slicer(element, processor, parentUsage) { - private fun KtDeclaration.processHierarchyDownwardAndPass() { + private fun PsiElement.processHierarchyDownwardAndPass() { processHierarchyDownward(parentUsage.scope.toSearchScope()) { passToProcessor() } } @@ -165,14 +170,25 @@ class InflowSlicer( private fun KtDeclaration.processAssignments(accessSearchScope: SearchScope) { processVariableAccesses(accessSearchScope, AccessKind.WRITE_WITH_OPTIONAL_READ) body@ { - val refExpression = it.element as? KtExpression ?: return@body - val (accessKind, accessExpression) = refExpression.readWriteAccessWithFullExpression(true) - if (accessKind == ReferenceAccess.WRITE && accessExpression is KtBinaryExpression && accessExpression.operationToken == KtTokens.EQ) { - accessExpression.right?.passToProcessorAsValue() - } - else { - accessExpression.passToProcessorAsValue() + val refElement = it.element ?: return@body + val refParent = refElement.parent + + val rhsValue = when { + refElement is KtExpression -> { + val (accessKind, accessExpression) = refElement.readWriteAccessWithFullExpression(true) + if (accessKind == ReferenceAccess.WRITE && accessExpression is KtBinaryExpression && accessExpression.operationToken == KtTokens.EQ) { + accessExpression.right + } + else { + accessExpression + } + } + + refParent is PsiCall -> refParent.argumentList?.expressions?.getOrNull(0) + + else -> null } + rhsValue?.passToProcessorAsValue() } } @@ -202,7 +218,7 @@ class InflowSlicer( if (hasDelegateExpression()) { val getter = (unsafeResolveToDescriptor() as VariableDescriptorWithAccessors).getter val delegateGetterResolvedCall = getter?.let { bindingContext[BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, it] } - (delegateGetterResolvedCall?.resultingDescriptor?.source?.getPsi() as? KtDeclarationWithBody)?.passToProcessor() + delegateGetterResolvedCall?.resultingDescriptor?.source?.getPsi()?.passToProcessor() return } @@ -246,16 +262,26 @@ class InflowSlicer( val parameterDescriptor = analyze()[BindingContext.VALUE_PARAMETER, this] ?: return (function as? KtFunction)?.processCalls(parentUsage.scope.toSearchScope()) body@ { - val refExpression = it.element as? KtExpression ?: return@body - val callElement = refExpression.getParentOfTypeAndBranch { calleeExpression } ?: return@body - val resolvedCall = callElement.getResolvedCall(callElement.analyze()) ?: return@body - val resolvedArgument = resolvedCall.valueArguments[parameterDescriptor] ?: return@body - val flownExpression = when (resolvedArgument) { - is DefaultValueArgument -> defaultValue - is ExpressionValueArgument -> resolvedArgument.valueArgument?.getArgumentExpression() - else -> null - } ?: return@body - flownExpression.passToProcessorAsValue() + val refElement = it.element ?: return@body + val refParent = refElement.parent + + val argumentExpression = when { + refElement is KtExpression -> { + val callElement = refElement.getParentOfTypeAndBranch { calleeExpression } ?: return@body + val resolvedCall = callElement.getResolvedCall(callElement.analyze()) ?: return@body + val resolvedArgument = resolvedCall.valueArguments[parameterDescriptor] ?: return@body + when (resolvedArgument) { + is DefaultValueArgument -> defaultValue + is ExpressionValueArgument -> resolvedArgument.valueArgument?.getArgumentExpression() + else -> null + } + } + + refParent is PsiCall -> refParent.argumentList?.expressions?.getOrNull(this@processParameter.parameterIndex()) + + else -> null + } + argumentExpression?.passToProcessorAsValue() } if (valOrVarKeyword.toValVar() == KotlinValVar.Var) { @@ -313,7 +339,7 @@ class InflowSlicer( return } val accessedDescriptor = createdAt.target.accessedDescriptor ?: return - val accessedDeclaration = accessedDescriptor.source.getPsi() as? KtDeclaration ?: return + val accessedDeclaration = accessedDescriptor.source.getPsi() ?: return if (accessedDescriptor is SyntheticFieldDescriptor) { val property = accessedDeclaration as? KtProperty ?: return if (accessedDescriptor.propertyDescriptor.setter?.isDefault ?: true) { @@ -347,7 +373,7 @@ class InflowSlicer( (resolvedCall.dispatchReceiver as? ExpressionReceiver)?.expression?.passToProcessorAsValue(parentUsage.lambdaLevel + 1) } else { - (resultingDescriptor.source.getPsi() as? KtDeclaration)?.processHierarchyDownwardAndPass() + resultingDescriptor.source.getPsi()?.processHierarchyDownwardAndPass() } } } @@ -376,8 +402,14 @@ class OutflowSlicer( val withDereferences = parentUsage.params.showInstanceDereferences val accessKind = if (withDereferences) AccessKind.READ_OR_WRITE else AccessKind.READ_ONLY - processVariableAccesses(parentUsage.scope.toSearchScope(), accessKind) body@ { - val refExpression = (it.element as? KtExpression)?.let { KtPsiUtil.safeDeparenthesize(it) } ?: return@body + (this as? KtDeclaration)?.processVariableAccesses(parentUsage.scope.toSearchScope(), accessKind) body@ { + val refElement = it.element + if (refElement !is KtExpression) { + refElement?.passToProcessor() + return@body + } + + val refExpression = KtPsiUtil.safeDeparenthesize(refElement) if (withDereferences) { refExpression.processDereferences() } @@ -388,7 +420,7 @@ class OutflowSlicer( } } - private fun PsiElement.getCallElementForExactCallee(): KtElement? { + private fun PsiElement.getCallElementForExactCallee(): PsiElement? { if (this is KtArrayAccessExpression) return this val operationRefExpr = getNonStrictParentOfType() @@ -397,6 +429,7 @@ class OutflowSlicer( val parentCall = getParentOfTypeAndBranch { calleeExpression } ?: return null val callee = parentCall.calleeExpression?.let { KtPsiUtil.safeDeparenthesize(it) } if (callee == this || callee is KtConstructorCalleeExpression && callee.isAncestor(this, true)) return parentCall + return null } @@ -409,9 +442,25 @@ class OutflowSlicer( private fun KtFunction.processFunction() { if (this is KtConstructor<*> || this is KtNamedFunction && name != null) { processHierarchyUpward(parentUsage.scope) { - (this as? KtFunction)?.processCalls(parentUsage.scope.toSearchScope()) { - it.element?.getCallElementForExactCallee()?.passToProcessor() - it.element?.getCallableReferenceForExactCallee()?.passToProcessor(parentUsage.lambdaLevel + 1) + if (this is KtFunction) { + processCalls(parentUsage.scope.toSearchScope()) { + val refElement = it.element + when { + refElement == null -> (it.reference as? LightMemberReference)?.element?.passToProcessor() + refElement is KtExpression -> { + refElement.getCallElementForExactCallee()?.passToProcessor() + refElement.getCallableReferenceForExactCallee()?.passToProcessor(parentUsage.lambdaLevel + 1) + } + else -> refElement.passToProcessor() + } + } + } + else if (this is PsiMethod && language == JavaLanguage.INSTANCE) { + // todo: work around the bug in JavaSliceProvider.transform() + processor.process(JavaSliceUsage.createRootUsage(this, parentUsage.params)) + } + else { + passToProcessor() } } return @@ -462,7 +511,7 @@ class OutflowSlicer( private fun KtExpression.processExpression() { processPseudocodeUsages { pseudoValue, instr -> when (instr) { - is WriteValueInstruction -> (instr.target.accessedDescriptor?.source?.getPsi() as? KtDeclaration)?.passToProcessor() + is WriteValueInstruction -> instr.target.accessedDescriptor?.source?.getPsi()?.passToProcessor() is CallInstruction -> { if (parentUsage.lambdaLevel > 0 && instr.receiverValues[pseudoValue] != null) { instr.element.passToProcessor(parentUsage.lambdaLevel - 1) diff --git a/idea/testData/slicer/inflow/delegateToJavaGetter.java b/idea/testData/slicer/inflow/delegateToJavaGetter.java new file mode 100644 index 00000000000..16136c4c0bc --- /dev/null +++ b/idea/testData/slicer/inflow/delegateToJavaGetter.java @@ -0,0 +1,11 @@ +import kotlin.reflect.KProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class D { + public static D INSTANCE = new D(); + + int getValue(@Nullable Object thisRef, @NotNull KProperty property) { + return 1; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/delegateToJavaGetter.kt b/idea/testData/slicer/inflow/delegateToJavaGetter.kt new file mode 100644 index 00000000000..aa8089c940b --- /dev/null +++ b/idea/testData/slicer/inflow/delegateToJavaGetter.kt @@ -0,0 +1,8 @@ +// FLOW: IN +// RUNTIME_WITH_REFLECT + +val foo: Int by D.INSTANCE + +fun test() { + val x = foo +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/delegateToJavaGetter.leafGroups.txt b/idea/testData/slicer/inflow/delegateToJavaGetter.leafGroups.txt new file mode 100644 index 00000000000..090d4fe0372 --- /dev/null +++ b/idea/testData/slicer/inflow/delegateToJavaGetter.leafGroups.txt @@ -0,0 +1,5 @@ +9 return 1; +7 val x = foo +7 val x = foo +4 val foo: Int by D.INSTANCE +9 return 1; diff --git a/idea/testData/slicer/inflow/delegateToJavaGetter.nullnessGroups.txt b/idea/testData/slicer/inflow/delegateToJavaGetter.nullnessGroups.txt new file mode 100644 index 00000000000..142739bce11 --- /dev/null +++ b/idea/testData/slicer/inflow/delegateToJavaGetter.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +7 val x = foo +7 val x = foo diff --git a/idea/testData/slicer/inflow/delegateToJavaGetter.results.txt b/idea/testData/slicer/inflow/delegateToJavaGetter.results.txt new file mode 100644 index 00000000000..1c258e4a6bb --- /dev/null +++ b/idea/testData/slicer/inflow/delegateToJavaGetter.results.txt @@ -0,0 +1,4 @@ +7 val x = foo +7 val x = foo +4 val foo: Int by D.INSTANCE +9 return 1; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.java b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.java new file mode 100644 index 00000000000..ade11476ec6 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.java @@ -0,0 +1,15 @@ +// FLOW: OUT + +interface A { + public int foo(); +} + +interface C extends A { + public int foo(); +} + +class D extends B implements C { + public int foo() { + return 4; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt new file mode 100644 index 00000000000..09d3f597ee0 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt @@ -0,0 +1,12 @@ +// FLOW: IN + +open class B : A { + override fun foo() = 2 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.leafGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.leafGroups.txt new file mode 100644 index 00000000000..9e384cbdbf0 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.leafGroups.txt @@ -0,0 +1,10 @@ +4 override fun foo() = 2 +9 val y = b.foo() +9 val y = b.foo() +4 override fun foo() = 2 +4 override fun foo() = 2 + +13 return 4; +9 val y = b.foo() +9 val y = b.foo() +13 return 4; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.nullnessGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.nullnessGroups.txt new file mode 100644 index 00000000000..b71769875ed --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +9 val y = b.foo() +9 val y = b.foo() diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.results.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.results.txt new file mode 100644 index 00000000000..c48a31ff65b --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.results.txt @@ -0,0 +1,5 @@ +9 val y = b.foo() +9 val y = b.foo() +4 override fun foo() = 2 +4 override fun foo() = 2 +13 return 4; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.java b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.java new file mode 100644 index 00000000000..69a9690517c --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.java @@ -0,0 +1,15 @@ +interface A { + public int foo(); +} + +class B extends A { + public int foo() { + return 2; + } +} + +class D extends B implements C { + public int foo() { + return 4; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt new file mode 100644 index 00000000000..340abe9390b --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt @@ -0,0 +1,12 @@ +// FLOW: IN + +interface C : A { + override fun foo() = 3 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.leafGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.leafGroups.txt new file mode 100644 index 00000000000..9aba49aa7ac --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.leafGroups.txt @@ -0,0 +1,10 @@ +4 override fun foo() = 3 +10 val z = c.foo() +10 val z = c.foo() +4 override fun foo() = 3 +4 override fun foo() = 3 + +13 return 4; +10 val z = c.foo() +10 val z = c.foo() +13 return 4; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.nullnessGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.nullnessGroups.txt new file mode 100644 index 00000000000..29011be65df --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +10 val z = c.foo() +10 val z = c.foo() diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.results.txt b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.results.txt new file mode 100644 index 00000000000..50a5bf26c4e --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.results.txt @@ -0,0 +1,5 @@ +10 val z = c.foo() +10 val z = c.foo() +4 override fun foo() = 3 +4 override fun foo() = 3 +13 return 4; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.java b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.java new file mode 100644 index 00000000000..16796a3acb6 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.java @@ -0,0 +1,15 @@ +class B implements A { + public int foo() { + return 2; + } +} + +interface C extends A { + public int foo(); +} + +class D extends B implements C { + public int foo() { + return 4; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt new file mode 100644 index 00000000000..bcc284c7727 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt @@ -0,0 +1,12 @@ +// FLOW: IN + +interface A { + fun foo() = 1 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.leafGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.leafGroups.txt new file mode 100644 index 00000000000..5ae3c41bcaf --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.leafGroups.txt @@ -0,0 +1,15 @@ +4 fun foo() = 1 +8 val x = a.foo() +8 val x = a.foo() +4 fun foo() = 1 +4 fun foo() = 1 + +3 return 2; +8 val x = a.foo() +8 val x = a.foo() +3 return 2; + +13 return 4; +8 val x = a.foo() +8 val x = a.foo() +13 return 4; diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.nullnessGroups.txt b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.nullnessGroups.txt new file mode 100644 index 00000000000..91e24f724b5 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +8 val x = a.foo() +8 val x = a.foo() diff --git a/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.results.txt b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.results.txt new file mode 100644 index 00000000000..96bce28dea5 --- /dev/null +++ b/idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.results.txt @@ -0,0 +1,6 @@ +8 val x = a.foo() +8 val x = a.foo() +4 fun foo() = 1 +4 fun foo() = 1 +13 return 4; +3 return 2; diff --git a/idea/testData/slicer/inflow/funParamerer.java b/idea/testData/slicer/inflow/funParamerer.java new file mode 100644 index 00000000000..c1e80c897f5 --- /dev/null +++ b/idea/testData/slicer/inflow/funParamerer.java @@ -0,0 +1,6 @@ +class J { + void test() { + FunParamererKt.foo(1): + FunParamererKt.foo(1, "2"): + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/funParamerer.kt b/idea/testData/slicer/inflow/funParamerer.kt index ee4e564c9be..1efc153dbef 100644 --- a/idea/testData/slicer/inflow/funParamerer.kt +++ b/idea/testData/slicer/inflow/funParamerer.kt @@ -1,5 +1,6 @@ // FLOW: IN +@JvmOverloads fun foo(n: Int, s: String = "???") { } diff --git a/idea/testData/slicer/inflow/funParamerer.leafGroups.txt b/idea/testData/slicer/inflow/funParamerer.leafGroups.txt index 522fc76c838..fdf8be6e6b6 100644 --- a/idea/testData/slicer/inflow/funParamerer.leafGroups.txt +++ b/idea/testData/slicer/inflow/funParamerer.leafGroups.txt @@ -1,4 +1,8 @@ -8 foo(1) -3 fun foo(n: Int, s: String = "???") { -8 foo(1) +3 FunParamererKt.foo(1): +4 fun foo(n: Int, s: String = "???") { +3 FunParamererKt.foo(1): + +9 foo(1) +4 fun foo(n: Int, s: String = "???") { +9 foo(1) diff --git a/idea/testData/slicer/inflow/funParamerer.nullnessGroups.txt b/idea/testData/slicer/inflow/funParamerer.nullnessGroups.txt index b884f9ebf40..689e74374f1 100644 --- a/idea/testData/slicer/inflow/funParamerer.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/funParamerer.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -3 fun foo(n: Int, s: String = "???") { -3 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { + diff --git a/idea/testData/slicer/inflow/funParamerer.results.txt b/idea/testData/slicer/inflow/funParamerer.results.txt index 9512d61dacb..3636b559025 100644 --- a/idea/testData/slicer/inflow/funParamerer.results.txt +++ b/idea/testData/slicer/inflow/funParamerer.results.txt @@ -1,6 +1,8 @@ -3 fun foo(n: Int, s: String = "???") { -8 foo(1) -9 foo(1, "2") -10 foo(1, s = "2") -11 foo(n = 1, s = "2") -12 foo(s = "2", n = 1) +4 fun foo(n: Int, s: String = "???") { +3 FunParamererKt.foo(1): +4 FunParamererKt.foo(1, "2"): +9 foo(1) +10 foo(1, "2") +11 foo(1, s = "2") +12 foo(n = 1, s = "2") +13 foo(s = "2", n = 1) diff --git a/idea/testData/slicer/inflow/funParamererWithDefault.java b/idea/testData/slicer/inflow/funParamererWithDefault.java new file mode 100644 index 00000000000..79878fb6178 --- /dev/null +++ b/idea/testData/slicer/inflow/funParamererWithDefault.java @@ -0,0 +1,6 @@ +class J { + void test() { + FunParamererWithDefaultKt.foo(1): + FunParamererWithDefaultKt.foo(1, "2"): + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/funParamererWithDefault.kt b/idea/testData/slicer/inflow/funParamererWithDefault.kt index 0ec7f9a3878..10bd672ec56 100644 --- a/idea/testData/slicer/inflow/funParamererWithDefault.kt +++ b/idea/testData/slicer/inflow/funParamererWithDefault.kt @@ -1,5 +1,6 @@ // FLOW: IN +@JvmOverloads fun foo(n: Int, s: String = "???") { } diff --git a/idea/testData/slicer/inflow/funParamererWithDefault.leafGroups.txt b/idea/testData/slicer/inflow/funParamererWithDefault.leafGroups.txt index 16aea0abbd4..13c7ea56293 100644 --- a/idea/testData/slicer/inflow/funParamererWithDefault.leafGroups.txt +++ b/idea/testData/slicer/inflow/funParamererWithDefault.leafGroups.txt @@ -1,8 +1,12 @@ -9 foo(1, "2") -3 fun foo(n: Int, s: String = "???") { -9 foo(1, "2") +4 FunParamererWithDefaultKt.foo(1, "2"): +4 fun foo(n: Int, s: String = "???") { +4 FunParamererWithDefaultKt.foo(1, "2"): -3 fun foo(n: Int, s: String = "???") { -3 fun foo(n: Int, s: String = "???") { -3 fun foo(n: Int, s: String = "???") { +10 foo(1, "2") +4 fun foo(n: Int, s: String = "???") { +10 foo(1, "2") + +4 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { diff --git a/idea/testData/slicer/inflow/funParamererWithDefault.nullnessGroups.txt b/idea/testData/slicer/inflow/funParamererWithDefault.nullnessGroups.txt index fa0600bde6d..ad2a142f82d 100644 --- a/idea/testData/slicer/inflow/funParamererWithDefault.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/funParamererWithDefault.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -3 fun foo(n: Int, s: String = "???") { -3 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { +4 fun foo(n: Int, s: String = "???") { + diff --git a/idea/testData/slicer/inflow/funParamererWithDefault.results.txt b/idea/testData/slicer/inflow/funParamererWithDefault.results.txt index 24826078dda..948987294be 100644 --- a/idea/testData/slicer/inflow/funParamererWithDefault.results.txt +++ b/idea/testData/slicer/inflow/funParamererWithDefault.results.txt @@ -1,6 +1,7 @@ -3 fun foo(n: Int, s: String = "???") { -3 fun foo(n: Int, s: String = "???") { -9 foo(1, "2") -10 foo(1, s = "2") -11 foo(n = 1, s = "2") -12 foo(s = "2", n = 1) +4 fun foo(n: Int, s: String = "???") { +4 FunParamererWithDefaultKt.foo(1, "2"): +4 fun foo(n: Int, s: String = "???") { +10 foo(1, "2") +11 foo(1, s = "2") +12 foo(n = 1, s = "2") +13 foo(s = "2", n = 1) diff --git a/idea/testData/slicer/inflow/overridingFunctionResult.java b/idea/testData/slicer/inflow/overridingFunctionResult.java new file mode 100644 index 00000000000..81bf1bc641c --- /dev/null +++ b/idea/testData/slicer/inflow/overridingFunctionResult.java @@ -0,0 +1,5 @@ +class D extends B { + public int foo() { + return 5; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/overridingFunctionResult.leafGroups.txt b/idea/testData/slicer/inflow/overridingFunctionResult.leafGroups.txt index c15a95bd653..35020314510 100644 --- a/idea/testData/slicer/inflow/overridingFunctionResult.leafGroups.txt +++ b/idea/testData/slicer/inflow/overridingFunctionResult.leafGroups.txt @@ -10,3 +10,8 @@ 12 override fun foo() = 3 12 override fun foo() = 3 +3 return 5; +17 val y = b.foo() +17 val y = b.foo() +3 return 5; + diff --git a/idea/testData/slicer/inflow/overridingFunctionResult.results.txt b/idea/testData/slicer/inflow/overridingFunctionResult.results.txt index 1568d394995..76e79b52a01 100644 --- a/idea/testData/slicer/inflow/overridingFunctionResult.results.txt +++ b/idea/testData/slicer/inflow/overridingFunctionResult.results.txt @@ -2,5 +2,6 @@ 17 val y = b.foo() 8 override fun foo() = 2 8 override fun foo() = 2 +3 return 5; 12 override fun foo() = 3 12 override fun foo() = 3 diff --git a/idea/testData/slicer/inflow/overridingParameter.java b/idea/testData/slicer/inflow/overridingParameter.java new file mode 100644 index 00000000000..b74de266109 --- /dev/null +++ b/idea/testData/slicer/inflow/overridingParameter.java @@ -0,0 +1,5 @@ +class D extends B { + public int getFoo() { + return 5; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/overridingParameter.leafGroups.txt b/idea/testData/slicer/inflow/overridingParameter.leafGroups.txt index bf2c9d42b27..1273c77f19e 100644 --- a/idea/testData/slicer/inflow/overridingParameter.leafGroups.txt +++ b/idea/testData/slicer/inflow/overridingParameter.leafGroups.txt @@ -9,3 +9,8 @@ 10 override val foo = 3 10 override val foo = 3 +3 return 5; +15 val y = b.foo +15 val y = b.foo +3 return 5; + diff --git a/idea/testData/slicer/inflow/overridingParameter.results.txt b/idea/testData/slicer/inflow/overridingParameter.results.txt index 96db7c39e0b..c1091a54113 100644 --- a/idea/testData/slicer/inflow/overridingParameter.results.txt +++ b/idea/testData/slicer/inflow/overridingParameter.results.txt @@ -1,5 +1,6 @@ 15 val y = b.foo 15 val y = b.foo 7 open class B(override val foo: Int) : A() +3 return 5; 10 override val foo = 3 10 override val foo = 3 diff --git a/idea/testData/slicer/inflow/overridingPropertyGetterResult.java b/idea/testData/slicer/inflow/overridingPropertyGetterResult.java new file mode 100644 index 00000000000..b74de266109 --- /dev/null +++ b/idea/testData/slicer/inflow/overridingPropertyGetterResult.java @@ -0,0 +1,5 @@ +class D extends B { + public int getFoo() { + return 5; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/overridingPropertyGetterResult.leafGroups.txt b/idea/testData/slicer/inflow/overridingPropertyGetterResult.leafGroups.txt index 17726de11f4..01188c82ae4 100644 --- a/idea/testData/slicer/inflow/overridingPropertyGetterResult.leafGroups.txt +++ b/idea/testData/slicer/inflow/overridingPropertyGetterResult.leafGroups.txt @@ -10,3 +10,8 @@ 14 override val foo: Int 15 get() = 3 +3 return 5; +20 val y = b.foo +20 val y = b.foo +3 return 5; + diff --git a/idea/testData/slicer/inflow/overridingPropertyGetterResult.results.txt b/idea/testData/slicer/inflow/overridingPropertyGetterResult.results.txt index 74f82ffb617..bcca29baaab 100644 --- a/idea/testData/slicer/inflow/overridingPropertyGetterResult.results.txt +++ b/idea/testData/slicer/inflow/overridingPropertyGetterResult.results.txt @@ -2,5 +2,6 @@ 20 val y = b.foo 9 override val foo: Int 10 get() = 2 +3 return 5; 14 override val foo: Int 15 get() = 3 diff --git a/idea/testData/slicer/inflow/overridingPropertyResult.java b/idea/testData/slicer/inflow/overridingPropertyResult.java new file mode 100644 index 00000000000..b74de266109 --- /dev/null +++ b/idea/testData/slicer/inflow/overridingPropertyResult.java @@ -0,0 +1,5 @@ +class D extends B { + public int getFoo() { + return 5; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/overridingPropertyResult.leafGroups.txt b/idea/testData/slicer/inflow/overridingPropertyResult.leafGroups.txt index 2a7b2ca8155..0681ba65ca8 100644 --- a/idea/testData/slicer/inflow/overridingPropertyResult.leafGroups.txt +++ b/idea/testData/slicer/inflow/overridingPropertyResult.leafGroups.txt @@ -10,3 +10,8 @@ 12 override val foo = 3 12 override val foo = 3 +3 return 5; +17 val y = b.foo +17 val y = b.foo +3 return 5; + diff --git a/idea/testData/slicer/inflow/overridingPropertyResult.results.txt b/idea/testData/slicer/inflow/overridingPropertyResult.results.txt index fe3db8a9f5b..da9b7e25d58 100644 --- a/idea/testData/slicer/inflow/overridingPropertyResult.results.txt +++ b/idea/testData/slicer/inflow/overridingPropertyResult.results.txt @@ -2,5 +2,6 @@ 17 val y = b.foo 8 override val foo = 2 8 override val foo = 2 +3 return 5; 12 override val foo = 3 12 override val foo = 3 diff --git a/idea/testData/slicer/inflow/primaryConstructorParameter.java b/idea/testData/slicer/inflow/primaryConstructorParameter.java new file mode 100644 index 00000000000..2204dbf0f94 --- /dev/null +++ b/idea/testData/slicer/inflow/primaryConstructorParameter.java @@ -0,0 +1,14 @@ +class D extends A { + D(int n, String s) { + super(n, s); + } + + D(int n) { + super(n); + } + + void test() { + new A(1); + new A(1, "2"); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/primaryConstructorParameter.kt b/idea/testData/slicer/inflow/primaryConstructorParameter.kt index 957941f898b..ea2aabff57a 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameter.kt +++ b/idea/testData/slicer/inflow/primaryConstructorParameter.kt @@ -1,6 +1,6 @@ // FLOW: IN -open class A(n: Int, s: String = "???") +open class A @JvmOverloads constructor(n: Int, s: String = "???") class B1: A(1) class B2: A(1, "2") diff --git a/idea/testData/slicer/inflow/primaryConstructorParameter.leafGroups.txt b/idea/testData/slicer/inflow/primaryConstructorParameter.leafGroups.txt index bf5e449eadc..6a790b235e2 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameter.leafGroups.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameter.leafGroups.txt @@ -1,4 +1,13 @@ +2 D(int n, String s) { +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 super(n, s); +2 D(int n, String s) { + 5 class B1: A(1) -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") 5 class B1: A(1) +11 new A(1); +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +11 new A(1); + diff --git a/idea/testData/slicer/inflow/primaryConstructorParameter.nullnessGroups.txt b/idea/testData/slicer/inflow/primaryConstructorParameter.nullnessGroups.txt index 63648612e2e..4b15ff6ecb1 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameter.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameter.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -3 open class A(n: Int, s: String = "???") -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") + diff --git a/idea/testData/slicer/inflow/primaryConstructorParameter.results.txt b/idea/testData/slicer/inflow/primaryConstructorParameter.results.txt index 692b92fa3bf..0d0831b062b 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameter.results.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameter.results.txt @@ -1,4 +1,4 @@ -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") 5 class B1: A(1) 6 class B2: A(1, "2") 7 class B3: A(1, s = "2") @@ -9,3 +9,9 @@ 14 A(1, s = "2") 15 A(n = 1, s = "2") 16 A(s = "2", n = 1) +3 super(n, s); +2 D(int n, String s) { +7 super(n); +6 D(int n) { +11 new A(1); +12 new A(1, "2"); diff --git a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.java b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.java new file mode 100644 index 00000000000..2204dbf0f94 --- /dev/null +++ b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.java @@ -0,0 +1,14 @@ +class D extends A { + D(int n, String s) { + super(n, s); + } + + D(int n) { + super(n); + } + + void test() { + new A(1); + new A(1, "2"); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.kt b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.kt index d178cccebcc..92f566a6850 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.kt +++ b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.kt @@ -1,6 +1,6 @@ // FLOW: IN -open class A(n: Int, s: String = "???") +open class A @JvmOverloads constructor(n: Int, s: String = "???") class B1: A(1) class B2: A(1, "2") diff --git a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.leafGroups.txt b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.leafGroups.txt index 069ec782427..fb2729d4947 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.leafGroups.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.leafGroups.txt @@ -1,8 +1,17 @@ 6 class B2: A(1, "2") -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") 6 class B2: A(1, "2") -3 open class A(n: Int, s: String = "???") -3 open class A(n: Int, s: String = "???") -3 open class A(n: Int, s: String = "???") +12 new A(1, "2"); +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +12 new A(1, "2"); + +2 D(int n, String s) { +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 super(n, s); +2 D(int n, String s) { + +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") diff --git a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.nullnessGroups.txt b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.nullnessGroups.txt index 51db0b7733b..9e4da8dfe3f 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -3 open class A(n: Int, s: String = "???") -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") + diff --git a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.results.txt b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.results.txt index 0b88fa77883..83865a19342 100644 --- a/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.results.txt +++ b/idea/testData/slicer/inflow/primaryConstructorParameterWithDefault.results.txt @@ -1,5 +1,5 @@ -3 open class A(n: Int, s: String = "???") -3 open class A(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") +3 open class A @JvmOverloads constructor(n: Int, s: String = "???") 6 class B2: A(1, "2") 7 class B3: A(1, s = "2") 8 class B4: A(n = 1, s = "2") @@ -8,3 +8,6 @@ 14 A(1, s = "2") 15 A(n = 1, s = "2") 16 A(s = "2", n = 1) +3 super(n, s); +2 D(int n, String s) { +12 new A(1, "2"); diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameter.java b/idea/testData/slicer/inflow/secondaryConstructorParameter.java new file mode 100644 index 00000000000..2204dbf0f94 --- /dev/null +++ b/idea/testData/slicer/inflow/secondaryConstructorParameter.java @@ -0,0 +1,14 @@ +class D extends A { + D(int n, String s) { + super(n, s); + } + + D(int n) { + super(n); + } + + void test() { + new A(1); + new A(1, "2"); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameter.kt b/idea/testData/slicer/inflow/secondaryConstructorParameter.kt index dc870536ce4..2610000ef6a 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameter.kt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameter.kt @@ -1,7 +1,7 @@ // FLOW: IN open class A { - constructor(n: Int, s: String = "???") + @JvmOverloads constructor(n: Int, s: String = "???") } class B1: A(1) diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameter.leafGroups.txt b/idea/testData/slicer/inflow/secondaryConstructorParameter.leafGroups.txt index 6270f30b3e8..441a70f6e54 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameter.leafGroups.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameter.leafGroups.txt @@ -1,4 +1,13 @@ +2 D(int n, String s) { +4 @JvmOverloads constructor(n: Int, s: String = "???") +3 super(n, s); +2 D(int n, String s) { + 7 class B1: A(1) -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") 7 class B1: A(1) +11 new A(1); +4 @JvmOverloads constructor(n: Int, s: String = "???") +11 new A(1); + diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameter.nullnessGroups.txt b/idea/testData/slicer/inflow/secondaryConstructorParameter.nullnessGroups.txt index 6b5730b5237..83966cc7d7c 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameter.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameter.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -4 constructor(n: Int, s: String = "???") -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") + diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameter.results.txt b/idea/testData/slicer/inflow/secondaryConstructorParameter.results.txt index 7ccd9cdae69..9f4e3cb9b86 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameter.results.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameter.results.txt @@ -1,4 +1,4 @@ -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") 7 class B1: A(1) 8 class B2: A(1, "2") 9 class B3: A(1, s = "2") @@ -9,3 +9,9 @@ 16 A(1, s = "2") 17 A(n = 1, s = "2") 18 A(s = "2", n = 1) +3 super(n, s); +2 D(int n, String s) { +7 super(n); +6 D(int n) { +11 new A(1); +12 new A(1, "2"); diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.java b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.java new file mode 100644 index 00000000000..2204dbf0f94 --- /dev/null +++ b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.java @@ -0,0 +1,14 @@ +class D extends A { + D(int n, String s) { + super(n, s); + } + + D(int n) { + super(n); + } + + void test() { + new A(1); + new A(1, "2"); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.kt b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.kt index 32614031efe..cd6b1a7e80c 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.kt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.kt @@ -1,7 +1,7 @@ // FLOW: IN open class A { - constructor(n: Int, s: String = "???") + @JvmOverloads constructor(n: Int, s: String = "???") } class B1: A(1) diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.leafGroups.txt b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.leafGroups.txt index 5e8e7fdabb1..3a7ec215f14 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.leafGroups.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.leafGroups.txt @@ -1,8 +1,17 @@ 8 class B2: A(1, "2") -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") 8 class B2: A(1, "2") -4 constructor(n: Int, s: String = "???") -4 constructor(n: Int, s: String = "???") -4 constructor(n: Int, s: String = "???") +12 new A(1, "2"); +4 @JvmOverloads constructor(n: Int, s: String = "???") +12 new A(1, "2"); + +2 D(int n, String s) { +4 @JvmOverloads constructor(n: Int, s: String = "???") +3 super(n, s); +2 D(int n, String s) { + +4 @JvmOverloads constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.nullnessGroups.txt b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.nullnessGroups.txt index 636ca3a1ebf..15fab3feda7 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.nullnessGroups.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.nullnessGroups.txt @@ -1,3 +1,4 @@ [NotNull Values] -4 constructor(n: Int, s: String = "???") -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") + diff --git a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.results.txt b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.results.txt index a67d20eb31f..aa79f112beb 100644 --- a/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.results.txt +++ b/idea/testData/slicer/inflow/secondaryConstructorParameterWithDefault.results.txt @@ -1,5 +1,5 @@ -4 constructor(n: Int, s: String = "???") -4 constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") +4 @JvmOverloads constructor(n: Int, s: String = "???") 8 class B2: A(1, "2") 9 class B3: A(1, s = "2") 10 class B4: A(n = 1, s = "2") @@ -8,3 +8,6 @@ 16 A(1, s = "2") 17 A(n = 1, s = "2") 18 A(s = "2", n = 1) +3 super(n, s); +2 D(int n, String s) { +12 new A(1, "2"); diff --git a/idea/testData/slicer/inflow/settersViaJavaDelegate.java b/idea/testData/slicer/inflow/settersViaJavaDelegate.java new file mode 100644 index 00000000000..cb94502d929 --- /dev/null +++ b/idea/testData/slicer/inflow/settersViaJavaDelegate.java @@ -0,0 +1,15 @@ +import kotlin.reflect.KProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class D { + private String _value = ""; + + int getValue(@Nullable Object thisRef, @NotNull KProperty property) { + return _value; + } + + void setValue(@Nullable Object thisRef, @NotNull KProperty property, @NotNull String value) { + _value = value; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/settersViaJavaDelegate.kt b/idea/testData/slicer/inflow/settersViaJavaDelegate.kt new file mode 100644 index 00000000000..66854534013 --- /dev/null +++ b/idea/testData/slicer/inflow/settersViaJavaDelegate.kt @@ -0,0 +1,19 @@ +// FLOW: IN +// RUNTIME_WITH_REFLECT + +class AClass(name1: String){ + var name by D() + init { + name = name1 + } + + fun uses(){ + name = "bye" + println("Now my name is '$name'") + } +} + +fun main(args: Array) { + val a = AClass("hello") + println("My name is '${a.name}'") +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/settersViaJavaDelegate.leafGroups.txt b/idea/testData/slicer/inflow/settersViaJavaDelegate.leafGroups.txt new file mode 100644 index 00000000000..50565355300 --- /dev/null +++ b/idea/testData/slicer/inflow/settersViaJavaDelegate.leafGroups.txt @@ -0,0 +1,12 @@ +6 private String _value = ""; +12 println("Now my name is '$name'") +5 var name by D() +9 return _value; +6 private String _value = ""; + +12 void setValue(@Nullable Object thisRef, @NotNull KProperty property, @NotNull String value) { +12 println("Now my name is '$name'") +5 var name by D() +9 return _value; +13 _value = value; +12 void setValue(@Nullable Object thisRef, @NotNull KProperty property, @NotNull String value) { diff --git a/idea/testData/slicer/inflow/settersViaJavaDelegate.nullnessGroups.txt b/idea/testData/slicer/inflow/settersViaJavaDelegate.nullnessGroups.txt new file mode 100644 index 00000000000..2757ee585bb --- /dev/null +++ b/idea/testData/slicer/inflow/settersViaJavaDelegate.nullnessGroups.txt @@ -0,0 +1,3 @@ +[NotNull Values] +12 println("Now my name is '$name'") +12 println("Now my name is '$name'") diff --git a/idea/testData/slicer/inflow/settersViaJavaDelegate.results.txt b/idea/testData/slicer/inflow/settersViaJavaDelegate.results.txt new file mode 100644 index 00000000000..14ba16fc7bc --- /dev/null +++ b/idea/testData/slicer/inflow/settersViaJavaDelegate.results.txt @@ -0,0 +1,6 @@ +12 println("Now my name is '$name'") +5 var name by D() +9 return _value; +6 private String _value = ""; +13 _value = value; +12 void setValue(@Nullable Object thisRef, @NotNull KProperty property, @NotNull String value) { diff --git a/idea/testData/slicer/inflow/topLevelVal.java b/idea/testData/slicer/inflow/topLevelVal.java new file mode 100644 index 00000000000..a1e397aefeb --- /dev/null +++ b/idea/testData/slicer/inflow/topLevelVal.java @@ -0,0 +1,5 @@ +class D { + void test() { + int foo = TopLevelValKt.getFoo(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/topLevelVar.java b/idea/testData/slicer/inflow/topLevelVar.java new file mode 100644 index 00000000000..cd002fd9f57 --- /dev/null +++ b/idea/testData/slicer/inflow/topLevelVar.java @@ -0,0 +1,6 @@ +class D { + void test() { + int foo = TopLevelVarKt.getFoo(); + TopLevelVarKt.setFoo(3); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/topLevelVar.leafGroups.txt b/idea/testData/slicer/inflow/topLevelVar.leafGroups.txt index e48dcf25c6b..60a8b4a95bc 100644 --- a/idea/testData/slicer/inflow/topLevelVar.leafGroups.txt +++ b/idea/testData/slicer/inflow/topLevelVar.leafGroups.txt @@ -6,3 +6,7 @@ 3 var foo: Int = 1 7 foo = 2 +4 TopLevelVarKt.setFoo(3); +3 var foo: Int = 1 +4 TopLevelVarKt.setFoo(3); + diff --git a/idea/testData/slicer/inflow/topLevelVar.results.txt b/idea/testData/slicer/inflow/topLevelVar.results.txt index cf8f5afec92..6b1fde030f6 100644 --- a/idea/testData/slicer/inflow/topLevelVar.results.txt +++ b/idea/testData/slicer/inflow/topLevelVar.results.txt @@ -1,3 +1,4 @@ 3 var foo: Int = 1 3 var foo: Int = 1 +4 TopLevelVarKt.setFoo(3); 7 foo = 2 diff --git a/idea/testData/slicer/inflow/valParameter.java b/idea/testData/slicer/inflow/valParameter.java new file mode 100644 index 00000000000..05a4d36385c --- /dev/null +++ b/idea/testData/slicer/inflow/valParameter.java @@ -0,0 +1,10 @@ +class D extends A { + D(int n) { + super(n); + } + + void test() { + A a = new A(3); + int foo = a.getN(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/valParameter.leafGroups.txt b/idea/testData/slicer/inflow/valParameter.leafGroups.txt index 8c98dea6875..f5ffd97031f 100644 --- a/idea/testData/slicer/inflow/valParameter.leafGroups.txt +++ b/idea/testData/slicer/inflow/valParameter.leafGroups.txt @@ -1,3 +1,8 @@ +2 D(int n) { +3 open class A(val n: Int) +3 super(n); +2 D(int n) { + 5 class B : A(1) 3 open class A(val n: Int) 5 class B : A(1) @@ -6,3 +11,7 @@ 3 open class A(val n: Int) 8 val z = A(2).n +7 A a = new A(3); +3 open class A(val n: Int) +7 A a = new A(3); + diff --git a/idea/testData/slicer/inflow/valParameter.results.txt b/idea/testData/slicer/inflow/valParameter.results.txt index 4d949b68e97..9e8178e9d8e 100644 --- a/idea/testData/slicer/inflow/valParameter.results.txt +++ b/idea/testData/slicer/inflow/valParameter.results.txt @@ -1,3 +1,6 @@ 3 open class A(val n: Int) 5 class B : A(1) 8 val z = A(2).n +3 super(n); +2 D(int n) { +7 A a = new A(3); diff --git a/idea/testData/slicer/inflow/varParameter.java b/idea/testData/slicer/inflow/varParameter.java new file mode 100644 index 00000000000..a2c39a44684 --- /dev/null +++ b/idea/testData/slicer/inflow/varParameter.java @@ -0,0 +1,11 @@ +class D extends A { + D(int n) { + super(n); + } + + void test() { + A a = new A(3); + int foo = a.getN(); + a.setN(4); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/inflow/varParameter.leafGroups.txt b/idea/testData/slicer/inflow/varParameter.leafGroups.txt index 5d90f9c4d70..6358f1a2d65 100644 --- a/idea/testData/slicer/inflow/varParameter.leafGroups.txt +++ b/idea/testData/slicer/inflow/varParameter.leafGroups.txt @@ -1,3 +1,8 @@ +2 D(int n) { +3 open class A(var n: Int) { +3 super(n); +2 D(int n) { + 20 class B : A(1) 3 open class A(var n: Int) { 20 class B : A(1) @@ -10,3 +15,11 @@ 3 open class A(var n: Int) { 24 A(3).n = 2 +7 A a = new A(3); +3 open class A(var n: Int) { +7 A a = new A(3); + +9 a.setN(4); +3 open class A(var n: Int) { +9 a.setN(4); + diff --git a/idea/testData/slicer/inflow/varParameter.results.txt b/idea/testData/slicer/inflow/varParameter.results.txt index 1a1f0299900..37be43b53dd 100644 --- a/idea/testData/slicer/inflow/varParameter.results.txt +++ b/idea/testData/slicer/inflow/varParameter.results.txt @@ -2,5 +2,9 @@ 20 class B : A(1) 23 val z = A(2).n 24 A(3).n = 2 +3 super(n); +2 D(int n) { +7 A a = new A(3); +9 a.setN(4); 16 n = 1 24 A(3).n = 2 diff --git a/idea/testData/slicer/outflow/callArgumentKJK.java b/idea/testData/slicer/outflow/callArgumentKJK.java new file mode 100644 index 00000000000..62544e86c3c --- /dev/null +++ b/idea/testData/slicer/outflow/callArgumentKJK.java @@ -0,0 +1,6 @@ +class J { + void foo(int n) { + int y = n; + new K().bar(y); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/callArgumentKJK.kt b/idea/testData/slicer/outflow/callArgumentKJK.kt new file mode 100644 index 00000000000..a8025f152ea --- /dev/null +++ b/idea/testData/slicer/outflow/callArgumentKJK.kt @@ -0,0 +1,11 @@ +// FLOW: OUT +class K { + fun bar(m: Int) { + val z = m + } + + fun test() { + val x = 1 + J().foo(x) + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/callArgumentKJK.results.txt b/idea/testData/slicer/outflow/callArgumentKJK.results.txt new file mode 100644 index 00000000000..feab245d97c --- /dev/null +++ b/idea/testData/slicer/outflow/callArgumentKJK.results.txt @@ -0,0 +1,10 @@ +8 val x = 1 +8 val x = 1 +9 J().foo(x) +2 void foo(int n) { +3 int y = n; +3 int y = n; +4 new K().bar(y); +3 fun bar(m: Int) { +4 val z = m +4 val z = m diff --git a/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.java b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.java new file mode 100644 index 00000000000..46196098de3 --- /dev/null +++ b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.java @@ -0,0 +1,13 @@ +class J extends A { + J() { + + } + + J(int n) { + super(); + } + + void test() { + A a = new A(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.kt b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.kt new file mode 100644 index 00000000000..b51143bd1af --- /dev/null +++ b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.kt @@ -0,0 +1,15 @@ +// FLOW: OUT + +open class A() { + constructor(n: Int) : this() +} + +class B : A() + +class C : A { + constructor() : super() +} + +fun test() { + val x = A() +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.results.txt b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.results.txt new file mode 100644 index 00000000000..dab25e3649c --- /dev/null +++ b/idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.results.txt @@ -0,0 +1,9 @@ +3 open class A() { +7 class B : A() +14 val x = A() +14 val x = A() +2 J() { +7 super(); +4 constructor(n: Int) : this() +10 constructor() : super() +11 A a = new A(); diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.java b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.java new file mode 100644 index 00000000000..ef14290d5a0 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.java @@ -0,0 +1,13 @@ +interface A { + public int foo(); +} + +class B implements A { + public int foo() { + return 2; + } +} + +interface C extends A { + public int foo(); +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.kt b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.kt new file mode 100644 index 00000000000..e04fbe3caae --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.kt @@ -0,0 +1,12 @@ +// FLOW: OUT + +class D : B(), C { + override fun foo() = 4 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.results.txt b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.results.txt new file mode 100644 index 00000000000..a36ff0bae52 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.results.txt @@ -0,0 +1,22 @@ +4 override fun foo() = 4 +4 override fun foo() = 4 +11 val u = d.foo() +11 val u = d.foo() +2 public int foo(); +8 val x = a.foo() +8 val x = a.foo() +9 val y = b.foo() +9 val y = b.foo() +10 val z = c.foo() +10 val z = c.foo() +11 DUPLICATE: val u = d.foo() +6 public int foo() { +9 DUPLICATE: val y = b.foo() +11 DUPLICATE: val u = d.foo() +8 DUPLICATE: val x = a.foo() +10 DUPLICATE: val z = c.foo() +12 public int foo(); +10 DUPLICATE: val z = c.foo() +11 DUPLICATE: val u = d.foo() +8 DUPLICATE: val x = a.foo() +9 DUPLICATE: val y = b.foo() diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.java b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.java new file mode 100644 index 00000000000..ade11476ec6 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.java @@ -0,0 +1,15 @@ +// FLOW: OUT + +interface A { + public int foo(); +} + +interface C extends A { + public int foo(); +} + +class D extends B implements C { + public int foo() { + return 4; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.kt b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.kt new file mode 100644 index 00000000000..be5bd1f39e0 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.kt @@ -0,0 +1,12 @@ +// FLOW: OUT + +open class B : A { + override fun foo() = 2 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.results.txt b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.results.txt new file mode 100644 index 00000000000..86b1b43cf19 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.results.txt @@ -0,0 +1,12 @@ +4 override fun foo() = 2 +4 override fun foo() = 2 +9 val y = b.foo() +9 val y = b.foo() +4 public int foo(); +8 val x = a.foo() +8 val x = a.foo() +10 val z = c.foo() +10 val z = c.foo() +11 val u = d.foo() +11 val u = d.foo() +9 DUPLICATE: val y = b.foo() diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.java b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.java new file mode 100644 index 00000000000..69a9690517c --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.java @@ -0,0 +1,15 @@ +interface A { + public int foo(); +} + +class B extends A { + public int foo() { + return 2; + } +} + +class D extends B implements C { + public int foo() { + return 4; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.kt b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.kt new file mode 100644 index 00000000000..e5d32556e94 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.kt @@ -0,0 +1,12 @@ +// FLOW: OUT + +interface C : A { + override fun foo() = 3 +} + +fun test(a: A, b: B, c: C, d: D) { + val x = a.foo() + val y = b.foo() + val z = c.foo() + val u = d.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.results.txt b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.results.txt new file mode 100644 index 00000000000..f9d7b4b34a9 --- /dev/null +++ b/idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.results.txt @@ -0,0 +1,12 @@ +4 override fun foo() = 3 +4 override fun foo() = 3 +10 val z = c.foo() +10 val z = c.foo() +2 public int foo(); +8 val x = a.foo() +8 val x = a.foo() +9 val y = b.foo() +9 val y = b.foo() +11 val u = d.foo() +11 val u = d.foo() +10 DUPLICATE: val z = c.foo() diff --git a/idea/testData/slicer/outflow/functionCalls.java b/idea/testData/slicer/outflow/functionCalls.java new file mode 100644 index 00000000000..23ed6b1d64d --- /dev/null +++ b/idea/testData/slicer/outflow/functionCalls.java @@ -0,0 +1,5 @@ +class J { + void test() { + int x = FunctionCallsKt.foo(2); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/functionCalls.kt b/idea/testData/slicer/outflow/functionCalls.kt index 599a0afeb8c..62632b8a8a7 100644 --- a/idea/testData/slicer/outflow/functionCalls.kt +++ b/idea/testData/slicer/outflow/functionCalls.kt @@ -1,8 +1,6 @@ // FLOW: OUT -fun foo(n: Int) { - -} +fun foo(n: Int) = n + 1 fun test(m: Int) { val x = foo(1) diff --git a/idea/testData/slicer/outflow/functionCalls.results.txt b/idea/testData/slicer/outflow/functionCalls.results.txt index 73ede156dbf..94fb8f8d78c 100644 --- a/idea/testData/slicer/outflow/functionCalls.results.txt +++ b/idea/testData/slicer/outflow/functionCalls.results.txt @@ -1,3 +1,4 @@ -3 fun foo(n: Int) { -8 val x = foo(1) -8 val x = foo(1) +3 fun foo(n: Int) = n + 1 +3 int x = FunctionCallsKt.foo(2); +6 val x = foo(1) +6 val x = foo(1) diff --git a/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.java b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.java new file mode 100644 index 00000000000..43aa9af2e68 --- /dev/null +++ b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.java @@ -0,0 +1,5 @@ +class J { + void test() { + int x = new A().x; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.kt b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.kt new file mode 100644 index 00000000000..93ab1001c7a --- /dev/null +++ b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.kt @@ -0,0 +1,5 @@ +// FLOW: OUT + +class A { + @JvmField val x = 1 +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.results.txt b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.results.txt new file mode 100644 index 00000000000..6fb0caa30e6 --- /dev/null +++ b/idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.results.txt @@ -0,0 +1,3 @@ +4 @JvmField val x = 1 +3 int x = new A().x; +3 int x = new A().x; diff --git a/idea/testData/slicer/outflow/memberPropertyUsages.java b/idea/testData/slicer/outflow/memberPropertyUsages.java new file mode 100644 index 00000000000..18018feac26 --- /dev/null +++ b/idea/testData/slicer/outflow/memberPropertyUsages.java @@ -0,0 +1,5 @@ +class J { + void test() { + int x = new A().getX(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/memberPropertyUsages.results.txt b/idea/testData/slicer/outflow/memberPropertyUsages.results.txt index 0fcfc37d3e2..96695f64e53 100644 --- a/idea/testData/slicer/outflow/memberPropertyUsages.results.txt +++ b/idea/testData/slicer/outflow/memberPropertyUsages.results.txt @@ -1,4 +1,5 @@ 4 val x = 1 +3 int x = new A().getX(); 6 val y = x 6 val y = x 11 z = x diff --git a/idea/testData/slicer/outflow/overridingFunctionResultWithJava.java b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.java new file mode 100644 index 00000000000..a27d38dcf2c --- /dev/null +++ b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.java @@ -0,0 +1,11 @@ +class A { + int foo() { + return 1; + } +} + +class C extends B { + int foo() { + return 3; + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/overridingFunctionResultWithJava.kt b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.kt new file mode 100644 index 00000000000..8b9a8a5ff08 --- /dev/null +++ b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.kt @@ -0,0 +1,11 @@ +// FLOW: OUT + +open class B : A() { + override fun foo() = 2 +} + +fun test(a: A, b: B, c: C) { + val x = a.foo() + val y = b.foo() + val z = c.foo() +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/overridingFunctionResultWithJava.results.txt b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.results.txt new file mode 100644 index 00000000000..ef191709ab7 --- /dev/null +++ b/idea/testData/slicer/outflow/overridingFunctionResultWithJava.results.txt @@ -0,0 +1,10 @@ +4 override fun foo() = 2 +4 override fun foo() = 2 +9 val y = b.foo() +9 val y = b.foo() +2 int foo() { +8 val x = a.foo() +8 val x = a.foo() +10 val z = c.foo() +10 val z = c.foo() +9 DUPLICATE: val y = b.foo() diff --git a/idea/testData/slicer/outflow/primaryConstructorCalls.java b/idea/testData/slicer/outflow/primaryConstructorCalls.java new file mode 100644 index 00000000000..54080eb9660 --- /dev/null +++ b/idea/testData/slicer/outflow/primaryConstructorCalls.java @@ -0,0 +1,9 @@ +class J extends A { + J() { + super(1); + } + + void test() { + A a = new A(1); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/primaryConstructorCalls.results.txt b/idea/testData/slicer/outflow/primaryConstructorCalls.results.txt index f2904bfa19d..321f048ddd4 100644 --- a/idea/testData/slicer/outflow/primaryConstructorCalls.results.txt +++ b/idea/testData/slicer/outflow/primaryConstructorCalls.results.txt @@ -2,5 +2,7 @@ 7 class B : A(1) 14 val x = A(1) 14 val x = A(1) +3 super(1); 4 constructor() : this(1) 10 constructor() : super(1) +7 A a = new A(1); diff --git a/idea/testData/slicer/outflow/secondaryConstructorCalls.java b/idea/testData/slicer/outflow/secondaryConstructorCalls.java new file mode 100644 index 00000000000..54080eb9660 --- /dev/null +++ b/idea/testData/slicer/outflow/secondaryConstructorCalls.java @@ -0,0 +1,9 @@ +class J extends A { + J() { + super(1); + } + + void test() { + A a = new A(1); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/secondaryConstructorCalls.results.txt b/idea/testData/slicer/outflow/secondaryConstructorCalls.results.txt index d22eccb6972..bbc817cf473 100644 --- a/idea/testData/slicer/outflow/secondaryConstructorCalls.results.txt +++ b/idea/testData/slicer/outflow/secondaryConstructorCalls.results.txt @@ -2,5 +2,7 @@ 9 class B : A(1) 16 val x = A(1) 16 val x = A(1) +3 super(1); 6 constructor() : this(1) 12 constructor() : super(1) +7 A a = new A(1); diff --git a/idea/testData/slicer/outflow/topLevelPropertyUsages.java b/idea/testData/slicer/outflow/topLevelPropertyUsages.java new file mode 100644 index 00000000000..bc4ee416d8f --- /dev/null +++ b/idea/testData/slicer/outflow/topLevelPropertyUsages.java @@ -0,0 +1,5 @@ +class J { + void test() { + int x = TopLevelPropertyUsagesKt.getX(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt b/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt index fc341f680d9..3ee47b7c38b 100644 --- a/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt +++ b/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt @@ -1,4 +1,5 @@ 3 val x = 1 +3 int x = TopLevelPropertyUsagesKt.getX(); 5 val y = x 5 val y = x 8 val y = x diff --git a/idea/testData/slicer/outflow/valParameter.java b/idea/testData/slicer/outflow/valParameter.java new file mode 100644 index 00000000000..9b382af9207 --- /dev/null +++ b/idea/testData/slicer/outflow/valParameter.java @@ -0,0 +1,5 @@ +class J { + void test() { + int n = new A(1).getN(); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/valParameter.results.txt b/idea/testData/slicer/outflow/valParameter.results.txt index 88edf075d7f..c6743c5a6c6 100644 --- a/idea/testData/slicer/outflow/valParameter.results.txt +++ b/idea/testData/slicer/outflow/valParameter.results.txt @@ -1,4 +1,5 @@ 3 class A(val n: Int) { +3 int n = new A(1).getN(); 4 val x = n 4 val x = n 9 y = n diff --git a/idea/testData/slicer/outflow/varParameter.java b/idea/testData/slicer/outflow/varParameter.java new file mode 100644 index 00000000000..52e0f1156f3 --- /dev/null +++ b/idea/testData/slicer/outflow/varParameter.java @@ -0,0 +1,6 @@ +class J { + void test() { + int n = new A(1).getN(); + new A(1).setN(2); + } +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/varParameter.results.txt b/idea/testData/slicer/outflow/varParameter.results.txt index 3776c997ac7..5257a670b15 100644 --- a/idea/testData/slicer/outflow/varParameter.results.txt +++ b/idea/testData/slicer/outflow/varParameter.results.txt @@ -1,4 +1,5 @@ 3 class A(var n: Int) { +3 int n = new A(1).getN(); 4 val x = n 4 val x = n 9 y = n diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/AbstractSlicerTest.kt b/idea/tests/org/jetbrains/kotlin/idea/slicer/AbstractSlicerTest.kt index 59d9f7cde41..1348e1d39a1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/AbstractSlicerTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/AbstractSlicerTest.kt @@ -105,8 +105,12 @@ abstract class AbstractSlicerTest : KotlinLightCodeInsightFixtureTestCase() { protected fun doTest(path: String) { val mainFile = File(path) + val rootDir = mainFile.parentFile - myFixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${mainFile.parent}" + val namePrefix = FileUtil.getNameWithoutExtension(mainFile) + val extraFiles = rootDir.listFiles { _, name -> name.startsWith("$namePrefix.") } + + myFixture.testDataPath = "${KotlinTestUtils.getHomeDirectory()}/${rootDir.path}" val fileText = FileUtil.loadFile(mainFile, true) val flowKind = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// FLOW: ") @@ -121,6 +125,7 @@ abstract class AbstractSlicerTest : KotlinLightCodeInsightFixtureTestCase() { scope = AnalysisScope(project) } + extraFiles.forEach { myFixture.configureByFile(it.name) } val file = myFixture.configureByFile(mainFile.name) as KtFile val elementAtCaret = file.findElementAt(editor.caretModel.offset) val sliceProvider = KotlinSliceProvider() diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java index 6b059638d2f..5a638c0d9ae 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerLeafGroupingTestGenerated.java @@ -61,6 +61,30 @@ public class SlicerLeafGroupingTestGenerated extends AbstractSlicerLeafGroupingT doTest(fileName); } + @TestMetadata("delegateToJavaGetter.kt") + public void testDelegateToJavaGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/delegateToJavaGetter.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKMiddleClassFun.kt") + public void testDiamondHierarchyJKMiddleClassFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKMiddleInterfaceFun.kt") + public void testDiamondHierarchyJKMiddleInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKRootInterfaceFun.kt") + public void testDiamondHierarchyJKRootInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt"); + doTest(fileName); + } + @TestMetadata("diamondHierarchyMiddleClassFun.kt") public void testDiamondHierarchyMiddleClassFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyMiddleClassFun.kt"); @@ -313,6 +337,12 @@ public class SlicerLeafGroupingTestGenerated extends AbstractSlicerLeafGroupingT doTest(fileName); } + @TestMetadata("settersViaJavaDelegate.kt") + public void testSettersViaJavaDelegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/settersViaJavaDelegate.kt"); + doTest(fileName); + } + @TestMetadata("topLevelVal.kt") public void testTopLevelVal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/topLevelVal.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java index 8a0866c1437..a5fb5304b2d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerNullnessGroupingTestGenerated.java @@ -61,6 +61,30 @@ public class SlicerNullnessGroupingTestGenerated extends AbstractSlicerNullnessG doTest(fileName); } + @TestMetadata("delegateToJavaGetter.kt") + public void testDelegateToJavaGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/delegateToJavaGetter.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKMiddleClassFun.kt") + public void testDiamondHierarchyJKMiddleClassFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKMiddleInterfaceFun.kt") + public void testDiamondHierarchyJKMiddleInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt"); + doTest(fileName); + } + + @TestMetadata("diamondHierarchyJKRootInterfaceFun.kt") + public void testDiamondHierarchyJKRootInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt"); + doTest(fileName); + } + @TestMetadata("diamondHierarchyMiddleClassFun.kt") public void testDiamondHierarchyMiddleClassFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyMiddleClassFun.kt"); @@ -313,6 +337,12 @@ public class SlicerNullnessGroupingTestGenerated extends AbstractSlicerNullnessG doTest(fileName); } + @TestMetadata("settersViaJavaDelegate.kt") + public void testSettersViaJavaDelegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/settersViaJavaDelegate.kt"); + doTest(fileName); + } + @TestMetadata("topLevelVal.kt") public void testTopLevelVal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/topLevelVal.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java index c3931950567..7e69b6470c5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTreeTestGenerated.java @@ -61,6 +61,30 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { doTest(fileName); } + @TestMetadata("inflow/delegateToJavaGetter.kt") + public void testInflow_DelegateToJavaGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/delegateToJavaGetter.kt"); + doTest(fileName); + } + + @TestMetadata("inflow/diamondHierarchyJKMiddleClassFun.kt") + public void testInflow_DiamondHierarchyJKMiddleClassFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleClassFun.kt"); + doTest(fileName); + } + + @TestMetadata("inflow/diamondHierarchyJKMiddleInterfaceFun.kt") + public void testInflow_DiamondHierarchyJKMiddleInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKMiddleInterfaceFun.kt"); + doTest(fileName); + } + + @TestMetadata("inflow/diamondHierarchyJKRootInterfaceFun.kt") + public void testInflow_DiamondHierarchyJKRootInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyJKRootInterfaceFun.kt"); + doTest(fileName); + } + @TestMetadata("inflow/diamondHierarchyMiddleClassFun.kt") public void testInflow_DiamondHierarchyMiddleClassFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/diamondHierarchyMiddleClassFun.kt"); @@ -313,6 +337,12 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { doTest(fileName); } + @TestMetadata("inflow/settersViaJavaDelegate.kt") + public void testInflow_SettersViaJavaDelegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/settersViaJavaDelegate.kt"); + doTest(fileName); + } + @TestMetadata("inflow/topLevelVal.kt") public void testInflow_TopLevelVal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/inflow/topLevelVal.kt"); @@ -361,12 +391,42 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { doTest(fileName); } + @TestMetadata("outflow/callArgumentKJK.kt") + public void testOutflow_CallArgumentKJK() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/callArgumentKJK.kt"); + doTest(fileName); + } + @TestMetadata("outflow/cast.kt") public void testOutflow_Cast() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/cast.kt"); doTest(fileName); } + @TestMetadata("outflow/defaultExplicitPrimaryConstructorCalls.kt") + public void testOutflow_DefaultExplicitPrimaryConstructorCalls() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/defaultExplicitPrimaryConstructorCalls.kt"); + doTest(fileName); + } + + @TestMetadata("outflow/diamondHierarchyJKLeafClassFun.kt") + public void testOutflow_DiamondHierarchyJKLeafClassFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/diamondHierarchyJKLeafClassFun.kt"); + doTest(fileName); + } + + @TestMetadata("outflow/diamondHierarchyJKMiddleClassFun.kt") + public void testOutflow_DiamondHierarchyJKMiddleClassFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/diamondHierarchyJKMiddleClassFun.kt"); + doTest(fileName); + } + + @TestMetadata("outflow/diamondHierarchyJKMiddleInterfaceFun.kt") + public void testOutflow_DiamondHierarchyJKMiddleInterfaceFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/diamondHierarchyJKMiddleInterfaceFun.kt"); + doTest(fileName); + } + @TestMetadata("outflow/diamondHierarchyLeafClassFun.kt") public void testOutflow_DiamondHierarchyLeafClassFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/diamondHierarchyLeafClassFun.kt"); @@ -481,6 +541,12 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { doTest(fileName); } + @TestMetadata("outflow/jvmFieldMemberPropertyJavaUsages.kt") + public void testOutflow_JvmFieldMemberPropertyJavaUsages() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/jvmFieldMemberPropertyJavaUsages.kt"); + doTest(fileName); + } + @TestMetadata("outflow/lambdaResult.kt") public void testOutflow_LambdaResult() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/lambdaResult.kt"); @@ -547,6 +613,12 @@ public class SlicerTreeTestGenerated extends AbstractSlicerTreeTest { doTest(fileName); } + @TestMetadata("outflow/overridingFunctionResultWithJava.kt") + public void testOutflow_OverridingFunctionResultWithJava() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/overridingFunctionResultWithJava.kt"); + doTest(fileName); + } + @TestMetadata("outflow/overridingParameter.kt") public void testOutflow_OverridingParameter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/overridingParameter.kt");