diff --git a/idea/testData/android/lint/sdCardTest.kt b/idea/testData/android/lint/sdCardTest.kt index 41c48d48afb..ffc534f68bd 100644 --- a/idea/testData/android/lint/sdCardTest.kt +++ b/idea/testData/android/lint/sdCardTest.kt @@ -29,6 +29,11 @@ class SdCardTest { val mypath = "/data/data/foo" val base = "/data/data/foo.bar/test-profiling" val s = "file://sdcard/foo" + + val sdCardPath by lazy { "/sdcard" } + fun localPropertyTest() { + val sdCardPathLocal by lazy { "/sdcard" } + } } companion object { diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt index 955d9a8e4eb..055f5598f36 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUVariable.kt @@ -20,8 +20,10 @@ import com.intellij.psi.* import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtVariableDeclaration import org.jetbrains.uast.* +import org.jetbrains.uast.internal.acceptList import org.jetbrains.uast.java.AbstractJavaUVariable import org.jetbrains.uast.java.JavaAbstractUExpression import org.jetbrains.uast.java.JavaUAnnotation @@ -29,6 +31,7 @@ import org.jetbrains.uast.java.annotations import org.jetbrains.uast.kotlin.declarations.UastLightIdentifier import org.jetbrains.uast.kotlin.psi.UastKotlinPsiParameter import org.jetbrains.uast.kotlin.psi.UastKotlinPsiVariable +import org.jetbrains.uast.visitor.UastVisitor abstract class AbstractKotlinUVariable : AbstractJavaUVariable() { override val uastInitializer: UExpression? @@ -50,6 +53,17 @@ abstract class AbstractKotlinUVariable : AbstractJavaUVariable() { return getLanguagePlugin().convertElement(initializerExpression, this) as? UExpression ?: UastEmptyExpression } + val delegateExpression: UExpression? by lz { + val psi = psi + val expression = when (psi) { + is KtLightElement<*, *> -> (psi.kotlinOrigin as? KtProperty)?.delegateExpression + is UastKotlinPsiVariable -> (psi.ktElement as? KtProperty)?.delegateExpression + else -> null + } + + expression?.let { getLanguagePlugin().convertElement(it, this) as? UExpression } + } + override fun getNameIdentifier(): PsiIdentifier { val kotlinOrigin = (psi as? KtLightElement<*, *>)?.kotlinOrigin return UastLightIdentifier(psi, kotlinOrigin as KtNamedDeclaration?) @@ -136,6 +150,14 @@ open class KotlinUField( } override fun getContainingFile(): PsiFile? = (psi as? KtLightElement<*, *>)?.kotlinOrigin?.containingFile ?: psi.containingFile + + override fun accept(visitor: UastVisitor) { + if (visitor.visitField(this)) return + annotations.acceptList(visitor) + uastInitializer?.accept(visitor) + delegateExpression?.accept(visitor) + visitor.afterVisitField(this) + } } open class KotlinULocalVariable( @@ -156,6 +178,14 @@ open class KotlinULocalVariable( override fun getNameIdentifier(): PsiIdentifier { return super.getNameIdentifier() } + + override fun accept(visitor: UastVisitor) { + if (visitor.visitLocalVariable(this)) return + annotations.acceptList(visitor) + uastInitializer?.accept(visitor) + delegateExpression?.accept(visitor) + visitor.afterVisitLocalVariable(this) + } } open class KotlinUEnumConstant( diff --git a/plugins/uast-kotlin/testData/PropertyDelegate.kt b/plugins/uast-kotlin/testData/PropertyDelegate.kt new file mode 100644 index 00000000000..4cc642ec36f --- /dev/null +++ b/plugins/uast-kotlin/testData/PropertyDelegate.kt @@ -0,0 +1,5 @@ +val sdCardPath by lazy { "/sdcard" } + +fun localPropertyTest() { + val sdCardPathLocal by lazy { "/sdcard" } +} \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/PropertyDelegate.log.txt b/plugins/uast-kotlin/testData/PropertyDelegate.log.txt new file mode 100644 index 00000000000..04df9270c82 --- /dev/null +++ b/plugins/uast-kotlin/testData/PropertyDelegate.log.txt @@ -0,0 +1,21 @@ +UFile (package = ) + UClass (name = PropertyDelegateKt) + UField (name = sdCardPath$delegate) + UAnnotation (fqName = org.jetbrains.annotations.NotNull) + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) + UIdentifier (Identifier (lazy)) + USimpleNameReferenceExpression (identifier = lazy) + ULambdaExpression + UBlockExpression + ULiteralExpression (value = "/sdcard") + UAnnotationMethod (name = getSdCardPath) + UAnnotationMethod (name = localPropertyTest) + UBlockExpression + UDeclarationsExpression + ULocalVariable (name = sdCardPathLocal) + UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) + UIdentifier (Identifier (lazy)) + USimpleNameReferenceExpression (identifier = lazy) + ULambdaExpression + UBlockExpression + ULiteralExpression (value = "/sdcard") diff --git a/plugins/uast-kotlin/testData/PropertyDelegate.render.txt b/plugins/uast-kotlin/testData/PropertyDelegate.render.txt new file mode 100644 index 00000000000..50efc00b1a3 --- /dev/null +++ b/plugins/uast-kotlin/testData/PropertyDelegate.render.txt @@ -0,0 +1,7 @@ +public final class PropertyDelegateKt { + private static final var sdCardPath$delegate: kotlin.Lazy + public static final fun getSdCardPath() : java.lang.String = UastEmptyExpression + public static final fun localPropertyTest() : void { + var sdCardPathLocal: + } +} diff --git a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt index c5fa6d9434a..365856c0f0f 100644 --- a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt +++ b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt @@ -26,4 +26,6 @@ class SimpleKotlinRenderLogTest : AbstractKotlinRenderLogTest() { @Test fun testStringTemplate() = doTest("StringTemplate") @Test fun testQualifiedConstructorCall() = doTest("QualifiedConstructorCall") + + @Test fun testPropertyDelegate() = doTest("PropertyDelegate") } \ No newline at end of file