UAST: Fix possible TypeCastException when creating KotlinUNamedExpression

This commit is contained in:
Vyacheslav Gerasimov
2018-06-26 17:07:42 +03:00
parent 23ee463053
commit a829251690
3 changed files with 44 additions and 29 deletions
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.uast.*
class KotlinUNamedExpression private constructor(
override val name: String?,
override val sourcePsi: PsiElement?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
override val name: String?,
override val sourcePsi: PsiElement?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
) : KotlinAbstractUElement(givenParent), UNamedExpression {
override val expression: UExpression by lz { expressionProducer(this) }
@@ -40,22 +40,26 @@ class KotlinUNamedExpression private constructor(
internal fun create(name: String?, valueArgument: ValueArgument, uastParent: UElement?): UNamedExpression {
val expression = valueArgument.getArgumentExpression()
return KotlinUNamedExpression(name, valueArgument.asElement(), uastParent) { expressionParent ->
expression?.let { expressionParent.getLanguagePlugin().convert<UExpression>(it, expressionParent) } ?: UastEmptyExpression
expression?.let { expressionParent.getLanguagePlugin().convertOpt<UExpression>(it, expressionParent) }
?: UastEmptyExpression(expressionParent)
}
}
internal fun create(
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?): UNamedExpression {
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?
): UNamedExpression {
return KotlinUNamedExpression(name, null, uastParent) { expressionParent ->
KotlinUVarargExpression(valueArguments, expressionParent)
}
}
}
}
class KotlinUVarargExpression(private val valueArgs: List<ValueArgument>,
uastParent: UElement?
class KotlinUVarargExpression(
private val valueArgs: List<ValueArgument>,
uastParent: UElement?
) : KotlinAbstractUExpression(uastParent), UCallExpressionEx {
override val kind: UastCallKind = UastCallKind.NESTED_ARRAY_INITIALIZER
@@ -22,10 +22,11 @@ import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.uast.*
class KotlinUNamedExpression private constructor(
override val name: String?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
override val name: String?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
) : KotlinAbstractUElement(givenParent), UNamedExpression {
override val expression: UExpression by lz { expressionProducer(this) }
override val annotations: List<UAnnotation> = emptyList()
@@ -36,22 +37,27 @@ class KotlinUNamedExpression private constructor(
internal fun create(name: String?, valueArgument: ValueArgument, uastParent: UElement?): UNamedExpression {
val expression = valueArgument.getArgumentExpression()
return KotlinUNamedExpression(name, uastParent) { expressionParent ->
expression?.let { expressionParent.getLanguagePlugin().convert<UExpression>(it, expressionParent) } ?: UastEmptyExpression
expression?.let { expressionParent.getLanguagePlugin().convertOpt<UExpression>(it, expressionParent) }
?: UastEmptyExpression
}
}
internal fun create(
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?): UNamedExpression {
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?
): UNamedExpression {
return KotlinUNamedExpression(name, uastParent) { expressionParent ->
KotlinUVarargExpression(valueArguments, expressionParent)
}
}
}
}
class KotlinUVarargExpression(private val valueArgs: List<ValueArgument>,
uastParent: UElement?) : KotlinAbstractUExpression(uastParent), UCallExpression {
class KotlinUVarargExpression(
private val valueArgs: List<ValueArgument>,
uastParent: UElement?
) : KotlinAbstractUExpression(uastParent), UCallExpression {
override val kind: UastCallKind = UastCallKind.NESTED_ARRAY_INITIALIZER
override val valueArguments: List<UExpression> by lz {
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.psi.ValueArgument
import org.jetbrains.uast.*
class KotlinUNamedExpression private constructor(
override val name: String?,
override val sourcePsi: PsiElement?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
override val name: String?,
override val sourcePsi: PsiElement?,
givenParent: UElement?,
expressionProducer: (UElement) -> UExpression
) : KotlinAbstractUElement(givenParent), UNamedExpression {
override val expression: UExpression by lz { expressionProducer(this) }
@@ -40,22 +40,27 @@ class KotlinUNamedExpression private constructor(
internal fun create(name: String?, valueArgument: ValueArgument, uastParent: UElement?): UNamedExpression {
val expression = valueArgument.getArgumentExpression()
return KotlinUNamedExpression(name, valueArgument.asElement(), uastParent) { expressionParent ->
expression?.let { expressionParent.getLanguagePlugin().convert<UExpression>(it, expressionParent) } ?: UastEmptyExpression
expression?.let { expressionParent.getLanguagePlugin().convertOpt<UExpression>(it, expressionParent) }
?: UastEmptyExpression
}
}
internal fun create(
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?): UNamedExpression {
name: String?,
valueArguments: List<ValueArgument>,
uastParent: UElement?
): UNamedExpression {
return KotlinUNamedExpression(name, null, uastParent) { expressionParent ->
KotlinUVarargExpression(valueArguments, expressionParent)
}
}
}
}
class KotlinUVarargExpression(private val valueArgs: List<ValueArgument>,
uastParent: UElement?) : KotlinAbstractUExpression(uastParent), UCallExpression {
class KotlinUVarargExpression(
private val valueArgs: List<ValueArgument>,
uastParent: UElement?
) : KotlinAbstractUExpression(uastParent), UCallExpression {
override val kind: UastCallKind = UastCallKind.NESTED_ARRAY_INITIALIZER
override val valueArguments: List<UExpression> by lz {