KT-4893 Code completion should not show multiple functions with the same signature

#KT-4893 Fixed
This commit is contained in:
Valentin Kipyatkov
2015-06-09 23:10:47 +03:00
parent 4c0e7e32e7
commit 483da9607c
43 changed files with 737 additions and 106 deletions
@@ -18,16 +18,23 @@ package org.jetbrains.kotlin.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.JetNodeTypes;
import org.jetbrains.kotlin.name.Name;
public class JetValueArgumentName extends JetElementImpl {
public class JetValueArgumentName extends JetElementImpl implements ValueArgumentName {
public JetValueArgumentName(@NotNull ASTNode node) {
super(node);
}
@Nullable @IfNotParsed
@Override
@NotNull
public JetSimpleNameExpression getReferenceExpression() {
return (JetSimpleNameExpression) findChildByType(JetNodeTypes.REFERENCE_EXPRESSION);
}
@NotNull
@Override
public Name getAsName() {
return getReferenceExpression().getReferencedNameAsName();
}
}
@@ -17,12 +17,13 @@
package org.jetbrains.kotlin.psi
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.name.Name
public trait ValueArgument {
IfNotParsed
public fun getArgumentExpression(): JetExpression?
public fun getArgumentName(): JetValueArgumentName?
public fun getArgumentName(): ValueArgumentName?
public fun isNamed(): Boolean
@@ -40,3 +41,8 @@ public trait FunctionLiteralArgument : ValueArgument {
override fun getArgumentExpression(): JetExpression
}
public interface ValueArgumentName {
public val asName: Name
public val referenceExpression: JetSimpleNameExpression?
}
@@ -155,9 +155,11 @@ public class ValueArgumentsToParametersMapper {
D candidate = candidateCall.getCandidateDescriptor();
JetSimpleNameExpression nameReference = argument.getArgumentName().getReferenceExpression();
ValueParameterDescriptor valueParameterDescriptor = parameterByName.get(nameReference.getReferencedNameAsName());
if (!candidate.hasStableParameterNames()) {
ValueArgumentName argumentName = argument.getArgumentName();
assert argumentName != null;
ValueParameterDescriptor valueParameterDescriptor = parameterByName.get(argumentName.getAsName());
JetReferenceExpression nameReference = argumentName.getReferenceExpression();
if (!candidate.hasStableParameterNames() && nameReference != null) {
report(NAMED_ARGUMENTS_NOT_ALLOWED.on(
nameReference,
candidate instanceof FunctionInvokeDescriptor ? INVOKE_ON_FUNCTION_TYPE : NON_KOTLIN_FUNCTION
@@ -165,14 +167,20 @@ public class ValueArgumentsToParametersMapper {
}
if (valueParameterDescriptor == null) {
report(NAMED_PARAMETER_NOT_FOUND.on(nameReference, nameReference));
if (nameReference != null) {
report(NAMED_PARAMETER_NOT_FOUND.on(nameReference, nameReference));
}
unmappedArguments.add(argument);
setStatus(WEAK_ERROR);
}
else {
candidateCall.getTrace().record(REFERENCE_TARGET, nameReference, valueParameterDescriptor);
if (nameReference != null) {
candidateCall.getTrace().record(REFERENCE_TARGET, nameReference, valueParameterDescriptor);
}
if (!usedParameters.add(valueParameterDescriptor)) {
report(ARGUMENT_PASSED_TWICE.on(nameReference));
if (nameReference != null) {
report(ARGUMENT_PASSED_TWICE.on(nameReference));
}
unmappedArguments.add(argument);
setStatus(WEAK_ERROR);
}
@@ -182,7 +182,7 @@ object DynamicCallableDescriptors {
null,
index,
Annotations.EMPTY,
arg.getArgumentName()?.getReferenceExpression()?.getReferencedNameAsName() ?: Name.identifier("p$index"),
arg.getArgumentName()?.asName ?: Name.identifier("p$index"),
outType,
false,
varargElementType,
@@ -60,7 +60,7 @@ public class CallMaker {
}
@Override
public JetValueArgumentName getArgumentName() {
public ValueArgumentName getArgumentName() {
return null;
}