Don't analyze temporary files created from destructuring declarations

They are known to not contain any synthetic accessor calls.
This commit is contained in:
Dmitry Jemerov
2017-10-10 19:06:19 +02:00
parent f5d40a1c98
commit 1d4c2e9223
2 changed files with 12 additions and 2 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.uast.kotlin
import com.intellij.lang.Language
import com.intellij.openapi.util.Key
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.tree.LeafPsiElement
@@ -45,6 +46,8 @@ interface KotlinUastBindingContextProviderService {
fun getTypeMapper(element: KtElement): KotlinTypeMapper?
}
var PsiElement.destructuringDeclarationInitializer: Boolean? by UserDataProperty(Key.create("kotlin.uast.destructuringDeclarationInitializer"))
class KotlinUastLanguagePlugin : UastLanguagePlugin {
override val priority = 10
@@ -367,6 +370,7 @@ internal object KotlinConverter {
val psiFactory = KtPsiFactory(expression.project)
val initializer = psiFactory.createAnalyzableExpression("${tempAssignment.name}.component${i + 1}()",
expression.containingFile)
initializer.destructuringDeclarationInitializer = true
KotlinULocalVariable(UastKotlinPsiVariable.create(entry, tempAssignment.psi, declarationsExpression, initializer), declarationsExpression)
}
declarations = listOf(tempAssignment) + destructuringAssignments
@@ -49,6 +49,14 @@ open class KotlinUSimpleReferenceExpression(
override fun accept(visitor: UastVisitor) {
visitor.visitSimpleNameReferenceExpression(this)
if (psi.parent.destructuringDeclarationInitializer != true) {
visitAccessorCalls(visitor)
}
visitor.afterVisitSimpleNameReferenceExpression(this)
}
private fun visitAccessorCalls(visitor: UastVisitor) {
// Visit Kotlin get-set synthetic Java property calls as function calls
val bindingContext = psi.analyze()
val access = psi.readWriteAccess()
@@ -78,8 +86,6 @@ open class KotlinUSimpleReferenceExpression(
}
}
}
visitor.afterVisitSimpleNameReferenceExpression(this)
}
private tailrec fun findAssignment(prev: PsiElement?, element: PsiElement?): KtBinaryExpression? = when (element) {