Fixed special item after "super." not working for fake override super
This commit is contained in:
@@ -16,26 +16,25 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.cfg.pseudocode
|
package org.jetbrains.kotlin.cfg.pseudocode
|
||||||
|
|
||||||
import com.google.common.collect.Sets
|
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import com.intellij.util.SmartFMap
|
|
||||||
import com.intellij.util.containers.MultiMap
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.MagicKind.*
|
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.*
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.*
|
||||||
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.MagicKind.*
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ConditionalJumpInstruction
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ConditionalJumpInstruction
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ReturnValueInstruction
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ReturnValueInstruction
|
||||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ThrowExceptionInstruction
|
import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ThrowExceptionInstruction
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.parents
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.*
|
import org.jetbrains.kotlin.resolve.BindingContext.*
|
||||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.calls.ValueArgumentsToParametersMapper
|
import org.jetbrains.kotlin.resolve.calls.ValueArgumentsToParametersMapper
|
||||||
@@ -45,6 +44,7 @@ import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getExplicitReceiverVa
|
|||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionCandidate
|
import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionCandidate
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
||||||
|
import org.jetbrains.kotlin.resolve.findTopMostOverriddenDescriptors
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
@@ -59,7 +59,7 @@ fun getReceiverTypePredicate(resolvedCall: ResolvedCall<*>, receiverValue: Recei
|
|||||||
if (receiverParameter != null) return receiverParameter.getType().getSubtypesPredicate()
|
if (receiverParameter != null) return receiverParameter.getType().getSubtypesPredicate()
|
||||||
}
|
}
|
||||||
resolvedCall.getDispatchReceiver() -> {
|
resolvedCall.getDispatchReceiver() -> {
|
||||||
val rootCallableDescriptors = OverridingUtil.getTopmostOverridenDescriptors(callableDescriptor)
|
val rootCallableDescriptors = callableDescriptor.findTopMostOverriddenDescriptors()
|
||||||
return or(rootCallableDescriptors.map {
|
return or(rootCallableDescriptors.map {
|
||||||
it.getDispatchReceiverParameter()?.getType()?.let { TypeUtils.makeNullableIfNeeded(it, resolvedCall.isSafeCall()) }?.getSubtypesPredicate()
|
it.getDispatchReceiverParameter()?.getType()?.let { TypeUtils.makeNullableIfNeeded(it, resolvedCall.isSafeCall()) }?.getSubtypesPredicate()
|
||||||
}.filterNotNull())
|
}.filterNotNull())
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
|
|||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
import org.jetbrains.kotlin.types.TypeConstructor;
|
import org.jetbrains.kotlin.types.TypeConstructor;
|
||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker;
|
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker;
|
||||||
import org.jetbrains.kotlin.utils.DFS;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -504,30 +503,6 @@ public class OverridingUtil {
|
|||||||
return maxVisibility;
|
return maxVisibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static List<? extends CallableDescriptor> getTopmostOverridenDescriptors(@NotNull CallableDescriptor originalDescriptor) {
|
|
||||||
return DFS.dfs(
|
|
||||||
Collections.singletonList(originalDescriptor),
|
|
||||||
new DFS.Neighbors<CallableDescriptor>() {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Iterable<? extends CallableDescriptor> getNeighbors(CallableDescriptor current) {
|
|
||||||
return current.getOverriddenDescriptors();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new DFS.CollectingNodeHandler<CallableDescriptor, CallableDescriptor, ArrayList<CallableDescriptor>>(
|
|
||||||
new ArrayList<CallableDescriptor>()
|
|
||||||
) {
|
|
||||||
@Override
|
|
||||||
public void afterChildren(CallableDescriptor current) {
|
|
||||||
if (current.getOverriddenDescriptors().isEmpty()) {
|
|
||||||
result.add(current);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface DescriptorSink {
|
public interface DescriptorSink {
|
||||||
void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride);
|
void addFakeOverride(@NotNull CallableMemberDescriptor fakeOverride);
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,27 @@
|
|||||||
package org.jetbrains.kotlin.resolve
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
|
import org.jetbrains.kotlin.utils.DFS
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
fun CallableDescriptor.getOriginalTopmostOverriddenDescriptors(): Set<CallableDescriptor> {
|
fun <TDescriptor : CallableDescriptor> TDescriptor.findTopMostOverriddenDescriptors(): List<TDescriptor> {
|
||||||
return OverridingUtil.getTopmostOverridenDescriptors(this).mapTo(LinkedHashSet()) { it.original }
|
return DFS.dfs(
|
||||||
|
listOf(this),
|
||||||
|
{ current -> current.overriddenDescriptors },
|
||||||
|
object : DFS.CollectingNodeHandler<CallableDescriptor, CallableDescriptor, ArrayList<TDescriptor>>(ArrayList<TDescriptor>()) {
|
||||||
|
override fun afterChildren(current: CallableDescriptor) {
|
||||||
|
if (current.overriddenDescriptors.isEmpty()) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
result.add(current as TDescriptor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun <TDescriptor : CallableDescriptor> TDescriptor.findOriginalTopMostOverriddenDescriptors(): Set<TDescriptor> {
|
||||||
|
return findTopMostOverriddenDescriptors().mapTo(LinkedHashSet<TDescriptor>()) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
(it.original as TDescriptor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.renderer.render
|
|||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
|
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
|
||||||
|
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||||
import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor
|
import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
@@ -62,9 +63,10 @@ class LookupElementFactory(
|
|||||||
|
|
||||||
private val superFunctions: Set<FunctionDescriptor> by lazy {
|
private val superFunctions: Set<FunctionDescriptor> by lazy {
|
||||||
inDescriptor.parentsWithSelf
|
inDescriptor.parentsWithSelf
|
||||||
|
.takeWhile { it !is ClassDescriptor }
|
||||||
.filterIsInstance<FunctionDescriptor>()
|
.filterIsInstance<FunctionDescriptor>()
|
||||||
.toList()
|
.toList()
|
||||||
.flatMap { it.overriddenDescriptors }
|
.flatMap { it.findOriginalTopMostOverriddenDescriptors() }
|
||||||
.toSet()
|
.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +157,7 @@ class LookupElementFactory(
|
|||||||
|
|
||||||
private fun createSuperFunctionCallWithArguments(descriptor: FunctionDescriptor): LookupElement? {
|
private fun createSuperFunctionCallWithArguments(descriptor: FunctionDescriptor): LookupElement? {
|
||||||
if (descriptor.valueParameters.isEmpty()) return null
|
if (descriptor.valueParameters.isEmpty()) return null
|
||||||
if (descriptor !in superFunctions) return null
|
if (descriptor.findOriginalTopMostOverriddenDescriptors().none { it in superFunctions }) return null
|
||||||
|
|
||||||
val argumentText = descriptor.valueParameters.map {
|
val argumentText = descriptor.valueParameters.map {
|
||||||
(if (it.varargElementType != null) "*" else "") + it.name.render()
|
(if (it.varargElementType != null) "*" else "") + it.name.render()
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
|||||||
import org.jetbrains.kotlin.idea.util.CallType
|
import org.jetbrains.kotlin.idea.util.CallType
|
||||||
import org.jetbrains.kotlin.idea.util.FuzzyType
|
import org.jetbrains.kotlin.idea.util.FuzzyType
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
|
import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.resolve.getOriginalTopmostOverriddenDescriptors
|
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||||
|
|
||||||
object PriorityWeigher : LookupElementWeigher("kotlin.priority") {
|
object PriorityWeigher : LookupElementWeigher("kotlin.priority") {
|
||||||
override fun weigh(element: LookupElement, context: WeighingContext)
|
override fun weigh(element: LookupElement, context: WeighingContext)
|
||||||
@@ -251,7 +251,7 @@ class PreferContextElementsWeigher(private val context: DeclarationDescriptor) :
|
|||||||
private val contextElements = context.parentsWithSelf
|
private val contextElements = context.parentsWithSelf
|
||||||
.takeWhile { it !is PackageFragmentDescriptor }
|
.takeWhile { it !is PackageFragmentDescriptor }
|
||||||
.toList()
|
.toList()
|
||||||
.flatMap { if (it is CallableDescriptor) it.getOriginalTopmostOverriddenDescriptors() else listOf(it) }
|
.flatMap { if (it is CallableDescriptor) it.findOriginalTopMostOverriddenDescriptors() else listOf(it) }
|
||||||
.toSet()
|
.toSet()
|
||||||
private val contextElementNames = contextElements.map { it.name }.toSet()
|
private val contextElementNames = contextElements.map { it.name }.toSet()
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
open class B<T> {
|
open class A<T> {
|
||||||
open fun xxx_foo(p1: T, vararg p2: String) {}
|
open fun xxx_foo(p1: T, vararg p2: String) {}
|
||||||
open fun xxx_bar(p1: Int, p2: String) {}
|
open fun xxx_bar(p1: Int, p2: String) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class B<T> : A<T> {
|
||||||
open val xxx_val: Int = 0
|
open val xxx_val: Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11,8 +14,8 @@ class C : B<String>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WITH_ORDER
|
// WITH_ORDER
|
||||||
// EXIST: { lookupString: "xxx_foo", itemText: "xxx_foo", tailText: "(p1, *p2)", typeText: "Unit", attributes: "bold" }
|
// EXIST: { lookupString: "xxx_foo", itemText: "xxx_foo", tailText: "(p1, *p2)", typeText: "Unit", attributes: "" }
|
||||||
// EXIST: { lookupString: "xxx_foo", itemText: "xxx_foo", tailText: "(p1: String, vararg p2: String)", typeText: "Unit", attributes: "bold" }
|
// EXIST: { lookupString: "xxx_foo", itemText: "xxx_foo", tailText: "(p1: String, vararg p2: String)", typeText: "Unit", attributes: "" }
|
||||||
// EXIST: { lookupString: "xxx_val", itemText: "xxx_val", tailText: null, typeText: "Int", attributes: "bold" }
|
// EXIST: { lookupString: "xxx_val", itemText: "xxx_val", tailText: null, typeText: "Int", attributes: "bold" }
|
||||||
// EXIST: { lookupString: "xxx_bar", itemText: "xxx_bar", tailText: "(p1: Int, p2: String)", typeText: "Unit", attributes: "bold" }
|
// EXIST: { lookupString: "xxx_bar", itemText: "xxx_bar", tailText: "(p1: Int, p2: String)", typeText: "Unit", attributes: "" }
|
||||||
// NOTHING_ELSE
|
// NOTHING_ELSE
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
|||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.getOriginalTopmostOverriddenDescriptors
|
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
||||||
@@ -88,8 +88,8 @@ public fun compareDescriptors(project: Project, currentDescriptor: DeclarationDe
|
|||||||
if (compareDescriptorsText(project, currentDescriptor, originalDescriptor)) return true
|
if (compareDescriptorsText(project, currentDescriptor, originalDescriptor)) return true
|
||||||
|
|
||||||
if (originalDescriptor is CallableDescriptor && currentDescriptor is CallableDescriptor) {
|
if (originalDescriptor is CallableDescriptor && currentDescriptor is CallableDescriptor) {
|
||||||
val overriddenOriginalDescriptor = originalDescriptor.getOriginalTopmostOverriddenDescriptors()
|
val overriddenOriginalDescriptor = originalDescriptor.findOriginalTopMostOverriddenDescriptors()
|
||||||
val overriddenCurrentDescriptor = currentDescriptor.getOriginalTopmostOverriddenDescriptors()
|
val overriddenCurrentDescriptor = currentDescriptor.findOriginalTopMostOverriddenDescriptors()
|
||||||
|
|
||||||
if (overriddenOriginalDescriptor.size != overriddenCurrentDescriptor.size) return false
|
if (overriddenOriginalDescriptor.size != overriddenCurrentDescriptor.size) return false
|
||||||
return overriddenCurrentDescriptor.zip(overriddenOriginalDescriptor).all {
|
return overriddenCurrentDescriptor.zip(overriddenOriginalDescriptor).all {
|
||||||
|
|||||||
+2
-2
@@ -48,7 +48,7 @@ import org.jetbrains.kotlin.idea.util.application.runReadAction
|
|||||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
import org.jetbrains.kotlin.psi.KtFunction
|
||||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
||||||
import org.jetbrains.kotlin.resolve.getOriginalTopmostOverriddenDescriptors
|
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
|
|
||||||
public abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration>
|
public abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration>
|
||||||
@@ -164,7 +164,7 @@ public abstract class KotlinFindMemberUsagesHandler<T : KtNamedDeclaration>
|
|||||||
|
|
||||||
override fun findReferencesToHighlight(target: PsiElement, searchScope: SearchScope): Collection<PsiReference> {
|
override fun findReferencesToHighlight(target: PsiElement, searchScope: SearchScope): Collection<PsiReference> {
|
||||||
val callableDescriptor = (target as? KtCallableDeclaration)?.resolveToDescriptorIfAny() as? CallableDescriptor
|
val callableDescriptor = (target as? KtCallableDeclaration)?.resolveToDescriptorIfAny() as? CallableDescriptor
|
||||||
val baseDescriptors = callableDescriptor?.getOriginalTopmostOverriddenDescriptors() ?: emptyList<CallableDescriptor>()
|
val baseDescriptors = callableDescriptor?.findOriginalTopMostOverriddenDescriptors() ?: emptyList<CallableDescriptor>()
|
||||||
val baseDeclarations = baseDescriptors.map { it.source.getPsi() }.filter { it != null && it != target }
|
val baseDeclarations = baseDescriptors.map { it.source.getPsi() }.filter { it != null && it != target }
|
||||||
|
|
||||||
return if (baseDeclarations.isNotEmpty()) {
|
return if (baseDeclarations.isNotEmpty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user