diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml index d0b4339f4d1..ef9215759da 100644 --- a/.idea/inspectionProfiles/idea_default.xml +++ b/.idea/inspectionProfiles/idea_default.xml @@ -119,6 +119,7 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/IdeaJavaToKotlinServices.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/IdeaJavaToKotlinServices.kt index b44288eca88..6b6564790c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/IdeaJavaToKotlinServices.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/IdeaJavaToKotlinServices.kt @@ -16,13 +16,14 @@ package org.jetbrains.kotlin.idea.j2k -import com.intellij.codeInspection.dataFlow.DfaUtil -import com.intellij.codeInspection.dataFlow.Nullness import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiVariable +import org.jetbrains.kotlin.idea.util.compat.dfaCheckNullability +import org.jetbrains.kotlin.idea.util.compat.dfaInferMethodNullability import org.jetbrains.kotlin.j2k.* import org.jetbrains.kotlin.j2k.ast.Nullability +import org.jetbrains.kotlin.idea.util.compat.Nullability as IntellijNullability object IdeaJavaToKotlinServices : JavaToKotlinConverterServices { override val referenceSearcher: ReferenceSearcher @@ -47,14 +48,14 @@ object IdeaSuperMethodSearcher : SuperMethodsSearcher { private object IdeaJavaDataFlowAnalyzerFacade : JavaDataFlowAnalyzerFacade { override fun variableNullability(variable: PsiVariable, context: PsiElement): Nullability = - DfaUtil.checkNullness(variable, context).toJ2KNullability() + dfaCheckNullability(variable, context).toJ2KNullability() override fun methodNullability(method: PsiMethod): Nullability = - DfaUtil.inferMethodNullity(method).toJ2KNullability() + dfaInferMethodNullability(method).toJ2KNullability() - private fun Nullness.toJ2KNullability() = when (this) { - Nullness.UNKNOWN -> Nullability.Default - Nullness.NOT_NULL -> Nullability.NotNull - Nullness.NULLABLE -> Nullability.Nullable + private fun IntellijNullability.toJ2KNullability() = when (this) { + IntellijNullability.UNKNOWN -> Nullability.Default + IntellijNullability.NOT_NULL -> Nullability.NotNull + IntellijNullability.NULLABLE -> Nullability.Nullable } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt index 7b0d969102a..260f5425c44 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/KotlinSliceProvider.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.slicer -import com.intellij.codeInspection.dataFlow.Nullness import com.intellij.ide.util.treeView.AbstractTreeStructure import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.psi.PsiElement @@ -24,12 +23,12 @@ import com.intellij.slicer.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny -import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.guessTypes import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.slicer.compat.PsiElement_N183_NN191 +import org.jetbrains.kotlin.idea.util.compat.Nullability +import org.jetbrains.kotlin.idea.util.compat.SliceNullnessAnalyzerBaseEx import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isPlainWithEscapes import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf @@ -51,8 +50,8 @@ class KotlinSliceProvider : SliceLanguageSupportProvider, SliceUsageTransformer val leafAnalyzer by lazy { SliceLeafAnalyzer(LEAF_ELEMENT_EQUALITY, this) } val nullnessAnalyzer: SliceNullnessAnalyzerBase by lazy { - object : SliceNullnessAnalyzerBase(LEAF_ELEMENT_EQUALITY, this) { - override fun checkNullness(element: PsiElement?): Nullness { + object : SliceNullnessAnalyzerBaseEx(LEAF_ELEMENT_EQUALITY, this) { + override fun checkNullabilityEx(element: PsiElement?): Nullability { val types = when (element) { is KtCallableDeclaration -> listOfNotNull((element.resolveToDescriptorIfAny() as? CallableDescriptor)?.returnType) is KtDeclaration -> emptyList() @@ -60,10 +59,10 @@ class KotlinSliceProvider : SliceLanguageSupportProvider, SliceUsageTransformer else -> emptyList() } return when { - types.isEmpty() -> return Nullness.UNKNOWN - types.all { KotlinBuiltIns.isNullableNothing(it) } -> Nullness.NULLABLE - types.any { it.isError || TypeUtils.isNullableType(it) || it.isNullabilityFlexible() } -> Nullness.UNKNOWN - else -> Nullness.NOT_NULL + types.isEmpty() -> return Nullability.UNKNOWN + types.all { KotlinBuiltIns.isNullableNothing(it) } -> Nullability.NULLABLE + types.any { it.isError || TypeUtils.isNullableType(it) || it.isNullabilityFlexible() } -> Nullability.UNKNOWN + else -> Nullability.NOT_NULL } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt b/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt new file mode 100644 index 00000000000..9db3a80d53b --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("MissingRecentApi", "IncompatibleAPI") + +package org.jetbrains.kotlin.idea.util.compat + +import com.intellij.codeInsight.Nullability as IntellijNullability +import com.intellij.codeInspection.dataFlow.DfaUtil +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiVariable +import com.intellij.slicer.SliceLanguageSupportProvider +import com.intellij.slicer.SliceLeafEquality +import com.intellij.slicer.SliceNullnessAnalyzerBase + +// BUNCH: 181 +typealias Nullability = IntellijNullability + +// BUNCH: 181 +fun dfaCheckNullability(variable: PsiVariable?, context: PsiElement?): Nullability = + DfaUtil.checkNullability(variable, context) + +// BUNCH: 181 +fun dfaInferMethodNullability(method: PsiMethod): Nullability = + DfaUtil.inferMethodNullability(method) + +// BUNCH: 181 +abstract class SliceNullnessAnalyzerBaseEx( + leafEquality: SliceLeafEquality, + provider: SliceLanguageSupportProvider +) : SliceNullnessAnalyzerBase(leafEquality, provider) { + override fun checkNullability(element: PsiElement?): Nullability { + return checkNullabilityEx(element) + } + + abstract fun checkNullabilityEx(element: PsiElement?): Nullability +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt.181 b/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt.181 new file mode 100644 index 00000000000..40490cac58a --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/util/compat/Nullability.kt.181 @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("MissingRecentApi", "IncompatibleAPI") + +package org.jetbrains.kotlin.idea.util.compat + +import com.intellij.codeInspection.dataFlow.Nullness +import com.intellij.codeInspection.dataFlow.DfaUtil +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiVariable +import com.intellij.slicer.SliceLanguageSupportProvider +import com.intellij.slicer.SliceLeafEquality +import com.intellij.slicer.SliceNullnessAnalyzerBase + +// BUNCH: 181 +typealias Nullability = Nullness + +// BUNCH: 181 +fun dfaCheckNullability(variable: PsiVariable?, context: PsiElement?): Nullability = + DfaUtil.checkNullness(variable, context) + +// BUNCH: 181 +fun dfaInferMethodNullability(method: PsiMethod): Nullability = + DfaUtil.inferMethodNullity(method) + +// BUNCH: 181 +abstract class SliceNullnessAnalyzerBaseEx( + leafEquality: SliceLeafEquality, + provider: SliceLanguageSupportProvider +) : SliceNullnessAnalyzerBase(leafEquality, provider) { + override fun checkNullness(element: PsiElement?): Nullability { + return checkNullabilityEx(element) + } + + abstract fun checkNullabilityEx(element: PsiElement?): Nullability +} \ No newline at end of file