Refactor function descriptors copy mechanism

Pull up CopyBuilder to interface and inline some custom usages
This commit is contained in:
Denis Zharkov
2016-04-04 15:34:32 +03:00
parent dbc8830acd
commit e316ab2ee6
9 changed files with 207 additions and 67 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.java
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.load.java.lazy.types.RawSubstitution
@@ -45,7 +46,7 @@ class ErasedOverridabilityCondition : ExternalOverridabilityCondition {
if (erasedSuper is SimpleFunctionDescriptor && erasedSuper.typeParameters.isNotEmpty()) {
// Only simple functions are supported now for erased overrides
erasedSuper = erasedSuper.createCopyWithNewTypeParameters(emptyList())
erasedSuper = erasedSuper.newCopyBuilder().setTypeParameters(emptyList()).build()!!
}
val overridabilityResult =
@@ -144,6 +144,13 @@ class LazyJavaClassMemberScope(
}
}
private fun SimpleFunctionDescriptor.createRenamedCopy(builtinName: Name): SimpleFunctionDescriptor =
this.newCopyBuilder().apply {
setName(builtinName)
setSignatureChange()
setPreserveSourceElement()
}.build()!!
private fun isOverridableRenamedDescriptor(superDescriptor: FunctionDescriptor, subDescriptor: FunctionDescriptor): Boolean {
// if we check 'removeAt', get original sub-descriptor to distinct `remove(int)` and `remove(E)` in Java
val subDescriptorToCheck = if (superDescriptor.isRemoveAtByIndex) subDescriptor.original else subDescriptor
@@ -222,7 +229,7 @@ class LazyJavaClassMemberScope(
return
}
var specialBuiltinsFromSuperTypes = SmartSet.create<SimpleFunctionDescriptor>()
val specialBuiltinsFromSuperTypes = SmartSet.create<SimpleFunctionDescriptor>()
// Merge functions with same signatures
val mergedFunctionFromSuperTypes = resolveOverridesForNonStaticMembers(
@@ -316,10 +323,11 @@ class LazyJavaClassMemberScope(
private fun SimpleFunctionDescriptor.createHiddenCopyIfBuiltinAlreadyAccidentallyOverridden(
specialBuiltin: CallableDescriptor,
alreadyDeclaredFunctions: Collection<SimpleFunctionDescriptor>
) = if (alreadyDeclaredFunctions.none { this != it && it.doesOverride(specialBuiltin) })
): SimpleFunctionDescriptor =
if (alreadyDeclaredFunctions.none { this != it && it.doesOverride(specialBuiltin) })
this
else
createHiddenCopyToOvercomeSignatureClash()
newCopyBuilder().setHiddenToOvercomeSignatureClash().build()!!
private fun createOverrideForBuiltinFunctionWithErasedParameterIfNeeded(
overridden: FunctionDescriptor,
@@ -329,9 +337,11 @@ class LazyJavaClassMemberScope(
it.doesOverrideBuiltinFunctionWithErasedValueParameters(overridden)
}?.let {
override ->
override.createCopyWithNewValueParameters(
copyValueParameters(overridden.valueParameters.map { it.type }, override.valueParameters, overridden))
override.newCopyBuilder().apply {
setValueParameters(copyValueParameters(overridden.valueParameters.map { it.type }, override.valueParameters, overridden))
setSignatureChange()
setPreserveSourceElement()
}.build()
}
}