diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/FirAnnotationTypeQualifierResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/FirAnnotationTypeQualifierResolver.kt index 3cf337d44d0..a2a4636ae95 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/FirAnnotationTypeQualifierResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/FirAnnotationTypeQualifierResolver.kt @@ -88,8 +88,7 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession, privat .annotations.find { it.resolvedFqName == TYPE_QUALIFIER_DEFAULT_FQNAME }!! .arguments .flatMap { argument -> - // TODO: replace after implementation of KT-24081 - if (true /*parameter == JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME*/) + if (argument !is FirNamedArgumentExpression || argument.name == JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME) argument.mapConstantToQualifierApplicabilityTypes() else emptyList() diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 982d0b69fdd..a1ad9777c86 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -191,8 +191,9 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) { private fun ValueArgument?.toFirExpression(): FirExpression { this ?: return FirErrorExpressionImpl(session, this as? KtElement, "No argument given") + val name = this.getArgumentName()?.asName val expression = this.getArgumentExpression() - return when (expression) { + val firExpression = when (expression) { is KtConstantExpression, is KtStringTemplateExpression -> { expression.accept(this@Visitor, Unit) as FirExpression } @@ -201,6 +202,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) { { expression }.toFirExpression("Argument is absent") } } + return if (name != null) FirNamedArgumentExpressionImpl(session, expression, name, firExpression) else firExpression } private fun KtPropertyAccessor?.toFirPropertyAccessor( @@ -1262,7 +1264,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) { this.calleeReference = calleeReference firFunctionCalls += this for (argument in expression.valueArguments) { - arguments += argument.getArgumentExpression().toFirExpression("No argument expression") + arguments += argument.toFirExpression() } for (typeArgument in expression.typeArguments) { typeArguments += typeArgument.convert() diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt new file mode 100644 index 00000000000..dc2dd74ebb0 --- /dev/null +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt @@ -0,0 +1,9 @@ +fun foo(first: String = "", second: Boolean = true, third: Double = 3.1415) {} + +fun test() { + foo() + foo("Alpha", false, 2.71) + foo(first = "Hello", second = true) + foo(third = -1.0, first = "123") + foo(= "") +} \ No newline at end of file diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.txt new file mode 100644 index 00000000000..c1daa2382d0 --- /dev/null +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.txt @@ -0,0 +1,10 @@ +FILE: namedArgument.kt + public? final? function foo(first: String = String(), second: Boolean = Boolean(true), third: Double = Double(3.1415)): kotlin/Unit { + } + public? final? function test(): kotlin/Unit { + foo#() + foo#(String(Alpha), Boolean(false), Double(2.71)) + foo#(first = String(Hello), second = Boolean(true)) + foo#(third = unaryMinus#(Double(1.0)), first = String(123)) + foo#(ERROR_EXPR(Argument is absent)) + } diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java index abad27890a5..a5d89e18f23 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java @@ -224,6 +224,11 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/modifications.kt"); } + @TestMetadata("namedArgument.kt") + public void testNamedArgument() throws Exception { + runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt"); + } + @TestMetadata("nullability.kt") public void testNullability() throws Exception { runTest("compiler/fir/psi2fir/testData/rawBuilder/expressions/nullability.kt"); diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt index bd00a2b28f9..01c40b857ff 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt @@ -232,7 +232,6 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() { it is KtValueArgumentList || it is KtParameterList || it is KtTypeParameterList || it is KtTypeArgumentList || it is KtTypeReference && it.parent.parent.parent is KtCallExpression || it is KtSuperTypeList || it is KtSuperTypeListEntry || - // TODO: may be we should look at argument after KT-24081 it is KtValueArgument || it is KtLambdaArgument || it is KtValueArgumentName || it is KtContainerNodeForControlStructureBody || it is KtContainerNode || it is KtStringTemplateEntry || diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index fc1050b08e8..a43f1799a7f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -551,6 +551,12 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { print("${constExpression.kind}(${constExpression.value})") } + override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) { + print(namedArgumentExpression.name) + print(" = ") + namedArgumentExpression.expression.accept(this) + } + override fun visitCall(call: FirCall) { print("(") call.arguments.renderSeparated() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirNamedArgumentExpression.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirNamedArgumentExpression.kt new file mode 100644 index 00000000000..c7c9f882a36 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirNamedArgumentExpression.kt @@ -0,0 +1,23 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.fir.expressions + +import org.jetbrains.kotlin.fir.visitors.FirVisitor +import org.jetbrains.kotlin.name.Name + +interface FirNamedArgumentExpression : FirExpression { + val name: Name + + val expression: FirExpression + + override fun accept(visitor: FirVisitor, data: D): R = + visitor.visitNamedArgumentExpression(this, data) + + override fun acceptChildren(visitor: FirVisitor, data: D) { + expression.accept(visitor, data) + super.acceptChildren(visitor, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt new file mode 100644 index 00000000000..ad8b5c7d7b5 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirNamedArgumentExpressionImpl.kt @@ -0,0 +1,27 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.fir.expressions.impl + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression +import org.jetbrains.kotlin.fir.transformSingle +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.name.Name + +class FirNamedArgumentExpressionImpl( + session: FirSession, + psi: PsiElement?, + override val name: Name, + override var expression: FirExpression +) : FirNamedArgumentExpression, FirAbstractExpression(session, psi) { + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + expression = expression.transformSingle(transformer, data) + return super.transformChildren(transformer, data) + } +} \ No newline at end of file diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index feff3b8266c..1054f3e23aa 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -256,6 +256,10 @@ abstract class FirTransformer : FirVisitor { + return transformExpression(namedArgumentExpression, data) + } + open fun transformThrowExpression(throwExpression: FirThrowExpression, data: D): CompositeTransformResult { return transformExpression(throwExpression, data) } @@ -564,6 +568,10 @@ abstract class FirTransformer : FirVisitor { + return transformNamedArgumentExpression(namedArgumentExpression, data) + } + final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: D): CompositeTransformResult { return transformNamedDeclaration(namedDeclaration, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index 4fafec1819c..69baa6cb202 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -256,6 +256,10 @@ abstract class FirVisitor { return visitJump(returnExpression, data) } + open fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: D): R { + return visitExpression(namedArgumentExpression, data) + } + open fun visitThrowExpression(throwExpression: FirThrowExpression, data: D): R { return visitExpression(throwExpression, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index 29669ab9d11..57c02dd467f 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -256,6 +256,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitJump(returnExpression, null) } + open fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) { + visitExpression(namedArgumentExpression, null) + } + open fun visitThrowExpression(throwExpression: FirThrowExpression) { visitExpression(throwExpression, null) } @@ -564,6 +568,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitModifiableQualifiedAccess(modifiableQualifiedAccess) } + final override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression, data: Nothing?) { + visitNamedArgumentExpression(namedArgumentExpression) + } + final override fun visitNamedDeclaration(namedDeclaration: FirNamedDeclaration, data: Nothing?) { visitNamedDeclaration(namedDeclaration) }