Port some Java tests for parameter hints; fix detected issues

Show hints for string templates; correctly apply blacklist for
constructor calls
This commit is contained in:
Dmitry Jemerov
2017-04-21 20:56:01 +02:00
parent 760e43d4f1
commit c9639f6ae0
2 changed files with 62 additions and 6 deletions
@@ -24,6 +24,7 @@ import com.intellij.lang.Language
import com.intellij.lang.java.JavaLanguage
import com.intellij.psi.PsiElement
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
@@ -40,12 +41,9 @@ import org.jetbrains.kotlin.renderer.RenderingFormat
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
/**
* @author Yuli Fiterman
*/
//hack to separate type presentation from param info presentation
private const val TYPE_INFO_PREFIX = "@TYPE@"
private val typeRenderer = DescriptorRenderer.COMPACT_WITH_SHORT_TYPES.withOptions {
@@ -140,7 +138,7 @@ private enum class HintType(desc: String, enabled: Boolean) {
}
private fun KtExpression.isUnclearExpression() = when(this) {
is KtConstantExpression, is KtThisExpression, is KtBinaryExpression -> true
is KtConstantExpression, is KtThisExpression, is KtBinaryExpression, is KtStringTemplateExpression -> true
is KtPrefixExpression -> baseExpression is KtConstantExpression && (operationToken == KtTokens.PLUS || operationToken == KtTokens.MINUS)
else -> false
}
@@ -214,7 +212,10 @@ class KotlinInlayParameterHintsProvider : InlayParameterHintsProvider {
val resolvedCall = elem.getResolvedCall(ctx)
val resolvedCallee = resolvedCall?.candidateDescriptor
if (resolvedCallee is FunctionDescriptor) {
val fqName = resolvedCallee.fqNameOrNull()?.asString() ?: return null
val fqName = if (resolvedCallee is ConstructorDescriptor)
resolvedCallee.containingDeclaration.fqNameSafe.asString()
else
(resolvedCallee.fqNameOrNull()?.asString() ?: return null)
val paramNames = resolvedCall.valueArguments
.mapNotNull { (valueParameterDescriptor, resolvedValueArgument) ->
if (resolvedValueArgument !is DefaultValueArgument) valueParameterDescriptor.name else null
@@ -0,0 +1,55 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.parameterInfo
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
class InlayParameterHintsTest : KotlinLightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
fun check(text: String) {
myFixture.configureByText("A.kt", text)
myFixture.testInlays()
}
fun `test insert literal arguments`() {
check("""
fun test(file: File) {
val testNow = System.currentTimeMillis() > 34000
val times = 1
val pi = 4.0f
val title = "Testing..."
val ch = 'q';
configure(<hint text="testNow:" />true, <hint text="times:" />555, <hint text="pii:" />3.141f, <hint text="title:" />"Huge Title", <hint text="terminate:" />'c', <hint text="file:" />null)
configure(testNow, shouldIgnoreRoots(), fourteen, pi, title, c, file)
}
fun configure(testNow: Boolean, times: Int, pii: Float, title: String, terminate: Char, file: File) {
System.out.println()
System.out.println()
}""")
}
fun `test do not show for Exceptions`() {
check("""
fun test() {
val t = IllegalStateException("crime");
}""")
}
}