Kapt: Dispose every JeElement and JeTypeMirror because some annotation processors may store them in static fields. (KT-13917)

Hello, Data Binding, why you cache them? :(

(cherry picked from commit d86a30b)
This commit is contained in:
Yan Zhulanow
2016-09-27 17:31:54 +03:00
committed by Yan Zhulanow
parent f83e7509b2
commit 46f3eae32c
26 changed files with 219 additions and 72 deletions
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.java.model.internal.JeElementRegistry
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension
import java.io.File
@@ -127,6 +128,8 @@ class AnnotationProcessingComponentRegistrar : ComponentRegistrar {
val annotationProcessingExtension = ClasspathBasedAnnotationProcessingExtension(
classpath, generatedOutputDirFile, classesOutputDir, javaRoots, verboseOutput,
incrementalDataFile, sourceRetentionAnnotationHandler)
project.registerService(JeElementRegistry::class.java, JeElementRegistry())
AnalysisCompletedHandlerExtension.registerExtension(project, annotationProcessingExtension)
}
@@ -31,6 +31,6 @@ class DisposableRef<out T : Any>(initialValue: T): Disposable {
fun <T : Any> T.toDisposable() = DisposableRef(this)
fun dispose(vararg refs: DisposableRef<*>) {
refs.forEach { it.dispose() }
fun dispose(vararg refs: DisposableRef<*>?) {
refs.forEach { it?.dispose() }
}
@@ -17,10 +17,12 @@
package org.jetbrains.kotlin.annotation.processing.impl
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiManager
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.java.model.internal.JeElementRegistry
import org.jetbrains.kotlin.resolve.BindingContext
import java.io.File
import java.util.*
@@ -55,13 +57,15 @@ class KotlinProcessingEnvironment(
internal val javaPsiFacade = javaPsiFacade.toDisposable()
internal val projectScope = projectScope.toDisposable()
internal val bindingContext = bindingContext.toDisposable()
private val registry = ServiceManager.getService(project, JeElementRegistry::class.java).toDisposable()
internal val appendJavaSourceRootsHandler = appendJavaSourceRootsHandler.toDisposable()
private val options = Collections.unmodifiableMap(options).toDisposable()
override fun dispose() {
types.dispose()
elements.dispose()
types().dispose()
elements().dispose()
registry().dispose()
dispose(elements, types, messager, filer, processors,
project, psiManager, javaPsiFacade, projectScope, bindingContext,
appendJavaSourceRootsHandler, options)
@@ -272,8 +272,8 @@ class KotlinTypes(
}
override fun isSubsignature(t1: ExecutableType, t2: ExecutableType): Boolean {
val m1 = (t1 as JeClassInitializerExecutableTypeMirror).initializer
val m2 = (t2 as JeClassInitializerExecutableTypeMirror).initializer
val m1 = (t1 as JeClassInitializerExecutableTypeMirror).psi
val m2 = (t2 as JeClassInitializerExecutableTypeMirror).psi
// No parameters
if (m1 is PsiClassInitializer && m2 is PsiClassInitializer) return true