Skip to content

Commit 6b00ade

Browse files
committed
~ EXAMPLE How to create a class descriptor and a instance function inside it
1 parent 85a0f8c commit 6b00ade

File tree

3 files changed

+59
-16
lines changed

3 files changed

+59
-16
lines changed

plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/PredefinedPackageFragmentDescriptor.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@
1616

1717
package org.jetbrains.kotlin.android.synthetic.descriptors
1818

19-
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
20-
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
21-
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
22-
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
19+
import org.jetbrains.kotlin.descriptors.*
2320
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
2421
import org.jetbrains.kotlin.incremental.components.LookupLocation
2522
import org.jetbrains.kotlin.name.FqName
@@ -34,12 +31,17 @@ class PredefinedPackageFragmentDescriptor(
3431
module: ModuleDescriptor,
3532
storageManager: StorageManager,
3633
val subpackages: List<PackageFragmentDescriptor> = emptyList(),
37-
private val functions: (PredefinedPackageFragmentDescriptor) -> Collection<SimpleFunctionDescriptor> = { emptyList() }
34+
private val functions: (PredefinedPackageFragmentDescriptor) -> Collection<SimpleFunctionDescriptor> = { emptyList() },
35+
private val classifiers: (PredefinedPackageFragmentDescriptor) -> Collection<ClassifierDescriptor> = { emptyList() }
3836
) : PackageFragmentDescriptorImpl(module, FqName(fqName)) {
3937
private val calculatedFunctions = storageManager.createLazyValue {
4038
functions(this)
4139
}
4240

41+
private val calculatedClassifiers = storageManager.createLazyValue {
42+
classifiers(this)
43+
}
44+
4345
private val scope = PredefinedScope()
4446

4547
override fun getMemberScope() = scope
@@ -49,11 +51,16 @@ class PredefinedPackageFragmentDescriptor(
4951

5052
override fun getContributedFunctions(name: Name, location: LookupLocation) = calculatedFunctions().filter { it.name == name }
5153

54+
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
55+
return calculatedClassifiers().firstOrNull { name == it.name }
56+
}
57+
5258
override fun getContributedDescriptors(
5359
kindFilter: DescriptorKindFilter,
5460
nameFilter: (Name) -> Boolean
55-
): List<SimpleFunctionDescriptor> {
56-
return calculatedFunctions().filter { nameFilter(it.name) && kindFilter.accepts(it) }
61+
): List<DeclarationDescriptorNonRoot> {
62+
return calculatedFunctions().filter { nameFilter(it.name) && kindFilter.accepts(it) } +
63+
calculatedClassifiers().filter { nameFilter(it.name) && kindFilter.accepts(it) }
5764
}
5865

5966
override fun printScopeStructure(p: Printer) {

plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,16 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider
8282

8383
// Package with clearFindViewByIdCache()
8484
AndroidConst.SYNTHETIC_SUBPACKAGES.last().let { s ->
85-
val packageDescriptor = PredefinedPackageFragmentDescriptor(s, module, storageManager, packagesToLookupInCompletion) { descriptor ->
85+
val packageDescriptor = PredefinedPackageFragmentDescriptor(s, module, storageManager, packagesToLookupInCompletion, { descriptor ->
8686
val widgetReceivers = lazyContext().getWidgetReceivers(forView = false, isExperimental = isExperimental) +
8787
lazyContext().getWidgetReceivers(forView = true, isExperimental = isExperimental)
8888

8989
widgetReceivers
9090
.filter { it.mayHaveCache }
9191
.map { genClearCacheFunction(descriptor, it.type) }
92-
}
92+
}, { descriptor ->
93+
listOf(genSimpleClass(descriptor))
94+
})
9395
packagesToLookupInCompletion += packageDescriptor
9496
allPackageDescriptors += packageDescriptor
9597
}

plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/syntheticDescriptorGeneration.kt

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,54 @@ import org.jetbrains.kotlin.android.synthetic.descriptors.AndroidSyntheticPackag
2222
import org.jetbrains.kotlin.android.synthetic.descriptors.SyntheticElementResolveContext
2323
import org.jetbrains.kotlin.descriptors.*
2424
import org.jetbrains.kotlin.descriptors.annotations.Annotations
25-
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
26-
import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
27-
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
25+
import org.jetbrains.kotlin.descriptors.impl.*
26+
import org.jetbrains.kotlin.incremental.components.LookupLocation
2827
import org.jetbrains.kotlin.name.Name
28+
import org.jetbrains.kotlin.resolve.DescriptorFactory
29+
import org.jetbrains.kotlin.resolve.DescriptorUtils
2930
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
3031
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
32+
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
33+
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
3134
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
32-
import org.jetbrains.kotlin.types.KotlinType
33-
import org.jetbrains.kotlin.types.KotlinTypeFactory
34-
import org.jetbrains.kotlin.types.SimpleType
35-
import org.jetbrains.kotlin.types.StarProjectionImpl
35+
import org.jetbrains.kotlin.types.*
36+
import org.jetbrains.kotlin.utils.Printer
3637

3738
private class XmlSourceElement(override val psi: PsiElement) : PsiSourceElement
3839

40+
internal fun genSimpleClass(packageFragmentDescriptor: PackageFragmentDescriptor): ClassDescriptor {
41+
val classDescriptor = ClassDescriptorImpl(packageFragmentDescriptor, Name.identifier("Test"), Modality.FINAL, ClassKind.CLASS,
42+
listOf(packageFragmentDescriptor.builtIns.anyType), SourceElement.NO_SOURCE, false)
43+
44+
val primaryConstructor = ClassConstructorDescriptorImpl.create(classDescriptor, Annotations.EMPTY, true, SourceElement.NO_SOURCE).apply {
45+
initialize(emptyList(), Visibilities.PUBLIC)
46+
}
47+
48+
val simpleFunction = SimpleFunctionDescriptorImpl.create(classDescriptor, Annotations.EMPTY, Name.identifier("foo"),
49+
CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE)
50+
51+
simpleFunction.initialize(null, classDescriptor.thisAsReceiverParameter, emptyList(), emptyList(),
52+
packageFragmentDescriptor.builtIns.stringType, Modality.FINAL, Visibilities.PUBLIC)
53+
54+
val scope = object : MemberScopeImpl() {
55+
override fun getContributedFunctions(name: Name, location: LookupLocation) = listOf(simpleFunction)
56+
override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName) }
57+
override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection<DeclarationDescriptor> {
58+
return when {
59+
kindFilter.accepts(simpleFunction) && nameFilter(simpleFunction.name) -> listOf(simpleFunction)
60+
kindFilter.accepts(primaryConstructor) && nameFilter(primaryConstructor.name) -> listOf(primaryConstructor)
61+
else -> emptyList()
62+
}
63+
}
64+
}
65+
66+
classDescriptor.initialize(scope, setOf(primaryConstructor), primaryConstructor)
67+
68+
primaryConstructor.returnType = KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, classDescriptor, emptyList())
69+
70+
return classDescriptor
71+
}
72+
3973
internal fun genClearCacheFunction(packageFragmentDescriptor: PackageFragmentDescriptor, receiverType: KotlinType): SimpleFunctionDescriptor {
4074
val function = object : AndroidSyntheticFunction, SimpleFunctionDescriptorImpl(
4175
packageFragmentDescriptor,

0 commit comments

Comments
 (0)