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:
committed by
Yan Zhulanow
parent
f83e7509b2
commit
46f3eae32c
+3
@@ -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)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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() }
|
||||
}
|
||||
+7
-3
@@ -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)
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user