Avoid rebuilds after changes of layouts xml-files
This commit makes IC react more granularly on these changes Precisely, it marks dirty only kt-files that having lookups into synthetic package built upon a changed layout-file #KT-21622 Fixed
This commit is contained in:
+14
-2
@@ -20,7 +20,10 @@ import org.jetbrains.kotlin.android.synthetic.res.*
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
||||
import org.jetbrains.kotlin.incremental.ANDROID_LAYOUT_CONTENT_LOOKUP_NAME
|
||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.incremental.recordPackageLookup
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
@@ -43,7 +46,9 @@ class AndroidSyntheticPackageFragmentDescriptor(
|
||||
val packageData: AndroidSyntheticPackageData,
|
||||
private val lazyContext: LazySyntheticElementResolveContext,
|
||||
private val storageManager: StorageManager,
|
||||
private val isExperimental: Boolean
|
||||
private val isExperimental: Boolean,
|
||||
private val lookupTracker: LookupTracker,
|
||||
private val layoutName: String
|
||||
) : PackageFragmentDescriptorImpl(module, fqName) {
|
||||
private val scope = AndroidExtensionPropertiesScope()
|
||||
override fun getMemberScope(): MemberScope = scope
|
||||
@@ -81,7 +86,14 @@ class AndroidSyntheticPackageFragmentDescriptor(
|
||||
override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) =
|
||||
properties().filter { kindFilter.acceptsKinds(DescriptorKindFilter.VARIABLES_MASK) && nameFilter(it.name) }
|
||||
|
||||
override fun getContributedVariables(name: Name, location: LookupLocation) = properties().filter { it.name == name }
|
||||
override fun getContributedVariables(name: Name, location: LookupLocation): List<PropertyDescriptor> {
|
||||
recordLookup(name, location)
|
||||
return properties().filter { it.name == name }
|
||||
}
|
||||
|
||||
override fun recordLookup(name: Name, location: LookupLocation) {
|
||||
lookupTracker.recordPackageLookup(location, layoutName, ANDROID_LAYOUT_CONTENT_LOOKUP_NAME)
|
||||
}
|
||||
|
||||
override fun printScopeStructure(p: Printer) {
|
||||
p.println(this::class.java.simpleName)
|
||||
|
||||
+13
-4
@@ -19,9 +19,15 @@ package org.jetbrains.kotlin.android.synthetic.res
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.android.synthetic.AndroidConst
|
||||
import org.jetbrains.kotlin.android.synthetic.descriptors.*
|
||||
import org.jetbrains.kotlin.android.synthetic.descriptors.AndroidSyntheticPackageData
|
||||
import org.jetbrains.kotlin.android.synthetic.descriptors.AndroidSyntheticPackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.android.synthetic.descriptors.LazySyntheticElementResolveContext
|
||||
import org.jetbrains.kotlin.android.synthetic.descriptors.PredefinedPackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.android.synthetic.forEachUntilLast
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||
@@ -38,7 +44,8 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider
|
||||
module: ModuleDescriptor,
|
||||
storageManager: StorageManager,
|
||||
trace: BindingTrace,
|
||||
moduleInfo: ModuleInfo?
|
||||
moduleInfo: ModuleInfo?,
|
||||
lookupTracker: LookupTracker
|
||||
): PackageFragmentProvider? {
|
||||
val isExperimental = isExperimental(moduleInfo)
|
||||
|
||||
@@ -58,7 +65,9 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider
|
||||
val resources = layoutXmlFileManager.extractResources(AndroidLayoutGroupData(layoutName, layouts), module)
|
||||
val packageData = AndroidSyntheticPackageData(moduleData, forView, isDeprecated, resources)
|
||||
val packageDescriptor = AndroidSyntheticPackageFragmentDescriptor(
|
||||
module, FqName(fqName), packageData, lazyContext, storageManager, isExperimental)
|
||||
module, FqName(fqName), packageData, lazyContext, storageManager, isExperimental,
|
||||
lookupTracker, layoutName
|
||||
)
|
||||
packagesToLookupInCompletion += packageDescriptor
|
||||
allPackageDescriptors += packageDescriptor
|
||||
}
|
||||
|
||||
+6
-2
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.android.synthetic.test
|
||||
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidPackageFragmentProviderExtension
|
||||
import org.jetbrains.kotlin.android.synthetic.res.AndroidSyntheticPackageFragmentProvider
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||
import org.jetbrains.kotlin.resolve.MemberComparator
|
||||
import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension
|
||||
@@ -39,8 +40,11 @@ abstract class AbstractAndroidSyntheticPropertyDescriptorTest : KtUsefulTestCase
|
||||
|
||||
val analysisResult = JvmResolveUtil.analyzeAndCheckForErrors(listOf(), env)
|
||||
|
||||
val fragmentProvider = ext.getPackageFragmentProvider(project, analysisResult.moduleDescriptor, LockBasedStorageManager.NO_LOCKS,
|
||||
KotlinTestUtils.DUMMY_EXCEPTION_ON_ERROR_TRACE, null) as AndroidSyntheticPackageFragmentProvider
|
||||
val fragmentProvider =
|
||||
ext.getPackageFragmentProvider(
|
||||
project, analysisResult.moduleDescriptor, LockBasedStorageManager.NO_LOCKS,
|
||||
KotlinTestUtils.DUMMY_EXCEPTION_ON_ERROR_TRACE, null, LookupTracker.DO_NOTHING
|
||||
) as AndroidSyntheticPackageFragmentProvider
|
||||
|
||||
val renderer = DescriptorRenderer.COMPACT_WITH_MODIFIERS
|
||||
val expected = fragmentProvider.packageFragments.sortedBy { it.fqName.asString() }.map {
|
||||
|
||||
Reference in New Issue
Block a user