Move SAM adapter resolution logic to SamConversionResolver
This commit is contained in:
+1
-1
@@ -90,7 +90,7 @@ class LazyJavaClassDescriptor(
|
||||
override fun getClassObjectDescriptor(): ClassDescriptor? = null
|
||||
override fun getClassObjectType(): JetType? = getClassObjectDescriptor()?.let { d -> d.getDefaultType() }
|
||||
|
||||
override fun getConstructors() = _scopeForMemberLookup._constructors()
|
||||
override fun getConstructors() = _scopeForMemberLookup.constructors()
|
||||
|
||||
private val _annotations = c.storageManager.createLazyValue { c.resolveAnnotations(jClass) }
|
||||
override fun getAnnotations() = _annotations()
|
||||
|
||||
+10
-19
@@ -31,7 +31,6 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||
import org.jetbrains.jet.lang.descriptors.impl.EnumEntrySyntheticClassDescriptor
|
||||
import org.jetbrains.jet.lang.types.TypeUtils
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.Annotations
|
||||
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaVisibilities
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaConstructorDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
|
||||
@@ -51,19 +50,15 @@ public class LazyJavaClassMemberScope(
|
||||
}
|
||||
}
|
||||
|
||||
internal val _constructors = c.storageManager.createLazyValue {
|
||||
jClass.getConstructors().flatMap { ctor ->
|
||||
val constructor = resolveConstructor(ctor, getContainingDeclaration())
|
||||
val samAdapter = resolveSamAdapter(constructor)
|
||||
if (samAdapter != null) {
|
||||
samAdapter.setReturnType(containingDeclaration.getDefaultType())
|
||||
listOf(constructor, samAdapter)
|
||||
}
|
||||
else
|
||||
listOf(constructor)
|
||||
} ifEmpty {
|
||||
emptyOrSingletonList(createDefaultConstructor())
|
||||
internal val constructors = c.storageManager.createLazyValue {
|
||||
val constructors = jClass.getConstructors()
|
||||
val result = ArrayList<JavaConstructorDescriptor>(constructors.size)
|
||||
for (constructor in constructors) {
|
||||
val descriptor = resolveConstructor(constructor)
|
||||
result.add(descriptor)
|
||||
result.addIfNotNull(c.samConversionResolver.resolveSamAdapter(descriptor))
|
||||
}
|
||||
result ifEmpty { emptyOrSingletonList(createDefaultConstructor()) }
|
||||
}
|
||||
|
||||
override fun computeNonDeclaredFunctions(result: MutableCollection<SimpleFunctionDescriptor>, name: Name) {
|
||||
@@ -105,13 +100,9 @@ public class LazyJavaClassMemberScope(
|
||||
return MethodSignatureData(effectiveSignature, superFunctions, propagated.getErrors() + effectiveSignature.getErrors())
|
||||
}
|
||||
|
||||
private fun resolveSamAdapter(original: JavaConstructorDescriptor): JavaConstructorDescriptor? {
|
||||
return if (SingleAbstractMethodUtils.isSamAdapterNecessary(original))
|
||||
SingleAbstractMethodUtils.createSamAdapterConstructor(original) as JavaConstructorDescriptor
|
||||
else null
|
||||
}
|
||||
private fun resolveConstructor(constructor: JavaConstructor): JavaConstructorDescriptor {
|
||||
val classDescriptor = getContainingDeclaration()
|
||||
|
||||
private fun resolveConstructor(constructor: JavaConstructor, classDescriptor: ClassDescriptor): JavaConstructorDescriptor {
|
||||
val constructorDescriptor = JavaConstructorDescriptor.createJavaConstructor(
|
||||
classDescriptor, Annotations.EMPTY, /* isPrimary = */ false, c.sourceElementFactory.source(constructor)
|
||||
)
|
||||
|
||||
+14
-29
@@ -41,7 +41,6 @@ import org.jetbrains.jet.lang.types.JetType
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.ExternalSignatureResolver
|
||||
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils
|
||||
import org.jetbrains.jet.utils.*
|
||||
import org.jetbrains.jet.lang.resolve.java.PLATFORM_TYPES
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.Annotations
|
||||
@@ -72,33 +71,25 @@ public abstract class LazyJavaMemberScope(
|
||||
|
||||
protected abstract fun getDispatchReceiverParameter(): ReceiverParameterDescriptor?
|
||||
|
||||
private val _functions = c.storageManager.createMemoizedFunction {
|
||||
(name: Name): Collection<FunctionDescriptor> ->
|
||||
val methods = memberIndex().findMethodsByName(name)
|
||||
val functions = LinkedHashSet<SimpleFunctionDescriptor>(
|
||||
methods.stream()
|
||||
.flatMap {
|
||||
m ->
|
||||
val function = resolveMethodToFunctionDescriptor(m, true)
|
||||
val samAdapter = resolveSamAdapter(function)
|
||||
if (samAdapter != null)
|
||||
listOf(function, samAdapter).stream()
|
||||
else
|
||||
listOf(function).stream()
|
||||
}
|
||||
.toList()
|
||||
)
|
||||
private val functions = c.storageManager.createMemoizedFunction {(name: Name): Collection<FunctionDescriptor> ->
|
||||
val result = LinkedHashSet<SimpleFunctionDescriptor>()
|
||||
|
||||
computeNonDeclaredFunctions(functions, name)
|
||||
for (method in memberIndex().findMethodsByName(name)) {
|
||||
val descriptor = resolveMethodToFunctionDescriptor(method, true)
|
||||
result.add(descriptor)
|
||||
result.addIfNotNull(c.samConversionResolver.resolveSamAdapter(descriptor))
|
||||
}
|
||||
|
||||
computeNonDeclaredFunctions(result, name)
|
||||
|
||||
// Make sure that lazy things are computed before we release the lock
|
||||
for (f in functions) {
|
||||
for (f in result) {
|
||||
for (p in f.getValueParameters()) {
|
||||
p.hasDefaultValue()
|
||||
}
|
||||
}
|
||||
|
||||
functions.toReadOnlyList()
|
||||
result.toReadOnlyList()
|
||||
}
|
||||
|
||||
data class MethodSignatureData(
|
||||
@@ -213,18 +204,12 @@ public abstract class LazyJavaMemberScope(
|
||||
return ResolvedValueParameters(descriptors, synthesizedNames)
|
||||
}
|
||||
|
||||
private fun resolveSamAdapter(original: JavaMethodDescriptor): JavaMethodDescriptor? {
|
||||
return if (SingleAbstractMethodUtils.isSamAdapterNecessary(original))
|
||||
SingleAbstractMethodUtils.createSamAdapterFunction(original) as JavaMethodDescriptor
|
||||
else null
|
||||
}
|
||||
|
||||
override fun getFunctions(name: Name) = _functions(name)
|
||||
override fun getFunctions(name: Name) = functions(name)
|
||||
protected open fun getAllFunctionNames(): Collection<Name> = memberIndex().getAllMethodNames()
|
||||
|
||||
protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection<PropertyDescriptor>)
|
||||
|
||||
val _properties = c.storageManager.createMemoizedFunction {
|
||||
private val properties = c.storageManager.createMemoizedFunction {
|
||||
(name: Name) ->
|
||||
val properties = ArrayList<PropertyDescriptor>()
|
||||
|
||||
@@ -291,7 +276,7 @@ public abstract class LazyJavaMemberScope(
|
||||
return propertyType
|
||||
}
|
||||
|
||||
override fun getProperties(name: Name): Collection<VariableDescriptor> = _properties(name)
|
||||
override fun getProperties(name: Name): Collection<VariableDescriptor> = properties(name)
|
||||
protected open fun getAllPropertyNames(): Collection<Name> = memberIndex().getAllFieldNames()
|
||||
|
||||
override fun getLocalVariable(name: Name): VariableDescriptor? = null
|
||||
|
||||
+3
@@ -19,7 +19,10 @@ package org.jetbrains.jet.lang.resolve.java.resolver
|
||||
import org.jetbrains.jet.lang.resolve.name.Name
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||
|
||||
public trait SamConversionResolver {
|
||||
public fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor?
|
||||
|
||||
public fun <D : FunctionDescriptor> resolveSamAdapter(original: D): D?
|
||||
}
|
||||
|
||||
+1
@@ -222,6 +222,7 @@ public class SingleAbstractMethodUtils {
|
||||
@Nullable JetType returnType
|
||||
) {
|
||||
result.initialize(typeParameters, valueParameters, original.getVisibility());
|
||||
result.setReturnType(result.getContainingDeclaration().getDefaultType());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user