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