[uast] Add pattern variable UAST conversion

#IDEA-310333

GitOrigin-RevId: 925c54c4bc2525dde46d3fc58291421600e0b572
This commit is contained in:
Bart van Helvert
2024-02-13 12:58:38 +00:00
committed by intellij-monorepo-bot
parent 6d55bf058d
commit 6b626d904d
8 changed files with 54 additions and 45 deletions
@@ -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)
}
@@ -184,6 +184,10 @@ class JavaUastLanguagePlugin : UastLanguagePlugin {
override fun visitVariable(variable: PsiVariable) {
result = requiredType.el<UVariable, PsiVariable>(variable, givenParent, ::JavaUVariable)
}
override fun visitPatternVariable(variable: PsiPatternVariable) {
result = requiredType.el<UParameter, PsiPatternVariable>(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)
@@ -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<UPatternExpression> = emptyList()
}
@@ -27,15 +24,13 @@ class JavaUTypePatternExpression(
override val sourcePsi: PsiTypeTestPattern,
givenParent: UElement?
) : JavaAbstractUExpression(givenParent), UPatternExpression {
private val typeReferencePart = UastLazyPart<UTypeReferenceExpression?>()
private val variablePart = UastLazyPart<UParameter?>()
override val name: String? = sourcePsi.patternVariable?.name
override val variable: UParameter? = variablePart.getOrBuild {
sourcePsi.patternVariable?.let { patternVariable -> JavaUParameter(patternVariable, this) }
}
override val deconstructedPatterns: List<UPatternExpression> = 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<List<UPatternExpression>>()
override val name: String? = null
override val typeReference: UTypeReferenceExpression = typeReferencePart.getOrBuild {
JavaUTypeReferenceExpression(sourcePsi.typeElement, this)
}
override val variable: UParameter? = null
override val deconstructedPatterns: List<UPatternExpression>
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)
}
}
@@ -136,7 +136,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiRecordHeader::class.java,
PsiUnnamedPattern::class.java,
PsiTypeTestPattern::class.java,
PsiDeconstructionPattern::class.java
PsiDeconstructionPattern::class.java,
PsiPatternVariable::class.java
),
UAnnotation::class.java to classSetOf<PsiElement>(
PsiAnnotation::class.java
@@ -235,7 +236,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiResourceVariable::class.java,
PsiTypeParameter::class.java,
PsiRecordComponent::class.java,
PsiRecordHeader::class.java
PsiRecordHeader::class.java,
PsiPatternVariable::class.java
),
UDeclarationEx::class.java to classSetOf<PsiElement>(
PsiAnnotationMethod::class.java,
@@ -251,7 +253,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiResourceVariable::class.java,
PsiTypeParameter::class.java,
PsiRecordComponent::class.java,
PsiRecordHeader::class.java
PsiRecordHeader::class.java,
PsiPatternVariable::class.java
),
UDeclarationsExpression::class.java to classSetOf<PsiElement>(
PsiDeclarationStatement::class.java,
@@ -338,7 +341,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiRecordHeader::class.java,
PsiUnnamedPattern::class.java,
PsiTypeTestPattern::class.java,
PsiDeconstructionPattern::class.java
PsiDeconstructionPattern::class.java,
PsiPatternVariable::class.java
),
UElementWithLocation::class.java to classSetOf<PsiElement>(
//PsiExpressionStatement::class.java,
@@ -525,13 +529,15 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiParameter::class.java,
PsiPatternVariable::class.java,
LightRecordField::class.java,
PsiRecordComponent::class.java
PsiRecordComponent::class.java,
PsiPatternVariable::class.java
),
UParameterEx::class.java to classSetOf<PsiElement>(
PsiParameter::class.java,
PsiPatternVariable::class.java,
LightRecordField::class.java,
PsiRecordComponent::class.java
PsiRecordComponent::class.java,
PsiPatternVariable::class.java
),
UParenthesizedExpression::class.java to classSetOf<PsiElement>(
//PsiExpressionStatement::class.java,
@@ -637,7 +643,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiParameter::class.java,
PsiPatternVariable::class.java,
PsiResourceVariable::class.java,
PsiRecordComponent::class.java
PsiRecordComponent::class.java,
PsiPatternVariable::class.java
),
UVariableEx::class.java to classSetOf<PsiElement>(
PsiEnumConstant::class.java,
@@ -646,7 +653,8 @@ private val possibleSourceTypes = mapOf<Class<*>, ClassSet<PsiElement>>(
PsiParameter::class.java,
PsiPatternVariable::class.java,
PsiResourceVariable::class.java,
PsiRecordComponent::class.java
PsiRecordComponent::class.java,
PsiPatternVariable::class.java
),
UWhileExpression::class.java to classSetOf<PsiElement>(
PsiWhileStatement::class.java
@@ -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
@@ -7,6 +7,6 @@ UFile (package = )
UBinaryExpressionWithPattern
USimpleNameReferenceExpression (identifier = x)
UPatternExpression
UTypeReferenceExpression (name = java.lang.Integer)
UParameter (name = y)
UBlockExpression
UastEmptyExpression
@@ -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
@@ -8,5 +8,5 @@ UFile (package = )
UExpressionList (switch)
USwitchClauseExpressionWithBody
UPatternExpression
UTypeReferenceExpression (name = java.lang.Integer)
UParameter (name = i)
UExpressionList (switch_entry)