diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index d18d4ca5db8..fc73f338479 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -375,17 +375,7 @@ public interface Errors { } }; - ParameterizedDiagnosticFactory2 CONFLICTING_OVERLOADS = new ParameterizedDiagnosticFactory2(ERROR, "{1} is already defined in ''{0}''") { - @Override - protected String makeMessageForA(@NotNull JetClassOrObject jetClassOrObject) { - return jetClassOrObject.getName(); - } - - @Override - protected String makeMessageForB(@NotNull CallableMemberDescriptor memberDescriptor) { - return DescriptorRenderer.TEXT.render(memberDescriptor); - } - }; + FunctionSignatureDiagnosticFactory CONFLICTING_OVERLOADS = new FunctionSignatureDiagnosticFactory(ERROR, "{1} is already defined in ''{0}''"); ParameterizedDiagnosticFactory3 RESULT_TYPE_MISMATCH = ParameterizedDiagnosticFactory3.create(ERROR, "{0} must return {1} but returns {2}"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java new file mode 100644 index 00000000000..cea7b7f3f4c --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/FunctionSignatureDiagnosticFactory.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.resolve.DescriptorRenderer; + +/** + * @author Stepan Koltsov + */ +public class FunctionSignatureDiagnosticFactory extends DiagnosticFactoryWithMessageFormat { + + public FunctionSignatureDiagnosticFactory(Severity severity, String messageTemplate) { + super(severity, messageTemplate); + } + + @NotNull + public Diagnostic on(@NotNull JetNamedFunction functionElement, @NotNull FunctionDescriptor functionDescriptor, + @NotNull JetClassOrObject jetClassOrObject) + { + TextRange rangeToMark = new TextRange( + functionElement.getStartOfSignatureElement().getTextRange().getStartOffset(), + functionElement.getEndOfSignatureElement().getTextRange().getEndOffset() + ); + String message = messageFormat.format(new Object[]{ + jetClassOrObject.getName(), + DescriptorRenderer.TEXT.render(functionDescriptor)}); + return new GenericDiagnostic(this, severity, message, functionElement.getContainingFile(), rangeToMark); + } + +} //~ diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java index 34e96ce83b9..30ffa3b5248 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java @@ -40,4 +40,26 @@ public class JetNamedFunction extends JetFunction { return findChildByType(JetTokens.EQ) == null; } + @NotNull + public JetElement getStartOfSignatureElement() { + return this; + } + + @NotNull + public JetElement getEndOfSignatureElement() { + JetElement r = getReturnTypeRef(); + if (r != null) { + return r; + } + + r = getValueParameterList(); + if (r != null) { + return r; + } + + // otherwise it is an error + + return this; + } + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index be18d1938de..08a4e044179 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -75,9 +75,7 @@ public class OverloadResolver { return; } - // XXX: mark "fun" keyword and parameters as in Java IDE // stepan.koltsov@ - PsiElement mark = member.getNameIdentifier(); - context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(mark, klass, function)); + context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, klass)); } } } diff --git a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet index e1d47e33868..84260a7cbd0 100644 --- a/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet +++ b/compiler/testData/checkerWithErrorTypes/quick/ConflictingOverloads.jet @@ -1,12 +1,14 @@ // http://youtrack.jetbrains.net/issue/KT-424 class A { - // XXX: error should be reported on the whole method signature - // not only on method name - fun a() { + fun a(a: Int): Int = 0 + + fun a(a: Int) { } - fun a() { + fun b() { + } + + fun b() { } } -