FIR/UAST: commonize type check expression
This commit is contained in:
committed by
teamcityserver
parent
6e0f755b39
commit
b2e644b485
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtIsExpression
|
||||
import org.jetbrains.uast.UBinaryExpressionWithType
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UastBinaryExpressionWithTypeKind
|
||||
import org.jetbrains.uast.UastErrorType
|
||||
|
||||
class KotlinUTypeCheckExpression(
|
||||
override val sourcePsi: KtIsExpression,
|
||||
givenParent: UElement?
|
||||
) : KotlinAbstractUExpression(givenParent), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement {
|
||||
override val operand by lz {
|
||||
baseResolveProviderService.baseKotlinConverter.convertOrEmpty(sourcePsi.leftHandSide, this)
|
||||
}
|
||||
|
||||
override val type by lz {
|
||||
sourcePsi.typeReference?.let {
|
||||
baseResolveProviderService.resolveToType(it, this)
|
||||
} ?: UastErrorType
|
||||
}
|
||||
|
||||
override val typeReference by lz {
|
||||
sourcePsi.typeReference?.let {
|
||||
KotlinUTypeReferenceExpression(it, this) { type }
|
||||
}
|
||||
}
|
||||
|
||||
override val operationKind =
|
||||
if (sourcePsi.isNegated)
|
||||
KotlinBinaryExpressionWithTypeKinds.NEGATED_INSTANCE_CHECK
|
||||
else
|
||||
UastBinaryExpressionWithTypeKind.INSTANCE_CHECK
|
||||
}
|
||||
@@ -291,6 +291,8 @@ internal object FirKotlinConverter : BaseKotlinConverter {
|
||||
|
||||
is KtIfExpression -> expr<UIfExpression>(build(::KotlinUIfExpression))
|
||||
|
||||
is KtIsExpression -> expr<UBinaryExpressionWithType>(build(::KotlinUTypeCheckExpression))
|
||||
|
||||
else -> expr<UExpression>(build(::UnknownKotlinExpression))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
fun Any?.asString(): String {
|
||||
return if (x !is String)
|
||||
x.toString()
|
||||
else
|
||||
x
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
UFile (package = ) [public final class TypeCheckKt {...]
|
||||
UClass (name = TypeCheckKt) [public final class TypeCheckKt {...}]
|
||||
UMethod (name = asString) [public static final fun asString(@org.jetbrains.annotations.Nullable $this$asString: java.lang.Object) : java.lang.String {...}]
|
||||
UParameter (name = $this$asString) [@org.jetbrains.annotations.Nullable var $this$asString: java.lang.Object]
|
||||
UAnnotation (fqName = org.jetbrains.annotations.Nullable) [@org.jetbrains.annotations.Nullable]
|
||||
UBlockExpression [{...}] : PsiType:Void
|
||||
UReturnExpression [return if (x !is java.lang.String) x.<anonymous class>() else x] : PsiType:Void
|
||||
UIfExpression [if (x !is java.lang.String) x.<anonymous class>() else x] : PsiType:String
|
||||
UBinaryExpressionWithType [x !is java.lang.String] : PsiType:boolean
|
||||
USimpleNameReferenceExpression (identifier = x) [x]
|
||||
UTypeReferenceExpression (name = java.lang.String) [java.lang.String]
|
||||
UQualifiedReferenceExpression [x.<anonymous class>()] : PsiType:<ErrorType>
|
||||
USimpleNameReferenceExpression (identifier = x) [x]
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) [<anonymous class>()] : PsiType:<ErrorType>
|
||||
UIdentifier (Identifier (toString)) [UIdentifier (Identifier (toString))]
|
||||
USimpleNameReferenceExpression (identifier = <anonymous class>, resolvesTo = null) [<anonymous class>] : PsiType:<ErrorType>
|
||||
USimpleNameReferenceExpression (identifier = x) [x]
|
||||
@@ -0,0 +1,12 @@
|
||||
UFile (package = ) [public final class TypeCheckKt {...]
|
||||
UClass (name = TypeCheckKt) [public final class TypeCheckKt {...}]
|
||||
UMethod (name = asString) [public static final fun asString($this$asString: java.lang.Object) : java.lang.String {...}]
|
||||
UParameter (name = $this$asString) [var $this$asString: java.lang.Object]
|
||||
UBlockExpression [{...}] : PsiType:Void
|
||||
UReturnExpression [return if ([!] UnknownKotlinExpression (REFERENCE_EXPRESSION) !is java.lang.String) [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) else [!] UnknownKotlinExpression (REFERENCE_EXPRESSION)] : PsiType:Void
|
||||
UIfExpression [if ([!] UnknownKotlinExpression (REFERENCE_EXPRESSION) !is java.lang.String) [!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) else [!] UnknownKotlinExpression (REFERENCE_EXPRESSION)] : PsiType:String
|
||||
UBinaryExpressionWithType [[!] UnknownKotlinExpression (REFERENCE_EXPRESSION) !is java.lang.String] : PsiType:boolean
|
||||
[!] UnknownKotlinExpression (REFERENCE_EXPRESSION) [[!] UnknownKotlinExpression (REFERENCE_EXPRESSION)]
|
||||
UTypeReferenceExpression (name = java.lang.String) [java.lang.String]
|
||||
[!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION) [[!] UnknownKotlinExpression (DOT_QUALIFIED_EXPRESSION)]
|
||||
[!] UnknownKotlinExpression (REFERENCE_EXPRESSION) [[!] UnknownKotlinExpression (REFERENCE_EXPRESSION)]
|
||||
Generated
+5
@@ -29,6 +29,11 @@ public class FE1UastTypesTestGenerated extends AbstractFE1UastTypesTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/uast-kotlin-fir/testData/type"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@TestMetadata("typeCheck.kt")
|
||||
public void testTypeCheck() throws Exception {
|
||||
runTest("plugins/uast-kotlin-fir/testData/type/typeCheck.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("unresolved.kt")
|
||||
public void testUnresolved() throws Exception {
|
||||
runTest("plugins/uast-kotlin-fir/testData/type/unresolved.kt");
|
||||
|
||||
Generated
+5
@@ -29,6 +29,11 @@ public class FirUastTypesTestGenerated extends AbstractFirUastTypesTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/uast-kotlin-fir/testData/type"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@TestMetadata("typeCheck.kt")
|
||||
public void testTypeCheck() throws Exception {
|
||||
runTest("plugins/uast-kotlin-fir/testData/type/typeCheck.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("unresolved.kt")
|
||||
public void testUnresolved() throws Exception {
|
||||
runTest("plugins/uast-kotlin-fir/testData/type/unresolved.kt");
|
||||
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2016 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import org.jetbrains.kotlin.psi.KtIsExpression
|
||||
import org.jetbrains.uast.UBinaryExpressionWithType
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UastBinaryExpressionWithTypeKind
|
||||
|
||||
class KotlinUTypeCheckExpression(
|
||||
override val sourcePsi: KtIsExpression,
|
||||
givenParent: UElement?
|
||||
) : KotlinAbstractUExpression(givenParent), UBinaryExpressionWithType, KotlinUElementWithType, KotlinEvaluatableUElement {
|
||||
override val operand by lz { KotlinConverter.convertOrEmpty(sourcePsi.leftHandSide, this) }
|
||||
|
||||
override val type by lz { sourcePsi.typeReference.toPsiType(this) }
|
||||
|
||||
override val typeReference = sourcePsi.typeReference?.let {
|
||||
KotlinUTypeReferenceExpression(it, this) { it.toPsiType(this) }
|
||||
}
|
||||
|
||||
override val operationKind =
|
||||
if(sourcePsi.isNegated)
|
||||
KotlinBinaryExpressionWithTypeKinds.NEGATED_INSTANCE_CHECK
|
||||
else
|
||||
UastBinaryExpressionWithTypeKind.INSTANCE_CHECK
|
||||
}
|
||||
Reference in New Issue
Block a user