Type hints: don't show for incomplete expressions followed by Unit type expressions (KT-22433)
#KT-22433 Fixed
This commit is contained in:
committed by
Nikolay Krasko
parent
6e852837f7
commit
36de8f1aa9
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.idea.parameterInfo
|
|||||||
import com.intellij.application.options.CodeStyle
|
import com.intellij.application.options.CodeStyle
|
||||||
import com.intellij.codeInsight.hints.InlayInfo
|
import com.intellij.codeInsight.hints.InlayInfo
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
|
||||||
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
|
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
|
||||||
import org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention
|
import org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention
|
||||||
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.lineCount
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.getLineNumber
|
||||||
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
@@ -35,6 +38,7 @@ import org.jetbrains.kotlin.types.KotlinType
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.containsError
|
import org.jetbrains.kotlin.types.typeUtil.containsError
|
||||||
import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes
|
import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isEnum
|
import org.jetbrains.kotlin.types.typeUtil.isEnum
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
|
|
||||||
//hack to separate type presentation from param info presentation
|
//hack to separate type presentation from param info presentation
|
||||||
const val TYPE_INFO_PREFIX = "@TYPE@"
|
const val TYPE_INFO_PREFIX = "@TYPE@"
|
||||||
@@ -100,6 +104,19 @@ fun provideTypeHint(element: KtCallableDeclaration, offset: Int): List<InlayInfo
|
|||||||
return emptyList()
|
return emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element is KtProperty && element.isLocal && type.isUnit() && element.lineCount() > 1) {
|
||||||
|
val propertyLine = element.getLineNumber()
|
||||||
|
val equalsTokenLine = element.equalsToken?.getLineNumber() ?: -1
|
||||||
|
val initializerLine = element.initializer?.getLineNumber() ?: -1
|
||||||
|
if (propertyLine == equalsTokenLine && propertyLine != initializerLine) {
|
||||||
|
val spaceBeforeProperty = (element.prevSibling as? PsiWhiteSpace)?.text?.reversed()?.takeWhile { it != '\n' }
|
||||||
|
val spaceBeforeInitializer = (element.initializer?.prevSibling as? PsiWhiteSpace)?.text?.reversed()?.takeWhile { it != '\n' }
|
||||||
|
if (spaceBeforeProperty == spaceBeforeInitializer) {
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return if (isUnclearType(type, element)) {
|
return if (isUnclearType(type, element)) {
|
||||||
val settings = CodeStyle.getCustomSettings(element.containingFile, KotlinCodeStyleSettings::class.java)
|
val settings = CodeStyle.getCustomSettings(element.containingFile, KotlinCodeStyleSettings::class.java)
|
||||||
val declString = buildString {
|
val declString = buildString {
|
||||||
|
|||||||
@@ -252,4 +252,37 @@ class InlayTypeHintsTest : KotlinLightCodeInsightFixtureTestCase() {
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testUnitLocalVariable() {
|
||||||
|
checkLocalVariable(
|
||||||
|
"""
|
||||||
|
fun foo() {
|
||||||
|
val x =
|
||||||
|
|
||||||
|
println("Foo")
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testUnitLocalVariable2() {
|
||||||
|
checkLocalVariable(
|
||||||
|
"""
|
||||||
|
fun foo() {
|
||||||
|
val x<hint text=": Unit"/> =
|
||||||
|
println("Foo")
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testUnitLocalVariable3() {
|
||||||
|
checkLocalVariable(
|
||||||
|
"""
|
||||||
|
fun foo() {
|
||||||
|
val x<hint text=": Unit"/> = println("Foo")
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user