From 6b626d904d72932bbb1cf6cb7ab06e62b3d01e1e Mon Sep 17 00:00:00 2001 From: Bart van Helvert Date: Mon, 5 Feb 2024 22:58:13 +0100 Subject: [PATCH] [uast] Add pattern variable UAST conversion #IDEA-310333 GitOrigin-RevId: 925c54c4bc2525dde46d3fc58291421600e0b572 --- .../uast/expressions/UPatternExpression.kt | 22 ++++++++----- .../uast/java/JavaUastLanguagePlugin.kt | 8 ++--- .../expressions/JavaUPatternExpression.kt | 31 ++++++++----------- .../jetbrains/uast/java/psiElementMapping.kt | 24 +++++++++----- .../Simple/InstanceOfRecordPattern.log.txt | 4 +-- .../Simple/InstanceOfTypeTestPattern.log.txt | 2 +- .../Simple/SwitchCaseRecordPattern.log.txt | 6 ++-- .../Simple/SwitchCaseTypeTestPattern.log.txt | 2 +- 8 files changed, 54 insertions(+), 45 deletions(-) diff --git a/uast/uast-common/src/org/jetbrains/uast/expressions/UPatternExpression.kt b/uast/uast-common/src/org/jetbrains/uast/expressions/UPatternExpression.kt index a8db9186ea39..aaff17f9372b 100644 --- a/uast/uast-common/src/org/jetbrains/uast/expressions/UPatternExpression.kt +++ b/uast/uast-common/src/org/jetbrains/uast/expressions/UPatternExpression.kt @@ -17,15 +17,15 @@ import org.jetbrains.uast.visitor.UastVisitor @Experimental interface UPatternExpression : UExpression { /** - * Name of the pattern, can be null if the pattern is unnamed or no name is specified. + * The primary type reference that is checked when evaluating this pattern or null when there is none (e.g., unnamed pattern). + * For deconstruction patterns like `Point(int x, int y)` the main type will be `Point`. */ - val name: String? + val typeReference: UTypeReferenceExpression? get() = variable?.typeReference /** - * The primary type reference that is checked when evaluating this pattern or null when there is none. - * * For deconstruction patterns like `Point(int x, int y)` this will be then main type `Point`. + * The pattern variable or null if the pattern has no name identifier specified. */ - val typeReference: UTypeReferenceExpression? + val variable: UParameter? /** * The deconstructed patterns or empty if this pattern is not a deconstruction pattern. @@ -36,14 +36,20 @@ interface UPatternExpression : UExpression { override fun asRenderString(): String { val renderPatternList = if (deconstructedPatterns.isNotEmpty()) "(${deconstructedPatterns.joinToString { it.asRenderString() }})" else "" - val renderName = "${if (typeReference != null) " " else ""}${name ?: "_"}" - return "${typeReference?.type?.name ?: ""}$renderPatternList$renderName" + val typeReference = typeReference?.type ?: variable?.type + val renderName = "${if (typeReference != null) " " else ""}${variable?.name ?: "_"}" + return "${typeReference?.name ?: ""}$renderPatternList$renderName" } override fun accept(visitor: UastVisitor) { if (visitor.visitPatternExpression(this)) return uAnnotations.acceptList(visitor) - typeReference?.accept(visitor) + if (variable == null) { + typeReference?.accept(visitor) + } else { + // type reference is part of the variable + variable?.accept(visitor) + } deconstructedPatterns.acceptList(visitor) visitor.afterVisitPatternExpression(this) } diff --git a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt index f0d8da743a07..18e91c94b123 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/JavaUastLanguagePlugin.kt @@ -184,6 +184,10 @@ class JavaUastLanguagePlugin : UastLanguagePlugin { override fun visitVariable(variable: PsiVariable) { result = requiredType.el(variable, givenParent, ::JavaUVariable) } + + override fun visitPatternVariable(variable: PsiPatternVariable) { + result = requiredType.el(variable, givenParent, ::JavaUParameter) + } } element.accept(visitor) @@ -321,10 +325,6 @@ internal object JavaConverter { override fun visitDeconstructionList(deconstructionList: PsiDeconstructionList) { result = true } - - override fun visitPatternVariable(variable: PsiPatternVariable) { - result = true - } } element.accept(visitor) diff --git a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPatternExpression.kt b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPatternExpression.kt index 27e951f3d5d0..dbc9812407d3 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPatternExpression.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/expressions/JavaUPatternExpression.kt @@ -1,24 +1,21 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.uast.java.expressions -import com.intellij.psi.PsiDeconstructionPattern -import com.intellij.psi.PsiTypeTestPattern -import com.intellij.psi.PsiUnnamedPattern +import com.intellij.psi.* import org.jetbrains.annotations.ApiStatus import org.jetbrains.uast.* -import org.jetbrains.uast.java.JavaAbstractUExpression +import org.jetbrains.uast.java.* import org.jetbrains.uast.java.JavaConverter -import org.jetbrains.uast.java.JavaUTypeReferenceExpression @ApiStatus.Internal class JavaUUnamedPatternExpression( override val sourcePsi: PsiUnnamedPattern, givenParent: UElement? ) : JavaAbstractUExpression(givenParent), UPatternExpression { - override val name: String? = null - override val typeReference: UTypeReferenceExpression? = null + override val variable: UParameter? = null + override val deconstructedPatterns: List = emptyList() } @@ -27,15 +24,13 @@ class JavaUTypePatternExpression( override val sourcePsi: PsiTypeTestPattern, givenParent: UElement? ) : JavaAbstractUExpression(givenParent), UPatternExpression { - private val typeReferencePart = UastLazyPart() + private val variablePart = UastLazyPart() - override val name: String? = sourcePsi.patternVariable?.name + override val variable: UParameter? = variablePart.getOrBuild { + sourcePsi.patternVariable?.let { patternVariable -> JavaUParameter(patternVariable, this) } + } override val deconstructedPatterns: List = emptyList() - - override val typeReference: UTypeReferenceExpression? = typeReferencePart.getOrBuild { - sourcePsi.checkType?.let { typeElem -> JavaUTypeReferenceExpression(typeElem, this) } - } } @ApiStatus.Internal @@ -47,7 +42,11 @@ class JavaUDeconstructionPatternPattern( private val patternsPart = UastLazyPart>() - override val name: String? = null + override val typeReference: UTypeReferenceExpression = typeReferencePart.getOrBuild { + JavaUTypeReferenceExpression(sourcePsi.typeElement, this) + } + + override val variable: UParameter? = null override val deconstructedPatterns: List get() = patternsPart.getOrBuild { @@ -55,8 +54,4 @@ class JavaUDeconstructionPatternPattern( JavaConverter.convertPsiElement(component, this, UPatternExpression::class.java) as? UPatternExpression } } - - override val typeReference: UTypeReferenceExpression = typeReferencePart.getOrBuild { - JavaUTypeReferenceExpression(sourcePsi.typeElement, this) - } } \ No newline at end of file diff --git a/uast/uast-java/src/org/jetbrains/uast/java/psiElementMapping.kt b/uast/uast-java/src/org/jetbrains/uast/java/psiElementMapping.kt index 730df19c6543..7ce8e885b64a 100644 --- a/uast/uast-java/src/org/jetbrains/uast/java/psiElementMapping.kt +++ b/uast/uast-java/src/org/jetbrains/uast/java/psiElementMapping.kt @@ -136,7 +136,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiRecordHeader::class.java, PsiUnnamedPattern::class.java, PsiTypeTestPattern::class.java, - PsiDeconstructionPattern::class.java + PsiDeconstructionPattern::class.java, + PsiPatternVariable::class.java ), UAnnotation::class.java to classSetOf( PsiAnnotation::class.java @@ -235,7 +236,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiResourceVariable::class.java, PsiTypeParameter::class.java, PsiRecordComponent::class.java, - PsiRecordHeader::class.java + PsiRecordHeader::class.java, + PsiPatternVariable::class.java ), UDeclarationEx::class.java to classSetOf( PsiAnnotationMethod::class.java, @@ -251,7 +253,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiResourceVariable::class.java, PsiTypeParameter::class.java, PsiRecordComponent::class.java, - PsiRecordHeader::class.java + PsiRecordHeader::class.java, + PsiPatternVariable::class.java ), UDeclarationsExpression::class.java to classSetOf( PsiDeclarationStatement::class.java, @@ -338,7 +341,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiRecordHeader::class.java, PsiUnnamedPattern::class.java, PsiTypeTestPattern::class.java, - PsiDeconstructionPattern::class.java + PsiDeconstructionPattern::class.java, + PsiPatternVariable::class.java ), UElementWithLocation::class.java to classSetOf( //PsiExpressionStatement::class.java, @@ -525,13 +529,15 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiParameter::class.java, PsiPatternVariable::class.java, LightRecordField::class.java, - PsiRecordComponent::class.java + PsiRecordComponent::class.java, + PsiPatternVariable::class.java ), UParameterEx::class.java to classSetOf( PsiParameter::class.java, PsiPatternVariable::class.java, LightRecordField::class.java, - PsiRecordComponent::class.java + PsiRecordComponent::class.java, + PsiPatternVariable::class.java ), UParenthesizedExpression::class.java to classSetOf( //PsiExpressionStatement::class.java, @@ -637,7 +643,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiParameter::class.java, PsiPatternVariable::class.java, PsiResourceVariable::class.java, - PsiRecordComponent::class.java + PsiRecordComponent::class.java, + PsiPatternVariable::class.java ), UVariableEx::class.java to classSetOf( PsiEnumConstant::class.java, @@ -646,7 +653,8 @@ private val possibleSourceTypes = mapOf, ClassSet>( PsiParameter::class.java, PsiPatternVariable::class.java, PsiResourceVariable::class.java, - PsiRecordComponent::class.java + PsiRecordComponent::class.java, + PsiPatternVariable::class.java ), UWhileExpression::class.java to classSetOf( PsiWhileStatement::class.java diff --git a/uast/uast-tests/java/Simple/InstanceOfRecordPattern.log.txt b/uast/uast-tests/java/Simple/InstanceOfRecordPattern.log.txt index 953d83ac370c..280dc71060bf 100644 --- a/uast/uast-tests/java/Simple/InstanceOfRecordPattern.log.txt +++ b/uast/uast-tests/java/Simple/InstanceOfRecordPattern.log.txt @@ -15,7 +15,7 @@ UFile (package = ) UPatternExpression UTypeReferenceExpression (name = Box) UPatternExpression - UTypeReferenceExpression (name = RedBall) + UParameter (name = a) UBlockExpression UastEmptyExpression UIfExpression @@ -24,7 +24,7 @@ UFile (package = ) UPatternExpression UTypeReferenceExpression (name = Box) UPatternExpression - UTypeReferenceExpression (name = GreenBall) + UParameter (name = _) UBlockExpression UastEmptyExpression UIfExpression diff --git a/uast/uast-tests/java/Simple/InstanceOfTypeTestPattern.log.txt b/uast/uast-tests/java/Simple/InstanceOfTypeTestPattern.log.txt index cf15dddec125..654dcb3934fe 100644 --- a/uast/uast-tests/java/Simple/InstanceOfTypeTestPattern.log.txt +++ b/uast/uast-tests/java/Simple/InstanceOfTypeTestPattern.log.txt @@ -7,6 +7,6 @@ UFile (package = ) UBinaryExpressionWithPattern USimpleNameReferenceExpression (identifier = x) UPatternExpression - UTypeReferenceExpression (name = java.lang.Integer) + UParameter (name = y) UBlockExpression UastEmptyExpression diff --git a/uast/uast-tests/java/Simple/SwitchCaseRecordPattern.log.txt b/uast/uast-tests/java/Simple/SwitchCaseRecordPattern.log.txt index ad2872bb9676..4e58bd8a4dab 100644 --- a/uast/uast-tests/java/Simple/SwitchCaseRecordPattern.log.txt +++ b/uast/uast-tests/java/Simple/SwitchCaseRecordPattern.log.txt @@ -15,11 +15,11 @@ UFile (package = ) UPatternExpression UTypeReferenceExpression (name = Box) UPatternExpression - UTypeReferenceExpression (name = RedBall) + UParameter (name = _) UPatternExpression UTypeReferenceExpression (name = Box) UPatternExpression - UTypeReferenceExpression (name = BlueBall) + UParameter (name = _) UExpressionList (switch_entry) UYieldExpression UQualifiedReferenceExpression @@ -33,7 +33,7 @@ UFile (package = ) UPatternExpression UTypeReferenceExpression (name = Box) UPatternExpression - UTypeReferenceExpression (name = GreenBall) + UParameter (name = a) UExpressionList (switch_entry) UYieldExpression UQualifiedReferenceExpression diff --git a/uast/uast-tests/java/Simple/SwitchCaseTypeTestPattern.log.txt b/uast/uast-tests/java/Simple/SwitchCaseTypeTestPattern.log.txt index 3741af9ee2ac..a41b70b1d126 100644 --- a/uast/uast-tests/java/Simple/SwitchCaseTypeTestPattern.log.txt +++ b/uast/uast-tests/java/Simple/SwitchCaseTypeTestPattern.log.txt @@ -8,5 +8,5 @@ UFile (package = ) UExpressionList (switch) USwitchClauseExpressionWithBody UPatternExpression - UTypeReferenceExpression (name = java.lang.Integer) + UParameter (name = i) UExpressionList (switch_entry)