mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[uast] Add pattern variable UAST conversion
#IDEA-310333 GitOrigin-RevId: 925c54c4bc2525dde46d3fc58291421600e0b572
This commit is contained in:
committed by
intellij-monorepo-bot
parent
6d55bf058d
commit
6b626d904d
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user