Show lambda parameter info #KT-13118 Fixed
This commit is contained in:
committed by
Nikolay Krasko
parent
30fc76a602
commit
c44d3a8d68
@@ -487,6 +487,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -485,6 +485,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -486,6 +486,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -487,6 +487,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -485,6 +485,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -485,6 +485,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
@@ -486,6 +486,7 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
|
||||
<qualifiedNameProvider implementation="org.jetbrains.kotlin.idea.actions.KotlinQualifiedNameProvider"/>
|
||||
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinLambdaParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinArrayAccessParameterInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinClassTypeArgumentInfoHandler"/>
|
||||
<codeInsight.parameterInfo language="kotlin" implementationClass="org.jetbrains.kotlin.idea.parameterInfo.KotlinFunctionTypeArgumentInfoHandler"/>
|
||||
|
||||
+23
-6
@@ -65,6 +65,20 @@ class KotlinFunctionParameterInfoHandler : KotlinParameterInfoWithCallHandlerBas
|
||||
override fun getArgumentListAllowedParentClasses() = setOf(KtCallElement::class.java)
|
||||
}
|
||||
|
||||
class KotlinLambdaParameterInfoHandler :
|
||||
KotlinParameterInfoWithCallHandlerBase<KtLambdaArgument, KtLambdaArgument>(KtLambdaArgument::class, KtLambdaArgument::class) {
|
||||
override fun getActualParameters(lambdaArgument: KtLambdaArgument) = arrayOf(lambdaArgument)
|
||||
|
||||
override fun getActualParametersRBraceType() = KtTokens.RBRACE
|
||||
|
||||
override fun getArgumentListAllowedParentClasses() = setOf(KtLambdaArgument::class.java)
|
||||
|
||||
override fun getParameterIndex(context: UpdateParameterInfoContext, argumentList: KtLambdaArgument): Int {
|
||||
val size = (argumentList.parent as? KtCallElement)?.valueArguments?.size ?: 1
|
||||
return size - 1
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinArrayAccessParameterInfoHandler : KotlinParameterInfoWithCallHandlerBase<KtContainerNode, KtExpression>(KtContainerNode::class, KtExpression::class) {
|
||||
override fun getArgumentListAllowedParentClasses() = setOf(KtArrayAccessExpression::class.java)
|
||||
|
||||
@@ -115,7 +129,7 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
|
||||
val file = context.file as? KtFile ?: return null
|
||||
|
||||
val token = file.findElementAt(context.offset) ?: return null
|
||||
val argumentList = PsiTreeUtil.getParentOfType(token, argumentListClass.java) ?: return null
|
||||
val argumentList = PsiTreeUtil.getParentOfType(token, argumentListClass.java, true, KtValueArgumentList::class.java) ?: return null
|
||||
|
||||
val bindingContext = argumentList.analyze(BodyResolveMode.PARTIAL)
|
||||
val call = findCall(argumentList, bindingContext) ?: return null
|
||||
@@ -139,14 +153,17 @@ abstract class KotlinParameterInfoWithCallHandlerBase<TArgumentList : KtElement,
|
||||
if (context.parameterOwner !== argumentList) {
|
||||
context.removeHint()
|
||||
}
|
||||
|
||||
val offset = context.offset
|
||||
val parameterIndex = argumentList.allChildren
|
||||
.takeWhile { it.startOffset < offset }
|
||||
.count { it.node.elementType == KtTokens.COMMA }
|
||||
val parameterIndex = getParameterIndex(context, argumentList)
|
||||
context.setCurrentParameter(parameterIndex)
|
||||
}
|
||||
|
||||
protected open fun getParameterIndex(context: UpdateParameterInfoContext, argumentList: TArgumentList): Int {
|
||||
val offset = context.offset
|
||||
return argumentList.allChildren
|
||||
.takeWhile { it.startOffset < offset }
|
||||
.count { it.node.elementType == KtTokens.COMMA }
|
||||
}
|
||||
|
||||
override fun updateUI(itemToShow: FunctionDescriptor, context: ParameterInfoUIContext) {
|
||||
if (!updateUIOrFail(itemToShow, context)) {
|
||||
context.isUIComponentEnabled = false
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
fun test() {
|
||||
foo {<caret> it.length }
|
||||
}
|
||||
|
||||
fun foo(f: (String) -> Int) {}
|
||||
//Text: (<highlight>f: (String) -> Int</highlight>), Disabled: false, Strikeout: false, Green: true
|
||||
@@ -0,0 +1,6 @@
|
||||
fun test() {
|
||||
foo({ 1 }, { 2 }) {<caret> it.length }
|
||||
}
|
||||
|
||||
fun foo(a: (Unit) -> Int, b: (Unit) -> Int, c: (String) -> Int) {}
|
||||
//Text: (a: (Unit) -> Int, b: (Unit) -> Int, <highlight>c: (String) -> Int</highlight>), Disabled: false, Strikeout: false, Green: true
|
||||
+10
@@ -167,6 +167,16 @@ public class ParameterInfoTestGenerated extends AbstractParameterInfoTest {
|
||||
runTest("idea/testData/parameterInfo/functionCall/Invoke.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("lambdaArgument.kt")
|
||||
public void testLambdaArgument() throws Exception {
|
||||
runTest("idea/testData/parameterInfo/functionCall/lambdaArgument.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("lambdaArgument2.kt")
|
||||
public void testLambdaArgument2() throws Exception {
|
||||
runTest("idea/testData/parameterInfo/functionCall/lambdaArgument2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("LocalFunctionBug.kt")
|
||||
public void testLocalFunctionBug() throws Exception {
|
||||
runTest("idea/testData/parameterInfo/functionCall/LocalFunctionBug.kt");
|
||||
|
||||
Reference in New Issue
Block a user