diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt index 9085bbd60b5..c29b4d55fd5 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt @@ -14,13 +14,18 @@ import com.intellij.psi.PsiFile import com.intellij.psi.tree.IElementType import com.intellij.util.PathUtil import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirRenderer +import org.jetbrains.kotlin.fir.FirSessionBase import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirWrappedDelegateExpressionImpl +import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirTransformer @@ -130,7 +135,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( override fun visitElement(element: FirElement) { // NB: types are reused sometimes (e.g. in accessors) if (!result.add(element)) { - if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription) { + if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription && !element.isExtensionFunctionAnnotationCall) { val elementDump = StringBuilder().also { element.accept(FirRenderer(it)) }.toString() throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump") } @@ -147,7 +152,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( override fun transformElement(element: E, data: Unit): CompositeTransformResult { if (!result.add(element)) { - if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription) { + if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription && !element.isExtensionFunctionAnnotationCall) { val elementDump = StringBuilder().also { element.accept(FirRenderer(it)) }.toString() throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump") } @@ -165,4 +170,12 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( FileTypeRegistry.ourInstanceGetter = Getter { FileTypeManager.getInstance() } } -} \ No newline at end of file +} + +private val FirElement.isExtensionFunctionAnnotationCall: Boolean get() = (this as? FirAnnotationCall)?.let { + (it.annotationTypeRef as? FirResolvedTypeRef)?.let { + (it.type as? ConeClassLikeType)?.let { + it.lookupTag.classId.asString() == "kotlin/ExtensionFunctionType" + } + } +} == true