From 927fb30fd491a9223c55f56e005b00b8d8f5ecd6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 11 Apr 2012 20:09:32 +0400 Subject: [PATCH 01/76] Saved diagnostic parameters into them. --- .../lang/diagnostics/DiagnosticFactory1.java | 2 +- .../lang/diagnostics/DiagnosticFactory2.java | 2 +- .../lang/diagnostics/DiagnosticFactory3.java | 2 +- .../DiagnosticWithParameters1.java | 56 +++++++++++++++ .../DiagnosticWithParameters2.java | 63 +++++++++++++++++ .../DiagnosticWithParameters3.java | 70 +++++++++++++++++++ .../diagnostics/DiagnosticWithPsiElement.java | 1 + 7 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index c6e1d9d3f91..139337eab2a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -35,7 +35,7 @@ public class DiagnosticFactory1 extends DiagnosticFacto @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A argument) { - return new DiagnosticWithPsiElement(element, this, severity, makeMessage(argument)); + return new DiagnosticWithParameters1(element, argument, this, severity, makeMessage(argument)); } protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index 8eb63ff8c04..767326616f0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -40,7 +40,7 @@ public class DiagnosticFactory2 extends DiagnosticFa @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b) { - return new DiagnosticWithPsiElement(element, this, severity, makeMessage(a, b)); + return new DiagnosticWithParameters2(element, a, b, this, severity, makeMessage(a, b)); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index caa5b8518e1..1ad9fda7b3e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -67,6 +67,6 @@ public class DiagnosticFactory3 extends Diagnosti } @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b, @NotNull C c) { - return new DiagnosticWithPsiElement(element, this, severity, makeMessage(a, b, c)); + return new DiagnosticWithParameters3(element, a, b, c, this, severity, makeMessage(a, b, c)); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java new file mode 100644 index 00000000000..ad757faf103 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Evgeny Gerashchenko + * @since 4/11/12 + */ +public class DiagnosticWithParameters1 extends AbstractDiagnostic { + private A a; + + public DiagnosticWithParameters1(@NotNull E psiElement, + @NotNull A a, + @NotNull DiagnosticFactory1 factory, + @NotNull Severity severity, + @NotNull String message) { + super(psiElement, factory, severity, message); + this.a = a; + } + + @NotNull + @Override + public DiagnosticFactory1 getFactory() { + return (DiagnosticFactory1)super.getFactory(); + } + + @Override + @NotNull + public List getTextRanges() { + return getFactory().getTextRanges(this); + } + + public A getA() { + return a; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java new file mode 100644 index 00000000000..51690b5e7d8 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java @@ -0,0 +1,63 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Evgeny Gerashchenko + * @since 4/11/12 + */ +public class DiagnosticWithParameters2 extends AbstractDiagnostic { + private A a; + private B b; + + public DiagnosticWithParameters2(@NotNull E psiElement, + @NotNull A a, + @NotNull B b, + @NotNull DiagnosticFactory2 factory, + @NotNull Severity severity, + @NotNull String message) { + super(psiElement, factory, severity, message); + this.a = a; + this.b = b; + } + + @NotNull + @Override + public DiagnosticFactory2 getFactory() { + return (DiagnosticFactory2)super.getFactory(); + } + + @Override + @NotNull + public List getTextRanges() { + return getFactory().getTextRanges(this); + } + + public A getA() { + return a; + } + + public B getB() { + return b; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java new file mode 100644 index 00000000000..a57d8526e86 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Evgeny Gerashchenko + * @since 4/11/12 + */ +public class DiagnosticWithParameters3 extends AbstractDiagnostic { + private A a; + private B b; + private C c; + + public DiagnosticWithParameters3(@NotNull E psiElement, + @NotNull A a, + @NotNull B b, + @NotNull C c, + @NotNull DiagnosticFactory3 factory, + @NotNull Severity severity, + @NotNull String message) { + super(psiElement, factory, severity, message); + this.a = a; + this.b = b; + this.c = c; + } + + @NotNull + @Override + public DiagnosticFactory3 getFactory() { + return (DiagnosticFactory3)super.getFactory(); + } + + @Override + @NotNull + public List getTextRanges() { + return getFactory().getTextRanges(this); + } + + public A getA() { + return a; + } + + public B getB() { + return b; + } + + public C getC() { + return c; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java index a73ce08470a..5d7fe6c0a6e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java @@ -36,6 +36,7 @@ public class DiagnosticWithPsiElement extends AbstractDiag return (DiagnosticFactoryWithPsiElement)super.getFactory(); } + @Override @NotNull public List getTextRanges() { return getFactory().getTextRanges(this); From 03fac491919de5a2bf52a14eb75203c99bb7e1c9 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 11 Apr 2012 20:58:21 +0400 Subject: [PATCH 02/76] Got rid of storing diagnostic messages inside them: now they are generated on demand. --- .../jet/lang/diagnostics/AbstractDiagnostic.java | 12 +++--------- .../jet/lang/diagnostics/DiagnosticFactory.java | 6 +++++- .../jet/lang/diagnostics/DiagnosticFactory1.java | 2 +- .../jet/lang/diagnostics/DiagnosticFactory2.java | 4 ++-- .../jet/lang/diagnostics/DiagnosticFactory3.java | 4 ++-- .../diagnostics/DiagnosticWithParameters1.java | 11 ++++++++--- .../diagnostics/DiagnosticWithParameters2.java | 11 ++++++++--- .../diagnostics/DiagnosticWithParameters3.java | 11 ++++++++--- .../diagnostics/DiagnosticWithPsiElement.java | 16 ++++++++++++---- .../diagnostics/RedeclarationDiagnostic.java | 16 +++++++++++++++- .../UnresolvedReferenceDiagnostic.java | 12 +++++++++--- .../UnresolvedReferenceDiagnosticFactory.java | 13 +++++-------- .../tests/NamedArgumentsAndDefaultValues.jet | 2 +- 13 files changed, 79 insertions(+), 41 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java index 3e1622aa486..f2a57cfc6bb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java @@ -25,15 +25,15 @@ import org.jetbrains.annotations.NotNull; */ public abstract class AbstractDiagnostic implements ParametrizedDiagnostic { private final E psiElement; - private final String message; private final AbstractDiagnosticFactory factory; private final Severity severity; - public AbstractDiagnostic(@NotNull E psiElement, @NotNull AbstractDiagnosticFactory factory, @NotNull Severity severity, @NotNull String message) { + public AbstractDiagnostic(@NotNull E psiElement, + @NotNull AbstractDiagnosticFactory factory, + @NotNull Severity severity) { this.psiElement = psiElement; this.factory = factory; this.severity = severity; - this.message = message; } @NotNull @@ -48,12 +48,6 @@ public abstract class AbstractDiagnostic implements Parame return psiElement.getContainingFile(); } - @NotNull - @Override - public String getMessage() { - return message; - } - @NotNull @Override public Severity getSeverity() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java index 5e893eef3f1..b1f03498b4f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java @@ -38,8 +38,12 @@ public class DiagnosticFactory extends DiagnosticFactoryWi return new DiagnosticFactory(severity, message, positioningStrategy); } + String getMessage() { + return message; + } + @NotNull public ParametrizedDiagnostic on(@NotNull E element) { - return new DiagnosticWithPsiElement(element, this, severity, message); + return new DiagnosticWithPsiElement(element, this, severity); } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index 139337eab2a..f28aaa14a2b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -35,7 +35,7 @@ public class DiagnosticFactory1 extends DiagnosticFacto @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A argument) { - return new DiagnosticWithParameters1(element, argument, this, severity, makeMessage(argument)); + return new DiagnosticWithParameters1(element, argument, this, severity); } protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index 767326616f0..c63687e00c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -26,7 +26,7 @@ public class DiagnosticFactory2 extends DiagnosticFa private final Renderer rendererForA; private final Renderer rendererForB; - private String makeMessage(@NotNull A a, @NotNull B b) { + protected String makeMessage(@NotNull A a, @NotNull B b) { return messageFormat.format(new Object[] {makeMessageForA(a), makeMessageForB(b)}); } @@ -40,7 +40,7 @@ public class DiagnosticFactory2 extends DiagnosticFa @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b) { - return new DiagnosticWithParameters2(element, a, b, this, severity, makeMessage(a, b)); + return new DiagnosticWithParameters2(element, a, b, this, severity); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index 1ad9fda7b3e..bc945a49bd1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -50,7 +50,7 @@ public class DiagnosticFactory3 extends Diagnosti return new DiagnosticFactory3(severity, messageStub, positioningStrategy, rendererForA, rendererForB, rendererForC); } - private String makeMessage(@NotNull A a, @NotNull B b, @NotNull C c) { + protected String makeMessage(@NotNull A a, @NotNull B b, @NotNull C c) { return messageFormat.format(new Object[]{makeMessageForA(a), makeMessageForB(b), makeMessageForC(c)}); } @@ -67,6 +67,6 @@ public class DiagnosticFactory3 extends Diagnosti } @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b, @NotNull C c) { - return new DiagnosticWithParameters3(element, a, b, c, this, severity, makeMessage(a, b, c)); + return new DiagnosticWithParameters3(element, a, b, c, this, severity); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java index ad757faf103..e02675d5c1a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java @@ -32,9 +32,8 @@ public class DiagnosticWithParameters1 extends Abstract public DiagnosticWithParameters1(@NotNull E psiElement, @NotNull A a, @NotNull DiagnosticFactory1 factory, - @NotNull Severity severity, - @NotNull String message) { - super(psiElement, factory, severity, message); + @NotNull Severity severity) { + super(psiElement, factory, severity); this.a = a; } @@ -44,6 +43,12 @@ public class DiagnosticWithParameters1 extends Abstract return (DiagnosticFactory1)super.getFactory(); } + @NotNull + @Override + public String getMessage() { + return getFactory().makeMessage(a); + } + @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java index 51690b5e7d8..031d5805a15 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java @@ -34,9 +34,8 @@ public class DiagnosticWithParameters2 extends Abstr @NotNull A a, @NotNull B b, @NotNull DiagnosticFactory2 factory, - @NotNull Severity severity, - @NotNull String message) { - super(psiElement, factory, severity, message); + @NotNull Severity severity) { + super(psiElement, factory, severity); this.a = a; this.b = b; } @@ -47,6 +46,12 @@ public class DiagnosticWithParameters2 extends Abstr return (DiagnosticFactory2)super.getFactory(); } + @NotNull + @Override + public String getMessage() { + return getFactory().makeMessage(a, b); + } + @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java index a57d8526e86..82ee507aa85 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java @@ -36,9 +36,8 @@ public class DiagnosticWithParameters3 extends Ab @NotNull B b, @NotNull C c, @NotNull DiagnosticFactory3 factory, - @NotNull Severity severity, - @NotNull String message) { - super(psiElement, factory, severity, message); + @NotNull Severity severity) { + super(psiElement, factory, severity); this.a = a; this.b = b; this.c = c; @@ -50,6 +49,12 @@ public class DiagnosticWithParameters3 extends Ab return (DiagnosticFactory3)super.getFactory(); } + @NotNull + @Override + public String getMessage() { + return getFactory().makeMessage(a, b, c); + } + @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java index 5d7fe6c0a6e..603c0aed730 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java @@ -26,14 +26,22 @@ import java.util.List; * @author svtk */ public class DiagnosticWithPsiElement extends AbstractDiagnostic { - public DiagnosticWithPsiElement(@NotNull E psiElement, @NotNull DiagnosticFactoryWithPsiElement factory, @NotNull Severity severity, @NotNull String message) { - super(psiElement, factory, severity, message); + public DiagnosticWithPsiElement(@NotNull E psiElement, + @NotNull DiagnosticFactory factory, + @NotNull Severity severity) { + super(psiElement, factory, severity); } @NotNull @Override - public DiagnosticFactoryWithPsiElement getFactory() { - return (DiagnosticFactoryWithPsiElement)super.getFactory(); + public DiagnosticFactory getFactory() { + return (DiagnosticFactory)super.getFactory(); + } + + @NotNull + @Override + public String getMessage() { + return getFactory().getMessage(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index 33553f9ccdd..15f49087fd6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -33,9 +33,23 @@ import java.util.List; */ public interface RedeclarationDiagnostic extends Diagnostic { class SimpleRedeclarationDiagnostic extends AbstractDiagnostic implements RedeclarationDiagnostic { + private String name; public SimpleRedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, RedeclarationDiagnosticFactory factory) { - super(psiElement, factory, factory.severity, factory.makeMessage(name)); + super(psiElement, factory, factory.severity); + this.name = name; + } + + @NotNull + @Override + public RedeclarationDiagnosticFactory getFactory() { + return (RedeclarationDiagnosticFactory)super.getFactory(); + } + + @NotNull + @Override + public String getMessage() { + return getFactory().makeMessage(name); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java index 8b1f2242987..730c992d305 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java @@ -30,15 +30,21 @@ import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR; * @author abreslav */ public class UnresolvedReferenceDiagnostic extends AbstractDiagnostic { + @NotNull + @Override + public UnresolvedReferenceDiagnosticFactory getFactory() { + return (UnresolvedReferenceDiagnosticFactory)super.getFactory(); + } - public UnresolvedReferenceDiagnostic(JetReferenceExpression referenceExpression, String message) { - super(referenceExpression, Errors.UNRESOLVED_REFERENCE, ERROR, message); + public UnresolvedReferenceDiagnostic(@NotNull JetReferenceExpression referenceExpression, + @NotNull UnresolvedReferenceDiagnosticFactory factory) { + super(referenceExpression, factory, ERROR); } @NotNull @Override public String getMessage() { - return super.getMessage() + ": " + getPsiElement().getText(); + return getFactory().getMessage() + ": " + getPsiElement().getText(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java index ddec486cf56..b4fd2e6e889 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java @@ -16,28 +16,25 @@ package org.jetbrains.jet.lang.diagnostics; -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression; -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; - -import java.util.List; /** * @author abreslav */ public class UnresolvedReferenceDiagnosticFactory extends AbstractDiagnosticFactory { - private final String message; private UnresolvedReferenceDiagnosticFactory(String message) { this.message = message; } + String getMessage() { + return message; + } + public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) { - return new UnresolvedReferenceDiagnostic(reference, message); + return new UnresolvedReferenceDiagnostic(reference, this); } public static UnresolvedReferenceDiagnosticFactory create(String message) { diff --git a/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.jet b/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.jet index 8cfd720f404..161e6f7f743 100644 --- a/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.jet +++ b/compiler/testData/diagnostics/tests/NamedArgumentsAndDefaultValues.jet @@ -19,5 +19,5 @@ fun test() { bar(1, 1, "") bar(1, 1, "") bar(1, z = "") - bar(1, zz = "", zz.foo) + bar(1, zz = "", zz.foo) } From 409d6b2da1687b34f2e0bbf783dbc14a436df6ca Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 13:26:47 +0400 Subject: [PATCH 03/76] Renamed DiagnosticWithPsiElement to SimpleDiagnostic, DiagnosticFactory to SimpleDiagnosticFactory, so they relation is reflected in their names. --- .../jet/compiler/CompileSession.java | 4 +- .../jet/lang/diagnostics/Errors.java | 353 +++++++++++------- ...hPsiElement.java => SimpleDiagnostic.java} | 10 +- ...tory.java => SimpleDiagnosticFactory.java} | 12 +- 4 files changed, 236 insertions(+), 143 deletions(-) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/{DiagnosticWithPsiElement.java => SimpleDiagnostic.java} (79%) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/{DiagnosticFactory.java => SimpleDiagnosticFactory.java} (62%) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index 8b6c4a8d1f9..952f4cdb2c7 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -36,7 +36,7 @@ import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory; +import org.jetbrains.jet.lang.diagnostics.SimpleDiagnosticFactory; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.psi.JetFile; @@ -139,7 +139,7 @@ public class CompileSession { public void visitErrorElement(PsiErrorElement element) { String description = element.getErrorDescription(); String message = StringUtil.isEmpty(description) ? "Syntax error" : description; - Diagnostic diagnostic = DiagnosticFactory.create(Severity.ERROR, message).on(element); + Diagnostic diagnostic = SimpleDiagnosticFactory.create(Severity.ERROR, message).on(element); reportDiagnostic(messageCollector, diagnostic); } }); 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 e6ba102a7eb..991f03e296c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -86,57 +86,90 @@ public interface Errors { DiagnosticFactory1 ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR, "Illegal modifier ''{0}''"); DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(Severity.WARNING, "Modifier {0} is redundant because {1} is present"); - DiagnosticFactory ABSTRACT_MODIFIER_IN_TRAIT = DiagnosticFactory.create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory OPEN_MODIFIER_IN_TRAIT = DiagnosticFactory.create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); - DiagnosticFactory REDUNDANT_MODIFIER_IN_GETTER = DiagnosticFactory.create(WARNING, "Visibility modifiers are redundant in getter"); - DiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = DiagnosticFactory.create(ERROR, "Trait can not be final"); - DiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = DiagnosticFactory.create(ERROR, "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message - DiagnosticFactory RETURN_NOT_ALLOWED = DiagnosticFactory.create(ERROR, "'return' is not allowed here"); - DiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = DiagnosticFactory.create(ERROR, "Projections are not allowed for immediate arguments of a supertype", new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetTypeProjection element) { - return markNode(element.getProjectionNode()); - } - }); - DiagnosticFactory LABEL_NAME_CLASH = DiagnosticFactory.create(WARNING, "There is more than one label with such a name in this scope"); - DiagnosticFactory EXPRESSION_EXPECTED_NAMESPACE_FOUND = DiagnosticFactory.create(ERROR, "Expression expected, but a namespace name found"); + SimpleDiagnosticFactory ABSTRACT_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory + .create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + SimpleDiagnosticFactory OPEN_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory + .create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); + SimpleDiagnosticFactory + REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING, "Visibility modifiers are redundant in getter"); + SimpleDiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.create(ERROR, "Trait can not be final"); + SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR, + "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message + SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "'return' is not allowed here"); + SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = SimpleDiagnosticFactory + .create(ERROR, "Projections are not allowed for immediate arguments of a supertype", + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetTypeProjection element) { + return markNode(element.getProjectionNode()); + } + }); + SimpleDiagnosticFactory + LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING, "There is more than one label with such a name in this scope"); + SimpleDiagnosticFactory + EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR, "Expression expected, but a namespace name found"); DiagnosticFactory1 CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR, "Cannot import from ''{0}''", NAME); DiagnosticFactory1 CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); - DiagnosticFactory USELESS_HIDDEN_IMPORT = DiagnosticFactory.create(WARNING, "Useless import, it is hidden further"); - DiagnosticFactory USELESS_SIMPLE_IMPORT = DiagnosticFactory.create(WARNING, "Useless import, does nothing"); + SimpleDiagnosticFactory + USELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING, "Useless import, it is hidden further"); + SimpleDiagnosticFactory USELESS_SIMPLE_IMPORT = SimpleDiagnosticFactory.create(WARNING, "Useless import, does nothing"); - DiagnosticFactory CANNOT_INFER_PARAMETER_TYPE = DiagnosticFactory.create(ERROR, "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); + SimpleDiagnosticFactory CANNOT_INFER_PARAMETER_TYPE = SimpleDiagnosticFactory + .create(ERROR, "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); - DiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = DiagnosticFactory.create(ERROR, "This property doesn't have a backing field, because it's abstract"); - DiagnosticFactory NO_BACKING_FIELD_CUSTOM_ACCESSORS = DiagnosticFactory.create(ERROR, "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); - DiagnosticFactory INACCESSIBLE_BACKING_FIELD = DiagnosticFactory.create(ERROR, "The backing field is not accessible here"); - DiagnosticFactory NOT_PROPERTY_BACKING_FIELD = DiagnosticFactory.create(ERROR, "The referenced variable is not a property and doesn't have backing field"); + SimpleDiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory + .create(ERROR, "This property doesn't have a backing field, because it's abstract"); + SimpleDiagnosticFactory NO_BACKING_FIELD_CUSTOM_ACCESSORS = SimpleDiagnosticFactory.create(ERROR, + "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); + SimpleDiagnosticFactory + INACCESSIBLE_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR, "The backing field is not accessible here"); + SimpleDiagnosticFactory NOT_PROPERTY_BACKING_FIELD = SimpleDiagnosticFactory + .create(ERROR, "The referenced variable is not a property and doesn't have backing field"); - DiagnosticFactory MIXING_NAMED_AND_POSITIONED_ARGUMENTS = DiagnosticFactory.create(ERROR, "Mixing named and positioned arguments in not allowed"); - DiagnosticFactory ARGUMENT_PASSED_TWICE = DiagnosticFactory.create(ERROR, "An argument is already passed for this parameter"); + SimpleDiagnosticFactory MIXING_NAMED_AND_POSITIONED_ARGUMENTS = SimpleDiagnosticFactory + .create(ERROR, "Mixing named and positioned arguments in not allowed"); + SimpleDiagnosticFactory + ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR, "An argument is already passed for this parameter"); UnresolvedReferenceDiagnosticFactory NAMED_PARAMETER_NOT_FOUND = UnresolvedReferenceDiagnosticFactory.create("Cannot find a parameter with this name"); - DiagnosticFactory VARARG_OUTSIDE_PARENTHESES = DiagnosticFactory.create(ERROR, "Passing value as a vararg is only allowed inside a parenthesized argument list"); - DiagnosticFactory NON_VARARG_SPREAD = DiagnosticFactory.create(ERROR, "The spread operator (*foo) may only be applied in a vararg position"); + SimpleDiagnosticFactory VARARG_OUTSIDE_PARENTHESES = SimpleDiagnosticFactory + .create(ERROR, "Passing value as a vararg is only allowed inside a parenthesized argument list"); + SimpleDiagnosticFactory + NON_VARARG_SPREAD = SimpleDiagnosticFactory.create(ERROR, "The spread operator (*foo) may only be applied in a vararg position"); - DiagnosticFactory MANY_FUNCTION_LITERAL_ARGUMENTS = DiagnosticFactory.create(ERROR, "Only one function literal is allowed outside a parenthesized argument list"); - DiagnosticFactory PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = DiagnosticFactory.create(ERROR, "This property must either have a type annotation or be initialized"); + SimpleDiagnosticFactory MANY_FUNCTION_LITERAL_ARGUMENTS = SimpleDiagnosticFactory + .create(ERROR, "Only one function literal is allowed outside a parenthesized argument list"); + SimpleDiagnosticFactory PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = SimpleDiagnosticFactory + .create(ERROR, "This property must either have a type annotation or be initialized"); - DiagnosticFactory ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS = DiagnosticFactory.create(ERROR, "This property cannot be declared abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = DiagnosticFactory.create(ERROR, "A property may be abstract only when defined in a class or trait", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory ABSTRACT_PROPERTY_WITH_INITIALIZER = DiagnosticFactory.create(ERROR, "Property with initializer cannot be abstract"); - DiagnosticFactory ABSTRACT_PROPERTY_WITH_GETTER = DiagnosticFactory.create(ERROR, "Property with getter implementation cannot be abstract"); - DiagnosticFactory ABSTRACT_PROPERTY_WITH_SETTER = DiagnosticFactory.create(ERROR, "Property with setter implementation cannot be abstract"); + SimpleDiagnosticFactory ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS = SimpleDiagnosticFactory + .create(ERROR, "This property cannot be declared abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + SimpleDiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = SimpleDiagnosticFactory + .create(ERROR, "A property may be abstract only when defined in a class or trait", + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + SimpleDiagnosticFactory + ABSTRACT_PROPERTY_WITH_INITIALIZER = SimpleDiagnosticFactory.create(ERROR, "Property with initializer cannot be abstract"); + SimpleDiagnosticFactory + ABSTRACT_PROPERTY_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR, "Property with getter implementation cannot be abstract"); + SimpleDiagnosticFactory + ABSTRACT_PROPERTY_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "Property with setter implementation cannot be abstract"); - DiagnosticFactory PACKAGE_MEMBER_CANNOT_BE_PROTECTED = DiagnosticFactory.create(ERROR, "Package member cannot be protected"); + SimpleDiagnosticFactory + PACKAGE_MEMBER_CANNOT_BE_PROTECTED = SimpleDiagnosticFactory.create(ERROR, "Package member cannot be protected"); - DiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = DiagnosticFactory.create(ERROR, "Getter visibility must be the same as property visibility"); - DiagnosticFactory BACKING_FIELD_IN_TRAIT = DiagnosticFactory.create(ERROR, "Property in a trait cannot have a backing field", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory MUST_BE_INITIALIZED = DiagnosticFactory.create(ERROR, "Property must be initialized", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = DiagnosticFactory.create(ERROR, "Property must be initialized or be abstract", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory PROPERTY_INITIALIZER_IN_TRAIT = DiagnosticFactory.create(ERROR, "Property initializers are not allowed in traits"); - DiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = DiagnosticFactory.create(ERROR, "Initializer is not allowed here because this property has no backing field"); + SimpleDiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = SimpleDiagnosticFactory + .create(ERROR, "Getter visibility must be the same as property visibility"); + SimpleDiagnosticFactory BACKING_FIELD_IN_TRAIT = SimpleDiagnosticFactory + .create(ERROR, "Property in a trait cannot have a backing field", PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory MUST_BE_INITIALIZED = SimpleDiagnosticFactory + .create(ERROR, "Property must be initialized", PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = SimpleDiagnosticFactory + .create(ERROR, "Property must be initialized or be abstract", PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory + PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Property initializers are not allowed in traits"); + SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory + .create(ERROR, "Initializer is not allowed here because this property has no backing field"); DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract property {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract function {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); @@ -144,18 +177,28 @@ public interface Errors { DiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = DiagnosticFactory1.create(ERROR, "Function {0} is not a class or trait member and cannot be abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = DiagnosticFactory1.create(ERROR, "Function {0} must have a body", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = DiagnosticFactory.create(ERROR, "Non final member in a final class", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); + SimpleDiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = SimpleDiagnosticFactory + .create(ERROR, "Non final member in a final class", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); - DiagnosticFactory PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE = DiagnosticFactory.create(ERROR, "Public or protected member should specify a type", PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE = SimpleDiagnosticFactory + .create(ERROR, "Public or protected member should specify a type", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = DiagnosticFactory.create(ERROR, "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning - DiagnosticFactory SUPERTYPE_NOT_INITIALIZED = DiagnosticFactory.create(ERROR, "This type has a constructor, and thus must be initialized here"); - DiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = DiagnosticFactory.create(ERROR, "Constructor invocation should be explicitly specified"); - DiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = DiagnosticFactory.create(ERROR, "A secondary constructor may appear only in a class that has a primary constructor"); - DiagnosticFactory SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST = DiagnosticFactory.create(ERROR, "Secondary constructors must have an initializer list"); - DiagnosticFactory BY_IN_SECONDARY_CONSTRUCTOR = DiagnosticFactory.create(ERROR, "'by'-clause is only supported for primary constructors"); - DiagnosticFactory INITIALIZER_WITH_NO_ARGUMENTS = DiagnosticFactory.create(ERROR, "Constructor arguments required"); - DiagnosticFactory MANY_CALLS_TO_THIS = DiagnosticFactory.create(ERROR, "Only one call to 'this(...)' is allowed"); + SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = SimpleDiagnosticFactory + .create(ERROR, "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning + SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory + .create(ERROR, "This type has a constructor, and thus must be initialized here"); + SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = SimpleDiagnosticFactory + .create(ERROR, "Constructor invocation should be explicitly specified"); + SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = SimpleDiagnosticFactory + .create(ERROR, "A secondary constructor may appear only in a class that has a primary constructor"); + SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST = SimpleDiagnosticFactory + .create(ERROR, "Secondary constructors must have an initializer list"); + SimpleDiagnosticFactory + BY_IN_SECONDARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR, "'by'-clause is only supported for primary constructors"); + SimpleDiagnosticFactory + INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR, "Constructor arguments required"); + SimpleDiagnosticFactory + MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR, "Only one call to 'this(...)' is allowed"); DiagnosticFactory1 NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, "{0} overrides nothing", PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD), DescriptorRenderer.TEXT); DiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", PositioningStrategies.POSITION_NAME_IDENTIFIER, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); @@ -170,88 +213,123 @@ public interface Errors { DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING, "Variable ''{0}'' initializer is redundant", NAME); DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); - DiagnosticFactory UNUSED_EXPRESSION = DiagnosticFactory.create(WARNING, "The expression is unused"); - DiagnosticFactory UNUSED_FUNCTION_LITERAL = DiagnosticFactory.create(WARNING, "The function literal is unused. If you mean block, you can use 'run { ... }'"); + SimpleDiagnosticFactory UNUSED_EXPRESSION = SimpleDiagnosticFactory.create(WARNING, "The expression is unused"); + SimpleDiagnosticFactory UNUSED_FUNCTION_LITERAL = SimpleDiagnosticFactory + .create(WARNING, "The function literal is unused. If you mean block, you can use 'run { ... }'"); DiagnosticFactory1 VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME); DiagnosticFactory1 INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR, "Variable cannot be initialized before declaration", NAME); - DiagnosticFactory VARIABLE_EXPECTED = DiagnosticFactory.create(ERROR, "Variable expected"); + SimpleDiagnosticFactory VARIABLE_EXPECTED = SimpleDiagnosticFactory.create(ERROR, "Variable expected"); DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER = DiagnosticFactory1.create(ERROR, "This property has a custom setter, so initialization using backing field required", NAME); DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER = DiagnosticFactory1.create(ERROR, "Setter of this property can be overridden, so initialization using backing field required", NAME); DiagnosticFactory1 FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = DiagnosticFactory1.create(ERROR, "Function parameters of inline function can only be invoked", NAME); - DiagnosticFactory UNREACHABLE_CODE = DiagnosticFactory.create(ERROR, "Unreachable code"); + SimpleDiagnosticFactory UNREACHABLE_CODE = SimpleDiagnosticFactory.create(ERROR, "Unreachable code"); - DiagnosticFactory MANY_CLASS_OBJECTS = DiagnosticFactory.create(ERROR, "Only one class object is allowed per class"); - DiagnosticFactory CLASS_OBJECT_NOT_ALLOWED = DiagnosticFactory.create(ERROR, "A class object is not allowed here"); - DiagnosticFactory DELEGATION_IN_TRAIT = DiagnosticFactory.create(ERROR, "Traits cannot use delegation"); - DiagnosticFactory DELEGATION_NOT_TO_TRAIT = DiagnosticFactory.create(ERROR, "Only traits can be delegated to"); - DiagnosticFactory NO_CONSTRUCTOR = DiagnosticFactory.create(ERROR, "This class does not have a constructor"); - DiagnosticFactory NOT_A_CLASS = DiagnosticFactory.create(ERROR, "Not a class"); - DiagnosticFactory ILLEGAL_ESCAPE_SEQUENCE = DiagnosticFactory.create(ERROR, "Illegal escape sequence"); + SimpleDiagnosticFactory + MANY_CLASS_OBJECTS = SimpleDiagnosticFactory.create(ERROR, "Only one class object is allowed per class"); + SimpleDiagnosticFactory + CLASS_OBJECT_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "A class object is not allowed here"); + SimpleDiagnosticFactory + DELEGATION_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Traits cannot use delegation"); + SimpleDiagnosticFactory + DELEGATION_NOT_TO_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Only traits can be delegated to"); + SimpleDiagnosticFactory NO_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR, "This class does not have a constructor"); + SimpleDiagnosticFactory NOT_A_CLASS = SimpleDiagnosticFactory.create(ERROR, "Not a class"); + SimpleDiagnosticFactory + ILLEGAL_ESCAPE_SEQUENCE = SimpleDiagnosticFactory.create(ERROR, "Illegal escape sequence"); - DiagnosticFactory LOCAL_EXTENSION_PROPERTY = DiagnosticFactory.create(ERROR, "Local extension properties are not allowed"); - DiagnosticFactory LOCAL_VARIABLE_WITH_GETTER = DiagnosticFactory.create(ERROR, "Local variables are not allowed to have getters"); - DiagnosticFactory LOCAL_VARIABLE_WITH_SETTER = DiagnosticFactory.create(ERROR, "Local variables are not allowed to have setters"); - DiagnosticFactory VAL_WITH_SETTER = DiagnosticFactory.create(ERROR, "A 'val'-property cannot have a setter"); + SimpleDiagnosticFactory + LOCAL_EXTENSION_PROPERTY = SimpleDiagnosticFactory.create(ERROR, "Local extension properties are not allowed"); + SimpleDiagnosticFactory + LOCAL_VARIABLE_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR, "Local variables are not allowed to have getters"); + SimpleDiagnosticFactory + LOCAL_VARIABLE_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "Local variables are not allowed to have setters"); + SimpleDiagnosticFactory + VAL_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "A 'val'-property cannot have a setter"); - DiagnosticFactory NO_GET_METHOD = DiagnosticFactory.create(ERROR, "No get method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); - DiagnosticFactory NO_SET_METHOD = DiagnosticFactory.create(ERROR, "No set method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); + SimpleDiagnosticFactory NO_GET_METHOD = SimpleDiagnosticFactory + .create(ERROR, "No get method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); + SimpleDiagnosticFactory NO_SET_METHOD = SimpleDiagnosticFactory + .create(ERROR, "No set method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); - DiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = DiagnosticFactory.create(ERROR, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); + SimpleDiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = SimpleDiagnosticFactory + .create(ERROR, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); DiagnosticFactory2 ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT = DiagnosticFactory2.create(ERROR, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT); AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Assignment operators ambiguity: {0}"); - DiagnosticFactory EQUALS_MISSING = DiagnosticFactory.create(ERROR, "No method 'equals(Any?) : Boolean' available"); - DiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = DiagnosticFactory.create(ERROR, "Assignments are not expressions, and only expressions are allowed in this context"); - DiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = DiagnosticFactory.create(ERROR, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); + SimpleDiagnosticFactory + EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR, "No method 'equals(Any?) : Boolean' available"); + SimpleDiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = SimpleDiagnosticFactory + .create(ERROR, "Assignments are not expressions, and only expressions are allowed in this context"); + SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory + .create(ERROR, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); DiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')"); - DiagnosticFactory DECLARATION_IN_ILLEGAL_CONTEXT = DiagnosticFactory.create(ERROR, "Declarations are not allowed in this position"); - DiagnosticFactory SETTER_PARAMETER_WITH_DEFAULT_VALUE = DiagnosticFactory.create(ERROR, "Setter parameters can not have default values"); - DiagnosticFactory NO_THIS = DiagnosticFactory.create(ERROR, "'this' is not defined in this context"); - DiagnosticFactory SUPER_NOT_AVAILABLE = DiagnosticFactory.create(ERROR, "No supertypes are accessible in this context"); - DiagnosticFactory AMBIGUOUS_SUPER = DiagnosticFactory.create(ERROR, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); - DiagnosticFactory ABSTRACT_SUPER_CALL = DiagnosticFactory.create(ERROR, "Abstract member cannot be accessed directly"); - DiagnosticFactory NOT_A_SUPERTYPE = DiagnosticFactory.create(ERROR, "Not a supertype"); - DiagnosticFactory TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = DiagnosticFactory.create(WARNING, "Type arguments do not need to be specified in a 'super' qualifier"); - DiagnosticFactory USELESS_CAST_STATIC_ASSERT_IS_FINE = DiagnosticFactory.create(WARNING, "No cast needed, use ':' instead"); - DiagnosticFactory USELESS_CAST = DiagnosticFactory.create(WARNING, "No cast needed"); - DiagnosticFactory CAST_NEVER_SUCCEEDS = DiagnosticFactory.create(WARNING, "This cast can never succeed"); + SimpleDiagnosticFactory + DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR, "Declarations are not allowed in this position"); + SimpleDiagnosticFactory + SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not have default values"); + SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR, "'this' is not defined in this context"); + SimpleDiagnosticFactory + SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR, "No supertypes are accessible in this context"); + SimpleDiagnosticFactory AMBIGUOUS_SUPER = SimpleDiagnosticFactory + .create(ERROR, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); + SimpleDiagnosticFactory + ABSTRACT_SUPER_CALL = SimpleDiagnosticFactory.create(ERROR, "Abstract member cannot be accessed directly"); + SimpleDiagnosticFactory NOT_A_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "Not a supertype"); + SimpleDiagnosticFactory TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = SimpleDiagnosticFactory + .create(WARNING, "Type arguments do not need to be specified in a 'super' qualifier"); + SimpleDiagnosticFactory + USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING, "No cast needed, use ':' instead"); + SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING, "No cast needed"); + SimpleDiagnosticFactory + CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING, "This cast can never succeed"); DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); - DiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = DiagnosticFactory.create(ERROR, "Generic arguments of the base type must be specified"); + SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory + .create(ERROR, "Generic arguments of the base type must be specified"); - DiagnosticFactory HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY = DiagnosticFactory.create(ERROR, "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); - DiagnosticFactory HAS_NEXT_MISSING = DiagnosticFactory.create(ERROR, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); - DiagnosticFactory HAS_NEXT_FUNCTION_AMBIGUITY = DiagnosticFactory.create(ERROR, "Function 'iterator().hasNext()' is ambiguous for this expression"); - DiagnosticFactory HAS_NEXT_MUST_BE_READABLE = DiagnosticFactory.create(ERROR, "The 'iterator().hasNext' property of the loop range must be readable"); + SimpleDiagnosticFactory HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory + .create(ERROR, "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); + SimpleDiagnosticFactory HAS_NEXT_MISSING = SimpleDiagnosticFactory + .create(ERROR, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); + SimpleDiagnosticFactory HAS_NEXT_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory + .create(ERROR, "Function 'iterator().hasNext()' is ambiguous for this expression"); + SimpleDiagnosticFactory HAS_NEXT_MUST_BE_READABLE = SimpleDiagnosticFactory + .create(ERROR, "The 'iterator().hasNext' property of the loop range must be readable"); DiagnosticFactory1 HAS_NEXT_PROPERTY_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE); DiagnosticFactory1 HAS_NEXT_FUNCTION_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE); - DiagnosticFactory NEXT_AMBIGUITY = DiagnosticFactory.create(ERROR, "Function 'iterator().next()' is ambiguous for this expression"); - DiagnosticFactory NEXT_MISSING = DiagnosticFactory.create(ERROR, "Loop range must have an 'iterator().next()' function"); - DiagnosticFactory ITERATOR_MISSING = DiagnosticFactory.create(ERROR, "For-loop range must have an iterator() method"); + SimpleDiagnosticFactory + NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR, "Function 'iterator().next()' is ambiguous for this expression"); + SimpleDiagnosticFactory + NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR, "Loop range must have an 'iterator().next()' function"); + SimpleDiagnosticFactory + ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR, "For-loop range must have an iterator() method"); AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Method 'iterator()' is ambiguous for this expression: {0}"); DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "compareTo() must return Int, but returns {0}", RENDER_TYPE); DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR, "Expecting a function type, but found {0}", RENDER_TYPE); - DiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = DiagnosticFactory.create(ERROR, "Returns are not allowed for functions with expression body. Use block body in '{...}'"); - DiagnosticFactory NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY = DiagnosticFactory.create(ERROR, "A 'return' expression required in a function with a block body ('{...}')", new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetDeclarationWithBody element) { - JetExpression bodyExpression = element.getBodyExpression(); - if (!(bodyExpression instanceof JetBlockExpression)) return Collections.emptyList(); - JetBlockExpression blockExpression = (JetBlockExpression) bodyExpression; - TextRange lastBracketRange = blockExpression.getLastBracketRange(); - if (lastBracketRange == null) return Collections.emptyList(); - return markRange(lastBracketRange); - } - }); + SimpleDiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = SimpleDiagnosticFactory + .create(ERROR, "Returns are not allowed for functions with expression body. Use block body in '{...}'"); + SimpleDiagnosticFactory NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY = SimpleDiagnosticFactory + .create(ERROR, "A 'return' expression required in a function with a block body ('{...}')", + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetDeclarationWithBody element) { + JetExpression bodyExpression = element.getBodyExpression(); + if (!(bodyExpression instanceof JetBlockExpression)) return Collections.emptyList(); + JetBlockExpression blockExpression = (JetBlockExpression)bodyExpression; + TextRange lastBracketRange = blockExpression.getLastBracketRange(); + if (lastBracketRange == null) return Collections.emptyList(); + return markRange(lastBracketRange); + } + }); DiagnosticFactory1 RETURN_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "This function must return a value of type {0}", RENDER_TYPE); DiagnosticFactory1 EXPECTED_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "Expected a value of type {0}", RENDER_TYPE); DiagnosticFactory1 ASSIGNMENT_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE); @@ -276,7 +354,7 @@ public interface Errors { DiagnosticFactory1 TOO_MANY_ARGUMENTS = DiagnosticFactory1.create(ERROR, "Too many arguments for {0}"); DiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = DiagnosticFactory1.create(ERROR, "{0}"); - DiagnosticFactory ELSE_MISPLACED_IN_WHEN = DiagnosticFactory.create( + SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create( ERROR, "'else' entry must be the last one in a when-expression", new PositioningStrategy() { @NotNull @Override @@ -287,7 +365,8 @@ public interface Errors { } }); - DiagnosticFactory NO_ELSE_IN_WHEN = new DiagnosticFactory(ERROR, "'when' expression must contain 'else' branch", new PositioningStrategy() { + SimpleDiagnosticFactory + NO_ELSE_IN_WHEN = new SimpleDiagnosticFactory(ERROR, "'when' expression must contain 'else' branch", new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenExpression element) { @@ -295,40 +374,50 @@ public interface Errors { return markElement(element.getWhenKeywordElement()); } }); - DiagnosticFactory TYPE_MISMATCH_IN_RANGE = new DiagnosticFactory(ERROR, "Type mismatch: incompatible types of range and element checked in it", new PositioningStrategy() { + SimpleDiagnosticFactory TYPE_MISMATCH_IN_RANGE = new SimpleDiagnosticFactory(ERROR, "Type mismatch: incompatible types of range and element checked in it", new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenConditionInRange condition) { return markElement(condition.getOperationReference()); } }); - DiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = DiagnosticFactory.create(ERROR, "There's a cycle in the inheritance hierarchy for this type"); + SimpleDiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = SimpleDiagnosticFactory + .create(ERROR, "There's a cycle in the inheritance hierarchy for this type"); - DiagnosticFactory MANY_CLASSES_IN_SUPERTYPE_LIST = DiagnosticFactory.create(ERROR, "Only one class may appear in a supertype list"); - DiagnosticFactory SUPERTYPE_NOT_A_CLASS_OR_TRAIT = DiagnosticFactory.create(ERROR, "Only classes and traits may serve as supertypes"); - DiagnosticFactory SUPERTYPE_INITIALIZED_IN_TRAIT = DiagnosticFactory.create(ERROR, "Traits cannot initialize supertypes"); - DiagnosticFactory CONSTRUCTOR_IN_TRAIT = DiagnosticFactory.create(ERROR, "A trait may not have a constructor"); - DiagnosticFactory SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = DiagnosticFactory.create(WARNING, "Secondary constructors are not supported"); - DiagnosticFactory SUPERTYPE_APPEARS_TWICE = DiagnosticFactory.create(ERROR, "A supertype appears twice"); - DiagnosticFactory FINAL_SUPERTYPE = DiagnosticFactory.create(ERROR, "This type is final, so it cannot be inherited from"); + SimpleDiagnosticFactory + MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR, "Only one class may appear in a supertype list"); + SimpleDiagnosticFactory + SUPERTYPE_NOT_A_CLASS_OR_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Only classes and traits may serve as supertypes"); + SimpleDiagnosticFactory + SUPERTYPE_INITIALIZED_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Traits cannot initialize supertypes"); + SimpleDiagnosticFactory CONSTRUCTOR_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "A trait may not have a constructor"); + SimpleDiagnosticFactory + SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = SimpleDiagnosticFactory.create(WARNING, "Secondary constructors are not supported"); + SimpleDiagnosticFactory SUPERTYPE_APPEARS_TWICE = SimpleDiagnosticFactory.create(ERROR, "A supertype appears twice"); + SimpleDiagnosticFactory + FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "This type is final, so it cannot be inherited from"); DiagnosticFactory1 ILLEGAL_SELECTOR = DiagnosticFactory1.create(ERROR, "Expression ''{0}'' cannot be a selector (occur after a dot)"); - DiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = DiagnosticFactory.create(ERROR, "A type annotation is required on a value parameter"); - DiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = DiagnosticFactory.create(ERROR, "'break' and 'continue' are only allowed inside a loop"); + SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory + .create(ERROR, "A type annotation is required on a value parameter"); + SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory + .create(ERROR, "'break' and 'continue' are only allowed inside a loop"); DiagnosticFactory1 NOT_A_LOOP_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not denote a loop"); DiagnosticFactory1 NOT_A_RETURN_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not reference to a context from which we can return"); - DiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = DiagnosticFactory.create(ERROR, "Anonymous initializers are only allowed in the presence of a primary constructor"); - DiagnosticFactory NULLABLE_SUPERTYPE = DiagnosticFactory.create(ERROR, "A supertype cannot be nullable", new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetNullableType element) { - return markNode(element.getQuestionMarkNode()); - } - }); + SimpleDiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = SimpleDiagnosticFactory + .create(ERROR, "Anonymous initializers are only allowed in the presence of a primary constructor"); + SimpleDiagnosticFactory NULLABLE_SUPERTYPE = SimpleDiagnosticFactory + .create(ERROR, "A supertype cannot be nullable", new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetNullableType element) { + return markNode(element.getQuestionMarkNode()); + } + }); DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); - DiagnosticFactory AMBIGUOUS_LABEL = DiagnosticFactory.create(ERROR, "Ambiguous label"); + SimpleDiagnosticFactory AMBIGUOUS_LABEL = SimpleDiagnosticFactory.create(ERROR, "Ambiguous label"); DiagnosticFactory1 UNSUPPORTED = DiagnosticFactory1.create(ERROR, "Unsupported [{0}]"); DiagnosticFactory1 UNNECESSARY_SAFE_CALL = DiagnosticFactory1.create(WARNING, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); DiagnosticFactory1 UNNECESSARY_NOT_NULL_ASSERTION = DiagnosticFactory1.create(WARNING, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); @@ -347,7 +436,8 @@ public interface Errors { DiagnosticFactory2 TYPE_MISMATCH_IN_TUPLE_PATTERN = DiagnosticFactory2.create(ERROR, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING); // TODO: message DiagnosticFactory2 TYPE_MISMATCH_IN_BINDING_PATTERN = DiagnosticFactory2.create(ERROR, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); DiagnosticFactory2 INCOMPATIBLE_TYPES = DiagnosticFactory2.create(ERROR, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); - DiagnosticFactory EXPECTED_CONDITION = DiagnosticFactory.create(ERROR, "Expected condition of Boolean type"); + SimpleDiagnosticFactory + EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR, "Expected condition of Boolean type"); DiagnosticFactory1 CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR, "Cannot check for instance of erased type: {0}", RENDER_TYPE); DiagnosticFactory2 UNCHECKED_CAST = DiagnosticFactory2.create(WARNING, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); @@ -438,9 +528,11 @@ public interface Errors { AmbiguousDescriptorDiagnosticFactory NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory("None of the following functions can be called with the arguments supplied: {0}"); DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR, "No value passed for parameter {0}", DescriptorRenderer.TEXT); DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR, "A receiver of type {0} is required", RENDER_TYPE); - DiagnosticFactory NO_RECEIVER_ADMITTED = DiagnosticFactory.create(ERROR, "No receiver can be passed to this function or property"); + SimpleDiagnosticFactory + NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR, "No receiver can be passed to this function or property"); - DiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = DiagnosticFactory.create(ERROR, "Can not create an instance of an abstract class"); + SimpleDiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = SimpleDiagnosticFactory + .create(ERROR, "Can not create an instance of an abstract class"); DiagnosticFactory1 TYPE_INFERENCE_FAILED = DiagnosticFactory1.create(ERROR, "Type inference failed: {0}"); DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR, "{0} type arguments expected", new Renderer() { @NotNull @@ -453,8 +545,9 @@ public interface Errors { DiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = DiagnosticFactory1.create(ERROR, "Unresolved IDE template: {0}"); - DiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = DiagnosticFactory.create(WARNING, "This expression is treated as an argument to the function call on the previous line. " + - "Separate it with a semicolon (;) if it is not intended to be an argument."); + SimpleDiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = SimpleDiagnosticFactory + .create(WARNING, "This expression is treated as an argument to the function call on the previous line. " + + "Separate it with a semicolon (;) if it is not intended to be an argument."); DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR, "{0} is not an annotation class"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java similarity index 79% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java index 603c0aed730..ddd531f827d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithPsiElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java @@ -25,17 +25,17 @@ import java.util.List; /** * @author svtk */ -public class DiagnosticWithPsiElement extends AbstractDiagnostic { - public DiagnosticWithPsiElement(@NotNull E psiElement, - @NotNull DiagnosticFactory factory, +public class SimpleDiagnostic extends AbstractDiagnostic { + public SimpleDiagnostic(@NotNull E psiElement, + @NotNull SimpleDiagnosticFactory factory, @NotNull Severity severity) { super(psiElement, factory, severity); } @NotNull @Override - public DiagnosticFactory getFactory() { - return (DiagnosticFactory)super.getFactory(); + public SimpleDiagnosticFactory getFactory() { + return (SimpleDiagnosticFactory)super.getFactory(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java similarity index 62% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java index b1f03498b4f..4a97b1e460b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java @@ -22,20 +22,20 @@ import org.jetbrains.annotations.NotNull; /** * @author svtk */ -public class DiagnosticFactory extends DiagnosticFactoryWithPsiElement { +public class SimpleDiagnosticFactory extends DiagnosticFactoryWithPsiElement { protected final String message; - protected DiagnosticFactory(Severity severity, String message, PositioningStrategy positioningStrategy) { + protected SimpleDiagnosticFactory(Severity severity, String message, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); this.message = message; } - public static DiagnosticFactory create(Severity severity, String message) { + public static SimpleDiagnosticFactory create(Severity severity, String message) { return create(severity, message, PositioningStrategies.DEFAULT); } - public static DiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy) { - return new DiagnosticFactory(severity, message, positioningStrategy); + public static SimpleDiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy) { + return new SimpleDiagnosticFactory(severity, message, positioningStrategy); } String getMessage() { @@ -44,6 +44,6 @@ public class DiagnosticFactory extends DiagnosticFactoryWi @NotNull public ParametrizedDiagnostic on(@NotNull E element) { - return new DiagnosticWithPsiElement(element, this, severity); + return new SimpleDiagnostic(element, this, severity); } } \ No newline at end of file From 6a13510741dacb4f74a3a1d146a0a95a99de6989 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 13:56:53 +0400 Subject: [PATCH 04/76] Replaced Diagnostic.getMessage() with DiagnosticRenderer.render() calls. Made Diagnostic.getMessage() deprecated, introduced DiagnosticRender interface and default implementation for it. --- .../jet/compiler/CompileSession.java | 7 +-- .../compiler/DefaultDiagnosticRenderer.java | 39 ++++++++++++++++ .../jet/lang/diagnostics/Diagnostic.java | 1 + .../lang/diagnostics/DiagnosticHolder.java | 3 +- .../lang/diagnostics/DiagnosticRenderer.java | 30 ++++++++++++ .../tests/org/jetbrains/jet/JetTestUtils.java | 6 ++- .../jet/plugin/highlighter/JetPsiChecker.java | 10 ++-- idea/testData/checker/infos/Autocasts.jet | 46 +++++++++---------- 8 files changed, 107 insertions(+), 35 deletions(-) create mode 100644 compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index 952f4cdb2c7..1e26ccf2fa9 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -35,10 +35,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; -import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.SimpleDiagnosticFactory; -import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; -import org.jetbrains.jet.lang.diagnostics.Severity; +import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; @@ -150,7 +147,7 @@ public class CompileSession { DiagnosticUtils.LineAndColumn lineAndColumn = DiagnosticUtils.getLineAndColumn(diagnostic); VirtualFile virtualFile = diagnostic.getPsiFile().getVirtualFile(); String path = virtualFile == null ? null : virtualFile.getPath(); - collector.report(diagnostic.getSeverity(), diagnostic.getMessage(), path, lineAndColumn.getLine(), lineAndColumn.getColumn()); + collector.report(diagnostic.getSeverity(), DefaultDiagnosticRenderer.INSTANCE.render(diagnostic), path, lineAndColumn.getLine(), lineAndColumn.getColumn()); } @NotNull diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java new file mode 100644 index 00000000000..55d4b2f9d8e --- /dev/null +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.compiler; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticRenderer; + +/** + * @author Evgeny Gerashchenko + * @since 4/12/12 + */ +public class DefaultDiagnosticRenderer implements DiagnosticRenderer { + public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); + + private DefaultDiagnosticRenderer() { + } + + @NotNull + @Override + public String render(@Nullable Diagnostic diagnostic) { + return diagnostic.getMessage(); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java index d4369a0513d..58049c26521 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java @@ -31,6 +31,7 @@ public interface Diagnostic { @NotNull AbstractDiagnosticFactory getFactory(); + @Deprecated @NotNull String getMessage(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticHolder.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticHolder.java index f0c110e14bd..c1f1472d2c5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticHolder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticHolder.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -38,7 +37,7 @@ public interface DiagnosticHolder { if (diagnostic.getSeverity() == Severity.ERROR) { PsiFile psiFile = diagnostic.getPsiFile(); List textRanges = diagnostic.getTextRanges(); - throw new IllegalStateException(diagnostic.getMessage() + DiagnosticUtils.atLocation(psiFile, textRanges.get(0))); + throw new IllegalStateException(diagnostic.getFactory().getName() + DiagnosticUtils.atLocation(psiFile, textRanges.get(0))); } } }; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java new file mode 100644 index 00000000000..d820c6cdf11 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Evgeny Gerashchenko + * @since 4/12/12 + */ +public interface DiagnosticRenderer extends Renderer { + @NotNull + @Override + String render(@Nullable Diagnostic diagnostic); +} diff --git a/compiler/tests/org/jetbrains/jet/JetTestUtils.java b/compiler/tests/org/jetbrains/jet/JetTestUtils.java index 7ce129cc6d8..8bcd54cc0c8 100644 --- a/compiler/tests/org/jetbrains/jet/JetTestUtils.java +++ b/compiler/tests/org/jetbrains/jet/JetTestUtils.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; +import org.jetbrains.jet.compiler.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic; @@ -153,11 +154,14 @@ public class JetTestUtils { @Override public void report(@NotNull Diagnostic diagnostic) { if (diagnostic.getSeverity() == Severity.ERROR) { - throw new IllegalStateException(diagnostic.getMessage()); + throw new IllegalStateException(DefaultDiagnosticRenderer.INSTANCE.render(diagnostic)); } } }; + private JetTestUtils() { + } + public static AnalyzeExhaust analyzeFile(@NotNull JetFile namespace, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) { return AnalyzerFacadeForJVM.analyzeOneFileWithJavaIntegration(namespace, flowDataTraceFactory, CompileCompilerDependenciesTest.compilerDependenciesForTests(CompilerSpecialMode.REGULAR)); diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index 3fcbddeae37..4bea587e9cd 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -33,6 +33,7 @@ import com.intellij.psi.PsiReference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.jet.compiler.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetReferenceExpression; @@ -154,7 +155,7 @@ public class JetPsiChecker implements Annotator { for (TextRange range : mrr.getRanges()) { Annotation annotation = holder.createErrorAnnotation( range.shiftRight(referenceExpression.getTextOffset()), - diagnostic.getMessage()); + getMessage(diagnostic)); registerQuickFix(annotation, diagnostic); @@ -163,7 +164,7 @@ public class JetPsiChecker implements Annotator { } else { for (TextRange textRange : textRanges) { - Annotation annotation = holder.createErrorAnnotation(textRange, diagnostic.getMessage()); + Annotation annotation = holder.createErrorAnnotation(textRange, getMessage(diagnostic)); registerQuickFix(annotation, diagnostic); annotation.setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); } @@ -239,10 +240,11 @@ public class JetPsiChecker implements Annotator { @NotNull private static String getMessage(@NotNull Diagnostic diagnostic) { + String message = DefaultDiagnosticRenderer.INSTANCE.render(diagnostic); if (ApplicationManager.getApplication().isInternal() || ApplicationManager.getApplication().isUnitTestMode()) { - return "[" + diagnostic.getFactory().getName() + "] " + diagnostic.getMessage(); + return "[" + diagnostic.getFactory().getName() + "] " + message; } - return diagnostic.getMessage(); + return message; } @Nullable diff --git a/idea/testData/checker/infos/Autocasts.jet b/idea/testData/checker/infos/Autocasts.jet index 9bd17ee710a..b665d066470 100644 --- a/idea/testData/checker/infos/Autocasts.jet +++ b/idea/testData/checker/infos/Autocasts.jet @@ -8,19 +8,19 @@ class B() : A() { fun f9(a : A?) { a?.foo() - a?.bar() + a?.bar() if (a is B) { a.bar() a.foo() } a?.foo() - a?.bar() + a?.bar() if (!(a is B)) { - a?.bar() + a?.bar() a?.foo() } if (!(a is B) || a.bar() == #()) { - a?.bar() + a?.bar() } if (!(a is B)) { return; @@ -55,7 +55,7 @@ fun f11(a : A?) { is B -> a.bar() is A -> a.foo() is Any -> a.foo() - is Any? -> a.bar() + is Any? -> a.bar() else -> a?.foo() } } @@ -65,7 +65,7 @@ fun f12(a : A?) { is B -> a.bar() is A -> a.foo() is Any -> a.foo(); - is Any? -> a.bar() + is Any? -> a.bar() is val c : B -> c.foo() is val c is C -> c.bar() is val c is C -> a.bar() @@ -73,7 +73,7 @@ fun f12(a : A?) { } if (a is val b) { - a?.bar() + a?.bar() b?.foo() } if (a is val b is B) { @@ -90,17 +90,17 @@ fun f13(a : A?) { } else { a?.foo() - c.bar() + c.bar() } a?.foo() if (!(a is val c is B)) { a?.foo() - c.bar() + c.bar() } else { a.foo() - c.bar() + c.bar() } a?.foo() @@ -110,16 +110,16 @@ fun f13(a : A?) { } else { a?.foo() - c.bar() + c.bar() } if (!(a is val c is B) || !(a is val x is C)) { - x - c + x + c } else { - x - c + x + c } if (!(a is val c is B) || !(a is val c is C)) { @@ -127,21 +127,21 @@ fun f13(a : A?) { if (!(a is val c is B)) return a.bar() - c.foo() - c.bar() + c.foo() + c.bar() } fun f14(a : A?) { while (!(a is val c is B)) { } a.bar() - c.bar() + c.bar() } fun f15(a : A?) { do { } while (!(a is val c is B)) a.bar() - c.bar() + c.bar() } fun getStringLength(obj : Any) : Char? { @@ -217,20 +217,20 @@ fun declarationInsidePattern(x: #(Any, Any)): String = when(x) { is #(val a is S fun mergeAutocasts(a: Any?) { if (a is String || a is Int) { - a.compareTo("") + a.compareTo("") a.toString() } if (a is Int || a is String) { - a.compareTo("") + a.compareTo("") } when (a) { - is String, is Any -> a.compareTo("") + is String, is Any -> a.compareTo("") } if (a is String && a is Any) { val i: Int = a.compareTo("") } if (a is String && a.compareTo("") == 0) {} - if (a is String || a.compareTo("") == 0) {} + if (a is String || a.compareTo("") == 0) {} } //mutability From 46d929efa1d0e75bc38e18dc61bad42618003d29 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 15:50:29 +0400 Subject: [PATCH 05/76] Introduced factory to renderer map in DefaultDiagnosticRenderer. Added first renderer there. --- .../compiler/DefaultDiagnosticRenderer.java | 48 +++++++++++++++++-- .../lang/diagnostics/DiagnosticRenderer.java | 4 +- .../DiagnosticWithParameters1.java | 1 + .../DiagnosticWithParameters2.java | 2 + .../DiagnosticWithParameters3.java | 3 ++ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java index 55d4b2f9d8e..c66171df830 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -16,24 +16,64 @@ package org.jetbrains.jet.compiler; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.DiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.psi.JetFile; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; + +import static org.jetbrains.jet.lang.diagnostics.Errors.EXCEPTION_WHILE_ANALYZING; /** * @author Evgeny Gerashchenko * @since 4/12/12 */ -public class DefaultDiagnosticRenderer implements DiagnosticRenderer { +public class DefaultDiagnosticRenderer implements DiagnosticRenderer { public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); + private final Map> factoryToRenderer = new HashMap>(); + private DefaultDiagnosticRenderer() { + factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { + @NotNull + @Override + public String render(@Nullable Throwable e) { + return e.getClass().getSimpleName() + ": " + e.getMessage(); + } + })); } @NotNull @Override public String render(@Nullable Diagnostic diagnostic) { - return diagnostic.getMessage(); + if (diagnostic == null) { + throw new IllegalArgumentException("Diagnostic passed to diagnostic renderer cannot be null"); + } + DiagnosticRenderer renderer = factoryToRenderer.get(diagnostic.getFactory()); + if (renderer == null) { + return diagnostic.getMessage(); // TODO throw IllegalArgumentException instead + } + //noinspection unchecked + return renderer.render(diagnostic); + } + + private class DiagnosticWithParameters1Renderer implements DiagnosticRenderer> { + private final MessageFormat messageFormat; + private final Renderer rendererForA; + + private DiagnosticWithParameters1Renderer(@NotNull String message, @NotNull Renderer rendererForA) { + this.messageFormat = new MessageFormat(message); + this.rendererForA = rendererForA; + } + + @NotNull + @Override + public String render(@Nullable DiagnosticWithParameters1 diagnostic) { + return diagnostic == null ? "null" : messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); + } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java index d820c6cdf11..8e0d505740e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java @@ -23,8 +23,8 @@ import org.jetbrains.annotations.Nullable; * @author Evgeny Gerashchenko * @since 4/12/12 */ -public interface DiagnosticRenderer extends Renderer { +public interface DiagnosticRenderer extends Renderer { @NotNull @Override - String render(@Nullable Diagnostic diagnostic); + String render(@Nullable D diagnostic); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java index e02675d5c1a..147e8da5c0e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java @@ -55,6 +55,7 @@ public class DiagnosticWithParameters1 extends Abstract return getFactory().getTextRanges(this); } + @NotNull public A getA() { return a; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java index 031d5805a15..fa7f24140b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java @@ -58,10 +58,12 @@ public class DiagnosticWithParameters2 extends Abstr return getFactory().getTextRanges(this); } + @NotNull public A getA() { return a; } + @NotNull public B getB() { return b; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java index 82ee507aa85..ded5998fd7e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java @@ -61,14 +61,17 @@ public class DiagnosticWithParameters3 extends Ab return getFactory().getTextRanges(this); } + @NotNull public A getA() { return a; } + @NotNull public B getB() { return b; } + @NotNull public C getC() { return c; } From 7be6fe84beac9cde4b354d3197afa27374762db2 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 18:27:29 +0400 Subject: [PATCH 06/76] Made single parameter of Renderer.render() @NotNull, because argument was almost never @Nullable on call-sites. --- .../compiler/DefaultDiagnosticRenderer.java | 12 ++++------- .../AmbiguousDescriptorDiagnosticFactory.java | 2 +- .../lang/diagnostics/DiagnosticRenderer.java | 3 +-- .../jet/lang/diagnostics/Errors.java | 20 +++++++++---------- .../jet/lang/diagnostics/Renderer.java | 7 ++----- .../jet/lang/diagnostics/Renderers.java | 17 ++++++---------- .../jet/resolve/DescriptorRenderer.java | 3 +-- .../jet/resolve/ExpectedResolveData.java | 15 ++++++++++---- .../highlighter/JetLineMarkerProvider.java | 6 +++++- .../libraries/DecompiledDataFactory.java | 2 +- 10 files changed, 41 insertions(+), 46 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java index c66171df830..16f97836827 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.compiler; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetFile; @@ -41,7 +40,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { @NotNull @Override - public String render(@Nullable Throwable e) { + public String render(@NotNull Throwable e) { return e.getClass().getSimpleName() + ": " + e.getMessage(); } })); @@ -49,10 +48,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer @NotNull @Override - public String render(@Nullable Diagnostic diagnostic) { - if (diagnostic == null) { - throw new IllegalArgumentException("Diagnostic passed to diagnostic renderer cannot be null"); - } + public String render(@NotNull Diagnostic diagnostic) { DiagnosticRenderer renderer = factoryToRenderer.get(diagnostic.getFactory()); if (renderer == null) { return diagnostic.getMessage(); // TODO throw IllegalArgumentException instead @@ -72,8 +68,8 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer @NotNull @Override - public String render(@Nullable DiagnosticWithParameters1 diagnostic) { - return diagnostic == null ? "null" : messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); + public String render(@NotNull DiagnosticWithParameters1 diagnostic) { + return messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java index 57cf016fdb4..4e69661a707 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java @@ -41,7 +41,7 @@ public class AmbiguousDescriptorDiagnosticFactory extends DiagnosticFactory1>>() { @NotNull @Override - public String render(@Nullable Collection> argument) { + public String render(@NotNull Collection> argument) { StringBuilder stringBuilder = new StringBuilder("\n"); for (ResolvedCall call : argument) { stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java index 8e0d505740e..c71d686fc0f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.diagnostics; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Evgeny Gerashchenko @@ -26,5 +25,5 @@ import org.jetbrains.annotations.Nullable; public interface DiagnosticRenderer extends Renderer { @NotNull @Override - String render(@Nullable D diagnostic); + String render(@NotNull D diagnostic); } 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 991f03e296c..d50b57581bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -49,7 +49,7 @@ public interface Errors { DiagnosticFactory1 EXCEPTION_WHILE_ANALYZING = DiagnosticFactory1.create(ERROR, "{0}", new Renderer() { @NotNull @Override - public String render(@Nullable Throwable e) { + public String render(@NotNull Throwable e) { return e.getClass().getSimpleName() + ": " + e.getMessage(); } }); @@ -70,8 +70,7 @@ public interface Errors { new Renderer>() { @NotNull @Override - public String render(@Nullable Collection element) { - assert element != null; + public String render(@NotNull Collection element) { StringBuilder sb = new StringBuilder(); for (Iterator iterator = element.iterator(); iterator.hasNext(); ) { JetKeywordToken modifier = iterator.next(); @@ -337,8 +336,7 @@ public interface Errors { DiagnosticFactory1 EXPRESSION_EXPECTED = DiagnosticFactory1.create(ERROR, "{0} is not an expression, and only expression are allowed here", new Renderer() { @NotNull @Override - public String render(@Nullable JetExpression expression) { - assert expression != null; + public String render(@NotNull JetExpression expression) { String expressionType = expression.toString(); return expressionType.substring(0, 1) + expressionType.substring(1).toLowerCase(); } @@ -424,8 +422,8 @@ public interface Errors { DiagnosticFactory2 NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER = DiagnosticFactory2.create(ERROR, "{0} does not refer to a type parameter of {1}", new Renderer() { @NotNull @Override - public String render(@Nullable JetTypeConstraint typeConstraint) { - assert typeConstraint != null; + public String render(@NotNull JetTypeConstraint typeConstraint) { + //noinspection ConstantConditions return typeConstraint.getSubjectTypeParameterName().getReferencedName(); } }, NAME); @@ -446,7 +444,7 @@ public interface Errors { DiagnosticFactory3.create(ERROR, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { @NotNull @Override - public String render(@Nullable Collection types) { + public String render(@NotNull Collection types) { StringBuilder builder = new StringBuilder(); for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { JetType jetType = iterator.next(); @@ -462,7 +460,8 @@ public interface Errors { DiagnosticFactory3 EQUALITY_NOT_APPLICABLE = DiagnosticFactory3.create(ERROR, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { @NotNull @Override - public String render(@Nullable JetSimpleNameExpression nameExpression) { + public String render(@NotNull JetSimpleNameExpression nameExpression) { + //noinspection ConstantConditions return nameExpression.getReferencedName(); } }, TO_STRING, TO_STRING); @@ -537,8 +536,7 @@ public interface Errors { DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR, "{0} type arguments expected", new Renderer() { @NotNull @Override - public String render(@Nullable Integer argument) { - assert argument != null; + public String render(@NotNull Integer argument) { return argument == 0 ? "No" : argument.toString(); } }); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java index 3d427e03be6..5884b97e3ff 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java @@ -16,15 +16,12 @@ package org.jetbrains.jet.lang.diagnostics; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author abreslav */ -public interface Renderer

{ - +public interface Renderer { @NotNull - String render(@Nullable P element); + String render(@NotNull O object); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java index dcccc2d4f69..7136502cfe9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.Named; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClassOrObject; @@ -32,8 +31,8 @@ public class Renderers { public static final Renderer TO_STRING = new Renderer() { @NotNull @Override - public String render(@Nullable Object element) { - return element == null ? "null" : element.toString(); + public String render(@NotNull Object element) { + return element.toString(); } @Override @@ -45,8 +44,7 @@ public class Renderers { public static final Renderer NAME = new Renderer() { @NotNull @Override - public String render(@Nullable Object element) { - if (element == null) return "null"; + public String render(@NotNull Object element) { if (element instanceof Named) { return ((Named) element).getName(); } @@ -57,8 +55,7 @@ public class Renderers { public static final Renderer ELEMENT_TEXT = new Renderer() { @NotNull @Override - public String render(@Nullable PsiElement element) { - if (element == null) return "null"; + public String render(@NotNull PsiElement element) { return element.getText(); } }; @@ -66,8 +63,7 @@ public class Renderers { public static final Renderer RENDER_CLASS_OR_OBJECT = new Renderer() { @NotNull @Override - public String render(@Nullable JetClassOrObject classOrObject) { - assert classOrObject != null; + public String render(@NotNull JetClassOrObject classOrObject) { String name = classOrObject.getName() != null ? " '" + classOrObject.getName() + "'" : ""; if (classOrObject instanceof JetClass) { return "Class" + name; @@ -80,8 +76,7 @@ public class Renderers { public static final Renderer RENDER_TYPE = new Renderer() { @NotNull @Override - public String render(@Nullable JetType type) { - assert type != null; + public String render(@NotNull JetType type) { return DescriptorRenderer.TEXT.renderType(type); } }; diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index ab314670626..aa98f28b710 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -209,8 +209,7 @@ public class DescriptorRenderer implements Renderer { @NotNull @Override - public String render(DeclarationDescriptor declarationDescriptor) { - if (declarationDescriptor == null) return lt() + "null>"; + public String render(@NotNull DeclarationDescriptor declarationDescriptor) { StringBuilder stringBuilder = new StringBuilder(); declarationDescriptor.accept(rootVisitor, stringBuilder); if (shouldRenderDefinedIn()) { diff --git a/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java b/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java index 2be4be17768..4ff2c59ebfb 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java +++ b/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java @@ -23,6 +23,8 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.CompileCompilerDependenciesTest; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; @@ -185,7 +187,7 @@ public abstract class ExpectedResolveData { assertTrue( "Must have been unresolved: " + renderReferenceInContext(referenceExpression) + - " but was resolved to " + DescriptorRenderer.TEXT.render(bindingContext.get(REFERENCE_TARGET, referenceExpression)), + " but was resolved to " + renderNullableDescriptor(bindingContext.get(REFERENCE_TARGET, referenceExpression)), unresolvedReferences.contains(referenceExpression)); continue; } @@ -193,7 +195,7 @@ public abstract class ExpectedResolveData { assertTrue( "Must have been resolved to multiple descriptors: " + renderReferenceInContext(referenceExpression) + - " but was resolved to " + DescriptorRenderer.TEXT.render(bindingContext.get(REFERENCE_TARGET, referenceExpression)), + " but was resolved to " + renderNullableDescriptor(bindingContext.get(REFERENCE_TARGET, referenceExpression)), bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, referenceExpression) != null); continue; } @@ -201,7 +203,7 @@ public abstract class ExpectedResolveData { assertTrue( "Must have been resolved to null: " + renderReferenceInContext(referenceExpression) + - " but was resolved to " + DescriptorRenderer.TEXT.render(bindingContext.get(REFERENCE_TARGET, referenceExpression)), + " but was resolved to " + renderNullableDescriptor(bindingContext.get(REFERENCE_TARGET, referenceExpression)), bindingContext.get(REFERENCE_TARGET, referenceExpression) == null ); continue; @@ -210,7 +212,7 @@ public abstract class ExpectedResolveData { assertTrue( "Must have been resolved to error: " + renderReferenceInContext(referenceExpression) + - " but was resolved to " + DescriptorRenderer.TEXT.render(bindingContext.get(REFERENCE_TARGET, referenceExpression)), + " but was resolved to " + renderNullableDescriptor(bindingContext.get(REFERENCE_TARGET, referenceExpression)), ErrorUtils.isError(bindingContext.get(REFERENCE_TARGET, referenceExpression)) ); continue; @@ -355,4 +357,9 @@ public abstract class ExpectedResolveData { T result = (T) element; return result; } + + @NotNull + private static String renderNullableDescriptor(@Nullable DeclarationDescriptor d) { + return d == null ? "" : DescriptorRenderer.TEXT.render(d); + } } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java index bd9577948c6..aac93f48e64 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java @@ -35,6 +35,7 @@ import com.intellij.util.PsiNavigateUtil; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.Modality; +import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetProperty; @@ -132,7 +133,10 @@ public class JetLineMarkerProvider implements LineMarkerProvider { public String getElementText(PsiElement element) { if (element instanceof JetNamedFunction) { JetNamedFunction function = (JetNamedFunction) element; - return DescriptorRenderer.HTML.render(bindingContext.get(BindingContext.FUNCTION, function)); + SimpleFunctionDescriptor fd = + bindingContext.get(BindingContext.FUNCTION, function); + assert fd != null; + return DescriptorRenderer.HTML.render(fd); } return super.getElementText(element); } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 4b499419098..f7c27060938 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -125,7 +125,7 @@ class DecompiledDataFactory { return r; } - private void appendDescriptor(DeclarationDescriptor descriptor, String indent) { + private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) { int startOffset = myBuilder.length(); String renderedDescriptor = DescriptorRenderer.COMPACT.render(descriptor); renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT); From 553ce9e5e0a60db36007df4ebb2919ba8d2f4a67 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 20:21:09 +0400 Subject: [PATCH 07/76] Extracted DiagnosticWithParameters1Renderer, moved it along with DiagnosticRenderer to frontend module. --- .../compiler/DefaultDiagnosticRenderer.java | 20 +-------- .../{ => rendering}/DiagnosticRenderer.java | 4 +- .../DiagnosticWithParameters1Renderer.java | 44 +++++++++++++++++++ 3 files changed, 49 insertions(+), 19 deletions(-) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/{ => rendering}/DiagnosticRenderer.java (84%) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java index 16f97836827..158ca104b80 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -16,12 +16,12 @@ package org.jetbrains.jet.compiler; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticWithParameters1Renderer; import org.jetbrains.jet.lang.psi.JetFile; -import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; @@ -56,20 +56,4 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer //noinspection unchecked return renderer.render(diagnostic); } - - private class DiagnosticWithParameters1Renderer implements DiagnosticRenderer> { - private final MessageFormat messageFormat; - private final Renderer rendererForA; - - private DiagnosticWithParameters1Renderer(@NotNull String message, @NotNull Renderer rendererForA) { - this.messageFormat = new MessageFormat(message); - this.rendererForA = rendererForA; - } - - @NotNull - @Override - public String render(@NotNull DiagnosticWithParameters1 diagnostic) { - return messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); - } - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java similarity index 84% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java index c71d686fc0f..ce843b367b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java @@ -14,9 +14,11 @@ * limitations under the License. */ -package org.jetbrains.jet.lang.diagnostics; +package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.Renderer; /** * @author Evgeny Gerashchenko diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java new file mode 100644 index 00000000000..6ae1c64d191 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; +import org.jetbrains.jet.lang.diagnostics.Renderer; + +import java.text.MessageFormat; + +/** +* @author Evgeny Gerashchenko +* @since 4/12/12 +*/ +public class DiagnosticWithParameters1Renderer implements DiagnosticRenderer> { + private final MessageFormat messageFormat; + private final Renderer rendererForA; + + public DiagnosticWithParameters1Renderer(@NotNull String message, @NotNull Renderer rendererForA) { + this.messageFormat = new MessageFormat(message); + this.rendererForA = rendererForA; + } + + @NotNull + @Override + public String render(@NotNull DiagnosticWithParameters1 diagnostic) { + return messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); + } +} From cab1e0059634849fd3c1c0c7accac1fbef4dffc5 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 20:54:36 +0400 Subject: [PATCH 08/76] Replaced unnecessary "E" type parameter in DiagnosticWithParameters1 with wildcard. --- .../jet/compiler/DefaultDiagnosticRenderer.java | 10 ++++++---- .../rendering/DiagnosticWithParameters1Renderer.java | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java index 158ca104b80..de3c793c937 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -17,15 +17,17 @@ package org.jetbrains.jet.compiler; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.diagnostics.AbstractDiagnosticFactory; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.Renderer; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticWithParameters1Renderer; -import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.diagnostics.rendering.SimpleDiagnosticRenderer; import java.util.HashMap; import java.util.Map; -import static org.jetbrains.jet.lang.diagnostics.Errors.EXCEPTION_WHILE_ANALYZING; +import static org.jetbrains.jet.lang.diagnostics.Errors.*; /** * @author Evgeny Gerashchenko @@ -37,7 +39,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer private final Map> factoryToRenderer = new HashMap>(); private DefaultDiagnosticRenderer() { - factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { + factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { @NotNull @Override public String render(@NotNull Throwable e) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java index 6ae1c64d191..6031bdeea45 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.diagnostics.rendering; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; import org.jetbrains.jet.lang.diagnostics.Renderer; @@ -27,7 +26,7 @@ import java.text.MessageFormat; * @author Evgeny Gerashchenko * @since 4/12/12 */ -public class DiagnosticWithParameters1Renderer implements DiagnosticRenderer> { +public class DiagnosticWithParameters1Renderer implements DiagnosticRenderer> { private final MessageFormat messageFormat; private final Renderer rendererForA; @@ -38,7 +37,7 @@ public class DiagnosticWithParameters1Renderer implemen @NotNull @Override - public String render(@NotNull DiagnosticWithParameters1 diagnostic) { + public String render(@NotNull DiagnosticWithParameters1 diagnostic) { return messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); } } From c3c2c716d976905d17901939da8c7117d102d5df Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 12 Apr 2012 20:55:13 +0400 Subject: [PATCH 09/76] Introduced DiagnosticWithParameters2Renderer, DiagnosticWithParameters3Renderer, SimpleDiagnosticRenderer. --- .../DiagnosticWithParameters2Renderer.java | 47 ++++++++++++++++ .../DiagnosticWithParameters3Renderer.java | 53 +++++++++++++++++++ .../rendering/SimpleDiagnosticRenderer.java | 38 +++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/SimpleDiagnosticRenderer.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java new file mode 100644 index 00000000000..758626891bb --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; +import org.jetbrains.jet.lang.diagnostics.Renderer; + +import java.text.MessageFormat; + +/** +* @author Evgeny Gerashchenko +* @since 4/12/12 +*/ +public class DiagnosticWithParameters2Renderer implements DiagnosticRenderer> { + private final MessageFormat messageFormat; + private final Renderer rendererForA; + private final Renderer rendererForB; + + public DiagnosticWithParameters2Renderer(@NotNull String message, @NotNull Renderer rendererForA, @NotNull Renderer rendererForB) { + this.messageFormat = new MessageFormat(message); + this.rendererForA = rendererForA; + this.rendererForB = rendererForB; + } + + @NotNull + @Override + public String render(@NotNull DiagnosticWithParameters2 diagnostic) { + return messageFormat.format(new Object[]{ + rendererForA.render(diagnostic.getA()), + rendererForB.render(diagnostic.getB())}); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java new file mode 100644 index 00000000000..b18385e6fc8 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters3; +import org.jetbrains.jet.lang.diagnostics.Renderer; + +import java.text.MessageFormat; + +/** +* @author Evgeny Gerashchenko +* @since 4/12/12 +*/ +public class DiagnosticWithParameters3Renderer implements DiagnosticRenderer> { + private final MessageFormat messageFormat; + private final Renderer rendererForA; + private final Renderer rendererForB; + private final Renderer rendererForC; + + public DiagnosticWithParameters3Renderer(@NotNull String message, + @NotNull Renderer rendererForA, + @NotNull Renderer rendererForB, + @NotNull Renderer rendererForC) { + this.messageFormat = new MessageFormat(message); + this.rendererForA = rendererForA; + this.rendererForB = rendererForB; + this.rendererForC = rendererForC; + } + + @NotNull + @Override + public String render(@NotNull DiagnosticWithParameters3 diagnostic) { + return messageFormat.format(new Object[]{ + rendererForA.render(diagnostic.getA()), + rendererForB.render(diagnostic.getB()), + rendererForC.render(diagnostic.getC())}); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/SimpleDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/SimpleDiagnosticRenderer.java new file mode 100644 index 00000000000..0dd094f89f3 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/SimpleDiagnosticRenderer.java @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; + +/** +* @author Evgeny Gerashchenko +* @since 4/12/12 +*/ +public class SimpleDiagnosticRenderer implements DiagnosticRenderer { + private final String message; + + public SimpleDiagnosticRenderer(@NotNull String message) { + this.message = message; + } + + @NotNull + @Override + public String render(@NotNull Diagnostic diagnostic) { + return message; + } +} From 8d599548ba670f4984c8e82e5563e1ef4f181742 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:07:52 +0400 Subject: [PATCH 10/76] Copied all diagnostic-rendering logic to DefaultDiagnosticRenderer. --- .../compiler/DefaultDiagnosticRenderer.java | 377 +++++++++++++++++- .../diagnostics/RedeclarationDiagnostic.java | 14 +- 2 files changed, 383 insertions(+), 8 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java index de3c793c937..0277131abbc 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java @@ -17,17 +17,23 @@ package org.jetbrains.jet.compiler; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.AbstractDiagnosticFactory; -import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; -import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticWithParameters1Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.SimpleDiagnosticRenderer; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.diagnostics.rendering.*; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; +import org.jetbrains.jet.lang.resolve.calls.inference.SolutionStatus; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lexer.JetKeywordToken; +import org.jetbrains.jet.resolve.DescriptorRenderer; +import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import static org.jetbrains.jet.lang.diagnostics.Errors.*; +import static org.jetbrains.jet.lang.diagnostics.Renderers.*; /** * @author Evgeny Gerashchenko @@ -46,6 +52,318 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer return e.getClass().getSimpleName() + ": " + e.getMessage(); } })); + + factoryToRenderer.put(UNRESOLVED_REFERENCE, new UnresolvedReferenceDiagnosticRenderer("Unresolved reference: ")); + + factoryToRenderer.put(INVISIBLE_REFERENCE, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); + factoryToRenderer.put(INVISIBLE_MEMBER, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); + + factoryToRenderer.put(REDECLARATION, new RedeclarationDiagnosticRenderer("Redeclaration: ")); + factoryToRenderer.put(NAME_SHADOWING, new RedeclarationDiagnosticRenderer("Name shadowed: ")); + + factoryToRenderer.put(TYPE_MISMATCH, new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE)); + factoryToRenderer.put(INCOMPATIBLE_MODIFIERS, new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection tokens) { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { + JetKeywordToken modifier = iterator.next(); + sb.append(modifier.getValue()); + if (iterator.hasNext()) { + sb.append(" "); + } + } + return sb.toString(); + } + } + )); + factoryToRenderer.put(ILLEGAL_MODIFIER, new DiagnosticWithParameters1Renderer("Illegal modifier ''{0}''", TO_STRING)); + + factoryToRenderer.put(REDUNDANT_MODIFIER, new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING)); + factoryToRenderer.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); + factoryToRenderer.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); + factoryToRenderer.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); + factoryToRenderer.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); + factoryToRenderer.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer("Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message + factoryToRenderer.put(RETURN_NOT_ALLOWED, new SimpleDiagnosticRenderer("'return' is not allowed here")); + factoryToRenderer.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); + factoryToRenderer.put(LABEL_NAME_CLASH, new SimpleDiagnosticRenderer("There is more than one label with such a name in this scope")); + factoryToRenderer.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, new SimpleDiagnosticRenderer("Expression expected, but a namespace name found")); + + factoryToRenderer.put(CANNOT_IMPORT_FROM_ELEMENT, new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); + factoryToRenderer.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer("Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); + factoryToRenderer.put(USELESS_HIDDEN_IMPORT, new SimpleDiagnosticRenderer("Useless import, it is hidden further")); + factoryToRenderer.put(USELESS_SIMPLE_IMPORT, new SimpleDiagnosticRenderer("Useless import, does nothing")); + + factoryToRenderer.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer("Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); + + factoryToRenderer.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); + factoryToRenderer.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); + factoryToRenderer.put(INACCESSIBLE_BACKING_FIELD, new SimpleDiagnosticRenderer("The backing field is not accessible here")); + factoryToRenderer.put(NOT_PROPERTY_BACKING_FIELD, new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); + + factoryToRenderer.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); + factoryToRenderer.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); + factoryToRenderer.put(NAMED_PARAMETER_NOT_FOUND, new UnresolvedReferenceDiagnosticRenderer("Cannot find a parameter with this name: ")); + factoryToRenderer.put(VARARG_OUTSIDE_PARENTHESES, new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); + factoryToRenderer.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); + + factoryToRenderer.put(MANY_FUNCTION_LITERAL_ARGUMENTS, new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); + factoryToRenderer.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); + + factoryToRenderer.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, new SimpleDiagnosticRenderer("This property cannot be declared abstract")); + factoryToRenderer.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); + factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, new SimpleDiagnosticRenderer("Property with initializer cannot be abstract")); + factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_GETTER, new SimpleDiagnosticRenderer("Property with getter implementation cannot be abstract")); + factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_SETTER, new SimpleDiagnosticRenderer("Property with setter implementation cannot be abstract")); + + factoryToRenderer.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, new SimpleDiagnosticRenderer("Package member cannot be protected")); + + factoryToRenderer.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); + factoryToRenderer.put(BACKING_FIELD_IN_TRAIT, new SimpleDiagnosticRenderer("Property in a trait cannot have a backing field")); + factoryToRenderer.put(MUST_BE_INITIALIZED, new SimpleDiagnosticRenderer("Property must be initialized")); + factoryToRenderer.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, new SimpleDiagnosticRenderer("Property must be initialized or be abstract")); + factoryToRenderer.put(PROPERTY_INITIALIZER_IN_TRAIT, new SimpleDiagnosticRenderer("Property initializers are not allowed in traits")); + factoryToRenderer.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); + factoryToRenderer.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); + factoryToRenderer.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); + factoryToRenderer.put(ABSTRACT_FUNCTION_WITH_BODY, new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); + factoryToRenderer.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); + factoryToRenderer.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer("Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); + + factoryToRenderer.put(NON_MEMBER_FUNCTION_NO_BODY, new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); + factoryToRenderer.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, new SimpleDiagnosticRenderer("Non final member in a final class")); + + factoryToRenderer.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SimpleDiagnosticRenderer("Public or protected member should specify a type")); + + factoryToRenderer.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer("Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning + factoryToRenderer.put(SUPERTYPE_NOT_INITIALIZED, new SimpleDiagnosticRenderer("This type has a constructor, and thus must be initialized here")); + factoryToRenderer.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, new SimpleDiagnosticRenderer("Constructor invocation should be explicitly specified")); + factoryToRenderer.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); + factoryToRenderer.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); + factoryToRenderer.put(BY_IN_SECONDARY_CONSTRUCTOR, new SimpleDiagnosticRenderer("'by'-clause is only supported for primary constructors")); + factoryToRenderer.put(INITIALIZER_WITH_NO_ARGUMENTS, new SimpleDiagnosticRenderer("Constructor arguments required")); + factoryToRenderer.put(MANY_CALLS_TO_THIS, new SimpleDiagnosticRenderer("Only one call to 'this(...)' is allowed")); + factoryToRenderer.put(NOTHING_TO_OVERRIDE, new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); + factoryToRenderer.put(VIRTUAL_MEMBER_HIDDEN, new DiagnosticWithParameters3Renderer("''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + factoryToRenderer.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); + factoryToRenderer.put(ENUM_ENTRY_ILLEGAL_TYPE, new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); + + factoryToRenderer.put(UNINITIALIZED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); + factoryToRenderer.put(UNINITIALIZED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); + factoryToRenderer.put(UNUSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is never used", NAME)); + factoryToRenderer.put(UNUSED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is never used", NAME)); + factoryToRenderer.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); + factoryToRenderer.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); + factoryToRenderer.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer("The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); + factoryToRenderer.put(UNUSED_CHANGED_VALUE, new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); + factoryToRenderer.put(UNUSED_EXPRESSION, new SimpleDiagnosticRenderer("The expression is unused")); + factoryToRenderer.put(UNUSED_FUNCTION_LITERAL, new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); + + factoryToRenderer.put(VAL_REASSIGNMENT, new DiagnosticWithParameters1Renderer("Val can not be reassigned", NAME)); + factoryToRenderer.put(INITIALIZATION_BEFORE_DECLARATION, new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); + factoryToRenderer.put(VARIABLE_EXPECTED, new SimpleDiagnosticRenderer("Variable expected")); + + factoryToRenderer.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer("This property has a custom setter, so initialization using backing field required", NAME)); + factoryToRenderer.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer("Setter of this property can be overridden, so initialization using backing field required", NAME)); + + factoryToRenderer.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", NAME)); + + factoryToRenderer.put(UNREACHABLE_CODE, new SimpleDiagnosticRenderer("Unreachable code")); + + factoryToRenderer.put(MANY_CLASS_OBJECTS, new SimpleDiagnosticRenderer("Only one class object is allowed per class")); + factoryToRenderer.put(CLASS_OBJECT_NOT_ALLOWED, new SimpleDiagnosticRenderer("A class object is not allowed here")); + factoryToRenderer.put(DELEGATION_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot use delegation")); + factoryToRenderer.put(DELEGATION_NOT_TO_TRAIT, new SimpleDiagnosticRenderer("Only traits can be delegated to")); + factoryToRenderer.put(NO_CONSTRUCTOR, new SimpleDiagnosticRenderer("This class does not have a constructor")); + factoryToRenderer.put(NOT_A_CLASS, new SimpleDiagnosticRenderer("Not a class")); + factoryToRenderer.put(ILLEGAL_ESCAPE_SEQUENCE, new SimpleDiagnosticRenderer("Illegal escape sequence")); + + factoryToRenderer.put(LOCAL_EXTENSION_PROPERTY, new SimpleDiagnosticRenderer("Local extension properties are not allowed")); + factoryToRenderer.put(LOCAL_VARIABLE_WITH_GETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have getters")); + factoryToRenderer.put(LOCAL_VARIABLE_WITH_SETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have setters")); + factoryToRenderer.put(VAL_WITH_SETTER, new SimpleDiagnosticRenderer("A 'val'-property cannot have a setter")); + + factoryToRenderer.put(NO_GET_METHOD, new SimpleDiagnosticRenderer("No get method providing array access")); + factoryToRenderer.put(NO_SET_METHOD, new SimpleDiagnosticRenderer("No set method providing array access")); + + factoryToRenderer.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); + factoryToRenderer.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, new DiagnosticWithParameters2Renderer("Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); + factoryToRenderer.put(ASSIGN_OPERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Assignment operators ambiguity: {0}")); + + factoryToRenderer.put(EQUALS_MISSING, new SimpleDiagnosticRenderer("No method 'equals(Any?) : Boolean' available")); + factoryToRenderer.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); + factoryToRenderer.put(NAMESPACE_IS_NOT_AN_EXPRESSION, new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); + factoryToRenderer.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer("{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); + factoryToRenderer.put(DECLARATION_IN_ILLEGAL_CONTEXT, new SimpleDiagnosticRenderer("Declarations are not allowed in this position")); + factoryToRenderer.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, new SimpleDiagnosticRenderer("Setter parameters can not have default values")); + factoryToRenderer.put(NO_THIS, new SimpleDiagnosticRenderer("'this' is not defined in this context")); + factoryToRenderer.put(SUPER_NOT_AVAILABLE, new SimpleDiagnosticRenderer("No supertypes are accessible in this context")); + factoryToRenderer.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer("Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); + factoryToRenderer.put(ABSTRACT_SUPER_CALL, new SimpleDiagnosticRenderer("Abstract member cannot be accessed directly")); + factoryToRenderer.put(NOT_A_SUPERTYPE, new SimpleDiagnosticRenderer("Not a supertype")); + factoryToRenderer.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); + factoryToRenderer.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, new SimpleDiagnosticRenderer("No cast needed, use ':' instead")); + factoryToRenderer.put(USELESS_CAST, new SimpleDiagnosticRenderer("No cast needed")); + factoryToRenderer.put(CAST_NEVER_SUCCEEDS, new SimpleDiagnosticRenderer("This cast can never succeed")); + factoryToRenderer.put(WRONG_SETTER_PARAMETER_TYPE, new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); + factoryToRenderer.put(WRONG_GETTER_RETURN_TYPE, new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); + factoryToRenderer.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer("Please specify constructor invocation; classifier {0} does not have a class object", NAME)); + factoryToRenderer.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, new SimpleDiagnosticRenderer("Generic arguments of the base type must be specified")); + + factoryToRenderer.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); + factoryToRenderer.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); + factoryToRenderer.put(HAS_NEXT_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); + factoryToRenderer.put(HAS_NEXT_MUST_BE_READABLE, new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); + factoryToRenderer.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + factoryToRenderer.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + factoryToRenderer.put(NEXT_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().next()' is ambiguous for this expression")); + factoryToRenderer.put(NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().next()' function")); + factoryToRenderer.put(ITERATOR_MISSING, new SimpleDiagnosticRenderer("For-loop range must have an iterator() method")); + factoryToRenderer.put(ITERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Method 'iterator()' is ambiguous for this expression: {0}")); + + factoryToRenderer.put(COMPARE_TO_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); + factoryToRenderer.put(CALLEE_NOT_A_FUNCTION, new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); + + factoryToRenderer.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); + factoryToRenderer.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); + factoryToRenderer.put(RETURN_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); + factoryToRenderer.put(EXPECTED_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}", RENDER_TYPE)); + factoryToRenderer.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); + factoryToRenderer.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer("Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); + factoryToRenderer.put(EXPRESSION_EXPECTED, new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetExpression expression) { + String expressionType = expression.toString(); + return expressionType.substring(0, 1) + expressionType.substring(1).toLowerCase(); + } + })); + + factoryToRenderer.put(UPPER_BOUND_VIOLATED, new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message + factoryToRenderer.put(FINAL_CLASS_OBJECT_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE)); + factoryToRenderer.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); + factoryToRenderer.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer("Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); + factoryToRenderer.put(CONFLICTING_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); + factoryToRenderer.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", NAME)); + + factoryToRenderer.put(TOO_MANY_ARGUMENTS, new DiagnosticWithParameters1Renderer("Too many arguments for {0}", TO_STRING)); + factoryToRenderer.put(ERROR_COMPILE_TIME_VALUE, new DiagnosticWithParameters1Renderer("{0}", TO_STRING)); + + factoryToRenderer.put(ELSE_MISPLACED_IN_WHEN, new SimpleDiagnosticRenderer("'else' entry must be the last one in a when-expression")); + + factoryToRenderer.put(NO_ELSE_IN_WHEN, new SimpleDiagnosticRenderer("'when' expression must contain 'else' branch")); + factoryToRenderer.put(TYPE_MISMATCH_IN_RANGE, new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); + factoryToRenderer.put(CYCLIC_INHERITANCE_HIERARCHY, new SimpleDiagnosticRenderer("There's a cycle in the inheritance hierarchy for this type")); + + factoryToRenderer.put(MANY_CLASSES_IN_SUPERTYPE_LIST, new SimpleDiagnosticRenderer("Only one class may appear in a supertype list")); + factoryToRenderer.put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, new SimpleDiagnosticRenderer("Only classes and traits may serve as supertypes")); + factoryToRenderer.put(SUPERTYPE_INITIALIZED_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot initialize supertypes")); + factoryToRenderer.put(CONSTRUCTOR_IN_TRAIT, new SimpleDiagnosticRenderer("A trait may not have a constructor")); + factoryToRenderer.put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, new SimpleDiagnosticRenderer("Secondary constructors are not supported")); + factoryToRenderer.put(SUPERTYPE_APPEARS_TWICE, new SimpleDiagnosticRenderer("A supertype appears twice")); + factoryToRenderer.put(FINAL_SUPERTYPE, new SimpleDiagnosticRenderer("This type is final, so it cannot be inherited from")); + + factoryToRenderer.put(ILLEGAL_SELECTOR, new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); + + factoryToRenderer.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); + factoryToRenderer.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, new SimpleDiagnosticRenderer("'break' and 'continue' are only allowed inside a loop")); + factoryToRenderer.put(NOT_A_LOOP_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not denote a loop", TO_STRING)); + factoryToRenderer.put(NOT_A_RETURN_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", TO_STRING)); + + factoryToRenderer.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); + factoryToRenderer.put(NULLABLE_SUPERTYPE, new SimpleDiagnosticRenderer("A supertype cannot be nullable")); + factoryToRenderer.put(UNSAFE_CALL, new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE)); + factoryToRenderer.put(AMBIGUOUS_LABEL, new SimpleDiagnosticRenderer("Ambiguous label")); + factoryToRenderer.put(UNSUPPORTED, new DiagnosticWithParameters1Renderer("Unsupported [{0}]", TO_STRING)); + factoryToRenderer.put(UNNECESSARY_SAFE_CALL, new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); + factoryToRenderer.put(UNNECESSARY_NOT_NULL_ASSERTION, new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE)); + factoryToRenderer.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, new DiagnosticWithParameters2Renderer("{0} does not refer to a type parameter of {1}", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetTypeConstraint typeConstraint) { + //noinspection ConstantConditions + return typeConstraint.getSubjectTypeParameterName().getReferencedName(); + } + }, NAME)); + factoryToRenderer.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer("Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); + + factoryToRenderer.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer("The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); + factoryToRenderer.put(TYPE_MISMATCH_IN_CONDITION, new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); + factoryToRenderer.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer("Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message + factoryToRenderer.put(TYPE_MISMATCH_IN_BINDING_PATTERN, new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE)); + factoryToRenderer.put(INCOMPATIBLE_TYPES, new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); + factoryToRenderer.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); + + factoryToRenderer.put(CANNOT_CHECK_FOR_ERASED, new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); + factoryToRenderer.put(UNCHECKED_CAST, new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); + + factoryToRenderer.put(INCONSISTENT_TYPE_PARAMETER_VALUES, new DiagnosticWithParameters3Renderer>("Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection types) { + StringBuilder builder = new StringBuilder(); + for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { + JetType jetType = iterator.next(); + builder.append(jetType); + if (iterator.hasNext()) { + builder.append(", "); + } + } + return builder.toString(); + } + })); + + factoryToRenderer.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer("Operator {0} cannot be applied to {1} and {2}", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetSimpleNameExpression nameExpression) { + //noinspection ConstantConditions + return nameExpression.getReferencedName(); + } + }, TO_STRING, TO_STRING)); + + factoryToRenderer.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer("''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); + factoryToRenderer.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + factoryToRenderer.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + + factoryToRenderer.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer("Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + factoryToRenderer.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer("Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + factoryToRenderer.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + + factoryToRenderer.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + + factoryToRenderer.put(CONFLICTING_OVERLOADS, new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING)); + + + factoryToRenderer.put(RESULT_TYPE_MISMATCH, new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE)); + factoryToRenderer.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer("Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", TO_STRING, TO_STRING, TO_STRING)); + + factoryToRenderer.put(OVERLOAD_RESOLUTION_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Overload resolution ambiguity: {0}")); + factoryToRenderer.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer("None of the following functions can be called with the arguments supplied: {0}")); + factoryToRenderer.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", DescriptorRenderer.TEXT)); + factoryToRenderer.put(MISSING_RECEIVER, new DiagnosticWithParameters1Renderer("A receiver of type {0} is required", RENDER_TYPE)); + factoryToRenderer.put(NO_RECEIVER_ADMITTED, new SimpleDiagnosticRenderer("No receiver can be passed to this function or property")); + + factoryToRenderer.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, new SimpleDiagnosticRenderer("Can not create an instance of an abstract class")); + factoryToRenderer.put(TYPE_INFERENCE_FAILED, new DiagnosticWithParameters1Renderer("Type inference failed: {0}", TO_STRING)); + factoryToRenderer.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { + @NotNull + @Override + public String render(@NotNull Integer argument) { + return argument == 0 ? "No" : argument.toString(); + } + })); + + factoryToRenderer.put(UNRESOLVED_IDE_TEMPLATE, new DiagnosticWithParameters1Renderer("Unresolved IDE template: {0}", TO_STRING)); + + factoryToRenderer.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer("This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); + + factoryToRenderer.put(NOT_AN_ANNOTATION_CLASS, new DiagnosticWithParameters1Renderer("{0} is not an annotation class", TO_STRING)); } @NotNull @@ -53,9 +371,54 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer public String render(@NotNull Diagnostic diagnostic) { DiagnosticRenderer renderer = factoryToRenderer.get(diagnostic.getFactory()); if (renderer == null) { - return diagnostic.getMessage(); // TODO throw IllegalArgumentException instead + throw new IllegalArgumentException("Don't know how to render diagnostic of type " + diagnostic.getFactory().getName()); } //noinspection unchecked return renderer.render(diagnostic); } + + private static class RedeclarationDiagnosticRenderer implements DiagnosticRenderer { + private String messagePrefix; + + private RedeclarationDiagnosticRenderer(@NotNull String messagePrefix) { + this.messagePrefix = messagePrefix; + } + + @NotNull + @Override + public String render(@NotNull RedeclarationDiagnostic diagnostic) { + return messagePrefix + diagnostic.getName(); + } + } + + private static class UnresolvedReferenceDiagnosticRenderer implements DiagnosticRenderer { + private String messagePrefix; + + private UnresolvedReferenceDiagnosticRenderer(@NotNull String messagePrefix) { + this.messagePrefix = messagePrefix; + } + + @NotNull + @Override + public String render(@NotNull UnresolvedReferenceDiagnostic diagnostic) { + return messagePrefix + diagnostic.getPsiElement().getText(); + } + } + + private static class AmbiguousDescriptorDiagnosticRenderer + extends DiagnosticWithParameters1Renderer>> { + private AmbiguousDescriptorDiagnosticRenderer(@NotNull String message) { + super(message, new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> argument) { + StringBuilder stringBuilder = new StringBuilder("\n"); + for (ResolvedCall call : argument) { + stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); + } + return stringBuilder.toString(); + } + }); + } + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index 15f49087fd6..acfa00a21cc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -32,6 +32,8 @@ import java.util.List; * @author abreslav */ public interface RedeclarationDiagnostic extends Diagnostic { + String getName(); + class SimpleRedeclarationDiagnostic extends AbstractDiagnostic implements RedeclarationDiagnostic { private String name; @@ -52,6 +54,11 @@ public interface RedeclarationDiagnostic extends Diagnostic { return getFactory().makeMessage(name); } + @Override + public String getName() { + return name; + } + @NotNull @Override public List getTextRanges() { @@ -104,10 +111,15 @@ public interface RedeclarationDiagnostic extends Diagnostic { return factory; } + @Override + public String getName() { + return duplicatingDescriptor.getName(); + } + @NotNull @Override public String getMessage() { - return factory.makeMessage(duplicatingDescriptor.getName()); + return factory.makeMessage(getName()); } @NotNull From b0e09319a97d8f308b67b2a523aa8f70e54b1355 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:09:33 +0400 Subject: [PATCH 11/76] Moved DefaultDiagnosticRenderer from cli back to frontend to avoid run-time dependencies on cli where rendering diagnostics is needed. --- .../cli/src/org/jetbrains/jet/compiler/CompileSession.java | 1 + .../lang/diagnostics/rendering}/DefaultDiagnosticRenderer.java | 3 +-- compiler/tests/org/jetbrains/jet/JetTestUtils.java | 2 +- .../org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename compiler/{cli/src/org/jetbrains/jet/compiler => frontend/src/org/jetbrains/jet/lang/diagnostics/rendering}/DefaultDiagnosticRenderer.java (99%) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index 1e26ccf2fa9..95b6752337a 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java similarity index 99% rename from compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 0277131abbc..e1407e943a6 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package org.jetbrains.jet.compiler; +package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.*; -import org.jetbrains.jet.lang.diagnostics.rendering.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.inference.SolutionStatus; diff --git a/compiler/tests/org/jetbrains/jet/JetTestUtils.java b/compiler/tests/org/jetbrains/jet/JetTestUtils.java index 8bcd54cc0c8..a12c4693120 100644 --- a/compiler/tests/org/jetbrains/jet/JetTestUtils.java +++ b/compiler/tests/org/jetbrains/jet/JetTestUtils.java @@ -26,7 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; -import org.jetbrains.jet.compiler.DefaultDiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic; diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index 4bea587e9cd..96d352074f4 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -33,7 +33,7 @@ import com.intellij.psi.PsiReference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.jet.compiler.DefaultDiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetReferenceExpression; From dff9f2e772126ad8a69518f28082c0d56c6454aa Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:12:48 +0400 Subject: [PATCH 12/76] Renamed map in DefaultDiagnosticRenderer to 'map' to reduce dazzling. --- .../rendering/DefaultDiagnosticRenderer.java | 502 +++++++++--------- 1 file changed, 251 insertions(+), 251 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index e1407e943a6..f5e53b49d43 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -41,10 +41,10 @@ import static org.jetbrains.jet.lang.diagnostics.Renderers.*; public class DefaultDiagnosticRenderer implements DiagnosticRenderer { public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); - private final Map> factoryToRenderer = new HashMap>(); + private final Map> map = new HashMap>(); private DefaultDiagnosticRenderer() { - factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { + map.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { @NotNull @Override public String render(@NotNull Throwable e) { @@ -52,16 +52,16 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } })); - factoryToRenderer.put(UNRESOLVED_REFERENCE, new UnresolvedReferenceDiagnosticRenderer("Unresolved reference: ")); + map.put(UNRESOLVED_REFERENCE, new UnresolvedReferenceDiagnosticRenderer("Unresolved reference: ")); - factoryToRenderer.put(INVISIBLE_REFERENCE, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); - factoryToRenderer.put(INVISIBLE_MEMBER, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); + map.put(INVISIBLE_REFERENCE, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); + map.put(INVISIBLE_MEMBER, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); - factoryToRenderer.put(REDECLARATION, new RedeclarationDiagnosticRenderer("Redeclaration: ")); - factoryToRenderer.put(NAME_SHADOWING, new RedeclarationDiagnosticRenderer("Name shadowed: ")); + map.put(REDECLARATION, new RedeclarationDiagnosticRenderer("Redeclaration: ")); + map.put(NAME_SHADOWING, new RedeclarationDiagnosticRenderer("Name shadowed: ")); - factoryToRenderer.put(TYPE_MISMATCH, new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE)); - factoryToRenderer.put(INCOMPATIBLE_MODIFIERS, new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", new Renderer>() { + map.put(TYPE_MISMATCH, new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE)); + map.put(INCOMPATIBLE_MODIFIERS, new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", new Renderer>() { @NotNull @Override public String render(@NotNull Collection tokens) { @@ -77,162 +77,162 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } } )); - factoryToRenderer.put(ILLEGAL_MODIFIER, new DiagnosticWithParameters1Renderer("Illegal modifier ''{0}''", TO_STRING)); + map.put(ILLEGAL_MODIFIER, new DiagnosticWithParameters1Renderer("Illegal modifier ''{0}''", TO_STRING)); - factoryToRenderer.put(REDUNDANT_MODIFIER, new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING)); - factoryToRenderer.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); - factoryToRenderer.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); - factoryToRenderer.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); - factoryToRenderer.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); - factoryToRenderer.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer("Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message - factoryToRenderer.put(RETURN_NOT_ALLOWED, new SimpleDiagnosticRenderer("'return' is not allowed here")); - factoryToRenderer.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); - factoryToRenderer.put(LABEL_NAME_CLASH, new SimpleDiagnosticRenderer("There is more than one label with such a name in this scope")); - factoryToRenderer.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, new SimpleDiagnosticRenderer("Expression expected, but a namespace name found")); - - factoryToRenderer.put(CANNOT_IMPORT_FROM_ELEMENT, new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); - factoryToRenderer.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer("Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); - factoryToRenderer.put(USELESS_HIDDEN_IMPORT, new SimpleDiagnosticRenderer("Useless import, it is hidden further")); - factoryToRenderer.put(USELESS_SIMPLE_IMPORT, new SimpleDiagnosticRenderer("Useless import, does nothing")); - - factoryToRenderer.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer("Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); - - factoryToRenderer.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); - factoryToRenderer.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); - factoryToRenderer.put(INACCESSIBLE_BACKING_FIELD, new SimpleDiagnosticRenderer("The backing field is not accessible here")); - factoryToRenderer.put(NOT_PROPERTY_BACKING_FIELD, new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); - - factoryToRenderer.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); - factoryToRenderer.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); - factoryToRenderer.put(NAMED_PARAMETER_NOT_FOUND, new UnresolvedReferenceDiagnosticRenderer("Cannot find a parameter with this name: ")); - factoryToRenderer.put(VARARG_OUTSIDE_PARENTHESES, new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); - factoryToRenderer.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); - - factoryToRenderer.put(MANY_FUNCTION_LITERAL_ARGUMENTS, new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); - factoryToRenderer.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); - - factoryToRenderer.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, new SimpleDiagnosticRenderer("This property cannot be declared abstract")); - factoryToRenderer.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); - factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, new SimpleDiagnosticRenderer("Property with initializer cannot be abstract")); - factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_GETTER, new SimpleDiagnosticRenderer("Property with getter implementation cannot be abstract")); - factoryToRenderer.put(ABSTRACT_PROPERTY_WITH_SETTER, new SimpleDiagnosticRenderer("Property with setter implementation cannot be abstract")); - - factoryToRenderer.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, new SimpleDiagnosticRenderer("Package member cannot be protected")); - - factoryToRenderer.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); - factoryToRenderer.put(BACKING_FIELD_IN_TRAIT, new SimpleDiagnosticRenderer("Property in a trait cannot have a backing field")); - factoryToRenderer.put(MUST_BE_INITIALIZED, new SimpleDiagnosticRenderer("Property must be initialized")); - factoryToRenderer.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, new SimpleDiagnosticRenderer("Property must be initialized or be abstract")); - factoryToRenderer.put(PROPERTY_INITIALIZER_IN_TRAIT, new SimpleDiagnosticRenderer("Property initializers are not allowed in traits")); - factoryToRenderer.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); - factoryToRenderer.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); - factoryToRenderer.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); - factoryToRenderer.put(ABSTRACT_FUNCTION_WITH_BODY, new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); - factoryToRenderer.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); - factoryToRenderer.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer("Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); - - factoryToRenderer.put(NON_MEMBER_FUNCTION_NO_BODY, new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); - factoryToRenderer.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, new SimpleDiagnosticRenderer("Non final member in a final class")); - - factoryToRenderer.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SimpleDiagnosticRenderer("Public or protected member should specify a type")); - - factoryToRenderer.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer("Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning - factoryToRenderer.put(SUPERTYPE_NOT_INITIALIZED, new SimpleDiagnosticRenderer("This type has a constructor, and thus must be initialized here")); - factoryToRenderer.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, new SimpleDiagnosticRenderer("Constructor invocation should be explicitly specified")); - factoryToRenderer.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); - factoryToRenderer.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); - factoryToRenderer.put(BY_IN_SECONDARY_CONSTRUCTOR, new SimpleDiagnosticRenderer("'by'-clause is only supported for primary constructors")); - factoryToRenderer.put(INITIALIZER_WITH_NO_ARGUMENTS, new SimpleDiagnosticRenderer("Constructor arguments required")); - factoryToRenderer.put(MANY_CALLS_TO_THIS, new SimpleDiagnosticRenderer("Only one call to 'this(...)' is allowed")); - factoryToRenderer.put(NOTHING_TO_OVERRIDE, new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); - factoryToRenderer.put(VIRTUAL_MEMBER_HIDDEN, new DiagnosticWithParameters3Renderer("''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - - factoryToRenderer.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); - factoryToRenderer.put(ENUM_ENTRY_ILLEGAL_TYPE, new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); - - factoryToRenderer.put(UNINITIALIZED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); - factoryToRenderer.put(UNINITIALIZED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); - factoryToRenderer.put(UNUSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is never used", NAME)); - factoryToRenderer.put(UNUSED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is never used", NAME)); - factoryToRenderer.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); - factoryToRenderer.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); - factoryToRenderer.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer("The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); - factoryToRenderer.put(UNUSED_CHANGED_VALUE, new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); - factoryToRenderer.put(UNUSED_EXPRESSION, new SimpleDiagnosticRenderer("The expression is unused")); - factoryToRenderer.put(UNUSED_FUNCTION_LITERAL, new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); - - factoryToRenderer.put(VAL_REASSIGNMENT, new DiagnosticWithParameters1Renderer("Val can not be reassigned", NAME)); - factoryToRenderer.put(INITIALIZATION_BEFORE_DECLARATION, new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); - factoryToRenderer.put(VARIABLE_EXPECTED, new SimpleDiagnosticRenderer("Variable expected")); - - factoryToRenderer.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer("This property has a custom setter, so initialization using backing field required", NAME)); - factoryToRenderer.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer("Setter of this property can be overridden, so initialization using backing field required", NAME)); - - factoryToRenderer.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", NAME)); - - factoryToRenderer.put(UNREACHABLE_CODE, new SimpleDiagnosticRenderer("Unreachable code")); - - factoryToRenderer.put(MANY_CLASS_OBJECTS, new SimpleDiagnosticRenderer("Only one class object is allowed per class")); - factoryToRenderer.put(CLASS_OBJECT_NOT_ALLOWED, new SimpleDiagnosticRenderer("A class object is not allowed here")); - factoryToRenderer.put(DELEGATION_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot use delegation")); - factoryToRenderer.put(DELEGATION_NOT_TO_TRAIT, new SimpleDiagnosticRenderer("Only traits can be delegated to")); - factoryToRenderer.put(NO_CONSTRUCTOR, new SimpleDiagnosticRenderer("This class does not have a constructor")); - factoryToRenderer.put(NOT_A_CLASS, new SimpleDiagnosticRenderer("Not a class")); - factoryToRenderer.put(ILLEGAL_ESCAPE_SEQUENCE, new SimpleDiagnosticRenderer("Illegal escape sequence")); - - factoryToRenderer.put(LOCAL_EXTENSION_PROPERTY, new SimpleDiagnosticRenderer("Local extension properties are not allowed")); - factoryToRenderer.put(LOCAL_VARIABLE_WITH_GETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have getters")); - factoryToRenderer.put(LOCAL_VARIABLE_WITH_SETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have setters")); - factoryToRenderer.put(VAL_WITH_SETTER, new SimpleDiagnosticRenderer("A 'val'-property cannot have a setter")); - - factoryToRenderer.put(NO_GET_METHOD, new SimpleDiagnosticRenderer("No get method providing array access")); - factoryToRenderer.put(NO_SET_METHOD, new SimpleDiagnosticRenderer("No set method providing array access")); - - factoryToRenderer.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); - factoryToRenderer.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, new DiagnosticWithParameters2Renderer("Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); - factoryToRenderer.put(ASSIGN_OPERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Assignment operators ambiguity: {0}")); - - factoryToRenderer.put(EQUALS_MISSING, new SimpleDiagnosticRenderer("No method 'equals(Any?) : Boolean' available")); - factoryToRenderer.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); - factoryToRenderer.put(NAMESPACE_IS_NOT_AN_EXPRESSION, new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); - factoryToRenderer.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer("{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); - factoryToRenderer.put(DECLARATION_IN_ILLEGAL_CONTEXT, new SimpleDiagnosticRenderer("Declarations are not allowed in this position")); - factoryToRenderer.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, new SimpleDiagnosticRenderer("Setter parameters can not have default values")); - factoryToRenderer.put(NO_THIS, new SimpleDiagnosticRenderer("'this' is not defined in this context")); - factoryToRenderer.put(SUPER_NOT_AVAILABLE, new SimpleDiagnosticRenderer("No supertypes are accessible in this context")); - factoryToRenderer.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer("Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); - factoryToRenderer.put(ABSTRACT_SUPER_CALL, new SimpleDiagnosticRenderer("Abstract member cannot be accessed directly")); - factoryToRenderer.put(NOT_A_SUPERTYPE, new SimpleDiagnosticRenderer("Not a supertype")); - factoryToRenderer.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); - factoryToRenderer.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, new SimpleDiagnosticRenderer("No cast needed, use ':' instead")); - factoryToRenderer.put(USELESS_CAST, new SimpleDiagnosticRenderer("No cast needed")); - factoryToRenderer.put(CAST_NEVER_SUCCEEDS, new SimpleDiagnosticRenderer("This cast can never succeed")); - factoryToRenderer.put(WRONG_SETTER_PARAMETER_TYPE, new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); - factoryToRenderer.put(WRONG_GETTER_RETURN_TYPE, new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); - factoryToRenderer.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer("Please specify constructor invocation; classifier {0} does not have a class object", NAME)); - factoryToRenderer.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, new SimpleDiagnosticRenderer("Generic arguments of the base type must be specified")); - - factoryToRenderer.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); - factoryToRenderer.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); - factoryToRenderer.put(HAS_NEXT_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); - factoryToRenderer.put(HAS_NEXT_MUST_BE_READABLE, new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); - factoryToRenderer.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); - factoryToRenderer.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); - factoryToRenderer.put(NEXT_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().next()' is ambiguous for this expression")); - factoryToRenderer.put(NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().next()' function")); - factoryToRenderer.put(ITERATOR_MISSING, new SimpleDiagnosticRenderer("For-loop range must have an iterator() method")); - factoryToRenderer.put(ITERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Method 'iterator()' is ambiguous for this expression: {0}")); - - factoryToRenderer.put(COMPARE_TO_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); - factoryToRenderer.put(CALLEE_NOT_A_FUNCTION, new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); - - factoryToRenderer.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); - factoryToRenderer.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); - factoryToRenderer.put(RETURN_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); - factoryToRenderer.put(EXPECTED_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}", RENDER_TYPE)); - factoryToRenderer.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); - factoryToRenderer.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer("Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); - factoryToRenderer.put(EXPRESSION_EXPECTED, new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", new Renderer() { + map.put(REDUNDANT_MODIFIER, new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING)); + map.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); + map.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); + map.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); + map.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); + map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer("Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message + map.put(RETURN_NOT_ALLOWED, new SimpleDiagnosticRenderer("'return' is not allowed here")); + map.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); + map.put(LABEL_NAME_CLASH, new SimpleDiagnosticRenderer("There is more than one label with such a name in this scope")); + map.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, new SimpleDiagnosticRenderer("Expression expected, but a namespace name found")); + + map.put(CANNOT_IMPORT_FROM_ELEMENT, new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); + map.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer("Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); + map.put(USELESS_HIDDEN_IMPORT, new SimpleDiagnosticRenderer("Useless import, it is hidden further")); + map.put(USELESS_SIMPLE_IMPORT, new SimpleDiagnosticRenderer("Useless import, does nothing")); + + map.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer("Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); + + map.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); + map.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); + map.put(INACCESSIBLE_BACKING_FIELD, new SimpleDiagnosticRenderer("The backing field is not accessible here")); + map.put(NOT_PROPERTY_BACKING_FIELD, new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); + + map.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); + map.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); + map.put(NAMED_PARAMETER_NOT_FOUND, new UnresolvedReferenceDiagnosticRenderer("Cannot find a parameter with this name: ")); + map.put(VARARG_OUTSIDE_PARENTHESES, new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); + map.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); + + map.put(MANY_FUNCTION_LITERAL_ARGUMENTS, new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); + map.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); + + map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, new SimpleDiagnosticRenderer("This property cannot be declared abstract")); + map.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); + map.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, new SimpleDiagnosticRenderer("Property with initializer cannot be abstract")); + map.put(ABSTRACT_PROPERTY_WITH_GETTER, new SimpleDiagnosticRenderer("Property with getter implementation cannot be abstract")); + map.put(ABSTRACT_PROPERTY_WITH_SETTER, new SimpleDiagnosticRenderer("Property with setter implementation cannot be abstract")); + + map.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, new SimpleDiagnosticRenderer("Package member cannot be protected")); + + map.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); + map.put(BACKING_FIELD_IN_TRAIT, new SimpleDiagnosticRenderer("Property in a trait cannot have a backing field")); + map.put(MUST_BE_INITIALIZED, new SimpleDiagnosticRenderer("Property must be initialized")); + map.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, new SimpleDiagnosticRenderer("Property must be initialized or be abstract")); + map.put(PROPERTY_INITIALIZER_IN_TRAIT, new SimpleDiagnosticRenderer("Property initializers are not allowed in traits")); + map.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); + map.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); + map.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); + map.put(ABSTRACT_FUNCTION_WITH_BODY, new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); + map.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); + map.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer("Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); + + map.put(NON_MEMBER_FUNCTION_NO_BODY, new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); + map.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, new SimpleDiagnosticRenderer("Non final member in a final class")); + + map.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SimpleDiagnosticRenderer("Public or protected member should specify a type")); + + map.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer("Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning + map.put(SUPERTYPE_NOT_INITIALIZED, new SimpleDiagnosticRenderer("This type has a constructor, and thus must be initialized here")); + map.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, new SimpleDiagnosticRenderer("Constructor invocation should be explicitly specified")); + map.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); + map.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); + map.put(BY_IN_SECONDARY_CONSTRUCTOR, new SimpleDiagnosticRenderer("'by'-clause is only supported for primary constructors")); + map.put(INITIALIZER_WITH_NO_ARGUMENTS, new SimpleDiagnosticRenderer("Constructor arguments required")); + map.put(MANY_CALLS_TO_THIS, new SimpleDiagnosticRenderer("Only one call to 'this(...)' is allowed")); + map.put(NOTHING_TO_OVERRIDE, new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); + map.put(VIRTUAL_MEMBER_HIDDEN, new DiagnosticWithParameters3Renderer("''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + map.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); + map.put(ENUM_ENTRY_ILLEGAL_TYPE, new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); + + map.put(UNINITIALIZED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); + map.put(UNINITIALIZED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); + map.put(UNUSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is never used", NAME)); + map.put(UNUSED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is never used", NAME)); + map.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); + map.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); + map.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer("The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); + map.put(UNUSED_CHANGED_VALUE, new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); + map.put(UNUSED_EXPRESSION, new SimpleDiagnosticRenderer("The expression is unused")); + map.put(UNUSED_FUNCTION_LITERAL, new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); + + map.put(VAL_REASSIGNMENT, new DiagnosticWithParameters1Renderer("Val can not be reassigned", NAME)); + map.put(INITIALIZATION_BEFORE_DECLARATION, new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); + map.put(VARIABLE_EXPECTED, new SimpleDiagnosticRenderer("Variable expected")); + + map.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer("This property has a custom setter, so initialization using backing field required", NAME)); + map.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer("Setter of this property can be overridden, so initialization using backing field required", NAME)); + + map.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", NAME)); + + map.put(UNREACHABLE_CODE, new SimpleDiagnosticRenderer("Unreachable code")); + + map.put(MANY_CLASS_OBJECTS, new SimpleDiagnosticRenderer("Only one class object is allowed per class")); + map.put(CLASS_OBJECT_NOT_ALLOWED, new SimpleDiagnosticRenderer("A class object is not allowed here")); + map.put(DELEGATION_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot use delegation")); + map.put(DELEGATION_NOT_TO_TRAIT, new SimpleDiagnosticRenderer("Only traits can be delegated to")); + map.put(NO_CONSTRUCTOR, new SimpleDiagnosticRenderer("This class does not have a constructor")); + map.put(NOT_A_CLASS, new SimpleDiagnosticRenderer("Not a class")); + map.put(ILLEGAL_ESCAPE_SEQUENCE, new SimpleDiagnosticRenderer("Illegal escape sequence")); + + map.put(LOCAL_EXTENSION_PROPERTY, new SimpleDiagnosticRenderer("Local extension properties are not allowed")); + map.put(LOCAL_VARIABLE_WITH_GETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have getters")); + map.put(LOCAL_VARIABLE_WITH_SETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have setters")); + map.put(VAL_WITH_SETTER, new SimpleDiagnosticRenderer("A 'val'-property cannot have a setter")); + + map.put(NO_GET_METHOD, new SimpleDiagnosticRenderer("No get method providing array access")); + map.put(NO_SET_METHOD, new SimpleDiagnosticRenderer("No set method providing array access")); + + map.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); + map.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, new DiagnosticWithParameters2Renderer("Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); + map.put(ASSIGN_OPERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Assignment operators ambiguity: {0}")); + + map.put(EQUALS_MISSING, new SimpleDiagnosticRenderer("No method 'equals(Any?) : Boolean' available")); + map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); + map.put(NAMESPACE_IS_NOT_AN_EXPRESSION, new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); + map.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer("{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); + map.put(DECLARATION_IN_ILLEGAL_CONTEXT, new SimpleDiagnosticRenderer("Declarations are not allowed in this position")); + map.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, new SimpleDiagnosticRenderer("Setter parameters can not have default values")); + map.put(NO_THIS, new SimpleDiagnosticRenderer("'this' is not defined in this context")); + map.put(SUPER_NOT_AVAILABLE, new SimpleDiagnosticRenderer("No supertypes are accessible in this context")); + map.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer("Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); + map.put(ABSTRACT_SUPER_CALL, new SimpleDiagnosticRenderer("Abstract member cannot be accessed directly")); + map.put(NOT_A_SUPERTYPE, new SimpleDiagnosticRenderer("Not a supertype")); + map.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); + map.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, new SimpleDiagnosticRenderer("No cast needed, use ':' instead")); + map.put(USELESS_CAST, new SimpleDiagnosticRenderer("No cast needed")); + map.put(CAST_NEVER_SUCCEEDS, new SimpleDiagnosticRenderer("This cast can never succeed")); + map.put(WRONG_SETTER_PARAMETER_TYPE, new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); + map.put(WRONG_GETTER_RETURN_TYPE, new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); + map.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer("Please specify constructor invocation; classifier {0} does not have a class object", NAME)); + map.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, new SimpleDiagnosticRenderer("Generic arguments of the base type must be specified")); + + map.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); + map.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); + map.put(HAS_NEXT_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); + map.put(HAS_NEXT_MUST_BE_READABLE, new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); + map.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + map.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + map.put(NEXT_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().next()' is ambiguous for this expression")); + map.put(NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().next()' function")); + map.put(ITERATOR_MISSING, new SimpleDiagnosticRenderer("For-loop range must have an iterator() method")); + map.put(ITERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Method 'iterator()' is ambiguous for this expression: {0}")); + + map.put(COMPARE_TO_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); + map.put(CALLEE_NOT_A_FUNCTION, new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); + + map.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); + map.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); + map.put(RETURN_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); + map.put(EXPECTED_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}", RENDER_TYPE)); + map.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); + map.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer("Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); + map.put(EXPRESSION_EXPECTED, new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", new Renderer() { @NotNull @Override public String render(@NotNull JetExpression expression) { @@ -241,45 +241,45 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } })); - factoryToRenderer.put(UPPER_BOUND_VIOLATED, new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message - factoryToRenderer.put(FINAL_CLASS_OBJECT_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE)); - factoryToRenderer.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); - factoryToRenderer.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer("Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); - factoryToRenderer.put(CONFLICTING_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); - factoryToRenderer.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", NAME)); - - factoryToRenderer.put(TOO_MANY_ARGUMENTS, new DiagnosticWithParameters1Renderer("Too many arguments for {0}", TO_STRING)); - factoryToRenderer.put(ERROR_COMPILE_TIME_VALUE, new DiagnosticWithParameters1Renderer("{0}", TO_STRING)); - - factoryToRenderer.put(ELSE_MISPLACED_IN_WHEN, new SimpleDiagnosticRenderer("'else' entry must be the last one in a when-expression")); - - factoryToRenderer.put(NO_ELSE_IN_WHEN, new SimpleDiagnosticRenderer("'when' expression must contain 'else' branch")); - factoryToRenderer.put(TYPE_MISMATCH_IN_RANGE, new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); - factoryToRenderer.put(CYCLIC_INHERITANCE_HIERARCHY, new SimpleDiagnosticRenderer("There's a cycle in the inheritance hierarchy for this type")); - - factoryToRenderer.put(MANY_CLASSES_IN_SUPERTYPE_LIST, new SimpleDiagnosticRenderer("Only one class may appear in a supertype list")); - factoryToRenderer.put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, new SimpleDiagnosticRenderer("Only classes and traits may serve as supertypes")); - factoryToRenderer.put(SUPERTYPE_INITIALIZED_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot initialize supertypes")); - factoryToRenderer.put(CONSTRUCTOR_IN_TRAIT, new SimpleDiagnosticRenderer("A trait may not have a constructor")); - factoryToRenderer.put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, new SimpleDiagnosticRenderer("Secondary constructors are not supported")); - factoryToRenderer.put(SUPERTYPE_APPEARS_TWICE, new SimpleDiagnosticRenderer("A supertype appears twice")); - factoryToRenderer.put(FINAL_SUPERTYPE, new SimpleDiagnosticRenderer("This type is final, so it cannot be inherited from")); - - factoryToRenderer.put(ILLEGAL_SELECTOR, new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); - - factoryToRenderer.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); - factoryToRenderer.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, new SimpleDiagnosticRenderer("'break' and 'continue' are only allowed inside a loop")); - factoryToRenderer.put(NOT_A_LOOP_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not denote a loop", TO_STRING)); - factoryToRenderer.put(NOT_A_RETURN_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", TO_STRING)); - - factoryToRenderer.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); - factoryToRenderer.put(NULLABLE_SUPERTYPE, new SimpleDiagnosticRenderer("A supertype cannot be nullable")); - factoryToRenderer.put(UNSAFE_CALL, new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE)); - factoryToRenderer.put(AMBIGUOUS_LABEL, new SimpleDiagnosticRenderer("Ambiguous label")); - factoryToRenderer.put(UNSUPPORTED, new DiagnosticWithParameters1Renderer("Unsupported [{0}]", TO_STRING)); - factoryToRenderer.put(UNNECESSARY_SAFE_CALL, new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); - factoryToRenderer.put(UNNECESSARY_NOT_NULL_ASSERTION, new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE)); - factoryToRenderer.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, new DiagnosticWithParameters2Renderer("{0} does not refer to a type parameter of {1}", new Renderer() { + map.put(UPPER_BOUND_VIOLATED, new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message + map.put(FINAL_CLASS_OBJECT_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE)); + map.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); + map.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer("Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); + map.put(CONFLICTING_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); + map.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", NAME)); + + map.put(TOO_MANY_ARGUMENTS, new DiagnosticWithParameters1Renderer("Too many arguments for {0}", TO_STRING)); + map.put(ERROR_COMPILE_TIME_VALUE, new DiagnosticWithParameters1Renderer("{0}", TO_STRING)); + + map.put(ELSE_MISPLACED_IN_WHEN, new SimpleDiagnosticRenderer("'else' entry must be the last one in a when-expression")); + + map.put(NO_ELSE_IN_WHEN, new SimpleDiagnosticRenderer("'when' expression must contain 'else' branch")); + map.put(TYPE_MISMATCH_IN_RANGE, new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); + map.put(CYCLIC_INHERITANCE_HIERARCHY, new SimpleDiagnosticRenderer("There's a cycle in the inheritance hierarchy for this type")); + + map.put(MANY_CLASSES_IN_SUPERTYPE_LIST, new SimpleDiagnosticRenderer("Only one class may appear in a supertype list")); + map.put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, new SimpleDiagnosticRenderer("Only classes and traits may serve as supertypes")); + map.put(SUPERTYPE_INITIALIZED_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot initialize supertypes")); + map.put(CONSTRUCTOR_IN_TRAIT, new SimpleDiagnosticRenderer("A trait may not have a constructor")); + map.put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, new SimpleDiagnosticRenderer("Secondary constructors are not supported")); + map.put(SUPERTYPE_APPEARS_TWICE, new SimpleDiagnosticRenderer("A supertype appears twice")); + map.put(FINAL_SUPERTYPE, new SimpleDiagnosticRenderer("This type is final, so it cannot be inherited from")); + + map.put(ILLEGAL_SELECTOR, new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); + + map.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); + map.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, new SimpleDiagnosticRenderer("'break' and 'continue' are only allowed inside a loop")); + map.put(NOT_A_LOOP_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not denote a loop", TO_STRING)); + map.put(NOT_A_RETURN_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", TO_STRING)); + + map.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); + map.put(NULLABLE_SUPERTYPE, new SimpleDiagnosticRenderer("A supertype cannot be nullable")); + map.put(UNSAFE_CALL, new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE)); + map.put(AMBIGUOUS_LABEL, new SimpleDiagnosticRenderer("Ambiguous label")); + map.put(UNSUPPORTED, new DiagnosticWithParameters1Renderer("Unsupported [{0}]", TO_STRING)); + map.put(UNNECESSARY_SAFE_CALL, new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); + map.put(UNNECESSARY_NOT_NULL_ASSERTION, new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE)); + map.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, new DiagnosticWithParameters2Renderer("{0} does not refer to a type parameter of {1}", new Renderer() { @NotNull @Override public String render(@NotNull JetTypeConstraint typeConstraint) { @@ -287,19 +287,19 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer return typeConstraint.getSubjectTypeParameterName().getReferencedName(); } }, NAME)); - factoryToRenderer.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer("Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); - - factoryToRenderer.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer("The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); - factoryToRenderer.put(TYPE_MISMATCH_IN_CONDITION, new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); - factoryToRenderer.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer("Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message - factoryToRenderer.put(TYPE_MISMATCH_IN_BINDING_PATTERN, new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE)); - factoryToRenderer.put(INCOMPATIBLE_TYPES, new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); - factoryToRenderer.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); - - factoryToRenderer.put(CANNOT_CHECK_FOR_ERASED, new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); - factoryToRenderer.put(UNCHECKED_CAST, new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); - - factoryToRenderer.put(INCONSISTENT_TYPE_PARAMETER_VALUES, new DiagnosticWithParameters3Renderer>("Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { + map.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer("Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); + + map.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer("The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); + map.put(TYPE_MISMATCH_IN_CONDITION, new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); + map.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer("Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message + map.put(TYPE_MISMATCH_IN_BINDING_PATTERN, new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE)); + map.put(INCOMPATIBLE_TYPES, new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); + map.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); + + map.put(CANNOT_CHECK_FOR_ERASED, new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); + map.put(UNCHECKED_CAST, new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); + + map.put(INCONSISTENT_TYPE_PARAMETER_VALUES, new DiagnosticWithParameters3Renderer>("Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { @NotNull @Override public String render(@NotNull Collection types) { @@ -315,7 +315,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } })); - factoryToRenderer.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer("Operator {0} cannot be applied to {1} and {2}", new Renderer() { + map.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer("Operator {0} cannot be applied to {1} and {2}", new Renderer() { @NotNull @Override public String render(@NotNull JetSimpleNameExpression nameExpression) { @@ -323,34 +323,34 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer return nameExpression.getReferencedName(); } }, TO_STRING, TO_STRING)); - - factoryToRenderer.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer("''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); - factoryToRenderer.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); - factoryToRenderer.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); - - factoryToRenderer.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer("Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - - factoryToRenderer.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer("Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - - factoryToRenderer.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); - - factoryToRenderer.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); - - factoryToRenderer.put(CONFLICTING_OVERLOADS, new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING)); - - - factoryToRenderer.put(RESULT_TYPE_MISMATCH, new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE)); - factoryToRenderer.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer("Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", TO_STRING, TO_STRING, TO_STRING)); - - factoryToRenderer.put(OVERLOAD_RESOLUTION_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Overload resolution ambiguity: {0}")); - factoryToRenderer.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer("None of the following functions can be called with the arguments supplied: {0}")); - factoryToRenderer.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", DescriptorRenderer.TEXT)); - factoryToRenderer.put(MISSING_RECEIVER, new DiagnosticWithParameters1Renderer("A receiver of type {0} is required", RENDER_TYPE)); - factoryToRenderer.put(NO_RECEIVER_ADMITTED, new SimpleDiagnosticRenderer("No receiver can be passed to this function or property")); - - factoryToRenderer.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, new SimpleDiagnosticRenderer("Can not create an instance of an abstract class")); - factoryToRenderer.put(TYPE_INFERENCE_FAILED, new DiagnosticWithParameters1Renderer("Type inference failed: {0}", TO_STRING)); - factoryToRenderer.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { + + map.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer("''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); + map.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + map.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + + map.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer("Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + map.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer("Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + + map.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + + map.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + + map.put(CONFLICTING_OVERLOADS, new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING)); + + + map.put(RESULT_TYPE_MISMATCH, new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE)); + map.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer("Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", TO_STRING, TO_STRING, TO_STRING)); + + map.put(OVERLOAD_RESOLUTION_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Overload resolution ambiguity: {0}")); + map.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer("None of the following functions can be called with the arguments supplied: {0}")); + map.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", DescriptorRenderer.TEXT)); + map.put(MISSING_RECEIVER, new DiagnosticWithParameters1Renderer("A receiver of type {0} is required", RENDER_TYPE)); + map.put(NO_RECEIVER_ADMITTED, new SimpleDiagnosticRenderer("No receiver can be passed to this function or property")); + + map.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, new SimpleDiagnosticRenderer("Can not create an instance of an abstract class")); + map.put(TYPE_INFERENCE_FAILED, new DiagnosticWithParameters1Renderer("Type inference failed: {0}", TO_STRING)); + map.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { @NotNull @Override public String render(@NotNull Integer argument) { @@ -358,17 +358,17 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } })); - factoryToRenderer.put(UNRESOLVED_IDE_TEMPLATE, new DiagnosticWithParameters1Renderer("Unresolved IDE template: {0}", TO_STRING)); - - factoryToRenderer.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer("This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); - - factoryToRenderer.put(NOT_AN_ANNOTATION_CLASS, new DiagnosticWithParameters1Renderer("{0} is not an annotation class", TO_STRING)); + map.put(UNRESOLVED_IDE_TEMPLATE, new DiagnosticWithParameters1Renderer("Unresolved IDE template: {0}", TO_STRING)); + + map.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer("This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); + + map.put(NOT_AN_ANNOTATION_CLASS, new DiagnosticWithParameters1Renderer("{0} is not an annotation class", TO_STRING)); } @NotNull @Override public String render(@NotNull Diagnostic diagnostic) { - DiagnosticRenderer renderer = factoryToRenderer.get(diagnostic.getFactory()); + DiagnosticRenderer renderer = map.get(diagnostic.getFactory()); if (renderer == null) { throw new IllegalArgumentException("Don't know how to render diagnostic of type " + diagnostic.getFactory().getName()); } From 555f1c9e6f4ab36407e511255774ac9f40a64043 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:16:06 +0400 Subject: [PATCH 13/76] Reformatted DefaultDiagnosticRenderer to fit it in screen. --- .../rendering/DefaultDiagnosticRenderer.java | 459 ++++++++++++------ 1 file changed, 300 insertions(+), 159 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index f5e53b49d43..ce75f36e9c2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -41,7 +41,8 @@ import static org.jetbrains.jet.lang.diagnostics.Renderers.*; public class DefaultDiagnosticRenderer implements DiagnosticRenderer { public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); - private final Map> map = new HashMap>(); + private final Map> map = + new HashMap>(); private DefaultDiagnosticRenderer() { map.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { @@ -54,121 +55,178 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(UNRESOLVED_REFERENCE, new UnresolvedReferenceDiagnosticRenderer("Unresolved reference: ")); - map.put(INVISIBLE_REFERENCE, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); - map.put(INVISIBLE_MEMBER, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); + map.put(INVISIBLE_REFERENCE, + new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", + NAME, NAME)); + map.put(INVISIBLE_MEMBER, + new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", + NAME, NAME)); map.put(REDECLARATION, new RedeclarationDiagnosticRenderer("Redeclaration: ")); map.put(NAME_SHADOWING, new RedeclarationDiagnosticRenderer("Name shadowed: ")); - map.put(TYPE_MISMATCH, new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE)); - map.put(INCOMPATIBLE_MODIFIERS, new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection tokens) { - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { - JetKeywordToken modifier = iterator.next(); - sb.append(modifier.getValue()); - if (iterator.hasNext()) { - sb.append(" "); - } - } - return sb.toString(); - } - } - )); + map.put(TYPE_MISMATCH, + new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", + RENDER_TYPE, RENDER_TYPE)); + map.put(INCOMPATIBLE_MODIFIERS, + new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", + new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection tokens) { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = + tokens.iterator(); + iterator.hasNext(); ) { + JetKeywordToken modifier = iterator.next(); + sb.append(modifier.getValue()); + if (iterator.hasNext()) { + sb.append(" "); + } + } + return sb.toString(); + } + } + )); map.put(ILLEGAL_MODIFIER, new DiagnosticWithParameters1Renderer("Illegal modifier ''{0}''", TO_STRING)); - map.put(REDUNDANT_MODIFIER, new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING)); + map.put(REDUNDANT_MODIFIER, + new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", + TO_STRING, TO_STRING)); map.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); map.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); map.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); map.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); - map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer("Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message + map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer( + "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message map.put(RETURN_NOT_ALLOWED, new SimpleDiagnosticRenderer("'return' is not allowed here")); - map.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); + map.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, + new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); map.put(LABEL_NAME_CLASH, new SimpleDiagnosticRenderer("There is more than one label with such a name in this scope")); map.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, new SimpleDiagnosticRenderer("Expression expected, but a namespace name found")); - map.put(CANNOT_IMPORT_FROM_ELEMENT, new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); - map.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer("Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); + map.put(CANNOT_IMPORT_FROM_ELEMENT, + new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); + map.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer( + "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); map.put(USELESS_HIDDEN_IMPORT, new SimpleDiagnosticRenderer("Useless import, it is hidden further")); map.put(USELESS_SIMPLE_IMPORT, new SimpleDiagnosticRenderer("Useless import, does nothing")); - map.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer("Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); + map.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer( + "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); - map.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); - map.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); + map.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, + new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); + map.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer( + "This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); map.put(INACCESSIBLE_BACKING_FIELD, new SimpleDiagnosticRenderer("The backing field is not accessible here")); - map.put(NOT_PROPERTY_BACKING_FIELD, new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); + map.put(NOT_PROPERTY_BACKING_FIELD, + new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); - map.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); + map.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, + new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); map.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); map.put(NAMED_PARAMETER_NOT_FOUND, new UnresolvedReferenceDiagnosticRenderer("Cannot find a parameter with this name: ")); - map.put(VARARG_OUTSIDE_PARENTHESES, new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); + map.put(VARARG_OUTSIDE_PARENTHESES, + new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); map.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); - map.put(MANY_FUNCTION_LITERAL_ARGUMENTS, new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); - map.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); + map.put(MANY_FUNCTION_LITERAL_ARGUMENTS, + new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); + map.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, + new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); - map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, new SimpleDiagnosticRenderer("This property cannot be declared abstract")); - map.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); + map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, + new SimpleDiagnosticRenderer("This property cannot be declared abstract")); + map.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, + new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); map.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, new SimpleDiagnosticRenderer("Property with initializer cannot be abstract")); map.put(ABSTRACT_PROPERTY_WITH_GETTER, new SimpleDiagnosticRenderer("Property with getter implementation cannot be abstract")); map.put(ABSTRACT_PROPERTY_WITH_SETTER, new SimpleDiagnosticRenderer("Property with setter implementation cannot be abstract")); map.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, new SimpleDiagnosticRenderer("Package member cannot be protected")); - map.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); + map.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, + new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); map.put(BACKING_FIELD_IN_TRAIT, new SimpleDiagnosticRenderer("Property in a trait cannot have a backing field")); map.put(MUST_BE_INITIALIZED, new SimpleDiagnosticRenderer("Property must be initialized")); map.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, new SimpleDiagnosticRenderer("Property must be initialized or be abstract")); map.put(PROPERTY_INITIALIZER_IN_TRAIT, new SimpleDiagnosticRenderer("Property initializers are not allowed in traits")); - map.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); - map.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); - map.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING)); - map.put(ABSTRACT_FUNCTION_WITH_BODY, new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); - map.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); - map.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer("Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); + map.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, + new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); + map.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, + new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", + TO_STRING, TO_STRING, TO_STRING)); + map.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, + new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", + TO_STRING, TO_STRING, TO_STRING)); + map.put(ABSTRACT_FUNCTION_WITH_BODY, + new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); + map.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, + new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); + map.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer( + "Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); - map.put(NON_MEMBER_FUNCTION_NO_BODY, new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); + map.put(NON_MEMBER_FUNCTION_NO_BODY, + new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); map.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, new SimpleDiagnosticRenderer("Non final member in a final class")); map.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SimpleDiagnosticRenderer("Public or protected member should specify a type")); - map.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer("Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning + map.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer( + "Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning map.put(SUPERTYPE_NOT_INITIALIZED, new SimpleDiagnosticRenderer("This type has a constructor, and thus must be initialized here")); map.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, new SimpleDiagnosticRenderer("Constructor invocation should be explicitly specified")); - map.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); - map.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); + map.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, + new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); + map.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, + new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); map.put(BY_IN_SECONDARY_CONSTRUCTOR, new SimpleDiagnosticRenderer("'by'-clause is only supported for primary constructors")); map.put(INITIALIZER_WITH_NO_ARGUMENTS, new SimpleDiagnosticRenderer("Constructor arguments required")); map.put(MANY_CALLS_TO_THIS, new SimpleDiagnosticRenderer("Only one call to 'this(...)' is allowed")); - map.put(NOTHING_TO_OVERRIDE, new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); - map.put(VIRTUAL_MEMBER_HIDDEN, new DiagnosticWithParameters3Renderer("''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + map.put(NOTHING_TO_OVERRIDE, + new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); + map.put(VIRTUAL_MEMBER_HIDDEN, + new DiagnosticWithParameters3Renderer( + "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - map.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); - map.put(ENUM_ENTRY_ILLEGAL_TYPE, new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); + map.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, + new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); + map.put(ENUM_ENTRY_ILLEGAL_TYPE, + new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); - map.put(UNINITIALIZED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); - map.put(UNINITIALIZED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); + map.put(UNINITIALIZED_VARIABLE, + new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); + map.put(UNINITIALIZED_PARAMETER, + new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); map.put(UNUSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is never used", NAME)); map.put(UNUSED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is never used", NAME)); - map.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); - map.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); - map.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer("The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); - map.put(UNUSED_CHANGED_VALUE, new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); + map.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, + new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); + map.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, + new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); + map.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer( + "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); + map.put(UNUSED_CHANGED_VALUE, + new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); map.put(UNUSED_EXPRESSION, new SimpleDiagnosticRenderer("The expression is unused")); - map.put(UNUSED_FUNCTION_LITERAL, new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); + map.put(UNUSED_FUNCTION_LITERAL, + new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); map.put(VAL_REASSIGNMENT, new DiagnosticWithParameters1Renderer("Val can not be reassigned", NAME)); - map.put(INITIALIZATION_BEFORE_DECLARATION, new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); + map.put(INITIALIZATION_BEFORE_DECLARATION, + new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); map.put(VARIABLE_EXPECTED, new SimpleDiagnosticRenderer("Variable expected")); - map.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer("This property has a custom setter, so initialization using backing field required", NAME)); - map.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer("Setter of this property can be overridden, so initialization using backing field required", NAME)); + map.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer( + "This property has a custom setter, so initialization using backing field required", NAME)); + map.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer( + "Setter of this property can be overridden, so initialization using backing field required", NAME)); - map.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", NAME)); + map.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, + new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", + NAME)); map.put(UNREACHABLE_CODE, new SimpleDiagnosticRenderer("Unreachable code")); @@ -188,65 +246,102 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(NO_GET_METHOD, new SimpleDiagnosticRenderer("No get method providing array access")); map.put(NO_SET_METHOD, new SimpleDiagnosticRenderer("No set method providing array access")); - map.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); - map.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, new DiagnosticWithParameters2Renderer("Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); + map.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, + new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); + map.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, + new DiagnosticWithParameters2Renderer( + "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); map.put(ASSIGN_OPERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Assignment operators ambiguity: {0}")); map.put(EQUALS_MISSING, new SimpleDiagnosticRenderer("No method 'equals(Any?) : Boolean' available")); - map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); - map.put(NAMESPACE_IS_NOT_AN_EXPRESSION, new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); - map.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer("{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); + map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, + new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); + map.put(NAMESPACE_IS_NOT_AN_EXPRESSION, + new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); + map.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer( + "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); map.put(DECLARATION_IN_ILLEGAL_CONTEXT, new SimpleDiagnosticRenderer("Declarations are not allowed in this position")); map.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, new SimpleDiagnosticRenderer("Setter parameters can not have default values")); map.put(NO_THIS, new SimpleDiagnosticRenderer("'this' is not defined in this context")); map.put(SUPER_NOT_AVAILABLE, new SimpleDiagnosticRenderer("No supertypes are accessible in this context")); - map.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer("Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); + map.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer( + "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); map.put(ABSTRACT_SUPER_CALL, new SimpleDiagnosticRenderer("Abstract member cannot be accessed directly")); map.put(NOT_A_SUPERTYPE, new SimpleDiagnosticRenderer("Not a supertype")); - map.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); + map.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, + new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); map.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, new SimpleDiagnosticRenderer("No cast needed, use ':' instead")); map.put(USELESS_CAST, new SimpleDiagnosticRenderer("No cast needed")); map.put(CAST_NEVER_SUCCEEDS, new SimpleDiagnosticRenderer("This cast can never succeed")); - map.put(WRONG_SETTER_PARAMETER_TYPE, new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); - map.put(WRONG_GETTER_RETURN_TYPE, new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE)); - map.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer("Please specify constructor invocation; classifier {0} does not have a class object", NAME)); + map.put(WRONG_SETTER_PARAMETER_TYPE, + new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", + RENDER_TYPE)); + map.put(WRONG_GETTER_RETURN_TYPE, + new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", + RENDER_TYPE)); + map.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer( + "Please specify constructor invocation; classifier {0} does not have a class object", NAME)); map.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, new SimpleDiagnosticRenderer("Generic arguments of the base type must be specified")); - map.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); - map.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); - map.put(HAS_NEXT_FUNCTION_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); - map.put(HAS_NEXT_MUST_BE_READABLE, new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); - map.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); - map.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + map.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, + new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); + map.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer( + "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); + map.put(HAS_NEXT_FUNCTION_AMBIGUITY, + new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); + map.put(HAS_NEXT_MUST_BE_READABLE, + new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); + map.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( + "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); + map.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( + "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); map.put(NEXT_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().next()' is ambiguous for this expression")); map.put(NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().next()' function")); map.put(ITERATOR_MISSING, new SimpleDiagnosticRenderer("For-loop range must have an iterator() method")); map.put(ITERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Method 'iterator()' is ambiguous for this expression: {0}")); - map.put(COMPARE_TO_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); - map.put(CALLEE_NOT_A_FUNCTION, new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); + map.put(COMPARE_TO_TYPE_MISMATCH, + new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); + map.put(CALLEE_NOT_A_FUNCTION, + new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); - map.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); - map.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); - map.put(RETURN_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); + map.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, + new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); + map.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, + new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); + map.put(RETURN_TYPE_MISMATCH, + new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); map.put(EXPECTED_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}", RENDER_TYPE)); - map.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); - map.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer("Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); - map.put(EXPRESSION_EXPECTED, new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetExpression expression) { - String expressionType = expression.toString(); - return expressionType.substring(0, 1) + expressionType.substring(1).toLowerCase(); - } - })); + map.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( + "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); + map.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer( + "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); + map.put(EXPRESSION_EXPECTED, + new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", + new Renderer() { + @NotNull + @Override + public String render(@NotNull JetExpression expression) { + String expressionType = expression.toString(); + return expressionType.substring(0, 1) + + expressionType.substring(1).toLowerCase(); + } + })); - map.put(UPPER_BOUND_VIOLATED, new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message - map.put(FINAL_CLASS_OBJECT_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE)); - map.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); - map.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer("Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); - map.put(CONFLICTING_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); - map.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", NAME)); + map.put(UPPER_BOUND_VIOLATED, + new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message + map.put(FINAL_CLASS_OBJECT_UPPER_BOUND, + new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", + RENDER_TYPE)); + map.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer( + "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); + map.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer( + "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); + map.put(CONFLICTING_UPPER_BOUNDS, + new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); + map.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, + new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", + NAME)); map.put(TOO_MANY_ARGUMENTS, new DiagnosticWithParameters1Renderer("Too many arguments for {0}", TO_STRING)); map.put(ERROR_COMPILE_TIME_VALUE, new DiagnosticWithParameters1Renderer("{0}", TO_STRING)); @@ -254,7 +349,8 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(ELSE_MISPLACED_IN_WHEN, new SimpleDiagnosticRenderer("'else' entry must be the last one in a when-expression")); map.put(NO_ELSE_IN_WHEN, new SimpleDiagnosticRenderer("'when' expression must contain 'else' branch")); - map.put(TYPE_MISMATCH_IN_RANGE, new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); + map.put(TYPE_MISMATCH_IN_RANGE, + new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); map.put(CYCLIC_INHERITANCE_HIERARCHY, new SimpleDiagnosticRenderer("There's a cycle in the inheritance hierarchy for this type")); map.put(MANY_CLASSES_IN_SUPERTYPE_LIST, new SimpleDiagnosticRenderer("Only one class may appear in a supertype list")); @@ -265,57 +361,82 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(SUPERTYPE_APPEARS_TWICE, new SimpleDiagnosticRenderer("A supertype appears twice")); map.put(FINAL_SUPERTYPE, new SimpleDiagnosticRenderer("This type is final, so it cannot be inherited from")); - map.put(ILLEGAL_SELECTOR, new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); + map.put(ILLEGAL_SELECTOR, + new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); - map.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); + map.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, + new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); map.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, new SimpleDiagnosticRenderer("'break' and 'continue' are only allowed inside a loop")); map.put(NOT_A_LOOP_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not denote a loop", TO_STRING)); - map.put(NOT_A_RETURN_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", TO_STRING)); + map.put(NOT_A_RETURN_LABEL, + new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", + TO_STRING)); - map.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); + map.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, + new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); map.put(NULLABLE_SUPERTYPE, new SimpleDiagnosticRenderer("A supertype cannot be nullable")); - map.put(UNSAFE_CALL, new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE)); + map.put(UNSAFE_CALL, + new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", + RENDER_TYPE)); map.put(AMBIGUOUS_LABEL, new SimpleDiagnosticRenderer("Ambiguous label")); map.put(UNSUPPORTED, new DiagnosticWithParameters1Renderer("Unsupported [{0}]", TO_STRING)); - map.put(UNNECESSARY_SAFE_CALL, new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); - map.put(UNNECESSARY_NOT_NULL_ASSERTION, new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE)); - map.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, new DiagnosticWithParameters2Renderer("{0} does not refer to a type parameter of {1}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetTypeConstraint typeConstraint) { - //noinspection ConstantConditions - return typeConstraint.getSubjectTypeParameterName().getReferencedName(); - } - }, NAME)); - map.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer("Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); - - map.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer("The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); - map.put(TYPE_MISMATCH_IN_CONDITION, new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); - map.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer("Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message - map.put(TYPE_MISMATCH_IN_BINDING_PATTERN, new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE)); - map.put(INCOMPATIBLE_TYPES, new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); - map.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); - - map.put(CANNOT_CHECK_FOR_ERASED, new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); - map.put(UNCHECKED_CAST, new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); - - map.put(INCONSISTENT_TYPE_PARAMETER_VALUES, new DiagnosticWithParameters3Renderer>("Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { + map.put(UNNECESSARY_SAFE_CALL, + new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); + map.put(UNNECESSARY_NOT_NULL_ASSERTION, + new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", + RENDER_TYPE)); + map.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, + new DiagnosticWithParameters2Renderer( + "{0} does not refer to a type parameter of {1}", new Renderer() { @NotNull @Override - public String render(@NotNull Collection types) { - StringBuilder builder = new StringBuilder(); - for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { - JetType jetType = iterator.next(); - builder.append(jetType); - if (iterator.hasNext()) { - builder.append(", "); - } - } - return builder.toString(); + public String render(@NotNull JetTypeConstraint typeConstraint) { + //noinspection ConstantConditions + return typeConstraint.getSubjectTypeParameterName().getReferencedName(); } - })); + }, NAME)); + map.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer( + "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); - map.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer("Operator {0} cannot be applied to {1} and {2}", new Renderer() { + map.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer( + "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); + map.put(TYPE_MISMATCH_IN_CONDITION, + new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); + map.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer( + "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message + map.put(TYPE_MISMATCH_IN_BINDING_PATTERN, + new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", + RENDER_TYPE, RENDER_TYPE)); + map.put(INCOMPATIBLE_TYPES, + new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); + map.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); + + map.put(CANNOT_CHECK_FOR_ERASED, + new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); + map.put(UNCHECKED_CAST, + new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); + + map.put(INCONSISTENT_TYPE_PARAMETER_VALUES, + new DiagnosticWithParameters3Renderer>( + "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, + new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection types) { + StringBuilder builder = new StringBuilder(); + for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { + JetType jetType = iterator.next(); + builder.append(jetType); + if (iterator.hasNext()) { + builder.append(", "); + } + } + return builder.toString(); + } + })); + + map.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer( + "Operator {0} cannot be applied to {1} and {2}", new Renderer() { @NotNull @Override public String render(@NotNull JetSimpleNameExpression nameExpression) { @@ -324,43 +445,63 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } }, TO_STRING, TO_STRING)); - map.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer("''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); - map.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); - map.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, new DiagnosticWithParameters3Renderer("Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + map.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer( + "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); + map.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, + new DiagnosticWithParameters3Renderer( + "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + map.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, + new DiagnosticWithParameters3Renderer( + "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); - map.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer("Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + map.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer( + "Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT)); - map.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer("Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + map.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer( + "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - map.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + map.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer( + "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); - map.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer("{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + map.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer( + "{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); - map.put(CONFLICTING_OVERLOADS, new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING)); + map.put(CONFLICTING_OVERLOADS, + new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", + DescriptorRenderer.TEXT, TO_STRING)); - map.put(RESULT_TYPE_MISMATCH, new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE)); - map.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer("Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", TO_STRING, TO_STRING, TO_STRING)); + map.put(RESULT_TYPE_MISMATCH, + new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, + RENDER_TYPE, RENDER_TYPE)); + map.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer( + "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", + TO_STRING, TO_STRING, TO_STRING)); map.put(OVERLOAD_RESOLUTION_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Overload resolution ambiguity: {0}")); - map.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer("None of the following functions can be called with the arguments supplied: {0}")); - map.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", DescriptorRenderer.TEXT)); + map.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer( + "None of the following functions can be called with the arguments supplied: {0}")); + map.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", + DescriptorRenderer.TEXT)); map.put(MISSING_RECEIVER, new DiagnosticWithParameters1Renderer("A receiver of type {0} is required", RENDER_TYPE)); map.put(NO_RECEIVER_ADMITTED, new SimpleDiagnosticRenderer("No receiver can be passed to this function or property")); map.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, new SimpleDiagnosticRenderer("Can not create an instance of an abstract class")); map.put(TYPE_INFERENCE_FAILED, new DiagnosticWithParameters1Renderer("Type inference failed: {0}", TO_STRING)); - map.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { - @NotNull - @Override - public String render(@NotNull Integer argument) { - return argument == 0 ? "No" : argument.toString(); - } - })); + map.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, + new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { + @NotNull + @Override + public String render(@NotNull Integer argument) { + return argument == 0 ? "No" : argument.toString(); + } + })); map.put(UNRESOLVED_IDE_TEMPLATE, new DiagnosticWithParameters1Renderer("Unresolved IDE template: {0}", TO_STRING)); - map.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer("This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); + map.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer( + "This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); map.put(NOT_AN_ANNOTATION_CLASS, new DiagnosticWithParameters1Renderer("{0} is not an annotation class", TO_STRING)); } From 9a917d7127afa628775fd43364f1e7039be6f383 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:16:44 +0400 Subject: [PATCH 14/76] Removed unused RedeclarationDiagnosticWithDeferredResolution. --- .../diagnostics/RedeclarationDiagnostic.java | 63 ------------------- 1 file changed, 63 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index acfa00a21cc..fd0fea2237a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -66,69 +66,6 @@ public interface RedeclarationDiagnostic extends Diagnostic { } } - class RedeclarationDiagnosticWithDeferredResolution implements RedeclarationDiagnostic { - - private final DeclarationDescriptor duplicatingDescriptor; - private final BindingContext contextToResolveToDeclaration; - private final RedeclarationDiagnosticFactory factory; - private PsiElement element; - - public RedeclarationDiagnosticWithDeferredResolution(@NotNull DeclarationDescriptor duplicatingDescriptor, @NotNull BindingContext contextToResolveToDeclaration, RedeclarationDiagnosticFactory factory) { - this.duplicatingDescriptor = duplicatingDescriptor; - this.contextToResolveToDeclaration = contextToResolveToDeclaration; - this.factory = factory; - } - - private PsiElement resolve() { - if (element == null) { - element = BindingContextUtils.descriptorToDeclaration(contextToResolveToDeclaration, duplicatingDescriptor); - assert element != null : "No element for descriptor: " + duplicatingDescriptor; - } - return element; - } - - @NotNull - @Override - public PsiElement getPsiElement() { - return resolve(); - } - - @NotNull - @Override - public List getTextRanges() { - return POSITION_REDECLARATION.mark(getPsiElement()); - } - - @NotNull - @Override - public PsiFile getPsiFile() { - return resolve().getContainingFile(); - } - - @NotNull - @Override - public AbstractDiagnosticFactory getFactory() { - return factory; - } - - @Override - public String getName() { - return duplicatingDescriptor.getName(); - } - - @NotNull - @Override - public String getMessage() { - return factory.makeMessage(getName()); - } - - @NotNull - @Override - public Severity getSeverity() { - return factory.severity; - } - } - PositioningStrategy POSITION_REDECLARATION = new PositioningStrategy() { @NotNull @Override From 623cbe7cca70b166daa07ec4a05f41d34e75a8e6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 13:19:25 +0400 Subject: [PATCH 15/76] Moved 'Renderer' and 'Renderers' to diagnostics.rendering package. --- .../diagnostics/AmbiguousDescriptorDiagnosticFactory.java | 4 ++-- .../jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java | 2 ++ .../jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java | 2 ++ .../jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java | 2 ++ .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 4 ++-- .../jet/lang/diagnostics/UnusedElementDiagnosticFactory.java | 3 +++ .../lang/diagnostics/rendering/DefaultDiagnosticRenderer.java | 2 +- .../jet/lang/diagnostics/rendering/DiagnosticRenderer.java | 1 - .../rendering/DiagnosticWithParameters1Renderer.java | 1 - .../rendering/DiagnosticWithParameters2Renderer.java | 1 - .../rendering/DiagnosticWithParameters3Renderer.java | 1 - .../jet/lang/diagnostics/{ => rendering}/Renderer.java | 2 +- .../jet/lang/diagnostics/{ => rendering}/Renderers.java | 2 +- .../src/org/jetbrains/jet/resolve/DescriptorRenderer.java | 2 +- 14 files changed, 17 insertions(+), 12 deletions(-) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/{ => rendering}/Renderer.java (93%) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/{ => rendering}/Renderers.java (97%) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java index 4e69661a707..718cd1b4a87 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java @@ -18,8 +18,8 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -37,7 +37,7 @@ public class AmbiguousDescriptorDiagnosticFactory extends DiagnosticFactory1>> AMBIGUOUS_DESCRIPTOR_RENDERER = + private static Renderer>> AMBIGUOUS_DESCRIPTOR_RENDERER = new Renderer>>() { @NotNull @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index f28aaa14a2b..7a036578666 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -18,6 +18,8 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author svtk diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index c63687e00c3..8c376bc9068 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -18,6 +18,8 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author abreslav diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index bc945a49bd1..c79a062411a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -18,6 +18,8 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author svtk 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 d50b57581bf..2298db7db08 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -21,8 +21,8 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.impl.source.tree.LeafPsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.inference.SolutionStatus; import org.jetbrains.jet.lang.types.JetType; @@ -37,7 +37,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import static org.jetbrains.jet.lang.diagnostics.Renderers.*; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR; import static org.jetbrains.jet.lang.diagnostics.Severity.WARNING; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java index 19a297fd9be..82cb5dcdbd1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java @@ -17,6 +17,9 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; + /** * @author svtk */ diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index ce75f36e9c2..1e1b586397c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -32,7 +32,7 @@ import java.util.Iterator; import java.util.Map; import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.diagnostics.Renderers.*; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; /** * @author Evgeny Gerashchenko diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java index ce843b367b2..324d8941830 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRenderer.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.Renderer; /** * @author Evgeny Gerashchenko diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java index 6031bdeea45..f005f2b343b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; -import org.jetbrains.jet.lang.diagnostics.Renderer; import java.text.MessageFormat; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java index 758626891bb..d61591c2ba5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; -import org.jetbrains.jet.lang.diagnostics.Renderer; import java.text.MessageFormat; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java index b18385e6fc8..fbb42366840 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters3; -import org.jetbrains.jet.lang.diagnostics.Renderer; import java.text.MessageFormat; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderer.java similarity index 93% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderer.java index 5884b97e3ff..a5bc6a660c8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.jet.lang.diagnostics; +package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java similarity index 97% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java index 7136502cfe9..8e42eb60b4e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.jet.lang.diagnostics; +package org.jetbrains.jet.lang.diagnostics.rendering; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index aa98f28b710..c9cb6cf9cc1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -19,7 +19,7 @@ package org.jetbrains.jet.resolve; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.diagnostics.Renderer; +import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; From 4900839c09cb427224316dba6bab0f8fe145c2b4 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:03:17 +0400 Subject: [PATCH 16/76] Removed Diagnostic.getMessage() method. --- .../org/jetbrains/jet/checkers/CheckerTestUtil.java | 6 ------ .../jet/lang/diagnostics/AbstractDiagnostic.java | 1 - .../org/jetbrains/jet/lang/diagnostics/Diagnostic.java | 4 ---- .../lang/diagnostics/DiagnosticWithParameters1.java | 6 ------ .../lang/diagnostics/DiagnosticWithParameters2.java | 6 ------ .../lang/diagnostics/DiagnosticWithParameters3.java | 6 ------ .../jet/lang/diagnostics/RedeclarationDiagnostic.java | 10 ---------- .../jet/lang/diagnostics/SimpleDiagnostic.java | 6 ------ .../diagnostics/UnresolvedReferenceDiagnostic.java | 6 ------ 9 files changed, 51 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java index 88e8988b2c5..3cf3bedd3f3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java @@ -320,12 +320,6 @@ public class CheckerTestUtil { return SyntaxErrorDiagnosticFactory.instance; } - @NotNull - @Override - public String getMessage() { - throw new IllegalStateException(); - } - @NotNull @Override public Severity getSeverity() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java index f2a57cfc6bb..33450c87fe2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnostic.java @@ -54,7 +54,6 @@ public abstract class AbstractDiagnostic implements Parame return severity; } - @Override @NotNull public E getPsiElement() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java index 58049c26521..8fcfbf18762 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Diagnostic.java @@ -31,10 +31,6 @@ public interface Diagnostic { @NotNull AbstractDiagnosticFactory getFactory(); - @Deprecated - @NotNull - String getMessage(); - @NotNull Severity getSeverity(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java index 147e8da5c0e..50976c627c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters1.java @@ -43,12 +43,6 @@ public class DiagnosticWithParameters1 extends Abstract return (DiagnosticFactory1)super.getFactory(); } - @NotNull - @Override - public String getMessage() { - return getFactory().makeMessage(a); - } - @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java index fa7f24140b2..272577dcfba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters2.java @@ -46,12 +46,6 @@ public class DiagnosticWithParameters2 extends Abstr return (DiagnosticFactory2)super.getFactory(); } - @NotNull - @Override - public String getMessage() { - return getFactory().makeMessage(a, b); - } - @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java index ded5998fd7e..febe21d7a5b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticWithParameters3.java @@ -49,12 +49,6 @@ public class DiagnosticWithParameters3 extends Ab return (DiagnosticFactory3)super.getFactory(); } - @NotNull - @Override - public String getMessage() { - return getFactory().makeMessage(a, b, c); - } - @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index fd0fea2237a..e3080ba18e5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -18,13 +18,9 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamedDeclaration; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; import java.util.List; @@ -48,12 +44,6 @@ public interface RedeclarationDiagnostic extends Diagnostic { return (RedeclarationDiagnosticFactory)super.getFactory(); } - @NotNull - @Override - public String getMessage() { - return getFactory().makeMessage(name); - } - @Override public String getName() { return name; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java index ddd531f827d..5dbaf4f5123 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnostic.java @@ -38,12 +38,6 @@ public class SimpleDiagnostic extends AbstractDiagnostic)super.getFactory(); } - @NotNull - @Override - public String getMessage() { - return getFactory().getMessage(); - } - @Override @NotNull public List getTextRanges() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java index 730c992d305..938cb898250 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java @@ -41,12 +41,6 @@ public class UnresolvedReferenceDiagnostic extends AbstractDiagnostic getTextRanges() { From 2cbac0a5886acd3a215998cbccf43c6e8e05d735 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:04:29 +0400 Subject: [PATCH 17/76] Made AbstractDiagnosticFactory actually abstract. --- .../jet/lang/diagnostics/AbstractDiagnosticFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnosticFactory.java index 8d6198a8a58..aeebc9f633f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AbstractDiagnosticFactory.java @@ -19,7 +19,7 @@ package org.jetbrains.jet.lang.diagnostics; /** * @author abreslav */ -public class AbstractDiagnosticFactory { +public abstract class AbstractDiagnosticFactory { private String name = null; From a5d5eb53e2cbff98db230c5103e296bb2048681e Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:21:43 +0400 Subject: [PATCH 18/76] Fixed rendering syntax error diagnostics in CompileSession. --- .../jet/compiler/CompileSession.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index 95b6752337a..458efc9ed12 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -54,6 +54,8 @@ import java.util.List; * @author yole */ public class CompileSession { + private static final SimpleDiagnosticFactory SYNTAX_ERROR_FACTORY = SimpleDiagnosticFactory.create(Severity.ERROR); + private final JetCoreEnvironment environment; private final MessageCollector messageCollector; private boolean stubs = false; @@ -137,7 +139,7 @@ public class CompileSession { public void visitErrorElement(PsiErrorElement element) { String description = element.getErrorDescription(); String message = StringUtil.isEmpty(description) ? "Syntax error" : description; - Diagnostic diagnostic = SimpleDiagnosticFactory.create(Severity.ERROR, message).on(element); + Diagnostic diagnostic = new SyntaxErrorDiagnostic(element, Severity.ERROR, message); reportDiagnostic(messageCollector, diagnostic); } }); @@ -148,7 +150,14 @@ public class CompileSession { DiagnosticUtils.LineAndColumn lineAndColumn = DiagnosticUtils.getLineAndColumn(diagnostic); VirtualFile virtualFile = diagnostic.getPsiFile().getVirtualFile(); String path = virtualFile == null ? null : virtualFile.getPath(); - collector.report(diagnostic.getSeverity(), DefaultDiagnosticRenderer.INSTANCE.render(diagnostic), path, lineAndColumn.getLine(), lineAndColumn.getColumn()); + String render; + if (diagnostic.getFactory() == SYNTAX_ERROR_FACTORY) { + render = ((SyntaxErrorDiagnostic)diagnostic).message; + } + else { + render = DefaultDiagnosticRenderer.INSTANCE.render(diagnostic); + } + collector.report(diagnostic.getSeverity(), render, path, lineAndColumn.getLine(), lineAndColumn.getColumn()); } @NotNull @@ -176,4 +185,13 @@ public class CompileSession { errorStream.println(messageRenderer.render(Severity.LOGGING, message, null, -1, -1)); } } + + private static class SyntaxErrorDiagnostic extends SimpleDiagnostic { + private String message; + + private SyntaxErrorDiagnostic(@NotNull PsiErrorElement psiElement, @NotNull Severity severity, String message) { + super(psiElement, SYNTAX_ERROR_FACTORY, severity); + this.message = message; + } + } } From 9b50cdfbe3532da63b66f4192bb8133bc2734058 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:23:00 +0400 Subject: [PATCH 19/76] Got rid of messages stored in SimpleDiagnosticFactory. --- .../jet/lang/diagnostics/Errors.java | 218 +++++++++--------- .../diagnostics/SimpleDiagnosticFactory.java | 18 +- 2 files changed, 115 insertions(+), 121 deletions(-) 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 2298db7db08..f9bc2fde7bd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -86,17 +86,17 @@ public interface Errors { DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(Severity.WARNING, "Modifier {0} is redundant because {1} is present"); SimpleDiagnosticFactory ABSTRACT_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory - .create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + .create(WARNING, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); SimpleDiagnosticFactory OPEN_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory - .create(WARNING, "Modifier ''{0}'' is redundant in trait", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); + .create(WARNING, PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); SimpleDiagnosticFactory - REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING, "Visibility modifiers are redundant in getter"); - SimpleDiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.create(ERROR, "Trait can not be final"); - SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR, - "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message - SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "'return' is not allowed here"); + REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR + ); // TODO: message + SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = SimpleDiagnosticFactory - .create(ERROR, "Projections are not allowed for immediate arguments of a supertype", + .create(ERROR, new PositioningStrategy() { @NotNull @Override @@ -105,70 +105,70 @@ public interface Errors { } }); SimpleDiagnosticFactory - LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING, "There is more than one label with such a name in this scope"); + LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory - EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR, "Expression expected, but a namespace name found"); + EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR, "Cannot import from ''{0}''", NAME); DiagnosticFactory1 CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); SimpleDiagnosticFactory - USELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING, "Useless import, it is hidden further"); - SimpleDiagnosticFactory USELESS_SIMPLE_IMPORT = SimpleDiagnosticFactory.create(WARNING, "Useless import, does nothing"); + USELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory USELESS_SIMPLE_IMPORT = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory CANNOT_INFER_PARAMETER_TYPE = SimpleDiagnosticFactory - .create(ERROR, "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); + .create(ERROR); SimpleDiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory - .create(ERROR, "This property doesn't have a backing field, because it's abstract"); - SimpleDiagnosticFactory NO_BACKING_FIELD_CUSTOM_ACCESSORS = SimpleDiagnosticFactory.create(ERROR, - "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); + .create(ERROR); + SimpleDiagnosticFactory NO_BACKING_FIELD_CUSTOM_ACCESSORS = SimpleDiagnosticFactory.create(ERROR + ); SimpleDiagnosticFactory - INACCESSIBLE_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR, "The backing field is not accessible here"); + INACCESSIBLE_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NOT_PROPERTY_BACKING_FIELD = SimpleDiagnosticFactory - .create(ERROR, "The referenced variable is not a property and doesn't have backing field"); + .create(ERROR); SimpleDiagnosticFactory MIXING_NAMED_AND_POSITIONED_ARGUMENTS = SimpleDiagnosticFactory - .create(ERROR, "Mixing named and positioned arguments in not allowed"); + .create(ERROR); SimpleDiagnosticFactory - ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR, "An argument is already passed for this parameter"); + ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR); UnresolvedReferenceDiagnosticFactory NAMED_PARAMETER_NOT_FOUND = UnresolvedReferenceDiagnosticFactory.create("Cannot find a parameter with this name"); SimpleDiagnosticFactory VARARG_OUTSIDE_PARENTHESES = SimpleDiagnosticFactory - .create(ERROR, "Passing value as a vararg is only allowed inside a parenthesized argument list"); + .create(ERROR); SimpleDiagnosticFactory - NON_VARARG_SPREAD = SimpleDiagnosticFactory.create(ERROR, "The spread operator (*foo) may only be applied in a vararg position"); + NON_VARARG_SPREAD = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory MANY_FUNCTION_LITERAL_ARGUMENTS = SimpleDiagnosticFactory - .create(ERROR, "Only one function literal is allowed outside a parenthesized argument list"); + .create(ERROR); SimpleDiagnosticFactory PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = SimpleDiagnosticFactory - .create(ERROR, "This property must either have a type annotation or be initialized"); + .create(ERROR); SimpleDiagnosticFactory ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS = SimpleDiagnosticFactory - .create(ERROR, "This property cannot be declared abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + .create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); SimpleDiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = SimpleDiagnosticFactory - .create(ERROR, "A property may be abstract only when defined in a class or trait", + .create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_INITIALIZER = SimpleDiagnosticFactory.create(ERROR, "Property with initializer cannot be abstract"); + ABSTRACT_PROPERTY_WITH_INITIALIZER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR, "Property with getter implementation cannot be abstract"); + ABSTRACT_PROPERTY_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "Property with setter implementation cannot be abstract"); + ABSTRACT_PROPERTY_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - PACKAGE_MEMBER_CANNOT_BE_PROTECTED = SimpleDiagnosticFactory.create(ERROR, "Package member cannot be protected"); + PACKAGE_MEMBER_CANNOT_BE_PROTECTED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = SimpleDiagnosticFactory - .create(ERROR, "Getter visibility must be the same as property visibility"); + .create(ERROR); SimpleDiagnosticFactory BACKING_FIELD_IN_TRAIT = SimpleDiagnosticFactory - .create(ERROR, "Property in a trait cannot have a backing field", PositioningStrategies.POSITION_NAME_IDENTIFIER); + .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory MUST_BE_INITIALIZED = SimpleDiagnosticFactory - .create(ERROR, "Property must be initialized", PositioningStrategies.POSITION_NAME_IDENTIFIER); + .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = SimpleDiagnosticFactory - .create(ERROR, "Property must be initialized or be abstract", PositioningStrategies.POSITION_NAME_IDENTIFIER); + .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory - PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Property initializers are not allowed in traits"); + PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory - .create(ERROR, "Initializer is not allowed here because this property has no backing field"); + .create(ERROR); DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract property {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract function {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); @@ -177,27 +177,27 @@ public interface Errors { DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = DiagnosticFactory1.create(ERROR, "Function {0} must have a body", PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = SimpleDiagnosticFactory - .create(ERROR, "Non final member in a final class", PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); + .create(ERROR, PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); SimpleDiagnosticFactory PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE = SimpleDiagnosticFactory - .create(ERROR, "Public or protected member should specify a type", PositioningStrategies.POSITION_NAME_IDENTIFIER); + .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = SimpleDiagnosticFactory - .create(ERROR, "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning + .create(ERROR); // TODO : better positioning SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory - .create(ERROR, "This type has a constructor, and thus must be initialized here"); + .create(ERROR); SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = SimpleDiagnosticFactory - .create(ERROR, "Constructor invocation should be explicitly specified"); + .create(ERROR); SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = SimpleDiagnosticFactory - .create(ERROR, "A secondary constructor may appear only in a class that has a primary constructor"); + .create(ERROR); SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST = SimpleDiagnosticFactory - .create(ERROR, "Secondary constructors must have an initializer list"); + .create(ERROR); SimpleDiagnosticFactory - BY_IN_SECONDARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR, "'by'-clause is only supported for primary constructors"); + BY_IN_SECONDARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR, "Constructor arguments required"); + INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR, "Only one call to 'this(...)' is allowed"); + MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, "{0} overrides nothing", PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD), DescriptorRenderer.TEXT); DiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", PositioningStrategies.POSITION_NAME_IDENTIFIER, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); @@ -212,111 +212,111 @@ public interface Errors { DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING, "Variable ''{0}'' initializer is redundant", NAME); DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); - SimpleDiagnosticFactory UNUSED_EXPRESSION = SimpleDiagnosticFactory.create(WARNING, "The expression is unused"); + SimpleDiagnosticFactory UNUSED_EXPRESSION = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory UNUSED_FUNCTION_LITERAL = SimpleDiagnosticFactory - .create(WARNING, "The function literal is unused. If you mean block, you can use 'run { ... }'"); + .create(WARNING); DiagnosticFactory1 VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME); DiagnosticFactory1 INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR, "Variable cannot be initialized before declaration", NAME); - SimpleDiagnosticFactory VARIABLE_EXPECTED = SimpleDiagnosticFactory.create(ERROR, "Variable expected"); + SimpleDiagnosticFactory VARIABLE_EXPECTED = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER = DiagnosticFactory1.create(ERROR, "This property has a custom setter, so initialization using backing field required", NAME); DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER = DiagnosticFactory1.create(ERROR, "Setter of this property can be overridden, so initialization using backing field required", NAME); DiagnosticFactory1 FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = DiagnosticFactory1.create(ERROR, "Function parameters of inline function can only be invoked", NAME); - SimpleDiagnosticFactory UNREACHABLE_CODE = SimpleDiagnosticFactory.create(ERROR, "Unreachable code"); + SimpleDiagnosticFactory UNREACHABLE_CODE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - MANY_CLASS_OBJECTS = SimpleDiagnosticFactory.create(ERROR, "Only one class object is allowed per class"); + MANY_CLASS_OBJECTS = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - CLASS_OBJECT_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "A class object is not allowed here"); + CLASS_OBJECT_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - DELEGATION_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Traits cannot use delegation"); + DELEGATION_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - DELEGATION_NOT_TO_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Only traits can be delegated to"); - SimpleDiagnosticFactory NO_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR, "This class does not have a constructor"); - SimpleDiagnosticFactory NOT_A_CLASS = SimpleDiagnosticFactory.create(ERROR, "Not a class"); + DELEGATION_NOT_TO_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NO_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NOT_A_CLASS = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - ILLEGAL_ESCAPE_SEQUENCE = SimpleDiagnosticFactory.create(ERROR, "Illegal escape sequence"); + ILLEGAL_ESCAPE_SEQUENCE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - LOCAL_EXTENSION_PROPERTY = SimpleDiagnosticFactory.create(ERROR, "Local extension properties are not allowed"); + LOCAL_EXTENSION_PROPERTY = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - LOCAL_VARIABLE_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR, "Local variables are not allowed to have getters"); + LOCAL_VARIABLE_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - LOCAL_VARIABLE_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "Local variables are not allowed to have setters"); + LOCAL_VARIABLE_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - VAL_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR, "A 'val'-property cannot have a setter"); + VAL_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NO_GET_METHOD = SimpleDiagnosticFactory - .create(ERROR, "No get method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); + .create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); SimpleDiagnosticFactory NO_SET_METHOD = SimpleDiagnosticFactory - .create(ERROR, "No set method providing array access", PositioningStrategies.POSITION_ARRAY_ACCESS); + .create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); SimpleDiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = SimpleDiagnosticFactory - .create(ERROR, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); + .create(ERROR); DiagnosticFactory2 ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT = DiagnosticFactory2.create(ERROR, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT); AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Assignment operators ambiguity: {0}"); SimpleDiagnosticFactory - EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR, "No method 'equals(Any?) : Boolean' available"); + EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = SimpleDiagnosticFactory - .create(ERROR, "Assignments are not expressions, and only expressions are allowed in this context"); + .create(ERROR); SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory - .create(ERROR, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); + .create(ERROR); DiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')"); SimpleDiagnosticFactory - DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR, "Declarations are not allowed in this position"); + DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not have default values"); - SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR, "'this' is not defined in this context"); + SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR, "No supertypes are accessible in this context"); + SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory AMBIGUOUS_SUPER = SimpleDiagnosticFactory - .create(ERROR, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); + .create(ERROR); SimpleDiagnosticFactory - ABSTRACT_SUPER_CALL = SimpleDiagnosticFactory.create(ERROR, "Abstract member cannot be accessed directly"); - SimpleDiagnosticFactory NOT_A_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "Not a supertype"); + ABSTRACT_SUPER_CALL = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NOT_A_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = SimpleDiagnosticFactory - .create(WARNING, "Type arguments do not need to be specified in a 'super' qualifier"); + .create(WARNING); SimpleDiagnosticFactory - USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING, "No cast needed, use ':' instead"); - SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING, "No cast needed"); + USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory - CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING, "This cast can never succeed"); + CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING); DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory - .create(ERROR, "Generic arguments of the base type must be specified"); + .create(ERROR); SimpleDiagnosticFactory HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory - .create(ERROR, "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); + .create(ERROR); SimpleDiagnosticFactory HAS_NEXT_MISSING = SimpleDiagnosticFactory - .create(ERROR, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); + .create(ERROR); SimpleDiagnosticFactory HAS_NEXT_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory - .create(ERROR, "Function 'iterator().hasNext()' is ambiguous for this expression"); + .create(ERROR); SimpleDiagnosticFactory HAS_NEXT_MUST_BE_READABLE = SimpleDiagnosticFactory - .create(ERROR, "The 'iterator().hasNext' property of the loop range must be readable"); + .create(ERROR); DiagnosticFactory1 HAS_NEXT_PROPERTY_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE); DiagnosticFactory1 HAS_NEXT_FUNCTION_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE); SimpleDiagnosticFactory - NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR, "Function 'iterator().next()' is ambiguous for this expression"); + NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR, "Loop range must have an 'iterator().next()' function"); + NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR, "For-loop range must have an iterator() method"); + ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR); AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Method 'iterator()' is ambiguous for this expression: {0}"); DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "compareTo() must return Int, but returns {0}", RENDER_TYPE); DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR, "Expecting a function type, but found {0}", RENDER_TYPE); SimpleDiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = SimpleDiagnosticFactory - .create(ERROR, "Returns are not allowed for functions with expression body. Use block body in '{...}'"); + .create(ERROR); SimpleDiagnosticFactory NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY = SimpleDiagnosticFactory - .create(ERROR, "A 'return' expression required in a function with a block body ('{...}')", + .create(ERROR, new PositioningStrategy() { @NotNull @Override @@ -353,7 +353,7 @@ public interface Errors { DiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = DiagnosticFactory1.create(ERROR, "{0}"); SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create( - ERROR, "'else' entry must be the last one in a when-expression", new PositioningStrategy() { + ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenEntry entry) { @@ -364,7 +364,7 @@ public interface Errors { }); SimpleDiagnosticFactory - NO_ELSE_IN_WHEN = new SimpleDiagnosticFactory(ERROR, "'when' expression must contain 'else' branch", new PositioningStrategy() { + NO_ELSE_IN_WHEN = new SimpleDiagnosticFactory(ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenExpression element) { @@ -372,7 +372,8 @@ public interface Errors { return markElement(element.getWhenKeywordElement()); } }); - SimpleDiagnosticFactory TYPE_MISMATCH_IN_RANGE = new SimpleDiagnosticFactory(ERROR, "Type mismatch: incompatible types of range and element checked in it", new PositioningStrategy() { + SimpleDiagnosticFactory TYPE_MISMATCH_IN_RANGE = new SimpleDiagnosticFactory(ERROR, + new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenConditionInRange condition) { @@ -380,34 +381,34 @@ public interface Errors { } }); SimpleDiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = SimpleDiagnosticFactory - .create(ERROR, "There's a cycle in the inheritance hierarchy for this type"); + .create(ERROR); SimpleDiagnosticFactory - MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR, "Only one class may appear in a supertype list"); + MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - SUPERTYPE_NOT_A_CLASS_OR_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Only classes and traits may serve as supertypes"); + SUPERTYPE_NOT_A_CLASS_OR_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - SUPERTYPE_INITIALIZED_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "Traits cannot initialize supertypes"); - SimpleDiagnosticFactory CONSTRUCTOR_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, "A trait may not have a constructor"); + SUPERTYPE_INITIALIZED_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory CONSTRUCTOR_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = SimpleDiagnosticFactory.create(WARNING, "Secondary constructors are not supported"); - SimpleDiagnosticFactory SUPERTYPE_APPEARS_TWICE = SimpleDiagnosticFactory.create(ERROR, "A supertype appears twice"); + SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory SUPERTYPE_APPEARS_TWICE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory - FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "This type is final, so it cannot be inherited from"); + FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 ILLEGAL_SELECTOR = DiagnosticFactory1.create(ERROR, "Expression ''{0}'' cannot be a selector (occur after a dot)"); SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory - .create(ERROR, "A type annotation is required on a value parameter"); + .create(ERROR); SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory - .create(ERROR, "'break' and 'continue' are only allowed inside a loop"); + .create(ERROR); DiagnosticFactory1 NOT_A_LOOP_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not denote a loop"); DiagnosticFactory1 NOT_A_RETURN_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not reference to a context from which we can return"); SimpleDiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = SimpleDiagnosticFactory - .create(ERROR, "Anonymous initializers are only allowed in the presence of a primary constructor"); + .create(ERROR); SimpleDiagnosticFactory NULLABLE_SUPERTYPE = SimpleDiagnosticFactory - .create(ERROR, "A supertype cannot be nullable", new PositioningStrategy() { + .create(ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetNullableType element) { @@ -415,7 +416,7 @@ public interface Errors { } }); DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); - SimpleDiagnosticFactory AMBIGUOUS_LABEL = SimpleDiagnosticFactory.create(ERROR, "Ambiguous label"); + SimpleDiagnosticFactory AMBIGUOUS_LABEL = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 UNSUPPORTED = DiagnosticFactory1.create(ERROR, "Unsupported [{0}]"); DiagnosticFactory1 UNNECESSARY_SAFE_CALL = DiagnosticFactory1.create(WARNING, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); DiagnosticFactory1 UNNECESSARY_NOT_NULL_ASSERTION = DiagnosticFactory1.create(WARNING, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); @@ -435,7 +436,7 @@ public interface Errors { DiagnosticFactory2 TYPE_MISMATCH_IN_BINDING_PATTERN = DiagnosticFactory2.create(ERROR, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); DiagnosticFactory2 INCOMPATIBLE_TYPES = DiagnosticFactory2.create(ERROR, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); SimpleDiagnosticFactory - EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR, "Expected condition of Boolean type"); + EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR, "Cannot check for instance of erased type: {0}", RENDER_TYPE); DiagnosticFactory2 UNCHECKED_CAST = DiagnosticFactory2.create(WARNING, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); @@ -528,10 +529,10 @@ public interface Errors { DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR, "No value passed for parameter {0}", DescriptorRenderer.TEXT); DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR, "A receiver of type {0} is required", RENDER_TYPE); SimpleDiagnosticFactory - NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR, "No receiver can be passed to this function or property"); + NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = SimpleDiagnosticFactory - .create(ERROR, "Can not create an instance of an abstract class"); + .create(ERROR); DiagnosticFactory1 TYPE_INFERENCE_FAILED = DiagnosticFactory1.create(ERROR, "Type inference failed: {0}"); DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR, "{0} type arguments expected", new Renderer() { @NotNull @@ -544,8 +545,7 @@ public interface Errors { DiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = DiagnosticFactory1.create(ERROR, "Unresolved IDE template: {0}"); SimpleDiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = SimpleDiagnosticFactory - .create(WARNING, "This expression is treated as an argument to the function call on the previous line. " + - "Separate it with a semicolon (;) if it is not intended to be an argument."); + .create(WARNING); DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR, "{0} is not an annotation class"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java index 4a97b1e460b..8b24829e98f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/SimpleDiagnosticFactory.java @@ -23,27 +23,21 @@ import org.jetbrains.annotations.NotNull; * @author svtk */ public class SimpleDiagnosticFactory extends DiagnosticFactoryWithPsiElement { - protected final String message; - protected SimpleDiagnosticFactory(Severity severity, String message, PositioningStrategy positioningStrategy) { + protected SimpleDiagnosticFactory(Severity severity, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); - this.message = message; } - public static SimpleDiagnosticFactory create(Severity severity, String message) { - return create(severity, message, PositioningStrategies.DEFAULT); + public static SimpleDiagnosticFactory create(Severity severity) { + return create(severity, PositioningStrategies.DEFAULT); } - public static SimpleDiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy) { - return new SimpleDiagnosticFactory(severity, message, positioningStrategy); - } - - String getMessage() { - return message; + public static SimpleDiagnosticFactory create(Severity severity, PositioningStrategy positioningStrategy) { + return new SimpleDiagnosticFactory(severity, positioningStrategy); } @NotNull - public ParametrizedDiagnostic on(@NotNull E element) { + public SimpleDiagnostic on(@NotNull E element) { return new SimpleDiagnostic(element, this, severity); } } \ No newline at end of file From d64d2c857974f715f07a2f6f73a1200904dab551 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:27:33 +0400 Subject: [PATCH 20/76] Removed fields and methods for rendering error messages in DiagnosticFactoryWithMessageFormat and its subclasses. --- .../lang/diagnostics/DiagnosticFactory1.java | 11 --------- .../lang/diagnostics/DiagnosticFactory2.java | 16 ------------- .../lang/diagnostics/DiagnosticFactory3.java | 23 +------------------ .../DiagnosticFactoryWithMessageFormat.java | 9 +------- 4 files changed, 2 insertions(+), 57 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index 7a036578666..4ac2abcdd3a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -25,16 +25,6 @@ import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; * @author svtk */ public class DiagnosticFactory1 extends DiagnosticFactoryWithMessageFormat { - private final Renderer renderer; - - protected String makeMessage(@NotNull A argument) { - return messageFormat.format(new Object[]{makeMessageFor(argument)}); - } - - protected String makeMessageFor(@NotNull A argument) { - return renderer.render(argument); - } - @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A argument) { return new DiagnosticWithParameters1(element, argument, this, severity); @@ -42,7 +32,6 @@ public class DiagnosticFactory1 extends DiagnosticFacto protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { super(severity, message, positioningStrategy); - this.renderer = renderer; } public static DiagnosticFactory1 create(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index 8c376bc9068..48726a9c574 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -25,20 +25,6 @@ import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; * @author abreslav */ public class DiagnosticFactory2 extends DiagnosticFactoryWithMessageFormat { - private final Renderer rendererForA; - private final Renderer rendererForB; - - protected String makeMessage(@NotNull A a, @NotNull B b) { - return messageFormat.format(new Object[] {makeMessageForA(a), makeMessageForB(b)}); - } - - private String makeMessageForA(@NotNull A a) { - return rendererForA.render(a); - } - - private String makeMessageForB(@NotNull B b) { - return rendererForB.render(b); - } @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b) { @@ -48,8 +34,6 @@ public class DiagnosticFactory2 extends DiagnosticFa private DiagnosticFactory2(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB) { super(severity, message, positioningStrategy); - this.rendererForA = rendererForA; - this.rendererForB = rendererForB; } public static DiagnosticFactory2 create(Severity severity, String messageStub, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index c79a062411a..d38b9da9d42 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -25,15 +25,9 @@ import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; * @author svtk */ public class DiagnosticFactory3 extends DiagnosticFactoryWithMessageFormat { - private final Renderer rendererForA; - private final Renderer rendererForB; - private final Renderer rendererForC; - + protected DiagnosticFactory3(Severity severity, String messageStub, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB, Renderer rendererForC) { super(severity, messageStub, positioningStrategy); - this.rendererForA = rendererForA; - this.rendererForB = rendererForB; - this.rendererForC = rendererForC; } public static DiagnosticFactory3 create(Severity severity, String messageStub) { @@ -52,21 +46,6 @@ public class DiagnosticFactory3 extends Diagnosti return new DiagnosticFactory3(severity, messageStub, positioningStrategy, rendererForA, rendererForB, rendererForC); } - protected String makeMessage(@NotNull A a, @NotNull B b, @NotNull C c) { - return messageFormat.format(new Object[]{makeMessageForA(a), makeMessageForB(b), makeMessageForC(c)}); - } - - private String makeMessageForA(@NotNull A a) { - return rendererForA.render(a); - } - - private String makeMessageForB(@NotNull B b) { - return rendererForB.render(b); - } - - private String makeMessageForC(@NotNull C c) { - return rendererForC.render(c); - } @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b, @NotNull C c) { return new DiagnosticWithParameters3(element, a, b, c, this, severity); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java index 9478ec5191d..95e64d22979 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java @@ -24,14 +24,7 @@ import java.text.MessageFormat; * @author abreslav */ public abstract class DiagnosticFactoryWithMessageFormat extends DiagnosticFactoryWithPsiElement { - protected final MessageFormat messageFormat; - - public DiagnosticFactoryWithMessageFormat(Severity severity, String message) { - this(severity, message, PositioningStrategies.DEFAULT); - } - - public DiagnosticFactoryWithMessageFormat(Severity severity, String message, PositioningStrategy positioningStrategy) { + protected DiagnosticFactoryWithMessageFormat(Severity severity, String message, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); - this.messageFormat = new MessageFormat(message); } } From 11e4caaee3c0f8c0ec8f259afd16914b23dfdeef Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:34:53 +0400 Subject: [PATCH 21/76] Removed message formats and renderers passed to constructor parameters of DiagnosticFactoryWithMessageFormat and its subclasses. --- .../AmbiguousDescriptorDiagnosticFactory.java | 2 +- .../lang/diagnostics/DiagnosticFactory1.java | 22 +- .../lang/diagnostics/DiagnosticFactory2.java | 23 +- .../lang/diagnostics/DiagnosticFactory3.java | 22 +- .../DiagnosticFactoryWithMessageFormat.java | 2 +- .../jet/lang/diagnostics/Errors.java | 252 +++++++----------- .../UnusedElementDiagnosticFactory.java | 2 +- 7 files changed, 120 insertions(+), 205 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java index 718cd1b4a87..06eecc981a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java @@ -34,7 +34,7 @@ public class AmbiguousDescriptorDiagnosticFactory extends DiagnosticFactory1>> AMBIGUOUS_DESCRIPTOR_RENDERER = diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index 4ac2abcdd3a..db3b08e5965 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -18,8 +18,6 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author svtk @@ -30,23 +28,15 @@ public class DiagnosticFactory1 extends DiagnosticFacto return new DiagnosticWithParameters1(element, argument, this, severity); } - protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { - super(severity, message, positioningStrategy); + protected DiagnosticFactory1(Severity severity, PositioningStrategy positioningStrategy) { + super(severity, positioningStrategy); } - public static DiagnosticFactory1 create(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { - return new DiagnosticFactory1(severity, message, positioningStrategy, renderer); + public static DiagnosticFactory1 create(Severity severity, PositioningStrategy positioningStrategy) { + return new DiagnosticFactory1(severity, positioningStrategy); } - public static DiagnosticFactory1 create(Severity severity, String message, PositioningStrategy positioningStrategy) { - return create(severity, message, positioningStrategy, Renderers.TO_STRING); - } - - public static DiagnosticFactory1 create(Severity severity, String message, Renderer renderer) { - return create(severity, message, PositioningStrategies.DEFAULT, renderer); - } - - public static DiagnosticFactory1 create(Severity severity, String message) { - return create(severity, message, PositioningStrategies.DEFAULT, Renderers.TO_STRING); + public static DiagnosticFactory1 create(Severity severity) { + return create(severity, PositioningStrategies.DEFAULT); } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index 48726a9c574..049b8824d38 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -18,8 +18,6 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author abreslav @@ -31,25 +29,16 @@ public class DiagnosticFactory2 extends DiagnosticFa return new DiagnosticWithParameters2(element, a, b, this, severity); } - - private DiagnosticFactory2(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB) { - super(severity, message, positioningStrategy); + private DiagnosticFactory2(Severity severity, PositioningStrategy positioningStrategy) { + super(severity, positioningStrategy); } - public static DiagnosticFactory2 create(Severity severity, String messageStub, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB) { - return new DiagnosticFactory2(severity, messageStub, positioningStrategy, rendererForA, rendererForB); + public static DiagnosticFactory2 create(Severity severity, PositioningStrategy positioningStrategy) { + return new DiagnosticFactory2(severity, positioningStrategy); } - public static DiagnosticFactory2 create(Severity severity, String messageStub, PositioningStrategy positioningStrategy) { - return new DiagnosticFactory2(severity, messageStub, positioningStrategy, Renderers.TO_STRING, Renderers.TO_STRING); - } - - public static DiagnosticFactory2 create(Severity severity, String messageStub, Renderer rendererForA, Renderer rendererForB) { - return new DiagnosticFactory2(severity, messageStub, PositioningStrategies.DEFAULT, rendererForA, rendererForB); - } - - public static DiagnosticFactory2 create(Severity severity, String messageStub) { - return new DiagnosticFactory2(severity, messageStub, PositioningStrategies.DEFAULT, Renderers.TO_STRING, Renderers.TO_STRING); + public static DiagnosticFactory2 create(Severity severity) { + return new DiagnosticFactory2(severity, PositioningStrategies.DEFAULT); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index d38b9da9d42..678bb9b3dbf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -18,32 +18,22 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author svtk */ public class DiagnosticFactory3 extends DiagnosticFactoryWithMessageFormat { - protected DiagnosticFactory3(Severity severity, String messageStub, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB, Renderer rendererForC) { - super(severity, messageStub, positioningStrategy); + protected DiagnosticFactory3(Severity severity, PositioningStrategy positioningStrategy) { + super(severity, positioningStrategy); } - public static DiagnosticFactory3 create(Severity severity, String messageStub) { - return create(severity, messageStub, PositioningStrategies.DEFAULT); + public static DiagnosticFactory3 create(Severity severity) { + return create(severity, PositioningStrategies.DEFAULT); } - public static DiagnosticFactory3 create(Severity severity, String messageStub, PositioningStrategy positioningStrategy) { - return create(severity, messageStub, positioningStrategy, Renderers.TO_STRING, Renderers.TO_STRING, Renderers.TO_STRING); - } - - public static DiagnosticFactory3 create(Severity severity, String messageStub, Renderer rendererForA, Renderer rendererForB, Renderer rendererForC) { - return create(severity, messageStub, PositioningStrategies.DEFAULT, rendererForA, rendererForB, rendererForC); - } - - public static DiagnosticFactory3 create(Severity severity, String messageStub, PositioningStrategy positioningStrategy, Renderer rendererForA, Renderer rendererForB, Renderer rendererForC) { - return new DiagnosticFactory3(severity, messageStub, positioningStrategy, rendererForA, rendererForB, rendererForC); + public static DiagnosticFactory3 create(Severity severity, PositioningStrategy positioningStrategy) { + return new DiagnosticFactory3(severity, positioningStrategy); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java index 95e64d22979..a04b6d59dce 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java @@ -24,7 +24,7 @@ import java.text.MessageFormat; * @author abreslav */ public abstract class DiagnosticFactoryWithMessageFormat extends DiagnosticFactoryWithPsiElement { - protected DiagnosticFactoryWithMessageFormat(Severity severity, String message, PositioningStrategy positioningStrategy) { + protected DiagnosticFactoryWithMessageFormat(Severity severity, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); } } 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 f9bc2fde7bd..f382ed1fc54 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -22,19 +22,16 @@ import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.impl.source.tree.LeafPsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.inference.SolutionStatus; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetTokens; -import org.jetbrains.jet.resolve.DescriptorRenderer; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.List; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -46,45 +43,25 @@ import static org.jetbrains.jet.lang.diagnostics.Severity.WARNING; */ public interface Errors { - DiagnosticFactory1 EXCEPTION_WHILE_ANALYZING = DiagnosticFactory1.create(ERROR, "{0}", new Renderer() { - @NotNull - @Override - public String render(@NotNull Throwable e) { - return e.getClass().getSimpleName() + ": " + e.getMessage(); - } - }); + DiagnosticFactory1 EXCEPTION_WHILE_ANALYZING = DiagnosticFactory1.create(ERROR); UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = UnresolvedReferenceDiagnosticFactory.create("Unresolved reference"); //Elements with "INVISIBLE_REFERENCE" error are marked as unresolved, unlike elements with "INVISIBLE_MEMBER" error - DiagnosticFactory2 INVISIBLE_REFERENCE = DiagnosticFactory2.create(ERROR, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); - DiagnosticFactory2 INVISIBLE_MEMBER = DiagnosticFactory2.create(ERROR, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); + DiagnosticFactory2 INVISIBLE_REFERENCE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 INVISIBLE_MEMBER = DiagnosticFactory2.create(ERROR); RedeclarationDiagnosticFactory REDECLARATION = RedeclarationDiagnosticFactory.REDECLARATION; RedeclarationDiagnosticFactory NAME_SHADOWING = RedeclarationDiagnosticFactory.NAME_SHADOWING; - DiagnosticFactory2 TYPE_MISMATCH = DiagnosticFactory2.create(ERROR, "Type mismatch: inferred type is {1} but {0} was expected", - RENDER_TYPE, RENDER_TYPE); + DiagnosticFactory2 TYPE_MISMATCH = DiagnosticFactory2.create(ERROR + ); DiagnosticFactory1> INCOMPATIBLE_MODIFIERS = - DiagnosticFactory1.create(ERROR, "Incompatible modifiers: ''{0}''", - new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection element) { - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = element.iterator(); iterator.hasNext(); ) { - JetKeywordToken modifier = iterator.next(); - sb.append(modifier.getValue()); - if (iterator.hasNext()) { - sb.append(" "); - } - } - return sb.toString(); - } - }); - DiagnosticFactory1 ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR, "Illegal modifier ''{0}''"); + DiagnosticFactory1.create(ERROR + ); + DiagnosticFactory1 ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR); - DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(Severity.WARNING, "Modifier {0} is redundant because {1} is present"); + DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(Severity.WARNING); SimpleDiagnosticFactory ABSTRACT_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory .create(WARNING, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); SimpleDiagnosticFactory OPEN_MODIFIER_IN_TRAIT = SimpleDiagnosticFactory @@ -109,8 +86,8 @@ public interface Errors { SimpleDiagnosticFactory EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR, "Cannot import from ''{0}''", NAME); - DiagnosticFactory1 CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); + DiagnosticFactory1 CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory USELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory USELESS_SIMPLE_IMPORT = SimpleDiagnosticFactory.create(WARNING); @@ -169,13 +146,19 @@ public interface Errors { PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory .create(ERROR); - DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract property {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, "Abstract function {0} in non-abstract class {1}", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = DiagnosticFactory1.create(ERROR, "Method {0} without a body must be abstract", PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = DiagnosticFactory1.create(ERROR, "Function {0} is not a class or trait member and cannot be abstract", PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = DiagnosticFactory1.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = DiagnosticFactory1.create(ERROR, + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = DiagnosticFactory1.create(ERROR, "Function {0} must have a body", PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = DiagnosticFactory1.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = SimpleDiagnosticFactory .create(ERROR, PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); @@ -198,32 +181,34 @@ public interface Errors { INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, "{0} overrides nothing", PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD), DescriptorRenderer.TEXT); - DiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", PositioningStrategies.POSITION_NAME_IDENTIFIER, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + DiagnosticFactory1 NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, + PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD)); + DiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory1 ENUM_ENTRY_SHOULD_BE_INITIALIZED = DiagnosticFactory1.create(ERROR, "Missing delegation specifier ''{0}''", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); - DiagnosticFactory1 ENUM_ENTRY_ILLEGAL_TYPE = DiagnosticFactory1.create(ERROR, "The type constructor of enum entry should be ''{0}''", NAME); + DiagnosticFactory1 ENUM_ENTRY_SHOULD_BE_INITIALIZED = DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory1 ENUM_ENTRY_ILLEGAL_TYPE = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 UNINITIALIZED_VARIABLE = DiagnosticFactory1.create(ERROR, "Variable ''{0}'' must be initialized", NAME); - DiagnosticFactory1 UNINITIALIZED_PARAMETER = DiagnosticFactory1.create(ERROR, "Parameter ''{0}'' is uninitialized here", NAME); + DiagnosticFactory1 UNINITIALIZED_VARIABLE = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 UNINITIALIZED_PARAMETER = DiagnosticFactory1.create(ERROR); UnusedElementDiagnosticFactory UNUSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, "Variable ''{0}'' is never used", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); UnusedElementDiagnosticFactory UNUSED_PARAMETER = UnusedElementDiagnosticFactory.create(WARNING, "Parameter ''{0}'' is never used", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); UnusedElementDiagnosticFactory ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, "Variable ''{0}'' is assigned but never accessed", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); - DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING, "Variable ''{0}'' initializer is redundant", NAME); - DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); - DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); + DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING); + DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING); + DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING); SimpleDiagnosticFactory UNUSED_EXPRESSION = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory UNUSED_FUNCTION_LITERAL = SimpleDiagnosticFactory .create(WARNING); - DiagnosticFactory1 VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME); - DiagnosticFactory1 INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR, "Variable cannot be initialized before declaration", NAME); + DiagnosticFactory1 VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory VARIABLE_EXPECTED = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER = DiagnosticFactory1.create(ERROR, "This property has a custom setter, so initialization using backing field required", NAME); - DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER = DiagnosticFactory1.create(ERROR, "Setter of this property can be overridden, so initialization using backing field required", NAME); + DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = DiagnosticFactory1.create(ERROR, "Function parameters of inline function can only be invoked", NAME); + DiagnosticFactory1 FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory UNREACHABLE_CODE = SimpleDiagnosticFactory.create(ERROR); @@ -257,7 +242,7 @@ public interface Errors { SimpleDiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = SimpleDiagnosticFactory .create(ERROR); DiagnosticFactory2 ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT = - DiagnosticFactory2.create(ERROR, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT); + DiagnosticFactory2.create(ERROR); AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Assignment operators ambiguity: {0}"); SimpleDiagnosticFactory @@ -266,7 +251,7 @@ public interface Errors { .create(ERROR); SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory .create(ERROR); - DiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')"); + DiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory @@ -286,9 +271,9 @@ public interface Errors { SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING); - DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); - DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE);//, DiagnosticParameters.TYPE); - DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); + DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR);//, DiagnosticParameters.TYPE); + DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR);//, DiagnosticParameters.TYPE); + DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory .create(ERROR); @@ -300,8 +285,8 @@ public interface Errors { .create(ERROR); SimpleDiagnosticFactory HAS_NEXT_MUST_BE_READABLE = SimpleDiagnosticFactory .create(ERROR); - DiagnosticFactory1 HAS_NEXT_PROPERTY_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE); - DiagnosticFactory1 HAS_NEXT_FUNCTION_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE); + DiagnosticFactory1 HAS_NEXT_PROPERTY_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 HAS_NEXT_FUNCTION_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory @@ -310,8 +295,8 @@ public interface Errors { ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR); AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Method 'iterator()' is ambiguous for this expression: {0}"); - DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "compareTo() must return Int, but returns {0}", RENDER_TYPE); - DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR, "Expecting a function type, but found {0}", RENDER_TYPE); + DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = SimpleDiagnosticFactory .create(ERROR); @@ -329,28 +314,21 @@ public interface Errors { return markRange(lastBracketRange); } }); - DiagnosticFactory1 RETURN_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "This function must return a value of type {0}", RENDER_TYPE); - DiagnosticFactory1 EXPECTED_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "Expected a value of type {0}", RENDER_TYPE); - DiagnosticFactory1 ASSIGNMENT_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR, "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE); - DiagnosticFactory1 IMPLICIT_CAST_TO_UNIT_OR_ANY = DiagnosticFactory1.create(WARNING, "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE); - DiagnosticFactory1 EXPRESSION_EXPECTED = DiagnosticFactory1.create(ERROR, "{0} is not an expression, and only expression are allowed here", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetExpression expression) { - String expressionType = expression.toString(); - return expressionType.substring(0, 1) + expressionType.substring(1).toLowerCase(); - } - }); + DiagnosticFactory1 RETURN_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 EXPECTED_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 ASSIGNMENT_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 IMPLICIT_CAST_TO_UNIT_OR_ANY = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 EXPRESSION_EXPECTED = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR, "An upper bound {0} is violated", RENDER_TYPE); // TODO : Message - DiagnosticFactory1 FINAL_CLASS_OBJECT_UPPER_BOUND = DiagnosticFactory1.create(ERROR, "{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE); - DiagnosticFactory1 FINAL_UPPER_BOUND = DiagnosticFactory1.create(WARNING, "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); - DiagnosticFactory1 USELESS_ELVIS = DiagnosticFactory1.create(WARNING, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); - DiagnosticFactory1 CONFLICTING_UPPER_BOUNDS = DiagnosticFactory1.create(ERROR, "Upper bounds of {0} have empty intersection", NAME); - DiagnosticFactory1 CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS = DiagnosticFactory1.create(ERROR, "Class object upper bounds of {0} have empty intersection", NAME); + DiagnosticFactory1 UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR); // TODO : Message + DiagnosticFactory1 FINAL_CLASS_OBJECT_UPPER_BOUND = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 FINAL_UPPER_BOUND = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 USELESS_ELVIS = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 CONFLICTING_UPPER_BOUNDS = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 TOO_MANY_ARGUMENTS = DiagnosticFactory1.create(ERROR, "Too many arguments for {0}"); - DiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = DiagnosticFactory1.create(ERROR, "{0}"); + DiagnosticFactory1 TOO_MANY_ARGUMENTS = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create( ERROR, new PositioningStrategy() { @@ -396,14 +374,14 @@ public interface Errors { SimpleDiagnosticFactory FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 ILLEGAL_SELECTOR = DiagnosticFactory1.create(ERROR, "Expression ''{0}'' cannot be a selector (occur after a dot)"); + DiagnosticFactory1 ILLEGAL_SELECTOR = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory .create(ERROR); SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory .create(ERROR); - DiagnosticFactory1 NOT_A_LOOP_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not denote a loop"); - DiagnosticFactory1 NOT_A_RETURN_LABEL = DiagnosticFactory1.create(ERROR, "The label ''{0}'' does not reference to a context from which we can return"); + DiagnosticFactory1 NOT_A_LOOP_LABEL = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 NOT_A_RETURN_LABEL = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = SimpleDiagnosticFactory .create(ERROR); @@ -415,78 +393,52 @@ public interface Errors { return markNode(element.getQuestionMarkNode()); } }); - DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); + DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory AMBIGUOUS_LABEL = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 UNSUPPORTED = DiagnosticFactory1.create(ERROR, "Unsupported [{0}]"); - DiagnosticFactory1 UNNECESSARY_SAFE_CALL = DiagnosticFactory1.create(WARNING, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); - DiagnosticFactory1 UNNECESSARY_NOT_NULL_ASSERTION = DiagnosticFactory1.create(WARNING, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); - DiagnosticFactory2 NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER = DiagnosticFactory2.create(ERROR, "{0} does not refer to a type parameter of {1}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetTypeConstraint typeConstraint) { - //noinspection ConstantConditions - return typeConstraint.getSubjectTypeParameterName().getReferencedName(); - } - }, NAME); - DiagnosticFactory2 AUTOCAST_IMPOSSIBLE = DiagnosticFactory2.create(ERROR, "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME); + DiagnosticFactory1 UNSUPPORTED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 UNNECESSARY_SAFE_CALL = DiagnosticFactory1.create(WARNING); + DiagnosticFactory1 UNNECESSARY_NOT_NULL_ASSERTION = DiagnosticFactory1.create(WARNING); + DiagnosticFactory2 NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 AUTOCAST_IMPOSSIBLE = DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 TYPE_MISMATCH_IN_FOR_LOOP = DiagnosticFactory2.create(ERROR, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE); - DiagnosticFactory1 TYPE_MISMATCH_IN_CONDITION = DiagnosticFactory1.create(ERROR, "Condition must be of type Boolean, but was of type {0}", RENDER_TYPE); - DiagnosticFactory2 TYPE_MISMATCH_IN_TUPLE_PATTERN = DiagnosticFactory2.create(ERROR, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING); // TODO: message - DiagnosticFactory2 TYPE_MISMATCH_IN_BINDING_PATTERN = DiagnosticFactory2.create(ERROR, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); - DiagnosticFactory2 INCOMPATIBLE_TYPES = DiagnosticFactory2.create(ERROR, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); + DiagnosticFactory2 TYPE_MISMATCH_IN_FOR_LOOP = DiagnosticFactory2.create(ERROR); + DiagnosticFactory1 TYPE_MISMATCH_IN_CONDITION = DiagnosticFactory1.create(ERROR); + DiagnosticFactory2 TYPE_MISMATCH_IN_TUPLE_PATTERN = DiagnosticFactory2.create(ERROR); // TODO: message + DiagnosticFactory2 TYPE_MISMATCH_IN_BINDING_PATTERN = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 INCOMPATIBLE_TYPES = DiagnosticFactory2.create(ERROR); SimpleDiagnosticFactory EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR, "Cannot check for instance of erased type: {0}", RENDER_TYPE); - DiagnosticFactory2 UNCHECKED_CAST = DiagnosticFactory2.create(WARNING, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); + DiagnosticFactory1 CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory2 UNCHECKED_CAST = DiagnosticFactory2.create(WARNING); DiagnosticFactory3> INCONSISTENT_TYPE_PARAMETER_VALUES = - DiagnosticFactory3.create(ERROR, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection types) { - StringBuilder builder = new StringBuilder(); - for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { - JetType jetType = iterator.next(); - builder.append(jetType); - if (iterator.hasNext()) { - builder.append(", "); - } - } - return builder.toString(); - } - }); + DiagnosticFactory3.create(ERROR); - DiagnosticFactory3 EQUALITY_NOT_APPLICABLE = DiagnosticFactory3.create(ERROR, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetSimpleNameExpression nameExpression) { - //noinspection ConstantConditions - return nameExpression.getReferencedName(); - } - }, TO_STRING, TO_STRING); + DiagnosticFactory3 EQUALITY_NOT_APPLICABLE = DiagnosticFactory3.create(ERROR); - DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); - DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", PositioningStrategies.POSITION_VISIBILITY_MODIFIER, TO_STRING, NAME, NAME); - DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", PositioningStrategies.POSITION_VISIBILITY_MODIFIER, TO_STRING, NAME, NAME); + DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR); + DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, + PositioningStrategies.POSITION_VISIBILITY_MODIFIER); + DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, + PositioningStrategies.POSITION_VISIBILITY_MODIFIER); DiagnosticFactory2 RETURN_TYPE_MISMATCH_ON_OVERRIDE = - DiagnosticFactory2.create(ERROR, "Return type of {0} is not a subtype of the return type overridden member {1}", PositioningStrategies.POSITION_DECLARATION, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + DiagnosticFactory2.create(ERROR, PositioningStrategies.POSITION_DECLARATION); - DiagnosticFactory2 VAR_OVERRIDDEN_BY_VAL = DiagnosticFactory2.create(ERROR, "Var-property {0} cannot be overridden by val-property {1}", new PositioningStrategy() { + DiagnosticFactory2 VAR_OVERRIDDEN_BY_VAL = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetProperty property) { return markNode(property.getValOrVarNode()); } - }, DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + }); - DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR, "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT); + DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR, "{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT); + DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, "{1} is already defined in ''{0}''", new PositioningStrategy() { + DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetDeclaration jetDeclaration) { @@ -518,36 +470,30 @@ public interface Errors { return markRange(jetDeclaration.getTextRange()); } } - }, DescriptorRenderer.TEXT, TO_STRING); + }); - DiagnosticFactory3 RESULT_TYPE_MISMATCH = DiagnosticFactory3.create(ERROR, "{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); - DiagnosticFactory3 UNSAFE_INFIX_CALL = DiagnosticFactory3.create(ERROR, "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead"); + DiagnosticFactory3 RESULT_TYPE_MISMATCH = DiagnosticFactory3.create(ERROR); + DiagnosticFactory3 UNSAFE_INFIX_CALL = DiagnosticFactory3.create(ERROR); AmbiguousDescriptorDiagnosticFactory OVERLOAD_RESOLUTION_AMBIGUITY = new AmbiguousDescriptorDiagnosticFactory("Overload resolution ambiguity: {0}"); AmbiguousDescriptorDiagnosticFactory NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory("None of the following functions can be called with the arguments supplied: {0}"); - DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR, "No value passed for parameter {0}", DescriptorRenderer.TEXT); - DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR, "A receiver of type {0} is required", RENDER_TYPE); + DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = SimpleDiagnosticFactory .create(ERROR); - DiagnosticFactory1 TYPE_INFERENCE_FAILED = DiagnosticFactory1.create(ERROR, "Type inference failed: {0}"); - DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR, "{0} type arguments expected", new Renderer() { - @NotNull - @Override - public String render(@NotNull Integer argument) { - return argument == 0 ? "No" : argument.toString(); - } - }); + DiagnosticFactory1 TYPE_INFERENCE_FAILED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = DiagnosticFactory1.create(ERROR, "Unresolved IDE template: {0}"); + DiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = SimpleDiagnosticFactory .create(WARNING); - DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR, "{0} is not an annotation class"); + DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR); // This field is needed to make the Initializer class load (interfaces cannot have static initializers) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java index 82cb5dcdbd1..416a4809603 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java @@ -25,7 +25,7 @@ import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; */ public class UnusedElementDiagnosticFactory extends DiagnosticFactory1 { private UnusedElementDiagnosticFactory(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { - super(severity, message, positioningStrategy, renderer); + super(severity, positioningStrategy); } public static UnusedElementDiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { From c957997943824fe59ac77ccf6b53138cd057397e Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 14:41:16 +0400 Subject: [PATCH 22/76] Removed message formats and renderers passed to constructor parameters of UnusedElementDiagnosticFactory and AmbiguousDescriptorDiagnosticFactory. --- .../AmbiguousDescriptorDiagnosticFactory.java | 22 +++---------------- .../jet/lang/diagnostics/Errors.java | 18 ++++++++------- .../UnusedElementDiagnosticFactory.java | 20 +++++------------ 3 files changed, 18 insertions(+), 42 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java index 06eecc981a9..809012d233b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/AmbiguousDescriptorDiagnosticFactory.java @@ -17,11 +17,8 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; -import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.Collection; @@ -29,24 +26,11 @@ import java.util.Collection; * @author abreslav */ public class AmbiguousDescriptorDiagnosticFactory extends DiagnosticFactory1>> { - public static AmbiguousDescriptorDiagnosticFactory create(String messageTemplate) { - return new AmbiguousDescriptorDiagnosticFactory(messageTemplate); + public static AmbiguousDescriptorDiagnosticFactory create() { + return new AmbiguousDescriptorDiagnosticFactory(); } - public AmbiguousDescriptorDiagnosticFactory(String messageTemplate) { + public AmbiguousDescriptorDiagnosticFactory() { super(Severity.ERROR, PositioningStrategies.DEFAULT); } - - private static Renderer>> AMBIGUOUS_DESCRIPTOR_RENDERER = - new Renderer>>() { - @NotNull - @Override - public String render(@NotNull Collection> argument) { - StringBuilder stringBuilder = new StringBuilder("\n"); - for (ResolvedCall call : argument) { - stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); - } - return stringBuilder.toString(); - } - }; } 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 f382ed1fc54..4ceecb4bef3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -34,7 +34,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR; import static org.jetbrains.jet.lang.diagnostics.Severity.WARNING; @@ -191,9 +190,12 @@ public interface Errors { DiagnosticFactory1 UNINITIALIZED_VARIABLE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 UNINITIALIZED_PARAMETER = DiagnosticFactory1.create(ERROR); - UnusedElementDiagnosticFactory UNUSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, "Variable ''{0}'' is never used", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); - UnusedElementDiagnosticFactory UNUSED_PARAMETER = UnusedElementDiagnosticFactory.create(WARNING, "Parameter ''{0}'' is never used", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); - UnusedElementDiagnosticFactory ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, "Variable ''{0}'' is assigned but never accessed", PositioningStrategies.POSITION_NAME_IDENTIFIER, NAME); + UnusedElementDiagnosticFactory UNUSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + UnusedElementDiagnosticFactory UNUSED_PARAMETER = UnusedElementDiagnosticFactory.create(WARNING, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + UnusedElementDiagnosticFactory ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, + PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING); DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING); DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING); @@ -243,7 +245,7 @@ public interface Errors { .create(ERROR); DiagnosticFactory2 ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT = DiagnosticFactory2.create(ERROR); - AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Assignment operators ambiguity: {0}"); + AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create(); SimpleDiagnosticFactory EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR); @@ -293,7 +295,7 @@ public interface Errors { NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR); - AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create("Method 'iterator()' is ambiguous for this expression: {0}"); + AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create(); DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR); @@ -476,8 +478,8 @@ public interface Errors { DiagnosticFactory3 RESULT_TYPE_MISMATCH = DiagnosticFactory3.create(ERROR); DiagnosticFactory3 UNSAFE_INFIX_CALL = DiagnosticFactory3.create(ERROR); - AmbiguousDescriptorDiagnosticFactory OVERLOAD_RESOLUTION_AMBIGUITY = new AmbiguousDescriptorDiagnosticFactory("Overload resolution ambiguity: {0}"); - AmbiguousDescriptorDiagnosticFactory NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory("None of the following functions can be called with the arguments supplied: {0}"); + AmbiguousDescriptorDiagnosticFactory OVERLOAD_RESOLUTION_AMBIGUITY = new AmbiguousDescriptorDiagnosticFactory(); + AmbiguousDescriptorDiagnosticFactory NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory(); DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java index 416a4809603..a9c8ce304dd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnusedElementDiagnosticFactory.java @@ -17,30 +17,20 @@ package org.jetbrains.jet.lang.diagnostics; import com.intellij.psi.PsiElement; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; -import org.jetbrains.jet.lang.diagnostics.rendering.Renderers; /** * @author svtk */ public class UnusedElementDiagnosticFactory extends DiagnosticFactory1 { - private UnusedElementDiagnosticFactory(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { + private UnusedElementDiagnosticFactory(Severity severity, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); } - public static UnusedElementDiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy, Renderer renderer) { - return new UnusedElementDiagnosticFactory(severity, message, positioningStrategy, renderer); + public static UnusedElementDiagnosticFactory create(Severity severity, PositioningStrategy positioningStrategy) { + return new UnusedElementDiagnosticFactory(severity, positioningStrategy); } - public static UnusedElementDiagnosticFactory create(Severity severity, String message, PositioningStrategy positioningStrategy) { - return create(severity, message, positioningStrategy, Renderers.TO_STRING); - } - - public static UnusedElementDiagnosticFactory create(Severity severity, String message, Renderer renderer) { - return create(severity, message, PositioningStrategies.DEFAULT, renderer); - } - - public static UnusedElementDiagnosticFactory create(Severity severity, String message) { - return create(severity, message, PositioningStrategies.DEFAULT, Renderers.TO_STRING); + public static UnusedElementDiagnosticFactory create(Severity severity) { + return create(severity, PositioningStrategies.DEFAULT); } } From 613ddeb461d6e4d1cba43b1ed69a01f734026444 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:06:00 +0400 Subject: [PATCH 23/76] Removed diagnostic rendering from RedeclarationDiagnosticFactory and UnresolvedReferenceDiagnosticFactory. --- .../jet/lang/diagnostics/Errors.java | 8 +++---- .../RedeclarationDiagnosticFactory.java | 22 +------------------ .../UnresolvedReferenceDiagnosticFactory.java | 13 +++-------- 3 files changed, 8 insertions(+), 35 deletions(-) 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 4ceecb4bef3..332b6075124 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -44,14 +44,14 @@ public interface Errors { DiagnosticFactory1 EXCEPTION_WHILE_ANALYZING = DiagnosticFactory1.create(ERROR); - UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = UnresolvedReferenceDiagnosticFactory.create("Unresolved reference"); + UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = UnresolvedReferenceDiagnosticFactory.create(); //Elements with "INVISIBLE_REFERENCE" error are marked as unresolved, unlike elements with "INVISIBLE_MEMBER" error DiagnosticFactory2 INVISIBLE_REFERENCE = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 INVISIBLE_MEMBER = DiagnosticFactory2.create(ERROR); - RedeclarationDiagnosticFactory REDECLARATION = RedeclarationDiagnosticFactory.REDECLARATION; - RedeclarationDiagnosticFactory NAME_SHADOWING = RedeclarationDiagnosticFactory.NAME_SHADOWING; + RedeclarationDiagnosticFactory REDECLARATION = new RedeclarationDiagnosticFactory(ERROR); + RedeclarationDiagnosticFactory NAME_SHADOWING = new RedeclarationDiagnosticFactory(WARNING); DiagnosticFactory2 TYPE_MISMATCH = DiagnosticFactory2.create(ERROR ); @@ -107,7 +107,7 @@ public interface Errors { .create(ERROR); SimpleDiagnosticFactory ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR); - UnresolvedReferenceDiagnosticFactory NAMED_PARAMETER_NOT_FOUND = UnresolvedReferenceDiagnosticFactory.create("Cannot find a parameter with this name"); + UnresolvedReferenceDiagnosticFactory NAMED_PARAMETER_NOT_FOUND = UnresolvedReferenceDiagnosticFactory.create(); SimpleDiagnosticFactory VARARG_OUTSIDE_PARENTHESES = SimpleDiagnosticFactory .create(ERROR); SimpleDiagnosticFactory diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java index 053238f2839..59d138f52c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java @@ -23,36 +23,16 @@ import org.jetbrains.annotations.NotNull; * @author abreslav */ public class RedeclarationDiagnosticFactory extends AbstractDiagnosticFactory { - - private final String name; final Severity severity; - private final String messagePrefix; - public static final RedeclarationDiagnosticFactory REDECLARATION = new RedeclarationDiagnosticFactory( - "REDECLARATION", Severity.ERROR, "Redeclaration: "); - public static final RedeclarationDiagnosticFactory NAME_SHADOWING = new RedeclarationDiagnosticFactory( - "NAME_SHADOWING", Severity.WARNING, "Name shadowed: "); - - public RedeclarationDiagnosticFactory(String name, Severity severity, String messagePrefix) { - this.name = name; + public RedeclarationDiagnosticFactory(Severity severity) { this.severity = severity; - this.messagePrefix = messagePrefix; } public RedeclarationDiagnostic on(@NotNull PsiElement duplicatingElement, @NotNull String name) { return new RedeclarationDiagnostic.SimpleRedeclarationDiagnostic(duplicatingElement, name, this); } - @NotNull - @Override - public String getName() { - return name; - } - - public String makeMessage(String identifier) { - return messagePrefix + identifier; - } - @Override public String toString() { return getName(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java index b4fd2e6e889..4aee43e3422 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java @@ -23,21 +23,14 @@ import org.jetbrains.jet.lang.psi.JetReferenceExpression; * @author abreslav */ public class UnresolvedReferenceDiagnosticFactory extends AbstractDiagnosticFactory { - private final String message; - - private UnresolvedReferenceDiagnosticFactory(String message) { - this.message = message; - } - - String getMessage() { - return message; + private UnresolvedReferenceDiagnosticFactory() { } public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) { return new UnresolvedReferenceDiagnostic(reference, this); } - public static UnresolvedReferenceDiagnosticFactory create(String message) { - return new UnresolvedReferenceDiagnosticFactory(message); + public static UnresolvedReferenceDiagnosticFactory create() { + return new UnresolvedReferenceDiagnosticFactory(); } } From 77ea513e42813ef3b29e0b4f99cf556e892ccbc6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:16:14 +0400 Subject: [PATCH 24/76] Reformatted Errors, got rid of obsolete comments. --- .../jet/lang/diagnostics/Errors.java | 520 ++++++++---------- 1 file changed, 229 insertions(+), 291 deletions(-) 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 332b6075124..2c74e53d6a3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -47,17 +47,15 @@ public interface Errors { UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = UnresolvedReferenceDiagnosticFactory.create(); //Elements with "INVISIBLE_REFERENCE" error are marked as unresolved, unlike elements with "INVISIBLE_MEMBER" error - DiagnosticFactory2 INVISIBLE_REFERENCE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 INVISIBLE_REFERENCE = + DiagnosticFactory2.create(ERROR); DiagnosticFactory2 INVISIBLE_MEMBER = DiagnosticFactory2.create(ERROR); RedeclarationDiagnosticFactory REDECLARATION = new RedeclarationDiagnosticFactory(ERROR); RedeclarationDiagnosticFactory NAME_SHADOWING = new RedeclarationDiagnosticFactory(WARNING); - DiagnosticFactory2 TYPE_MISMATCH = DiagnosticFactory2.create(ERROR - ); - DiagnosticFactory1> INCOMPATIBLE_MODIFIERS = - DiagnosticFactory1.create(ERROR - ); + DiagnosticFactory2 TYPE_MISMATCH = DiagnosticFactory2.create(ERROR); + DiagnosticFactory1> INCOMPATIBLE_MODIFIERS = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR); DiagnosticFactory2 REDUNDANT_MODIFIER = DiagnosticFactory2.create(Severity.WARNING); @@ -68,140 +66,111 @@ public interface Errors { SimpleDiagnosticFactory REDUNDANT_MODIFIER_IN_GETTER = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory TRAIT_CAN_NOT_BE_FINAL = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR - ); // TODO: message + SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = SimpleDiagnosticFactory - .create(ERROR, - new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetTypeProjection element) { - return markNode(element.getProjectionNode()); - } - }); - SimpleDiagnosticFactory - LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING); - SimpleDiagnosticFactory - EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = + SimpleDiagnosticFactory.create(ERROR, + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetTypeProjection element) { + return markNode(element.getProjectionNode()); + } + }); + SimpleDiagnosticFactoryLABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 CANNOT_IMPORT_FROM_ELEMENT = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 CANNOT_BE_IMPORTED = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory - USELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactoryUSELESS_HIDDEN_IMPORT = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory USELESS_SIMPLE_IMPORT = SimpleDiagnosticFactory.create(WARNING); - SimpleDiagnosticFactory CANNOT_INFER_PARAMETER_TYPE = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory CANNOT_INFER_PARAMETER_TYPE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory NO_BACKING_FIELD_ABSTRACT_PROPERTY = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NO_BACKING_FIELD_CUSTOM_ACCESSORS = SimpleDiagnosticFactory.create(ERROR ); - SimpleDiagnosticFactory - INACCESSIBLE_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory NOT_PROPERTY_BACKING_FIELD = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory INACCESSIBLE_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NOT_PROPERTY_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory MIXING_NAMED_AND_POSITIONED_ARGUMENTS = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory - ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory MIXING_NAMED_AND_POSITIONED_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ARGUMENT_PASSED_TWICE = SimpleDiagnosticFactory.create(ERROR); UnresolvedReferenceDiagnosticFactory NAMED_PARAMETER_NOT_FOUND = UnresolvedReferenceDiagnosticFactory.create(); - SimpleDiagnosticFactory VARARG_OUTSIDE_PARENTHESES = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory - NON_VARARG_SPREAD = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory VARARG_OUTSIDE_PARENTHESES = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NON_VARARG_SPREAD = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory MANY_FUNCTION_LITERAL_ARGUMENTS = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory MANY_FUNCTION_LITERAL_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory PROPERTY_WITH_NO_TYPE_NO_INITIALIZER = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS = SimpleDiagnosticFactory .create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - SimpleDiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = SimpleDiagnosticFactory - .create(ERROR, - PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_INITIALIZER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - ABSTRACT_PROPERTY_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ABSTRACT_PROPERTY_NOT_IN_CLASS = SimpleDiagnosticFactory.create(ERROR, + PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + SimpleDiagnosticFactory ABSTRACT_PROPERTY_WITH_INITIALIZER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ABSTRACT_PROPERTY_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactoryABSTRACT_PROPERTY_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - PACKAGE_MEMBER_CANNOT_BE_PROTECTED = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory PACKAGE_MEMBER_CANNOT_BE_PROTECTED = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory BACKING_FIELD_IN_TRAIT = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); - SimpleDiagnosticFactory MUST_BE_INITIALIZED = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); - SimpleDiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); - SimpleDiagnosticFactory - PROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory - .create(ERROR); - DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, - PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = DiagnosticFactory3.create(ERROR, - PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, - PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = DiagnosticFactory1.create(ERROR, - PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = DiagnosticFactory1.create(ERROR, - PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + SimpleDiagnosticFactory GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory BACKING_FIELD_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory MUST_BE_INITIALIZED = SimpleDiagnosticFactory.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory MUST_BE_INITIALIZED_OR_BE_ABSTRACT = SimpleDiagnosticFactory.create(ERROR, + PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactoryPROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); + DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = + DiagnosticFactory3.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = + DiagnosticFactory3.create(ERROR,PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = + DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = + DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = + DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = DiagnosticFactory1.create(ERROR, - PositioningStrategies.POSITION_NAME_IDENTIFIER); - SimpleDiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); + DiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = + DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.positionModifier(JetTokens.OPEN_KEYWORD)); - SimpleDiagnosticFactory PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE = + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); - SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = SimpleDiagnosticFactory - .create(ERROR); // TODO : better positioning - SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory - BY_IN_SECONDARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory1 NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, - PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD)); - DiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, - PositioningStrategies.POSITION_NAME_IDENTIFIER); + SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = + SimpleDiagnosticFactory.create(ERROR); // TODO : better positioning + SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory BY_IN_SECONDARY_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory INITIALIZER_WITH_NO_ARGUMENTS = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory MANY_CALLS_TO_THIS = SimpleDiagnosticFactory.create(ERROR); + DiagnosticFactory1 NOTHING_TO_OVERRIDE = + DiagnosticFactory1.create(ERROR, PositioningStrategies.positionModifier(JetTokens.OVERRIDE_KEYWORD)); + DiagnosticFactory3 + VIRTUAL_MEMBER_HIDDEN = DiagnosticFactory3.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); - DiagnosticFactory1 ENUM_ENTRY_SHOULD_BE_INITIALIZED = DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); + DiagnosticFactory1 ENUM_ENTRY_SHOULD_BE_INITIALIZED = + DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory1 ENUM_ENTRY_ILLEGAL_TYPE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 UNINITIALIZED_VARIABLE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 UNINITIALIZED_PARAMETER = DiagnosticFactory1.create(ERROR); - UnusedElementDiagnosticFactory UNUSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, - PositioningStrategies.POSITION_NAME_IDENTIFIER); - UnusedElementDiagnosticFactory UNUSED_PARAMETER = UnusedElementDiagnosticFactory.create(WARNING, - PositioningStrategies.POSITION_NAME_IDENTIFIER); - UnusedElementDiagnosticFactory ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE = UnusedElementDiagnosticFactory.create(WARNING, - PositioningStrategies.POSITION_NAME_IDENTIFIER); + UnusedElementDiagnosticFactory UNUSED_VARIABLE = + UnusedElementDiagnosticFactory.create(WARNING, PositioningStrategies.POSITION_NAME_IDENTIFIER); + UnusedElementDiagnosticFactory UNUSED_PARAMETER = + UnusedElementDiagnosticFactory.create(WARNING, PositioningStrategies.POSITION_NAME_IDENTIFIER); + UnusedElementDiagnosticFactory ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE = + UnusedElementDiagnosticFactory.create(WARNING, PositioningStrategies.POSITION_NAME_IDENTIFIER); DiagnosticFactory1 VARIABLE_WITH_REDUNDANT_INITIALIZER = DiagnosticFactory1.create(WARNING); DiagnosticFactory2 UNUSED_VALUE = DiagnosticFactory2.create(WARNING); DiagnosticFactory1 UNUSED_CHANGED_VALUE = DiagnosticFactory1.create(WARNING); SimpleDiagnosticFactory UNUSED_EXPRESSION = SimpleDiagnosticFactory.create(WARNING); - SimpleDiagnosticFactory UNUSED_FUNCTION_LITERAL = SimpleDiagnosticFactory - .create(WARNING); + SimpleDiagnosticFactory UNUSED_FUNCTION_LITERAL = SimpleDiagnosticFactory.create(WARNING); DiagnosticFactory1 VAL_REASSIGNMENT = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 INITIALIZATION_BEFORE_DECLARATION = DiagnosticFactory1.create(ERROR); @@ -214,115 +183,89 @@ public interface Errors { SimpleDiagnosticFactory UNREACHABLE_CODE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - MANY_CLASS_OBJECTS = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - CLASS_OBJECT_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - DELEGATION_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - DELEGATION_NOT_TO_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory MANY_CLASS_OBJECTS = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory CLASS_OBJECT_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory DELEGATION_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory DELEGATION_NOT_TO_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NO_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NOT_A_CLASS = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - ILLEGAL_ESCAPE_SEQUENCE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ILLEGAL_ESCAPE_SEQUENCE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - LOCAL_EXTENSION_PROPERTY = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - LOCAL_VARIABLE_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - LOCAL_VARIABLE_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - VAL_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory LOCAL_EXTENSION_PROPERTY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory LOCAL_VARIABLE_WITH_GETTER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory LOCAL_VARIABLE_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory VAL_WITH_SETTER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory NO_GET_METHOD = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); - SimpleDiagnosticFactory NO_SET_METHOD = SimpleDiagnosticFactory - .create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); + SimpleDiagnosticFactory NO_GET_METHOD = + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); + SimpleDiagnosticFactory NO_SET_METHOD = + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.POSITION_ARRAY_ACCESS); - SimpleDiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory INC_DEC_SHOULD_NOT_RETURN_UNIT = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory2 ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT = DiagnosticFactory2.create(ERROR); AmbiguousDescriptorDiagnosticFactory ASSIGN_OPERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create(); - SimpleDiagnosticFactory - EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory - DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory AMBIGUOUS_SUPER = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory - ABSTRACT_SUPER_CALL = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory AMBIGUOUS_SUPER = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ABSTRACT_SUPER_CALL = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory NOT_A_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = SimpleDiagnosticFactory - .create(WARNING); - SimpleDiagnosticFactory - USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING); - SimpleDiagnosticFactory - CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING); - DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR);//, DiagnosticParameters.TYPE); - DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR);//, DiagnosticParameters.TYPE); + SimpleDiagnosticFactory CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING); + DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory HAS_NEXT_MISSING = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory HAS_NEXT_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory HAS_NEXT_MUST_BE_READABLE = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory HAS_NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory HAS_NEXT_FUNCTION_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory HAS_NEXT_MUST_BE_READABLE = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 HAS_NEXT_PROPERTY_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 HAS_NEXT_FUNCTION_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory - NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NEXT_AMBIGUITY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NEXT_MISSING = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory ITERATOR_MISSING = SimpleDiagnosticFactory.create(ERROR); AmbiguousDescriptorDiagnosticFactory ITERATOR_AMBIGUITY = AmbiguousDescriptorDiagnosticFactory.create(); DiagnosticFactory1 COMPARE_TO_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 CALLEE_NOT_A_FUNCTION = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY = SimpleDiagnosticFactory - .create(ERROR, - new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetDeclarationWithBody element) { - JetExpression bodyExpression = element.getBodyExpression(); - if (!(bodyExpression instanceof JetBlockExpression)) return Collections.emptyList(); - JetBlockExpression blockExpression = (JetBlockExpression)bodyExpression; - TextRange lastBracketRange = blockExpression.getLastBracketRange(); - if (lastBracketRange == null) return Collections.emptyList(); - return markRange(lastBracketRange); - } - }); + SimpleDiagnosticFactory RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY = + SimpleDiagnosticFactory.create(ERROR, + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetDeclarationWithBody element) { + JetExpression bodyExpression = element.getBodyExpression(); + if (!(bodyExpression instanceof JetBlockExpression)) { + return Collections.emptyList(); + } + JetBlockExpression blockExpression = (JetBlockExpression)bodyExpression; + TextRange lastBracketRange = blockExpression.getLastBracketRange(); + if (lastBracketRange == null) { + return Collections.emptyList(); + } + return markRange(lastBracketRange); + } + }); DiagnosticFactory1 RETURN_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 EXPECTED_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 ASSIGNMENT_TYPE_MISMATCH = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 IMPLICIT_CAST_TO_UNIT_OR_ANY = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 EXPRESSION_EXPECTED = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR); // TODO : Message + DiagnosticFactory1 UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 FINAL_CLASS_OBJECT_UPPER_BOUND = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 FINAL_UPPER_BOUND = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 USELESS_ELVIS = DiagnosticFactory1.create(WARNING); @@ -332,8 +275,7 @@ public interface Errors { DiagnosticFactory1 TOO_MANY_ARGUMENTS = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 ERROR_COMPILE_TIME_VALUE = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create( - ERROR, new PositioningStrategy() { + SimpleDiagnosticFactory ELSE_MISPLACED_IN_WHEN = SimpleDiagnosticFactory.create(ERROR, new PositioningStrategy() { @NotNull @Override public List mark(@NotNull JetWhenEntry entry) { @@ -352,127 +294,125 @@ public interface Errors { return markElement(element.getWhenKeywordElement()); } }); - SimpleDiagnosticFactory TYPE_MISMATCH_IN_RANGE = new SimpleDiagnosticFactory(ERROR, - new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetWhenConditionInRange condition) { - return markElement(condition.getOperationReference()); - } - }); - SimpleDiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory TYPE_MISMATCH_IN_RANGE = + new SimpleDiagnosticFactory(ERROR, + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetWhenConditionInRange condition) { + return markElement(condition.getOperationReference()); + } + }); + SimpleDiagnosticFactory CYCLIC_INHERITANCE_HIERARCHY = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - SUPERTYPE_NOT_A_CLASS_OR_TRAIT = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - SUPERTYPE_INITIALIZED_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory MANY_CLASSES_IN_SUPERTYPE_LIST = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SUPERTYPE_NOT_A_CLASS_OR_TRAIT = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory SUPERTYPE_INITIALIZED_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory CONSTRUCTOR_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = SimpleDiagnosticFactory.create(WARNING); + SimpleDiagnosticFactory SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory SUPERTYPE_APPEARS_TWICE = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory - FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory FINAL_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 ILLEGAL_SELECTOR = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory BREAK_OR_CONTINUE_OUTSIDE_A_LOOP = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 NOT_A_LOOP_LABEL = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 NOT_A_RETURN_LABEL = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = SimpleDiagnosticFactory - .create(ERROR); - SimpleDiagnosticFactory NULLABLE_SUPERTYPE = SimpleDiagnosticFactory - .create(ERROR, new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetNullableType element) { - return markNode(element.getQuestionMarkNode()); - } - }); + SimpleDiagnosticFactory ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NULLABLE_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, + new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetNullableType element) { + return markNode(element.getQuestionMarkNode()); + } + }); DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory AMBIGUOUS_LABEL = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 UNSUPPORTED = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 UNNECESSARY_SAFE_CALL = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 UNNECESSARY_NOT_NULL_ASSERTION = DiagnosticFactory1.create(WARNING); - DiagnosticFactory2 NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER = + DiagnosticFactory2.create(ERROR); DiagnosticFactory2 AUTOCAST_IMPOSSIBLE = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 TYPE_MISMATCH_IN_FOR_LOOP = DiagnosticFactory2.create(ERROR); DiagnosticFactory1 TYPE_MISMATCH_IN_CONDITION = DiagnosticFactory1.create(ERROR); - DiagnosticFactory2 TYPE_MISMATCH_IN_TUPLE_PATTERN = DiagnosticFactory2.create(ERROR); // TODO: message + DiagnosticFactory2 TYPE_MISMATCH_IN_TUPLE_PATTERN = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 TYPE_MISMATCH_IN_BINDING_PATTERN = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 INCOMPATIBLE_TYPES = DiagnosticFactory2.create(ERROR); - SimpleDiagnosticFactory - EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory EXPECTED_CONDITION = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 CANNOT_CHECK_FOR_ERASED = DiagnosticFactory1.create(ERROR); DiagnosticFactory2 UNCHECKED_CAST = DiagnosticFactory2.create(WARNING); - DiagnosticFactory3> INCONSISTENT_TYPE_PARAMETER_VALUES = + DiagnosticFactory3> + INCONSISTENT_TYPE_PARAMETER_VALUES = DiagnosticFactory3.create(ERROR); + + DiagnosticFactory3 EQUALITY_NOT_APPLICABLE = DiagnosticFactory3.create(ERROR); - DiagnosticFactory3 EQUALITY_NOT_APPLICABLE = DiagnosticFactory3.create(ERROR); - - DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR); - DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, - PositioningStrategies.POSITION_VISIBILITY_MODIFIER); - DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, - PositioningStrategies.POSITION_VISIBILITY_MODIFIER); + DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = + DiagnosticFactory2.create(ERROR); + DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = + DiagnosticFactory3.create(ERROR, PositioningStrategies.POSITION_VISIBILITY_MODIFIER); + DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = + DiagnosticFactory3.create(ERROR, PositioningStrategies.POSITION_VISIBILITY_MODIFIER); DiagnosticFactory2 RETURN_TYPE_MISMATCH_ON_OVERRIDE = DiagnosticFactory2.create(ERROR, PositioningStrategies.POSITION_DECLARATION); - DiagnosticFactory2 VAR_OVERRIDDEN_BY_VAL = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetProperty property) { - return markNode(property.getValOrVarNode()); - } - }); - - DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR); - - DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = DiagnosticFactory2.create(ERROR); - - DiagnosticFactory2 CONFLICTING_OVERLOADS = DiagnosticFactory2.create(ERROR, new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetDeclaration jetDeclaration) { - if (jetDeclaration instanceof JetNamedFunction) { - JetNamedFunction functionElement = (JetNamedFunction) jetDeclaration; - return markRange(new TextRange( - functionElement.getStartOfSignatureElement().getTextRange().getStartOffset(), - functionElement.getEndOfSignatureElement().getTextRange().getEndOffset() - )); - } - else if (jetDeclaration instanceof JetClass) { - // primary constructor - JetClass klass = (JetClass) jetDeclaration; - PsiElement nameAsDeclaration = klass.getNameIdentifier(); - if (nameAsDeclaration == null) { - return markRange(klass.getTextRange()); + DiagnosticFactory2 VAR_OVERRIDDEN_BY_VAL = + DiagnosticFactory2.create(ERROR, new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetProperty property) { + return markNode(property.getValOrVarNode()); } - PsiElement primaryConstructorParameterList = klass.getPrimaryConstructorParameterList(); - if (primaryConstructorParameterList == null) { - return markRange(nameAsDeclaration.getTextRange()); + }); + + DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = + DiagnosticFactory2.create(ERROR); + + DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = + DiagnosticFactory2.create(ERROR); + + DiagnosticFactory2 CONFLICTING_OVERLOADS = + DiagnosticFactory2.create(ERROR, new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetDeclaration jetDeclaration) { + if (jetDeclaration instanceof JetNamedFunction) { + JetNamedFunction functionElement = (JetNamedFunction)jetDeclaration; + return markRange(new TextRange( + functionElement.getStartOfSignatureElement().getTextRange().getStartOffset(), + functionElement.getEndOfSignatureElement().getTextRange().getEndOffset() + )); + } + else if (jetDeclaration instanceof JetClass) { + // primary constructor + JetClass klass = (JetClass)jetDeclaration; + PsiElement nameAsDeclaration = klass.getNameIdentifier(); + if (nameAsDeclaration == null) { + return markRange(klass.getTextRange()); + } + PsiElement primaryConstructorParameterList = klass.getPrimaryConstructorParameterList(); + if (primaryConstructorParameterList == null) { + return markRange(nameAsDeclaration.getTextRange()); + } + return markRange(new TextRange( + nameAsDeclaration.getTextRange().getStartOffset(), + primaryConstructorParameterList.getTextRange().getEndOffset() + )); + } + else { + // safe way + return markRange(jetDeclaration.getTextRange()); + } } - return markRange(new TextRange( - nameAsDeclaration.getTextRange().getStartOffset(), - primaryConstructorParameterList.getTextRange().getEndOffset() - )); - } - else { - // safe way - return markRange(jetDeclaration.getTextRange()); - } - } - }); + }); DiagnosticFactory3 RESULT_TYPE_MISMATCH = DiagnosticFactory3.create(ERROR); @@ -482,18 +422,15 @@ public interface Errors { AmbiguousDescriptorDiagnosticFactory NONE_APPLICABLE = new AmbiguousDescriptorDiagnosticFactory(); DiagnosticFactory1 NO_VALUE_FOR_PARAMETER = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 MISSING_RECEIVER = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory - NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR); + SimpleDiagnosticFactory NO_RECEIVER_ADMITTED = SimpleDiagnosticFactory.create(ERROR); - SimpleDiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = SimpleDiagnosticFactory - .create(ERROR); + SimpleDiagnosticFactory CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS = SimpleDiagnosticFactory.create(ERROR); DiagnosticFactory1 TYPE_INFERENCE_FAILED = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 WRONG_NUMBER_OF_TYPE_ARGUMENTS = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 UNRESOLVED_IDE_TEMPLATE = DiagnosticFactory1.create(ERROR); - SimpleDiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = SimpleDiagnosticFactory - .create(WARNING); + SimpleDiagnosticFactory DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED = SimpleDiagnosticFactory.create(WARNING); DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR); @@ -509,10 +446,11 @@ public interface Errors { try { Object value = field.get(null); if (value instanceof AbstractDiagnosticFactory) { - AbstractDiagnosticFactory factory = (AbstractDiagnosticFactory) value; + AbstractDiagnosticFactory factory = (AbstractDiagnosticFactory)value; factory.setName(field.getName()); } - } catch (IllegalAccessException e) { + } + catch (IllegalAccessException e) { throw new IllegalStateException(e); } } From be34ab252693ebfdbd710e61bcec0d79d0e7ecf7 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:17:50 +0400 Subject: [PATCH 25/76] Got rid of DiagnosticFactoryWithMessageFormat class. --- .../lang/diagnostics/DiagnosticFactory1.java | 2 +- .../lang/diagnostics/DiagnosticFactory2.java | 2 +- .../lang/diagnostics/DiagnosticFactory3.java | 2 +- .../DiagnosticFactoryWithMessageFormat.java | 30 ------------------- 4 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java index db3b08e5965..ebc4ebe4b23 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory1.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; /** * @author svtk */ -public class DiagnosticFactory1 extends DiagnosticFactoryWithMessageFormat { +public class DiagnosticFactory1 extends DiagnosticFactoryWithPsiElement { @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A argument) { return new DiagnosticWithParameters1(element, argument, this, severity); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java index 049b8824d38..5f63a87870b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory2.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; /** * @author abreslav */ -public class DiagnosticFactory2 extends DiagnosticFactoryWithMessageFormat { +public class DiagnosticFactory2 extends DiagnosticFactoryWithPsiElement { @NotNull public ParametrizedDiagnostic on(@NotNull E element, @NotNull A a, @NotNull B b) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java index 678bb9b3dbf..2bb0deb23da 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactory3.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; /** * @author svtk */ -public class DiagnosticFactory3 extends DiagnosticFactoryWithMessageFormat { +public class DiagnosticFactory3 extends DiagnosticFactoryWithPsiElement { protected DiagnosticFactory3(Severity severity, PositioningStrategy positioningStrategy) { super(severity, positioningStrategy); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java deleted file mode 100644 index a04b6d59dce..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticFactoryWithMessageFormat.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.diagnostics; - -import com.intellij.psi.PsiElement; - -import java.text.MessageFormat; - -/** -* @author abreslav -*/ -public abstract class DiagnosticFactoryWithMessageFormat extends DiagnosticFactoryWithPsiElement { - protected DiagnosticFactoryWithMessageFormat(Severity severity, PositioningStrategy positioningStrategy) { - super(severity, positioningStrategy); - } -} From d1f35cfd9c1b1a864804f832a01e49227c2eafa2 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:16:14 +0400 Subject: [PATCH 26/76] Reformatted Errors, got rid of obsolete comments. --- .../lang/diagnostics/rendering/DefaultDiagnosticRenderer.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 1e1b586397c..7989922ec68 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -75,9 +75,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer @Override public String render(@NotNull Collection tokens) { StringBuilder sb = new StringBuilder(); - for (Iterator iterator = - tokens.iterator(); - iterator.hasNext(); ) { + for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { JetKeywordToken modifier = iterator.next(); sb.append(modifier.getValue()); if (iterator.hasNext()) { From 545e559d5b4bbcac0311dc13df0670b168132dc5 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:46:28 +0400 Subject: [PATCH 27/76] Made UnresolvedReferenceDiagnostic subtype of DiagnosticWithParameters1 to simplify diagnostic renderer. --- .../UnresolvedReferenceDiagnostic.java | 29 ++----------------- .../UnresolvedReferenceDiagnosticFactory.java | 21 ++++++++++++-- .../rendering/DefaultDiagnosticRenderer.java | 18 ++---------- 3 files changed, 23 insertions(+), 45 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java index 938cb898250..ee443e2051c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java @@ -16,38 +16,15 @@ package org.jetbrains.jet.lang.diagnostics; -import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression; -import java.util.Collections; -import java.util.List; - -import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR; - /** * @author abreslav */ -public class UnresolvedReferenceDiagnostic extends AbstractDiagnostic { - @NotNull - @Override - public UnresolvedReferenceDiagnosticFactory getFactory() { - return (UnresolvedReferenceDiagnosticFactory)super.getFactory(); - } - +public class UnresolvedReferenceDiagnostic extends DiagnosticWithParameters1 { public UnresolvedReferenceDiagnostic(@NotNull JetReferenceExpression referenceExpression, - @NotNull UnresolvedReferenceDiagnosticFactory factory) { - super(referenceExpression, factory, ERROR); - } - - @NotNull - @Override - public List getTextRanges() { - JetReferenceExpression element = getPsiElement(); - if (element instanceof JetArrayAccessExpression) { - return ((JetArrayAccessExpression) element).getBracketRanges(); - } - return Collections.singletonList(element.getTextRange()); + @NotNull UnresolvedReferenceDiagnosticFactory factory, @NotNull Severity severity) { + super(referenceExpression, referenceExpression.getText(), factory, severity); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java index 4aee43e3422..d3647c31363 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java @@ -16,18 +16,33 @@ package org.jetbrains.jet.lang.diagnostics; +import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression; +import java.util.Collections; +import java.util.List; + /** * @author abreslav */ -public class UnresolvedReferenceDiagnosticFactory extends AbstractDiagnosticFactory { - private UnresolvedReferenceDiagnosticFactory() { +public class UnresolvedReferenceDiagnosticFactory extends DiagnosticFactory1 { + public UnresolvedReferenceDiagnosticFactory() { + super(Severity.ERROR, new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetReferenceExpression element) { + if (element instanceof JetArrayAccessExpression) { + return ((JetArrayAccessExpression) element).getBracketRanges(); + } + return Collections.singletonList(element.getTextRange()); + } + }); } public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) { - return new UnresolvedReferenceDiagnostic(reference, this); + return new UnresolvedReferenceDiagnostic(reference, this, severity); } public static UnresolvedReferenceDiagnosticFactory create() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 7989922ec68..abcc949afbb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -53,7 +53,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } })); - map.put(UNRESOLVED_REFERENCE, new UnresolvedReferenceDiagnosticRenderer("Unresolved reference: ")); + map.put(UNRESOLVED_REFERENCE, new DiagnosticWithParameters1Renderer("Unresolved reference: {0}", TO_STRING)); map.put(INVISIBLE_REFERENCE, new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", @@ -124,7 +124,7 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); map.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); - map.put(NAMED_PARAMETER_NOT_FOUND, new UnresolvedReferenceDiagnosticRenderer("Cannot find a parameter with this name: ")); + map.put(NAMED_PARAMETER_NOT_FOUND, new DiagnosticWithParameters1Renderer("Cannot find a parameter with this name: {0}", TO_STRING)); map.put(VARARG_OUTSIDE_PARENTHESES, new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); map.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); @@ -529,20 +529,6 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer } } - private static class UnresolvedReferenceDiagnosticRenderer implements DiagnosticRenderer { - private String messagePrefix; - - private UnresolvedReferenceDiagnosticRenderer(@NotNull String messagePrefix) { - this.messagePrefix = messagePrefix; - } - - @NotNull - @Override - public String render(@NotNull UnresolvedReferenceDiagnostic diagnostic) { - return messagePrefix + diagnostic.getPsiElement().getText(); - } - } - private static class AmbiguousDescriptorDiagnosticRenderer extends DiagnosticWithParameters1Renderer>> { private AmbiguousDescriptorDiagnosticRenderer(@NotNull String message) { From 9f3f309625088715fae1c42d6226c85c7cbbbf30 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 15:50:57 +0400 Subject: [PATCH 28/76] Made RedeclarationDiagnostic simpler. --- .../diagnostics/RedeclarationDiagnostic.java | 49 +++++++++---------- .../RedeclarationDiagnosticFactory.java | 7 +-- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index e3080ba18e5..2e04e3eff8b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -27,36 +27,31 @@ import java.util.List; /** * @author abreslav */ -public interface RedeclarationDiagnostic extends Diagnostic { - String getName(); +public class RedeclarationDiagnostic extends AbstractDiagnostic { + private String name; - class SimpleRedeclarationDiagnostic extends AbstractDiagnostic implements RedeclarationDiagnostic { - private String name; - - public SimpleRedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, RedeclarationDiagnosticFactory factory) { - super(psiElement, factory, factory.severity); - this.name = name; - } - - @NotNull - @Override - public RedeclarationDiagnosticFactory getFactory() { - return (RedeclarationDiagnosticFactory)super.getFactory(); - } - - @Override - public String getName() { - return name; - } - - @NotNull - @Override - public List getTextRanges() { - return POSITION_REDECLARATION.mark(getPsiElement()); - } + public RedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, RedeclarationDiagnosticFactory factory) { + super(psiElement, factory, factory.severity); + this.name = name; } - PositioningStrategy POSITION_REDECLARATION = new PositioningStrategy() { + @NotNull + @Override + public RedeclarationDiagnosticFactory getFactory() { + return (RedeclarationDiagnosticFactory)super.getFactory(); + } + + public String getName() { + return name; + } + + @NotNull + @Override + public List getTextRanges() { + return POSITION_REDECLARATION.mark(getPsiElement()); + } + + private static final PositioningStrategy POSITION_REDECLARATION = new PositioningStrategy() { @NotNull @Override public List mark(@NotNull PsiElement element) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java index 59d138f52c4..a651060b00d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java @@ -30,11 +30,6 @@ public class RedeclarationDiagnosticFactory extends AbstractDiagnosticFactory { } public RedeclarationDiagnostic on(@NotNull PsiElement duplicatingElement, @NotNull String name) { - return new RedeclarationDiagnostic.SimpleRedeclarationDiagnostic(duplicatingElement, name, this); - } - - @Override - public String toString() { - return getName(); + return new RedeclarationDiagnostic(duplicatingElement, name, this); } } From 4d05b6757c180237eba4ddb836969235c1148793 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 16:07:47 +0400 Subject: [PATCH 29/76] Made RedeclarationDiagnostic subtype of DiagnosticWithParameters1 to simplify diagnostic renderer. --- .../diagnostics/RedeclarationDiagnostic.java | 47 ++----------------- .../RedeclarationDiagnosticFactory.java | 32 +++++++++++-- .../rendering/DefaultDiagnosticRenderer.java | 18 +------ 3 files changed, 34 insertions(+), 63 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java index 2e04e3eff8b..093a90f6451 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java @@ -27,48 +27,9 @@ import java.util.List; /** * @author abreslav */ -public class RedeclarationDiagnostic extends AbstractDiagnostic { - private String name; - - public RedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, RedeclarationDiagnosticFactory factory) { - super(psiElement, factory, factory.severity); - this.name = name; +public class RedeclarationDiagnostic extends DiagnosticWithParameters1 { + public RedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, + @NotNull RedeclarationDiagnosticFactory factory, @NotNull Severity severity) { + super(psiElement, name, factory, severity); } - - @NotNull - @Override - public RedeclarationDiagnosticFactory getFactory() { - return (RedeclarationDiagnosticFactory)super.getFactory(); - } - - public String getName() { - return name; - } - - @NotNull - @Override - public List getTextRanges() { - return POSITION_REDECLARATION.mark(getPsiElement()); - } - - private static final PositioningStrategy POSITION_REDECLARATION = new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull PsiElement element) { - if (element instanceof JetNamedDeclaration) { - PsiElement nameIdentifier = ((JetNamedDeclaration) element).getNameIdentifier(); - if (nameIdentifier != null) { - return markElement(nameIdentifier); - } - } - else if (element instanceof JetFile) { - JetFile file = (JetFile) element; - PsiElement nameIdentifier = file.getNamespaceHeader().getNameIdentifier(); - if (nameIdentifier != null) { - return markElement(nameIdentifier); - } - } - return markElement(element); - } - }; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java index a651060b00d..bcf0598504f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java @@ -16,20 +16,44 @@ package org.jetbrains.jet.lang.diagnostics; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetNamedDeclaration; + +import java.util.List; /** * @author abreslav */ -public class RedeclarationDiagnosticFactory extends AbstractDiagnosticFactory { - final Severity severity; +public class RedeclarationDiagnosticFactory extends DiagnosticFactory1 { + private static final PositioningStrategy POSITION_REDECLARATION = new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull PsiElement element) { + if (element instanceof JetNamedDeclaration) { + PsiElement nameIdentifier = ((JetNamedDeclaration) element).getNameIdentifier(); + if (nameIdentifier != null) { + return markElement(nameIdentifier); + } + } + else if (element instanceof JetFile) { + JetFile file = (JetFile) element; + PsiElement nameIdentifier = file.getNamespaceHeader().getNameIdentifier(); + if (nameIdentifier != null) { + return markElement(nameIdentifier); + } + } + return markElement(element); + } + }; public RedeclarationDiagnosticFactory(Severity severity) { - this.severity = severity; + super(severity, POSITION_REDECLARATION); } public RedeclarationDiagnostic on(@NotNull PsiElement duplicatingElement, @NotNull String name) { - return new RedeclarationDiagnostic(duplicatingElement, name, this); + return new RedeclarationDiagnostic(duplicatingElement, name, this, severity); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index abcc949afbb..43fce44d057 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -62,8 +62,8 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", NAME, NAME)); - map.put(REDECLARATION, new RedeclarationDiagnosticRenderer("Redeclaration: ")); - map.put(NAME_SHADOWING, new RedeclarationDiagnosticRenderer("Name shadowed: ")); + map.put(REDECLARATION, new DiagnosticWithParameters1Renderer("Redeclaration: {0}", NAME)); + map.put(NAME_SHADOWING, new DiagnosticWithParameters1Renderer("Name shadowed: {0}", NAME)); map.put(TYPE_MISMATCH, new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", @@ -515,20 +515,6 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer return renderer.render(diagnostic); } - private static class RedeclarationDiagnosticRenderer implements DiagnosticRenderer { - private String messagePrefix; - - private RedeclarationDiagnosticRenderer(@NotNull String messagePrefix) { - this.messagePrefix = messagePrefix; - } - - @NotNull - @Override - public String render(@NotNull RedeclarationDiagnostic diagnostic) { - return messagePrefix + diagnostic.getName(); - } - } - private static class AmbiguousDescriptorDiagnosticRenderer extends DiagnosticWithParameters1Renderer>> { private AmbiguousDescriptorDiagnosticRenderer(@NotNull String message) { From 1501883ded2836c19de67adb510420a2e3aa392b Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 16:19:16 +0400 Subject: [PATCH 30/76] Removed RedeclarationDiagnostic class, since it's not very useful. --- .../diagnostics/RedeclarationDiagnostic.java | 35 ------------------- .../RedeclarationDiagnosticFactory.java | 4 --- .../jet/plugin/highlighter/JetPsiChecker.java | 13 ++++--- 3 files changed, 6 insertions(+), 46 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java deleted file mode 100644 index 093a90f6451..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnostic.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.diagnostics; - -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetNamedDeclaration; - -import java.util.List; - -/** - * @author abreslav - */ -public class RedeclarationDiagnostic extends DiagnosticWithParameters1 { - public RedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, - @NotNull RedeclarationDiagnosticFactory factory, @NotNull Severity severity) { - super(psiElement, name, factory, severity); - } -} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java index bcf0598504f..023a7e8c077 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/RedeclarationDiagnosticFactory.java @@ -52,8 +52,4 @@ public class RedeclarationDiagnosticFactory extends DiagnosticFactory1 redeclarations, - @NotNull RedeclarationDiagnostic diagnostic, + @NotNull Diagnostic redeclarationDiagnostic, @NotNull AnnotationHolder holder) { - if (!redeclarations.add(diagnostic.getPsiElement())) return null; - List textRanges = diagnostic.getTextRanges(); + if (!redeclarations.add(redeclarationDiagnostic.getPsiElement())) return null; + List textRanges = redeclarationDiagnostic.getTextRanges(); if (textRanges.isEmpty()) return null; - return holder.createErrorAnnotation(textRanges.get(0), getMessage(diagnostic)); + return holder.createErrorAnnotation(textRanges.get(0), getMessage(redeclarationDiagnostic)); } } From dd3c9146cd3e145f6c5f4c1e30cc941ccc17e2b8 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 16:30:11 +0400 Subject: [PATCH 31/76] Removed UnresolvedReferenceDiagnostic class, since it's not very useful. --- .../UnresolvedReferenceDiagnostic.java | 30 ------------------- .../UnresolvedReferenceDiagnosticFactory.java | 4 +-- .../tests/org/jetbrains/jet/JetTestUtils.java | 7 ++--- .../jet/resolve/ExpectedResolveData.java | 7 ++--- .../highlighter/DebugInfoAnnotator.java | 6 ++-- .../jet/plugin/highlighter/JetPsiChecker.java | 5 ++-- 6 files changed, 13 insertions(+), 46 deletions(-) delete mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java deleted file mode 100644 index ee443e2051c..00000000000 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnostic.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.diagnostics; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetReferenceExpression; - -/** - * @author abreslav - */ -public class UnresolvedReferenceDiagnostic extends DiagnosticWithParameters1 { - public UnresolvedReferenceDiagnostic(@NotNull JetReferenceExpression referenceExpression, - @NotNull UnresolvedReferenceDiagnosticFactory factory, @NotNull Severity severity) { - super(referenceExpression, referenceExpression.getText(), factory, severity); - } -} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java index d3647c31363..fd80049556d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/UnresolvedReferenceDiagnosticFactory.java @@ -41,8 +41,8 @@ public class UnresolvedReferenceDiagnosticFactory extends DiagnosticFactory1 on(@NotNull JetReferenceExpression reference) { + return new DiagnosticWithParameters1(reference, reference.getText(), this, severity); } public static UnresolvedReferenceDiagnosticFactory create() { diff --git a/compiler/tests/org/jetbrains/jet/JetTestUtils.java b/compiler/tests/org/jetbrains/jet/JetTestUtils.java index a12c4693120..de37982408a 100644 --- a/compiler/tests/org/jetbrains/jet/JetTestUtils.java +++ b/compiler/tests/org/jetbrains/jet/JetTestUtils.java @@ -26,10 +26,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; +import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnosticFactory; import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Severity; -import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; @@ -102,9 +102,8 @@ public class JetTestUtils { @Override public void report(@NotNull Diagnostic diagnostic) { - if (diagnostic instanceof UnresolvedReferenceDiagnostic) { - UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic)diagnostic; - throw new IllegalStateException("Unresolved: " + unresolvedReferenceDiagnostic.getPsiElement().getText()); + if (diagnostic.getFactory() instanceof UnresolvedReferenceDiagnosticFactory) { + throw new IllegalStateException("Unresolved: " + diagnostic.getPsiElement().getText()); } } }; diff --git a/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java b/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java index 4ff2c59ebfb..bdca4724f4f 100644 --- a/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java +++ b/compiler/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; -import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic; +import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnosticFactory; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; @@ -146,9 +146,8 @@ public abstract class ExpectedResolveData { CompileCompilerDependenciesTest.compilerDependenciesForTests(CompilerSpecialMode.REGULAR)); BindingContext bindingContext = analyzeExhaust.getBindingContext(); for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { - if (diagnostic instanceof UnresolvedReferenceDiagnostic) { - UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic) diagnostic; - unresolvedReferences.add(unresolvedReferenceDiagnostic.getPsiElement()); + if (diagnostic.getFactory() instanceof UnresolvedReferenceDiagnosticFactory) { + unresolvedReferences.add(diagnostic.getPsiElement()); } } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/DebugInfoAnnotator.java b/idea/src/org/jetbrains/jet/plugin/highlighter/DebugInfoAnnotator.java index 9c873a73df0..0421c720cc7 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/DebugInfoAnnotator.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/DebugInfoAnnotator.java @@ -29,7 +29,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic; +import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnosticFactory; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.ErrorUtils; @@ -72,8 +72,8 @@ public class DebugInfoAnnotator implements Annotator { final Set unresolvedReferences = Sets.newHashSet(); for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { - if (diagnostic instanceof UnresolvedReferenceDiagnostic) { - unresolvedReferences.add(((UnresolvedReferenceDiagnostic) diagnostic).getPsiElement()); + if (diagnostic.getFactory() instanceof UnresolvedReferenceDiagnosticFactory) { + unresolvedReferences.add((JetReferenceExpression)diagnostic.getPsiElement()); } } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index e024c4a2813..ed012e03db0 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -146,9 +146,8 @@ public class JetPsiChecker implements Annotator { if (diagnostic.getFactory() == Errors.UNRESOLVED_IDE_TEMPLATE) { return; } - if (diagnostic instanceof UnresolvedReferenceDiagnostic) { - UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic)diagnostic; - JetReferenceExpression referenceExpression = unresolvedReferenceDiagnostic.getPsiElement(); + if (diagnostic.getFactory() instanceof UnresolvedReferenceDiagnosticFactory) { + JetReferenceExpression referenceExpression = (JetReferenceExpression)diagnostic.getPsiElement(); PsiReference reference = referenceExpression.getReference(); if (reference instanceof MultiRangeReference) { MultiRangeReference mrr = (MultiRangeReference)reference; From 13ac89a591c4c750317680eb8080bf73db653fff Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 16:38:39 +0400 Subject: [PATCH 32/76] Fixed bad error messages for ABSTRACT_MODIFIER_IN_TRAIT and OPEN_MODIFIER_IN_TRAIT. --- .../lang/diagnostics/rendering/DefaultDiagnosticRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 43fce44d057..305e4e74dc8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -91,8 +91,8 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer map.put(REDUNDANT_MODIFIER, new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING)); - map.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); - map.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''{0}'' is redundant in trait")); + map.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''abstract'' is redundant in trait")); + map.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''open'' is redundant in trait")); map.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); map.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer( From f559369f54d8cce81067f4693b0e6d4d3d559201 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 17:50:15 +0400 Subject: [PATCH 33/76] Simplified code in DefaultDiagnosticRenderer. Replaced direct renderer creation with calling generic "put" method: type arguments are not needed, descriptor renderer type specification is not needed. --- .../rendering/DefaultDiagnosticRenderer.java | 799 ++++++++---------- 1 file changed, 354 insertions(+), 445 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 305e4e74dc8..746ce87d618 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -16,12 +16,14 @@ package org.jetbrains.jet.lang.diagnostics.rendering; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.diagnostics.*; -import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; +import org.jetbrains.jet.lang.psi.JetTypeConstraint; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; -import org.jetbrains.jet.lang.resolve.calls.inference.SolutionStatus; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -40,468 +42,392 @@ import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; */ public class DefaultDiagnosticRenderer implements DiagnosticRenderer { public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); + private static final Renderer>> AMBIGUOUS_CALLS = + new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> argument) { + StringBuilder stringBuilder = new StringBuilder("\n"); + for (ResolvedCall call : argument) { + stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); + } + return stringBuilder.toString(); + } + }; private final Map> map = new HashMap>(); - private DefaultDiagnosticRenderer() { - map.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer("{0}", new Renderer() { + protected final void put(SimpleDiagnosticFactory factory, String message) { + map.put(factory, new SimpleDiagnosticRenderer(message)); + } + + protected final void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { + map.put(factory, new DiagnosticWithParameters1Renderer(message, rendererA)); + } + + protected final void put(DiagnosticFactory2 factory, + String message, + Renderer rendererA, + Renderer rendererB) { + map.put(factory, new DiagnosticWithParameters2Renderer(message, rendererA, rendererB)); + } + + protected final void put(DiagnosticFactory3 factory, + String message, + Renderer rendererA, + Renderer rendererB, + Renderer rendererC) { + map.put(factory, new DiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)); + } + + protected DefaultDiagnosticRenderer() { + put(EXCEPTION_WHILE_ANALYZING, "{0}", new Renderer() { @NotNull @Override public String render(@NotNull Throwable e) { return e.getClass().getSimpleName() + ": " + e.getMessage(); } - })); + }); - map.put(UNRESOLVED_REFERENCE, new DiagnosticWithParameters1Renderer("Unresolved reference: {0}", TO_STRING)); + put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", TO_STRING); - map.put(INVISIBLE_REFERENCE, - new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", - NAME, NAME)); - map.put(INVISIBLE_MEMBER, - new DiagnosticWithParameters2Renderer("Cannot access ''{0}'' in ''{1}''", - NAME, NAME)); + put(INVISIBLE_REFERENCE, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); + put(INVISIBLE_MEMBER, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); - map.put(REDECLARATION, new DiagnosticWithParameters1Renderer("Redeclaration: {0}", NAME)); - map.put(NAME_SHADOWING, new DiagnosticWithParameters1Renderer("Name shadowed: {0}", NAME)); + put(REDECLARATION, "Redeclaration: {0}", NAME); + put(NAME_SHADOWING, "Name shadowed: {0}", NAME); - map.put(TYPE_MISMATCH, - new DiagnosticWithParameters2Renderer("Type mismatch: inferred type is {1} but {0} was expected", - RENDER_TYPE, RENDER_TYPE)); - map.put(INCOMPATIBLE_MODIFIERS, - new DiagnosticWithParameters1Renderer>("Incompatible modifiers: ''{0}''", - new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection tokens) { - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { - JetKeywordToken modifier = iterator.next(); - sb.append(modifier.getValue()); - if (iterator.hasNext()) { - sb.append(" "); - } - } - return sb.toString(); - } - } - )); - map.put(ILLEGAL_MODIFIER, new DiagnosticWithParameters1Renderer("Illegal modifier ''{0}''", TO_STRING)); - - map.put(REDUNDANT_MODIFIER, - new DiagnosticWithParameters2Renderer("Modifier {0} is redundant because {1} is present", - TO_STRING, TO_STRING)); - map.put(ABSTRACT_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''abstract'' is redundant in trait")); - map.put(OPEN_MODIFIER_IN_TRAIT, new SimpleDiagnosticRenderer("Modifier ''open'' is redundant in trait")); - map.put(REDUNDANT_MODIFIER_IN_GETTER, new SimpleDiagnosticRenderer("Visibility modifiers are redundant in getter")); - map.put(TRAIT_CAN_NOT_BE_FINAL, new SimpleDiagnosticRenderer("Trait can not be final")); - map.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, new SimpleDiagnosticRenderer( - "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly")); // TODO: message - map.put(RETURN_NOT_ALLOWED, new SimpleDiagnosticRenderer("'return' is not allowed here")); - map.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, - new SimpleDiagnosticRenderer("Projections are not allowed for immediate arguments of a supertype")); - map.put(LABEL_NAME_CLASH, new SimpleDiagnosticRenderer("There is more than one label with such a name in this scope")); - map.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, new SimpleDiagnosticRenderer("Expression expected, but a namespace name found")); - - map.put(CANNOT_IMPORT_FROM_ELEMENT, - new DiagnosticWithParameters1Renderer("Cannot import from ''{0}''", NAME)); - map.put(CANNOT_BE_IMPORTED, new DiagnosticWithParameters1Renderer( - "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME)); - map.put(USELESS_HIDDEN_IMPORT, new SimpleDiagnosticRenderer("Useless import, it is hidden further")); - map.put(USELESS_SIMPLE_IMPORT, new SimpleDiagnosticRenderer("Useless import, does nothing")); - - map.put(CANNOT_INFER_PARAMETER_TYPE, new SimpleDiagnosticRenderer( - "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation")); - - map.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, - new SimpleDiagnosticRenderer("This property doesn't have a backing field, because it's abstract")); - map.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, new SimpleDiagnosticRenderer( - "This property doesn't have a backing field, because it has custom accessors without reference to the backing field")); - map.put(INACCESSIBLE_BACKING_FIELD, new SimpleDiagnosticRenderer("The backing field is not accessible here")); - map.put(NOT_PROPERTY_BACKING_FIELD, - new SimpleDiagnosticRenderer("The referenced variable is not a property and doesn't have backing field")); - - map.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, - new SimpleDiagnosticRenderer("Mixing named and positioned arguments in not allowed")); - map.put(ARGUMENT_PASSED_TWICE, new SimpleDiagnosticRenderer("An argument is already passed for this parameter")); - map.put(NAMED_PARAMETER_NOT_FOUND, new DiagnosticWithParameters1Renderer("Cannot find a parameter with this name: {0}", TO_STRING)); - map.put(VARARG_OUTSIDE_PARENTHESES, - new SimpleDiagnosticRenderer("Passing value as a vararg is only allowed inside a parenthesized argument list")); - map.put(NON_VARARG_SPREAD, new SimpleDiagnosticRenderer("The spread operator (*foo) may only be applied in a vararg position")); - - map.put(MANY_FUNCTION_LITERAL_ARGUMENTS, - new SimpleDiagnosticRenderer("Only one function literal is allowed outside a parenthesized argument list")); - map.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, - new SimpleDiagnosticRenderer("This property must either have a type annotation or be initialized")); - - map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, - new SimpleDiagnosticRenderer("This property cannot be declared abstract")); - map.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, - new SimpleDiagnosticRenderer("A property may be abstract only when defined in a class or trait")); - map.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, new SimpleDiagnosticRenderer("Property with initializer cannot be abstract")); - map.put(ABSTRACT_PROPERTY_WITH_GETTER, new SimpleDiagnosticRenderer("Property with getter implementation cannot be abstract")); - map.put(ABSTRACT_PROPERTY_WITH_SETTER, new SimpleDiagnosticRenderer("Property with setter implementation cannot be abstract")); - - map.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, new SimpleDiagnosticRenderer("Package member cannot be protected")); - - map.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, - new SimpleDiagnosticRenderer("Getter visibility must be the same as property visibility")); - map.put(BACKING_FIELD_IN_TRAIT, new SimpleDiagnosticRenderer("Property in a trait cannot have a backing field")); - map.put(MUST_BE_INITIALIZED, new SimpleDiagnosticRenderer("Property must be initialized")); - map.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, new SimpleDiagnosticRenderer("Property must be initialized or be abstract")); - map.put(PROPERTY_INITIALIZER_IN_TRAIT, new SimpleDiagnosticRenderer("Property initializers are not allowed in traits")); - map.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, - new SimpleDiagnosticRenderer("Initializer is not allowed here because this property has no backing field")); - map.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, - new DiagnosticWithParameters3Renderer("Abstract property {0} in non-abstract class {1}", - TO_STRING, TO_STRING, TO_STRING)); - map.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, - new DiagnosticWithParameters3Renderer("Abstract function {0} in non-abstract class {1}", - TO_STRING, TO_STRING, TO_STRING)); - map.put(ABSTRACT_FUNCTION_WITH_BODY, - new DiagnosticWithParameters1Renderer("A function {0} with body cannot be abstract", TO_STRING)); - map.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, - new DiagnosticWithParameters1Renderer("Method {0} without a body must be abstract", TO_STRING)); - map.put(NON_MEMBER_ABSTRACT_FUNCTION, new DiagnosticWithParameters1Renderer( - "Function {0} is not a class or trait member and cannot be abstract", TO_STRING)); - - map.put(NON_MEMBER_FUNCTION_NO_BODY, - new DiagnosticWithParameters1Renderer("Function {0} must have a body", TO_STRING)); - map.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, new SimpleDiagnosticRenderer("Non final member in a final class")); - - map.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, new SimpleDiagnosticRenderer("Public or protected member should specify a type")); - - map.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, new SimpleDiagnosticRenderer( - "Projections are not allowed on type arguments of functions and properties")); // TODO : better positioning - map.put(SUPERTYPE_NOT_INITIALIZED, new SimpleDiagnosticRenderer("This type has a constructor, and thus must be initialized here")); - map.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, new SimpleDiagnosticRenderer("Constructor invocation should be explicitly specified")); - map.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, - new SimpleDiagnosticRenderer("A secondary constructor may appear only in a class that has a primary constructor")); - map.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, - new SimpleDiagnosticRenderer("Secondary constructors must have an initializer list")); - map.put(BY_IN_SECONDARY_CONSTRUCTOR, new SimpleDiagnosticRenderer("'by'-clause is only supported for primary constructors")); - map.put(INITIALIZER_WITH_NO_ARGUMENTS, new SimpleDiagnosticRenderer("Constructor arguments required")); - map.put(MANY_CALLS_TO_THIS, new SimpleDiagnosticRenderer("Only one call to 'this(...)' is allowed")); - map.put(NOTHING_TO_OVERRIDE, - new DiagnosticWithParameters1Renderer("{0} overrides nothing", DescriptorRenderer.TEXT)); - map.put(VIRTUAL_MEMBER_HIDDEN, - new DiagnosticWithParameters3Renderer( - "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, - DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); - - map.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, - new DiagnosticWithParameters1Renderer("Missing delegation specifier ''{0}''", NAME)); - map.put(ENUM_ENTRY_ILLEGAL_TYPE, - new DiagnosticWithParameters1Renderer("The type constructor of enum entry should be ''{0}''", NAME)); - - map.put(UNINITIALIZED_VARIABLE, - new DiagnosticWithParameters1Renderer("Variable ''{0}'' must be initialized", NAME)); - map.put(UNINITIALIZED_PARAMETER, - new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is uninitialized here", NAME)); - map.put(UNUSED_VARIABLE, new DiagnosticWithParameters1Renderer("Variable ''{0}'' is never used", NAME)); - map.put(UNUSED_PARAMETER, new DiagnosticWithParameters1Renderer("Parameter ''{0}'' is never used", NAME)); - map.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, - new DiagnosticWithParameters1Renderer("Variable ''{0}'' is assigned but never accessed", NAME)); - map.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, - new DiagnosticWithParameters1Renderer("Variable ''{0}'' initializer is redundant", NAME)); - map.put(UNUSED_VALUE, new DiagnosticWithParameters2Renderer( - "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING)); - map.put(UNUSED_CHANGED_VALUE, - new DiagnosticWithParameters1Renderer("The value changed at ''{0}'' is never used", ELEMENT_TEXT)); - map.put(UNUSED_EXPRESSION, new SimpleDiagnosticRenderer("The expression is unused")); - map.put(UNUSED_FUNCTION_LITERAL, - new SimpleDiagnosticRenderer("The function literal is unused. If you mean block, you can use 'run { ... }'")); - - map.put(VAL_REASSIGNMENT, new DiagnosticWithParameters1Renderer("Val can not be reassigned", NAME)); - map.put(INITIALIZATION_BEFORE_DECLARATION, - new DiagnosticWithParameters1Renderer("Variable cannot be initialized before declaration", NAME)); - map.put(VARIABLE_EXPECTED, new SimpleDiagnosticRenderer("Variable expected")); - - map.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, new DiagnosticWithParameters1Renderer( - "This property has a custom setter, so initialization using backing field required", NAME)); - map.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, new DiagnosticWithParameters1Renderer( - "Setter of this property can be overridden, so initialization using backing field required", NAME)); - - map.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, - new DiagnosticWithParameters1Renderer("Function parameters of inline function can only be invoked", - NAME)); - - map.put(UNREACHABLE_CODE, new SimpleDiagnosticRenderer("Unreachable code")); - - map.put(MANY_CLASS_OBJECTS, new SimpleDiagnosticRenderer("Only one class object is allowed per class")); - map.put(CLASS_OBJECT_NOT_ALLOWED, new SimpleDiagnosticRenderer("A class object is not allowed here")); - map.put(DELEGATION_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot use delegation")); - map.put(DELEGATION_NOT_TO_TRAIT, new SimpleDiagnosticRenderer("Only traits can be delegated to")); - map.put(NO_CONSTRUCTOR, new SimpleDiagnosticRenderer("This class does not have a constructor")); - map.put(NOT_A_CLASS, new SimpleDiagnosticRenderer("Not a class")); - map.put(ILLEGAL_ESCAPE_SEQUENCE, new SimpleDiagnosticRenderer("Illegal escape sequence")); - - map.put(LOCAL_EXTENSION_PROPERTY, new SimpleDiagnosticRenderer("Local extension properties are not allowed")); - map.put(LOCAL_VARIABLE_WITH_GETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have getters")); - map.put(LOCAL_VARIABLE_WITH_SETTER, new SimpleDiagnosticRenderer("Local variables are not allowed to have setters")); - map.put(VAL_WITH_SETTER, new SimpleDiagnosticRenderer("A 'val'-property cannot have a setter")); - - map.put(NO_GET_METHOD, new SimpleDiagnosticRenderer("No get method providing array access")); - map.put(NO_SET_METHOD, new SimpleDiagnosticRenderer("No set method providing array access")); - - map.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, - new SimpleDiagnosticRenderer("Functions inc(), dec() shouldn't return Unit to be used by operators ++, --")); - map.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, - new DiagnosticWithParameters2Renderer( - "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", NAME, ELEMENT_TEXT)); - map.put(ASSIGN_OPERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Assignment operators ambiguity: {0}")); - - map.put(EQUALS_MISSING, new SimpleDiagnosticRenderer("No method 'equals(Any?) : Boolean' available")); - map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, - new SimpleDiagnosticRenderer("Assignments are not expressions, and only expressions are allowed in this context")); - map.put(NAMESPACE_IS_NOT_AN_EXPRESSION, - new SimpleDiagnosticRenderer("'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')")); - map.put(SUPER_IS_NOT_AN_EXPRESSION, new DiagnosticWithParameters1Renderer( - "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING)); - map.put(DECLARATION_IN_ILLEGAL_CONTEXT, new SimpleDiagnosticRenderer("Declarations are not allowed in this position")); - map.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, new SimpleDiagnosticRenderer("Setter parameters can not have default values")); - map.put(NO_THIS, new SimpleDiagnosticRenderer("'this' is not defined in this context")); - map.put(SUPER_NOT_AVAILABLE, new SimpleDiagnosticRenderer("No supertypes are accessible in this context")); - map.put(AMBIGUOUS_SUPER, new SimpleDiagnosticRenderer( - "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'")); - map.put(ABSTRACT_SUPER_CALL, new SimpleDiagnosticRenderer("Abstract member cannot be accessed directly")); - map.put(NOT_A_SUPERTYPE, new SimpleDiagnosticRenderer("Not a supertype")); - map.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, - new SimpleDiagnosticRenderer("Type arguments do not need to be specified in a 'super' qualifier")); - map.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, new SimpleDiagnosticRenderer("No cast needed, use ':' instead")); - map.put(USELESS_CAST, new SimpleDiagnosticRenderer("No cast needed")); - map.put(CAST_NEVER_SUCCEEDS, new SimpleDiagnosticRenderer("This cast can never succeed")); - map.put(WRONG_SETTER_PARAMETER_TYPE, - new DiagnosticWithParameters1Renderer("Setter parameter type must be equal to the type of the property, i.e. {0}", - RENDER_TYPE)); - map.put(WRONG_GETTER_RETURN_TYPE, - new DiagnosticWithParameters1Renderer("Getter return type must be equal to the type of the property, i.e. {0}", - RENDER_TYPE)); - map.put(NO_CLASS_OBJECT, new DiagnosticWithParameters1Renderer( - "Please specify constructor invocation; classifier {0} does not have a class object", NAME)); - map.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, new SimpleDiagnosticRenderer("Generic arguments of the base type must be specified")); - - map.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, - new SimpleDiagnosticRenderer("An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property")); - map.put(HAS_NEXT_MISSING, new SimpleDiagnosticRenderer( - "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property")); - map.put(HAS_NEXT_FUNCTION_AMBIGUITY, - new SimpleDiagnosticRenderer("Function 'iterator().hasNext()' is ambiguous for this expression")); - map.put(HAS_NEXT_MUST_BE_READABLE, - new SimpleDiagnosticRenderer("The 'iterator().hasNext' property of the loop range must be readable")); - map.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( - "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); - map.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( - "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", RENDER_TYPE)); - map.put(NEXT_AMBIGUITY, new SimpleDiagnosticRenderer("Function 'iterator().next()' is ambiguous for this expression")); - map.put(NEXT_MISSING, new SimpleDiagnosticRenderer("Loop range must have an 'iterator().next()' function")); - map.put(ITERATOR_MISSING, new SimpleDiagnosticRenderer("For-loop range must have an iterator() method")); - map.put(ITERATOR_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Method 'iterator()' is ambiguous for this expression: {0}")); - - map.put(COMPARE_TO_TYPE_MISMATCH, - new DiagnosticWithParameters1Renderer("compareTo() must return Int, but returns {0}", RENDER_TYPE)); - map.put(CALLEE_NOT_A_FUNCTION, - new DiagnosticWithParameters1Renderer("Expecting a function type, but found {0}", RENDER_TYPE)); - - map.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, - new SimpleDiagnosticRenderer("Returns are not allowed for functions with expression body. Use block body in '{...}'")); - map.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, - new SimpleDiagnosticRenderer("A 'return' expression required in a function with a block body ('{...}')")); - map.put(RETURN_TYPE_MISMATCH, - new DiagnosticWithParameters1Renderer("This function must return a value of type {0}", RENDER_TYPE)); - map.put(EXPECTED_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer("Expected a value of type {0}", RENDER_TYPE)); - map.put(ASSIGNMENT_TYPE_MISMATCH, new DiagnosticWithParameters1Renderer( - "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE)); - map.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, new DiagnosticWithParameters1Renderer( - "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", RENDER_TYPE)); - map.put(EXPRESSION_EXPECTED, - new DiagnosticWithParameters1Renderer("{0} is not an expression, and only expression are allowed here", - new Renderer() { - @NotNull - @Override - public String render(@NotNull JetExpression expression) { - String expressionType = expression.toString(); - return expressionType.substring(0, 1) + - expressionType.substring(1).toLowerCase(); - } - })); - - map.put(UPPER_BOUND_VIOLATED, - new DiagnosticWithParameters1Renderer("An upper bound {0} is violated", RENDER_TYPE)); // TODO : Message - map.put(FINAL_CLASS_OBJECT_UPPER_BOUND, - new DiagnosticWithParameters1Renderer("{0} is a final type, and thus a class object cannot extend it", - RENDER_TYPE)); - map.put(FINAL_UPPER_BOUND, new DiagnosticWithParameters1Renderer( - "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE)); - map.put(USELESS_ELVIS, new DiagnosticWithParameters1Renderer( - "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE)); - map.put(CONFLICTING_UPPER_BOUNDS, - new DiagnosticWithParameters1Renderer("Upper bounds of {0} have empty intersection", NAME)); - map.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, - new DiagnosticWithParameters1Renderer("Class object upper bounds of {0} have empty intersection", - NAME)); - - map.put(TOO_MANY_ARGUMENTS, new DiagnosticWithParameters1Renderer("Too many arguments for {0}", TO_STRING)); - map.put(ERROR_COMPILE_TIME_VALUE, new DiagnosticWithParameters1Renderer("{0}", TO_STRING)); - - map.put(ELSE_MISPLACED_IN_WHEN, new SimpleDiagnosticRenderer("'else' entry must be the last one in a when-expression")); - - map.put(NO_ELSE_IN_WHEN, new SimpleDiagnosticRenderer("'when' expression must contain 'else' branch")); - map.put(TYPE_MISMATCH_IN_RANGE, - new SimpleDiagnosticRenderer("Type mismatch: incompatible types of range and element checked in it")); - map.put(CYCLIC_INHERITANCE_HIERARCHY, new SimpleDiagnosticRenderer("There's a cycle in the inheritance hierarchy for this type")); - - map.put(MANY_CLASSES_IN_SUPERTYPE_LIST, new SimpleDiagnosticRenderer("Only one class may appear in a supertype list")); - map.put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, new SimpleDiagnosticRenderer("Only classes and traits may serve as supertypes")); - map.put(SUPERTYPE_INITIALIZED_IN_TRAIT, new SimpleDiagnosticRenderer("Traits cannot initialize supertypes")); - map.put(CONSTRUCTOR_IN_TRAIT, new SimpleDiagnosticRenderer("A trait may not have a constructor")); - map.put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, new SimpleDiagnosticRenderer("Secondary constructors are not supported")); - map.put(SUPERTYPE_APPEARS_TWICE, new SimpleDiagnosticRenderer("A supertype appears twice")); - map.put(FINAL_SUPERTYPE, new SimpleDiagnosticRenderer("This type is final, so it cannot be inherited from")); - - map.put(ILLEGAL_SELECTOR, - new DiagnosticWithParameters1Renderer("Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING)); - - map.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, - new SimpleDiagnosticRenderer("A type annotation is required on a value parameter")); - map.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, new SimpleDiagnosticRenderer("'break' and 'continue' are only allowed inside a loop")); - map.put(NOT_A_LOOP_LABEL, new DiagnosticWithParameters1Renderer("The label ''{0}'' does not denote a loop", TO_STRING)); - map.put(NOT_A_RETURN_LABEL, - new DiagnosticWithParameters1Renderer("The label ''{0}'' does not reference to a context from which we can return", - TO_STRING)); - - map.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, - new SimpleDiagnosticRenderer("Anonymous initializers are only allowed in the presence of a primary constructor")); - map.put(NULLABLE_SUPERTYPE, new SimpleDiagnosticRenderer("A supertype cannot be nullable")); - map.put(UNSAFE_CALL, - new DiagnosticWithParameters1Renderer("Only safe calls (?.) are allowed on a nullable receiver of type {0}", - RENDER_TYPE)); - map.put(AMBIGUOUS_LABEL, new SimpleDiagnosticRenderer("Ambiguous label")); - map.put(UNSUPPORTED, new DiagnosticWithParameters1Renderer("Unsupported [{0}]", TO_STRING)); - map.put(UNNECESSARY_SAFE_CALL, - new DiagnosticWithParameters1Renderer("Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE)); - map.put(UNNECESSARY_NOT_NULL_ASSERTION, - new DiagnosticWithParameters1Renderer("Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", - RENDER_TYPE)); - map.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, - new DiagnosticWithParameters2Renderer( - "{0} does not refer to a type parameter of {1}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetTypeConstraint typeConstraint) { - //noinspection ConstantConditions - return typeConstraint.getSubjectTypeParameterName().getReferencedName(); + put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE); + put(INCOMPATIBLE_MODIFIERS, "Incompatible modifiers: ''{0}''", new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection tokens) { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { + JetKeywordToken modifier = iterator.next(); + sb.append(modifier.getValue()); + if (iterator.hasNext()) { + sb.append(" "); } - }, NAME)); - map.put(AUTOCAST_IMPOSSIBLE, new DiagnosticWithParameters2Renderer( - "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, NAME)); + } + return sb.toString(); + } + }); + put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING); - map.put(TYPE_MISMATCH_IN_FOR_LOOP, new DiagnosticWithParameters2Renderer( - "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE)); - map.put(TYPE_MISMATCH_IN_CONDITION, - new DiagnosticWithParameters1Renderer("Condition must be of type Boolean, but was of type {0}", RENDER_TYPE)); - map.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, new DiagnosticWithParameters2Renderer( - "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING)); // TODO: message - map.put(TYPE_MISMATCH_IN_BINDING_PATTERN, - new DiagnosticWithParameters2Renderer("{0} must be a supertype of {1}. Use 'is' to match against {0}", - RENDER_TYPE, RENDER_TYPE)); - map.put(INCOMPATIBLE_TYPES, - new DiagnosticWithParameters2Renderer("Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE)); - map.put(EXPECTED_CONDITION, new SimpleDiagnosticRenderer("Expected condition of Boolean type")); + put(REDUNDANT_MODIFIER, "Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING); + put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in trait"); + put(OPEN_MODIFIER_IN_TRAIT, "Modifier ''open'' is redundant in trait"); + put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); + put(TRAIT_CAN_NOT_BE_FINAL, "Trait can not be final"); + put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, + "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message + put(RETURN_NOT_ALLOWED, "'return' is not allowed here"); + put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, "Projections are not allowed for immediate arguments of a supertype"); + put(LABEL_NAME_CLASH, "There is more than one label with such a name in this scope"); + put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, "Expression expected, but a namespace name found"); - map.put(CANNOT_CHECK_FOR_ERASED, - new DiagnosticWithParameters1Renderer("Cannot check for instance of erased type: {0}", RENDER_TYPE)); - map.put(UNCHECKED_CAST, - new DiagnosticWithParameters2Renderer("Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE)); + put(CANNOT_IMPORT_FROM_ELEMENT, "Cannot import from ''{0}''", NAME); + put(CANNOT_BE_IMPORTED, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); + put(USELESS_HIDDEN_IMPORT, "Useless import, it is hidden further"); + put(USELESS_SIMPLE_IMPORT, "Useless import, does nothing"); - map.put(INCONSISTENT_TYPE_PARAMETER_VALUES, - new DiagnosticWithParameters3Renderer>( - "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, - new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection types) { - StringBuilder builder = new StringBuilder(); - for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { - JetType jetType = iterator.next(); - builder.append(jetType); - if (iterator.hasNext()) { - builder.append(", "); - } - } - return builder.toString(); - } - })); + put(CANNOT_INFER_PARAMETER_TYPE, + "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); - map.put(EQUALITY_NOT_APPLICABLE, new DiagnosticWithParameters3Renderer( - "Operator {0} cannot be applied to {1} and {2}", new Renderer() { + put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, "This property doesn't have a backing field, because it's abstract"); + put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, + "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); + put(INACCESSIBLE_BACKING_FIELD, "The backing field is not accessible here"); + put(NOT_PROPERTY_BACKING_FIELD, "The referenced variable is not a property and doesn't have backing field"); + + put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments in not allowed"); + put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter"); + put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", TO_STRING); + put(VARARG_OUTSIDE_PARENTHESES, "Passing value as a vararg is only allowed inside a parenthesized argument list"); + put(NON_VARARG_SPREAD, "The spread operator (*foo) may only be applied in a vararg position"); + + put(MANY_FUNCTION_LITERAL_ARGUMENTS, "Only one function literal is allowed outside a parenthesized argument list"); + put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, "This property must either have a type annotation or be initialized"); + + put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract"); + put(ABSTRACT_PROPERTY_NOT_IN_CLASS, "A property may be abstract only when defined in a class or trait"); + put(ABSTRACT_PROPERTY_WITH_INITIALIZER, "Property with initializer cannot be abstract"); + put(ABSTRACT_PROPERTY_WITH_GETTER, "Property with getter implementation cannot be abstract"); + put(ABSTRACT_PROPERTY_WITH_SETTER, "Property with setter implementation cannot be abstract"); + + put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, "Package member cannot be protected"); + + put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, "Getter visibility must be the same as property visibility"); + put(BACKING_FIELD_IN_TRAIT, "Property in a trait cannot have a backing field"); + put(MUST_BE_INITIALIZED, "Property must be initialized"); + put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); + put(PROPERTY_INITIALIZER_IN_TRAIT, "Property initializers are not allowed in traits"); + put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, "Initializer is not allowed here because this property has no backing field"); + put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); + put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); + put(ABSTRACT_FUNCTION_WITH_BODY, "A function {0} with body cannot be abstract", TO_STRING); + put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Method {0} without a body must be abstract", TO_STRING); + put(NON_MEMBER_ABSTRACT_FUNCTION, "Function {0} is not a class or trait member and cannot be abstract", TO_STRING); + + put(NON_MEMBER_FUNCTION_NO_BODY, "Function {0} must have a body", TO_STRING); + put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "Non final member in a final class"); + + put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, "Public or protected member should specify a type"); + + put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, + "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning + put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here"); + put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, "Constructor invocation should be explicitly specified"); + put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, "A secondary constructor may appear only in a class that has a primary constructor"); + put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, "Secondary constructors must have an initializer list"); + put(BY_IN_SECONDARY_CONSTRUCTOR, "'by'-clause is only supported for primary constructors"); + put(INITIALIZER_WITH_NO_ARGUMENTS, "Constructor arguments required"); + put(MANY_CALLS_TO_THIS, "Only one call to 'this(...)' is allowed"); + put(NOTHING_TO_OVERRIDE, "{0} overrides nothing", DescriptorRenderer.TEXT); + put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + + put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, "Missing delegation specifier ''{0}''", NAME); + put(ENUM_ENTRY_ILLEGAL_TYPE, "The type constructor of enum entry should be ''{0}''", NAME); + + put(UNINITIALIZED_VARIABLE, "Variable ''{0}'' must be initialized", NAME); + put(UNINITIALIZED_PARAMETER, "Parameter ''{0}'' is uninitialized here", NAME); + put(UNUSED_VARIABLE, "Variable ''{0}'' is never used", NAME); + put(UNUSED_PARAMETER, "Parameter ''{0}'' is never used", NAME); + put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, "Variable ''{0}'' is assigned but never accessed", NAME); + put(VARIABLE_WITH_REDUNDANT_INITIALIZER, "Variable ''{0}'' initializer is redundant", NAME); + put(UNUSED_VALUE, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); + put(UNUSED_CHANGED_VALUE, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); + put(UNUSED_EXPRESSION, "The expression is unused"); + put(UNUSED_FUNCTION_LITERAL, "The function literal is unused. If you mean block, you can use 'run { ... }'"); + + put(VAL_REASSIGNMENT, "Val can not be reassigned", NAME); + put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); + put(VARIABLE_EXPECTED, "Variable expected"); + + put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, + "This property has a custom setter, so initialization using backing field required", NAME); + put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, + "Setter of this property can be overridden, so initialization using backing field required", NAME); + + put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, "Function parameters of inline function can only be invoked", NAME); + + put(UNREACHABLE_CODE, "Unreachable code"); + + put(MANY_CLASS_OBJECTS, "Only one class object is allowed per class"); + put(CLASS_OBJECT_NOT_ALLOWED, "A class object is not allowed here"); + put(DELEGATION_IN_TRAIT, "Traits cannot use delegation"); + put(DELEGATION_NOT_TO_TRAIT, "Only traits can be delegated to"); + put(NO_CONSTRUCTOR, "This class does not have a constructor"); + put(NOT_A_CLASS, "Not a class"); + put(ILLEGAL_ESCAPE_SEQUENCE, "Illegal escape sequence"); + + put(LOCAL_EXTENSION_PROPERTY, "Local extension properties are not allowed"); + put(LOCAL_VARIABLE_WITH_GETTER, "Local variables are not allowed to have getters"); + put(LOCAL_VARIABLE_WITH_SETTER, "Local variables are not allowed to have setters"); + put(VAL_WITH_SETTER, "A 'val'-property cannot have a setter"); + + put(NO_GET_METHOD, "No get method providing array access"); + put(NO_SET_METHOD, "No set method providing array access"); + + put(INC_DEC_SHOULD_NOT_RETURN_UNIT, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); + put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", + NAME, ELEMENT_TEXT); + put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity: {0}", AMBIGUOUS_CALLS); + + put(EQUALS_MISSING, "No method 'equals(Any?) : Boolean' available"); + put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Assignments are not expressions, and only expressions are allowed in this context"); + put(NAMESPACE_IS_NOT_AN_EXPRESSION, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); + put(SUPER_IS_NOT_AN_EXPRESSION, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING); + put(DECLARATION_IN_ILLEGAL_CONTEXT, "Declarations are not allowed in this position"); + put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, "Setter parameters can not have default values"); + put(NO_THIS, "'this' is not defined in this context"); + put(SUPER_NOT_AVAILABLE, "No supertypes are accessible in this context"); + put(AMBIGUOUS_SUPER, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); + put(ABSTRACT_SUPER_CALL, "Abstract member cannot be accessed directly"); + put(NOT_A_SUPERTYPE, "Not a supertype"); + put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, "Type arguments do not need to be specified in a 'super' qualifier"); + put(USELESS_CAST_STATIC_ASSERT_IS_FINE, "No cast needed, use ':' instead"); + put(USELESS_CAST, "No cast needed"); + put(CAST_NEVER_SUCCEEDS, "This cast can never succeed"); + put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); + put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); + put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); + put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); + + put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, + "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); + put(HAS_NEXT_MISSING, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); + put(HAS_NEXT_FUNCTION_AMBIGUITY, "Function 'iterator().hasNext()' is ambiguous for this expression"); + put(HAS_NEXT_MUST_BE_READABLE, "The 'iterator().hasNext' property of the loop range must be readable"); + put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", + RENDER_TYPE); + put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", + RENDER_TYPE); + put(NEXT_AMBIGUITY, "Function 'iterator().next()' is ambiguous for this expression"); + put(NEXT_MISSING, "Loop range must have an 'iterator().next()' function"); + put(ITERATOR_MISSING, "For-loop range must have an iterator() method"); + put(ITERATOR_AMBIGUITY, "Method 'iterator()' is ambiguous for this expression: {0}", AMBIGUOUS_CALLS); + + put(COMPARE_TO_TYPE_MISMATCH, "compareTo() must return Int, but returns {0}", RENDER_TYPE); + put(CALLEE_NOT_A_FUNCTION, "Expecting a function type, but found {0}", RENDER_TYPE); + + put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, + "Returns are not allowed for functions with expression body. Use block body in '{...}'"); + put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, "A 'return' expression required in a function with a block body ('{...}')"); + put(RETURN_TYPE_MISMATCH, "This function must return a value of type {0}", RENDER_TYPE); + put(EXPECTED_TYPE_MISMATCH, "Expected a value of type {0}", RENDER_TYPE); + put(ASSIGNMENT_TYPE_MISMATCH, + "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE); + put(IMPLICIT_CAST_TO_UNIT_OR_ANY, "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", + RENDER_TYPE); + put(EXPRESSION_EXPECTED, "{0} is not an expression, and only expression are allowed here", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetExpression expression) { + String expressionType = expression.toString(); + return expressionType.substring(0, 1) + + expressionType.substring(1).toLowerCase(); + } + }); + + put(UPPER_BOUND_VIOLATED, "An upper bound {0} is violated", RENDER_TYPE); // TODO : Message + put(FINAL_CLASS_OBJECT_UPPER_BOUND, "{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE); + put(FINAL_UPPER_BOUND, "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); + put(USELESS_ELVIS, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); + put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME); + put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, "Class object upper bounds of {0} have empty intersection", NAME); + + put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", TO_STRING); + put(ERROR_COMPILE_TIME_VALUE, "{0}", TO_STRING); + + put(ELSE_MISPLACED_IN_WHEN, "'else' entry must be the last one in a when-expression"); + + put(NO_ELSE_IN_WHEN, "'when' expression must contain 'else' branch"); + put(TYPE_MISMATCH_IN_RANGE, "Type mismatch: incompatible types of range and element checked in it"); + put(CYCLIC_INHERITANCE_HIERARCHY, "There's a cycle in the inheritance hierarchy for this type"); + + put(MANY_CLASSES_IN_SUPERTYPE_LIST, "Only one class may appear in a supertype list"); + put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, "Only classes and traits may serve as supertypes"); + put(SUPERTYPE_INITIALIZED_IN_TRAIT, "Traits cannot initialize supertypes"); + put(CONSTRUCTOR_IN_TRAIT, "A trait may not have a constructor"); + put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, "Secondary constructors are not supported"); + put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice"); + put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from"); + + put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING); + + put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, "A type annotation is required on a value parameter"); + put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, "'break' and 'continue' are only allowed inside a loop"); + put(NOT_A_LOOP_LABEL, "The label ''{0}'' does not denote a loop", TO_STRING); + put(NOT_A_RETURN_LABEL, "The label ''{0}'' does not reference to a context from which we can return", TO_STRING); + + put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, "Anonymous initializers are only allowed in the presence of a primary constructor"); + put(NULLABLE_SUPERTYPE, "A supertype cannot be nullable"); + put(UNSAFE_CALL, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); + put(AMBIGUOUS_LABEL, "Ambiguous label"); + put(UNSUPPORTED, "Unsupported [{0}]", TO_STRING); + put(UNNECESSARY_SAFE_CALL, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); + put(UNNECESSARY_NOT_NULL_ASSERTION, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); + put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, "{0} does not refer to a type parameter of {1}", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetTypeConstraint typeConstraint) { + //noinspection ConstantConditions + return typeConstraint.getSubjectTypeParameterName().getReferencedName(); + } + }, NAME); + put(AUTOCAST_IMPOSSIBLE, "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, + NAME); + + put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, + RENDER_TYPE); + put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type Boolean, but was of type {0}", RENDER_TYPE); + put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, + TO_STRING); // TODO: message + put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); + put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); + put(EXPECTED_CONDITION, "Expected condition of Boolean type"); + + put(CANNOT_CHECK_FOR_ERASED, "Cannot check for instance of erased type: {0}", RENDER_TYPE); + put(UNCHECKED_CAST, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); + + put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, + new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection types) { + StringBuilder builder = new StringBuilder(); + for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { + JetType jetType = iterator.next(); + builder.append(jetType); + if (iterator.hasNext()) { + builder.append(", "); + } + } + return builder.toString(); + } + }); + + put(EQUALITY_NOT_APPLICABLE, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { @NotNull @Override public String render(@NotNull JetSimpleNameExpression nameExpression) { //noinspection ConstantConditions return nameExpression.getReferencedName(); } - }, TO_STRING, TO_STRING)); + }, TO_STRING, TO_STRING); - map.put(OVERRIDING_FINAL_MEMBER, new DiagnosticWithParameters2Renderer( - "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME)); - map.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, - new DiagnosticWithParameters3Renderer( - "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); - map.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, - new DiagnosticWithParameters3Renderer( - "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME)); + put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); + put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); + put(CANNOT_CHANGE_ACCESS_PRIVILEGE, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); - map.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, new DiagnosticWithParameters2Renderer( - "Return type of {0} is not a subtype of the return type overridden member {1}", DescriptorRenderer.TEXT, - DescriptorRenderer.TEXT)); + put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of {0} is not a subtype of the return type overridden member {1}", + DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); - map.put(VAR_OVERRIDDEN_BY_VAL, new DiagnosticWithParameters2Renderer( - "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT)); + put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT); - map.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer( - "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, + DescriptorRenderer.TEXT); - map.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, new DiagnosticWithParameters2Renderer( - "{0} must override {1} because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT)); + put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "{0} must override {1} because it inherits many implementations of it", + RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT); - map.put(CONFLICTING_OVERLOADS, - new DiagnosticWithParameters2Renderer("{1} is already defined in ''{0}''", - DescriptorRenderer.TEXT, TO_STRING)); + put(CONFLICTING_OVERLOADS, "{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING); - map.put(RESULT_TYPE_MISMATCH, - new DiagnosticWithParameters3Renderer("{0} must return {1} but returns {2}", TO_STRING, - RENDER_TYPE, RENDER_TYPE)); - map.put(UNSAFE_INFIX_CALL, new DiagnosticWithParameters3Renderer( - "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. Use '?.'-qualified call instead", - TO_STRING, TO_STRING, TO_STRING)); + put(RESULT_TYPE_MISMATCH, "{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); + put(UNSAFE_INFIX_CALL, + "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. " + + "Use '?.'-qualified call instead", + TO_STRING, TO_STRING, TO_STRING); - map.put(OVERLOAD_RESOLUTION_AMBIGUITY, new AmbiguousDescriptorDiagnosticRenderer("Overload resolution ambiguity: {0}")); - map.put(NONE_APPLICABLE, new AmbiguousDescriptorDiagnosticRenderer( - "None of the following functions can be called with the arguments supplied: {0}")); - map.put(NO_VALUE_FOR_PARAMETER, new DiagnosticWithParameters1Renderer("No value passed for parameter {0}", - DescriptorRenderer.TEXT)); - map.put(MISSING_RECEIVER, new DiagnosticWithParameters1Renderer("A receiver of type {0} is required", RENDER_TYPE)); - map.put(NO_RECEIVER_ADMITTED, new SimpleDiagnosticRenderer("No receiver can be passed to this function or property")); + put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity: {0}", AMBIGUOUS_CALLS); + put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied: {0}", AMBIGUOUS_CALLS); + put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter {0}", DescriptorRenderer.TEXT); + put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); + put(NO_RECEIVER_ADMITTED, "No receiver can be passed to this function or property"); - map.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, new SimpleDiagnosticRenderer("Can not create an instance of an abstract class")); - map.put(TYPE_INFERENCE_FAILED, new DiagnosticWithParameters1Renderer("Type inference failed: {0}", TO_STRING)); - map.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, - new DiagnosticWithParameters1Renderer("{0} type arguments expected", new Renderer() { - @NotNull - @Override - public String render(@NotNull Integer argument) { - return argument == 0 ? "No" : argument.toString(); - } - })); + put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Can not create an instance of an abstract class"); + put(TYPE_INFERENCE_FAILED, "Type inference failed: {0}", TO_STRING); + put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0} type arguments expected", new Renderer() { + @NotNull + @Override + public String render(@NotNull Integer argument) { + return argument == 0 ? "No" : argument.toString(); + } + }); - map.put(UNRESOLVED_IDE_TEMPLATE, new DiagnosticWithParameters1Renderer("Unresolved IDE template: {0}", TO_STRING)); + put(UNRESOLVED_IDE_TEMPLATE, "Unresolved IDE template: {0}", TO_STRING); - map.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, new SimpleDiagnosticRenderer( - "This expression is treated as an argument to the function call on the previous line. Separate it with a semicolon (;) if it is not intended to be an argument.")); + put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, + "This expression is treated as an argument to the function call on the previous line. " + + "Separate it with a semicolon (;) if it is not intended to be an argument."); - map.put(NOT_AN_ANNOTATION_CLASS, new DiagnosticWithParameters1Renderer("{0} is not an annotation class", TO_STRING)); + put(NOT_AN_ANNOTATION_CLASS, "{0} is not an annotation class", TO_STRING); } @NotNull @@ -514,21 +440,4 @@ public class DefaultDiagnosticRenderer implements DiagnosticRenderer //noinspection unchecked return renderer.render(diagnostic); } - - private static class AmbiguousDescriptorDiagnosticRenderer - extends DiagnosticWithParameters1Renderer>> { - private AmbiguousDescriptorDiagnosticRenderer(@NotNull String message) { - super(message, new Renderer>>() { - @NotNull - @Override - public String render(@NotNull Collection> argument) { - StringBuilder stringBuilder = new StringBuilder("\n"); - for (ResolvedCall call : argument) { - stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); - } - return stringBuilder.toString(); - } - }); - } - } } From 6ac389cf8a8d445d7689e672f1b9e8dd23f37419 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 18:45:19 +0400 Subject: [PATCH 34/76] Extracted error messages from DefaultDiagnosticRenderer to special DefaultErrorMessages class. --- .../jet/lang/diagnostics/Errors.java | 5 +- .../rendering/DefaultDiagnosticRenderer.java | 406 +---------------- .../rendering/DefaultErrorMessages.java | 408 ++++++++++++++++++ .../DiagnosticFactoryToRendererMap.java | 62 +++ 4 files changed, 476 insertions(+), 405 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java 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 2c74e53d6a3..628d07a338f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -38,6 +38,8 @@ import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR; import static org.jetbrains.jet.lang.diagnostics.Severity.WARNING; /** + * For error messages, see DefaultErrorMessages and IdeErrorMessages. + * * @author abreslav */ public interface Errors { @@ -326,7 +328,8 @@ public interface Errors { @NotNull @Override public List mark(@NotNull JetNullableType element) { - return markNode(element.getQuestionMarkNode()); + return markNode( + element.getQuestionMarkNode()); } }); DiagnosticFactory1 UNSAFE_CALL = DiagnosticFactory1.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java index 746ce87d618..6453e0465e7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java @@ -16,25 +16,8 @@ package org.jetbrains.jet.lang.diagnostics.rendering; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; -import org.jetbrains.jet.lang.diagnostics.*; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; -import org.jetbrains.jet.lang.psi.JetTypeConstraint; -import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lexer.JetKeywordToken; -import org.jetbrains.jet.resolve.DescriptorRenderer; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; /** * @author Evgeny Gerashchenko @@ -42,393 +25,8 @@ import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; */ public class DefaultDiagnosticRenderer implements DiagnosticRenderer { public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); - private static final Renderer>> AMBIGUOUS_CALLS = - new Renderer>>() { - @NotNull - @Override - public String render(@NotNull Collection> argument) { - StringBuilder stringBuilder = new StringBuilder("\n"); - for (ResolvedCall call : argument) { - stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); - } - return stringBuilder.toString(); - } - }; - private final Map> map = - new HashMap>(); - - protected final void put(SimpleDiagnosticFactory factory, String message) { - map.put(factory, new SimpleDiagnosticRenderer(message)); - } - - protected final void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { - map.put(factory, new DiagnosticWithParameters1Renderer(message, rendererA)); - } - - protected final void put(DiagnosticFactory2 factory, - String message, - Renderer rendererA, - Renderer rendererB) { - map.put(factory, new DiagnosticWithParameters2Renderer(message, rendererA, rendererB)); - } - - protected final void put(DiagnosticFactory3 factory, - String message, - Renderer rendererA, - Renderer rendererB, - Renderer rendererC) { - map.put(factory, new DiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)); - } - - protected DefaultDiagnosticRenderer() { - put(EXCEPTION_WHILE_ANALYZING, "{0}", new Renderer() { - @NotNull - @Override - public String render(@NotNull Throwable e) { - return e.getClass().getSimpleName() + ": " + e.getMessage(); - } - }); - - put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", TO_STRING); - - put(INVISIBLE_REFERENCE, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); - put(INVISIBLE_MEMBER, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); - - put(REDECLARATION, "Redeclaration: {0}", NAME); - put(NAME_SHADOWING, "Name shadowed: {0}", NAME); - - put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE); - put(INCOMPATIBLE_MODIFIERS, "Incompatible modifiers: ''{0}''", new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection tokens) { - StringBuilder sb = new StringBuilder(); - for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { - JetKeywordToken modifier = iterator.next(); - sb.append(modifier.getValue()); - if (iterator.hasNext()) { - sb.append(" "); - } - } - return sb.toString(); - } - }); - put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING); - - put(REDUNDANT_MODIFIER, "Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING); - put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in trait"); - put(OPEN_MODIFIER_IN_TRAIT, "Modifier ''open'' is redundant in trait"); - put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); - put(TRAIT_CAN_NOT_BE_FINAL, "Trait can not be final"); - put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, - "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message - put(RETURN_NOT_ALLOWED, "'return' is not allowed here"); - put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, "Projections are not allowed for immediate arguments of a supertype"); - put(LABEL_NAME_CLASH, "There is more than one label with such a name in this scope"); - put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, "Expression expected, but a namespace name found"); - - put(CANNOT_IMPORT_FROM_ELEMENT, "Cannot import from ''{0}''", NAME); - put(CANNOT_BE_IMPORTED, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); - put(USELESS_HIDDEN_IMPORT, "Useless import, it is hidden further"); - put(USELESS_SIMPLE_IMPORT, "Useless import, does nothing"); - - put(CANNOT_INFER_PARAMETER_TYPE, - "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); - - put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, "This property doesn't have a backing field, because it's abstract"); - put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, - "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); - put(INACCESSIBLE_BACKING_FIELD, "The backing field is not accessible here"); - put(NOT_PROPERTY_BACKING_FIELD, "The referenced variable is not a property and doesn't have backing field"); - - put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments in not allowed"); - put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter"); - put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", TO_STRING); - put(VARARG_OUTSIDE_PARENTHESES, "Passing value as a vararg is only allowed inside a parenthesized argument list"); - put(NON_VARARG_SPREAD, "The spread operator (*foo) may only be applied in a vararg position"); - - put(MANY_FUNCTION_LITERAL_ARGUMENTS, "Only one function literal is allowed outside a parenthesized argument list"); - put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, "This property must either have a type annotation or be initialized"); - - put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract"); - put(ABSTRACT_PROPERTY_NOT_IN_CLASS, "A property may be abstract only when defined in a class or trait"); - put(ABSTRACT_PROPERTY_WITH_INITIALIZER, "Property with initializer cannot be abstract"); - put(ABSTRACT_PROPERTY_WITH_GETTER, "Property with getter implementation cannot be abstract"); - put(ABSTRACT_PROPERTY_WITH_SETTER, "Property with setter implementation cannot be abstract"); - - put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, "Package member cannot be protected"); - - put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, "Getter visibility must be the same as property visibility"); - put(BACKING_FIELD_IN_TRAIT, "Property in a trait cannot have a backing field"); - put(MUST_BE_INITIALIZED, "Property must be initialized"); - put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); - put(PROPERTY_INITIALIZER_IN_TRAIT, "Property initializers are not allowed in traits"); - put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, "Initializer is not allowed here because this property has no backing field"); - put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); - put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); - put(ABSTRACT_FUNCTION_WITH_BODY, "A function {0} with body cannot be abstract", TO_STRING); - put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Method {0} without a body must be abstract", TO_STRING); - put(NON_MEMBER_ABSTRACT_FUNCTION, "Function {0} is not a class or trait member and cannot be abstract", TO_STRING); - - put(NON_MEMBER_FUNCTION_NO_BODY, "Function {0} must have a body", TO_STRING); - put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "Non final member in a final class"); - - put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, "Public or protected member should specify a type"); - - put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, - "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning - put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here"); - put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, "Constructor invocation should be explicitly specified"); - put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, "A secondary constructor may appear only in a class that has a primary constructor"); - put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, "Secondary constructors must have an initializer list"); - put(BY_IN_SECONDARY_CONSTRUCTOR, "'by'-clause is only supported for primary constructors"); - put(INITIALIZER_WITH_NO_ARGUMENTS, "Constructor arguments required"); - put(MANY_CALLS_TO_THIS, "Only one call to 'this(...)' is allowed"); - put(NOTHING_TO_OVERRIDE, "{0} overrides nothing", DescriptorRenderer.TEXT); - put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, - DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); - - put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, "Missing delegation specifier ''{0}''", NAME); - put(ENUM_ENTRY_ILLEGAL_TYPE, "The type constructor of enum entry should be ''{0}''", NAME); - - put(UNINITIALIZED_VARIABLE, "Variable ''{0}'' must be initialized", NAME); - put(UNINITIALIZED_PARAMETER, "Parameter ''{0}'' is uninitialized here", NAME); - put(UNUSED_VARIABLE, "Variable ''{0}'' is never used", NAME); - put(UNUSED_PARAMETER, "Parameter ''{0}'' is never used", NAME); - put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, "Variable ''{0}'' is assigned but never accessed", NAME); - put(VARIABLE_WITH_REDUNDANT_INITIALIZER, "Variable ''{0}'' initializer is redundant", NAME); - put(UNUSED_VALUE, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); - put(UNUSED_CHANGED_VALUE, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); - put(UNUSED_EXPRESSION, "The expression is unused"); - put(UNUSED_FUNCTION_LITERAL, "The function literal is unused. If you mean block, you can use 'run { ... }'"); - - put(VAL_REASSIGNMENT, "Val can not be reassigned", NAME); - put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); - put(VARIABLE_EXPECTED, "Variable expected"); - - put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, - "This property has a custom setter, so initialization using backing field required", NAME); - put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, - "Setter of this property can be overridden, so initialization using backing field required", NAME); - - put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, "Function parameters of inline function can only be invoked", NAME); - - put(UNREACHABLE_CODE, "Unreachable code"); - - put(MANY_CLASS_OBJECTS, "Only one class object is allowed per class"); - put(CLASS_OBJECT_NOT_ALLOWED, "A class object is not allowed here"); - put(DELEGATION_IN_TRAIT, "Traits cannot use delegation"); - put(DELEGATION_NOT_TO_TRAIT, "Only traits can be delegated to"); - put(NO_CONSTRUCTOR, "This class does not have a constructor"); - put(NOT_A_CLASS, "Not a class"); - put(ILLEGAL_ESCAPE_SEQUENCE, "Illegal escape sequence"); - - put(LOCAL_EXTENSION_PROPERTY, "Local extension properties are not allowed"); - put(LOCAL_VARIABLE_WITH_GETTER, "Local variables are not allowed to have getters"); - put(LOCAL_VARIABLE_WITH_SETTER, "Local variables are not allowed to have setters"); - put(VAL_WITH_SETTER, "A 'val'-property cannot have a setter"); - - put(NO_GET_METHOD, "No get method providing array access"); - put(NO_SET_METHOD, "No set method providing array access"); - - put(INC_DEC_SHOULD_NOT_RETURN_UNIT, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); - put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", - NAME, ELEMENT_TEXT); - put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity: {0}", AMBIGUOUS_CALLS); - - put(EQUALS_MISSING, "No method 'equals(Any?) : Boolean' available"); - put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Assignments are not expressions, and only expressions are allowed in this context"); - put(NAMESPACE_IS_NOT_AN_EXPRESSION, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); - put(SUPER_IS_NOT_AN_EXPRESSION, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING); - put(DECLARATION_IN_ILLEGAL_CONTEXT, "Declarations are not allowed in this position"); - put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, "Setter parameters can not have default values"); - put(NO_THIS, "'this' is not defined in this context"); - put(SUPER_NOT_AVAILABLE, "No supertypes are accessible in this context"); - put(AMBIGUOUS_SUPER, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); - put(ABSTRACT_SUPER_CALL, "Abstract member cannot be accessed directly"); - put(NOT_A_SUPERTYPE, "Not a supertype"); - put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, "Type arguments do not need to be specified in a 'super' qualifier"); - put(USELESS_CAST_STATIC_ASSERT_IS_FINE, "No cast needed, use ':' instead"); - put(USELESS_CAST, "No cast needed"); - put(CAST_NEVER_SUCCEEDS, "This cast can never succeed"); - put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); - put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); - put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); - put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); - - put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, - "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); - put(HAS_NEXT_MISSING, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); - put(HAS_NEXT_FUNCTION_AMBIGUITY, "Function 'iterator().hasNext()' is ambiguous for this expression"); - put(HAS_NEXT_MUST_BE_READABLE, "The 'iterator().hasNext' property of the loop range must be readable"); - put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", - RENDER_TYPE); - put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", - RENDER_TYPE); - put(NEXT_AMBIGUITY, "Function 'iterator().next()' is ambiguous for this expression"); - put(NEXT_MISSING, "Loop range must have an 'iterator().next()' function"); - put(ITERATOR_MISSING, "For-loop range must have an iterator() method"); - put(ITERATOR_AMBIGUITY, "Method 'iterator()' is ambiguous for this expression: {0}", AMBIGUOUS_CALLS); - - put(COMPARE_TO_TYPE_MISMATCH, "compareTo() must return Int, but returns {0}", RENDER_TYPE); - put(CALLEE_NOT_A_FUNCTION, "Expecting a function type, but found {0}", RENDER_TYPE); - - put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, - "Returns are not allowed for functions with expression body. Use block body in '{...}'"); - put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, "A 'return' expression required in a function with a block body ('{...}')"); - put(RETURN_TYPE_MISMATCH, "This function must return a value of type {0}", RENDER_TYPE); - put(EXPECTED_TYPE_MISMATCH, "Expected a value of type {0}", RENDER_TYPE); - put(ASSIGNMENT_TYPE_MISMATCH, - "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE); - put(IMPLICIT_CAST_TO_UNIT_OR_ANY, "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", - RENDER_TYPE); - put(EXPRESSION_EXPECTED, "{0} is not an expression, and only expression are allowed here", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetExpression expression) { - String expressionType = expression.toString(); - return expressionType.substring(0, 1) + - expressionType.substring(1).toLowerCase(); - } - }); - - put(UPPER_BOUND_VIOLATED, "An upper bound {0} is violated", RENDER_TYPE); // TODO : Message - put(FINAL_CLASS_OBJECT_UPPER_BOUND, "{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE); - put(FINAL_UPPER_BOUND, "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); - put(USELESS_ELVIS, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); - put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME); - put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, "Class object upper bounds of {0} have empty intersection", NAME); - - put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", TO_STRING); - put(ERROR_COMPILE_TIME_VALUE, "{0}", TO_STRING); - - put(ELSE_MISPLACED_IN_WHEN, "'else' entry must be the last one in a when-expression"); - - put(NO_ELSE_IN_WHEN, "'when' expression must contain 'else' branch"); - put(TYPE_MISMATCH_IN_RANGE, "Type mismatch: incompatible types of range and element checked in it"); - put(CYCLIC_INHERITANCE_HIERARCHY, "There's a cycle in the inheritance hierarchy for this type"); - - put(MANY_CLASSES_IN_SUPERTYPE_LIST, "Only one class may appear in a supertype list"); - put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, "Only classes and traits may serve as supertypes"); - put(SUPERTYPE_INITIALIZED_IN_TRAIT, "Traits cannot initialize supertypes"); - put(CONSTRUCTOR_IN_TRAIT, "A trait may not have a constructor"); - put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, "Secondary constructors are not supported"); - put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice"); - put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from"); - - put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING); - - put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, "A type annotation is required on a value parameter"); - put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, "'break' and 'continue' are only allowed inside a loop"); - put(NOT_A_LOOP_LABEL, "The label ''{0}'' does not denote a loop", TO_STRING); - put(NOT_A_RETURN_LABEL, "The label ''{0}'' does not reference to a context from which we can return", TO_STRING); - - put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, "Anonymous initializers are only allowed in the presence of a primary constructor"); - put(NULLABLE_SUPERTYPE, "A supertype cannot be nullable"); - put(UNSAFE_CALL, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); - put(AMBIGUOUS_LABEL, "Ambiguous label"); - put(UNSUPPORTED, "Unsupported [{0}]", TO_STRING); - put(UNNECESSARY_SAFE_CALL, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); - put(UNNECESSARY_NOT_NULL_ASSERTION, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); - put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, "{0} does not refer to a type parameter of {1}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetTypeConstraint typeConstraint) { - //noinspection ConstantConditions - return typeConstraint.getSubjectTypeParameterName().getReferencedName(); - } - }, NAME); - put(AUTOCAST_IMPOSSIBLE, "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, - NAME); - - put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, - RENDER_TYPE); - put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type Boolean, but was of type {0}", RENDER_TYPE); - put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, - TO_STRING); // TODO: message - put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); - put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); - put(EXPECTED_CONDITION, "Expected condition of Boolean type"); - - put(CANNOT_CHECK_FOR_ERASED, "Cannot check for instance of erased type: {0}", RENDER_TYPE); - put(UNCHECKED_CAST, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); - - put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, - new Renderer>() { - @NotNull - @Override - public String render(@NotNull Collection types) { - StringBuilder builder = new StringBuilder(); - for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { - JetType jetType = iterator.next(); - builder.append(jetType); - if (iterator.hasNext()) { - builder.append(", "); - } - } - return builder.toString(); - } - }); - - put(EQUALITY_NOT_APPLICABLE, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { - @NotNull - @Override - public String render(@NotNull JetSimpleNameExpression nameExpression) { - //noinspection ConstantConditions - return nameExpression.getReferencedName(); - } - }, TO_STRING, TO_STRING); - - put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); - put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); - put(CANNOT_CHANGE_ACCESS_PRIVILEGE, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); - - put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of {0} is not a subtype of the return type overridden member {1}", - DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); - - put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, - DescriptorRenderer.TEXT); - - put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, - DescriptorRenderer.TEXT); - - put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "{0} must override {1} because it inherits many implementations of it", - RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT); - - put(CONFLICTING_OVERLOADS, "{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING); - - - put(RESULT_TYPE_MISMATCH, "{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); - put(UNSAFE_INFIX_CALL, - "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. " + - "Use '?.'-qualified call instead", - TO_STRING, TO_STRING, TO_STRING); - - put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity: {0}", AMBIGUOUS_CALLS); - put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied: {0}", AMBIGUOUS_CALLS); - put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter {0}", DescriptorRenderer.TEXT); - put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); - put(NO_RECEIVER_ADMITTED, "No receiver can be passed to this function or property"); - - put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Can not create an instance of an abstract class"); - put(TYPE_INFERENCE_FAILED, "Type inference failed: {0}", TO_STRING); - put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0} type arguments expected", new Renderer() { - @NotNull - @Override - public String render(@NotNull Integer argument) { - return argument == 0 ? "No" : argument.toString(); - } - }); - - put(UNRESOLVED_IDE_TEMPLATE, "Unresolved IDE template: {0}", TO_STRING); - - put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, - "This expression is treated as an argument to the function call on the previous line. " + - "Separate it with a semicolon (;) if it is not intended to be an argument."); - - put(NOT_AN_ANNOTATION_CLASS, "{0} is not an annotation class", TO_STRING); - } + private final DiagnosticFactoryToRendererMap map = DefaultErrorMessages.MAP; @NotNull @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java new file mode 100644 index 00000000000..f9954ace34c --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -0,0 +1,408 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; +import org.jetbrains.jet.lang.psi.JetTypeConstraint; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lexer.JetKeywordToken; +import org.jetbrains.jet.resolve.DescriptorRenderer; + +import java.util.Collection; +import java.util.Iterator; + +import static org.jetbrains.jet.lang.diagnostics.Errors.*; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; + +/** + * @author Evgeny Gerashchenko + * @since 4/13/12 + */ +public class DefaultErrorMessages { + public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); + + private static final Renderer>> AMBIGUOUS_CALLS = + new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> argument) { + StringBuilder stringBuilder = new StringBuilder("\n"); + for (ResolvedCall call : argument) { + stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); + } + return stringBuilder.toString(); + } + }; + + static { + MAP.put(EXCEPTION_WHILE_ANALYZING, "{0}", new Renderer() { + @NotNull + @Override + public String render(@NotNull Throwable e) { + return e.getClass().getSimpleName() + ": " + e.getMessage(); + } + }); + + MAP.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", TO_STRING); + + MAP.put(INVISIBLE_REFERENCE, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); + MAP.put(INVISIBLE_MEMBER, "Cannot access ''{0}'' in ''{1}''", NAME, NAME); + + MAP.put(REDECLARATION, "Redeclaration: {0}", NAME); + MAP.put(NAME_SHADOWING, "Name shadowed: {0}", NAME); + + MAP.put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE); + MAP.put(INCOMPATIBLE_MODIFIERS, "Incompatible modifiers: ''{0}''", new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection tokens) { + StringBuilder sb = new StringBuilder(); + for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { + JetKeywordToken modifier = iterator.next(); + sb.append(modifier.getValue()); + if (iterator.hasNext()) { + sb.append(" "); + } + } + return sb.toString(); + } + }); + MAP.put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING); + + MAP.put(REDUNDANT_MODIFIER, "Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING); + MAP.put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in trait"); + MAP.put(OPEN_MODIFIER_IN_TRAIT, "Modifier ''open'' is redundant in trait"); + MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); + MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait can not be final"); + MAP.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, + "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message + MAP.put(RETURN_NOT_ALLOWED, "'return' is not allowed here"); + MAP.put(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE, "Projections are not allowed for immediate arguments of a supertype"); + MAP.put(LABEL_NAME_CLASH, "There is more than one label with such a name in this scope"); + MAP.put(EXPRESSION_EXPECTED_NAMESPACE_FOUND, "Expression expected, but a namespace name found"); + + MAP.put(CANNOT_IMPORT_FROM_ELEMENT, "Cannot import from ''{0}''", NAME); + MAP.put(CANNOT_BE_IMPORTED, "Cannot import ''{0}'', functions and properties can be imported only from packages", NAME); + MAP.put(USELESS_HIDDEN_IMPORT, "Useless import, it is hidden further"); + MAP.put(USELESS_SIMPLE_IMPORT, "Useless import, does nothing"); + + MAP.put(CANNOT_INFER_PARAMETER_TYPE, + "Cannot infer a type for this parameter. To specify it explicitly use the {(p : Type) => ...} notation"); + + MAP.put(NO_BACKING_FIELD_ABSTRACT_PROPERTY, "This property doesn't have a backing field, because it's abstract"); + MAP.put(NO_BACKING_FIELD_CUSTOM_ACCESSORS, + "This property doesn't have a backing field, because it has custom accessors without reference to the backing field"); + MAP.put(INACCESSIBLE_BACKING_FIELD, "The backing field is not accessible here"); + MAP.put(NOT_PROPERTY_BACKING_FIELD, "The referenced variable is not a property and doesn't have backing field"); + + MAP.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments in not allowed"); + MAP.put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter"); + MAP.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", TO_STRING); + MAP.put(VARARG_OUTSIDE_PARENTHESES, "Passing value as a vararg is only allowed inside a parenthesized argument list"); + MAP.put(NON_VARARG_SPREAD, "The spread operator (*foo) may only be applied in a vararg position"); + + MAP.put(MANY_FUNCTION_LITERAL_ARGUMENTS, "Only one function literal is allowed outside a parenthesized argument list"); + MAP.put(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER, "This property must either have a type annotation or be initialized"); + + MAP.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract"); + MAP.put(ABSTRACT_PROPERTY_NOT_IN_CLASS, "A property may be abstract only when defined in a class or trait"); + MAP.put(ABSTRACT_PROPERTY_WITH_INITIALIZER, "Property with initializer cannot be abstract"); + MAP.put(ABSTRACT_PROPERTY_WITH_GETTER, "Property with getter implementation cannot be abstract"); + MAP.put(ABSTRACT_PROPERTY_WITH_SETTER, "Property with setter implementation cannot be abstract"); + + MAP.put(PACKAGE_MEMBER_CANNOT_BE_PROTECTED, "Package member cannot be protected"); + + MAP.put(GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY, "Getter visibility must be the same as property visibility"); + MAP.put(BACKING_FIELD_IN_TRAIT, "Property in a trait cannot have a backing field"); + MAP.put(MUST_BE_INITIALIZED, "Property must be initialized"); + MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); + MAP.put(PROPERTY_INITIALIZER_IN_TRAIT, "Property initializers are not allowed in traits"); + MAP.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, "Initializer is not allowed here because this property has no backing field"); + MAP.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); + MAP.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); + MAP.put(ABSTRACT_FUNCTION_WITH_BODY, "A function {0} with body cannot be abstract", TO_STRING); + MAP.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Method {0} without a body must be abstract", TO_STRING); + MAP.put(NON_MEMBER_ABSTRACT_FUNCTION, "Function {0} is not a class or trait member and cannot be abstract", TO_STRING); + + MAP.put(NON_MEMBER_FUNCTION_NO_BODY, "Function {0} must have a body", TO_STRING); + MAP.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "Non final member in a final class"); + + MAP.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, "Public or protected member should specify a type"); + + MAP.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, + "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning + MAP.put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here"); + MAP.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, "Constructor invocation should be explicitly specified"); + MAP.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, "A secondary constructor may appear only in a class that has a primary constructor"); + MAP.put(SECONDARY_CONSTRUCTOR_NO_INITIALIZER_LIST, "Secondary constructors must have an initializer list"); + MAP.put(BY_IN_SECONDARY_CONSTRUCTOR, "'by'-clause is only supported for primary constructors"); + MAP.put(INITIALIZER_WITH_NO_ARGUMENTS, "Constructor arguments required"); + MAP.put(MANY_CALLS_TO_THIS, "Only one call to 'this(...)' is allowed"); + MAP.put(NOTHING_TO_OVERRIDE, "{0} overrides nothing", DescriptorRenderer.TEXT); + MAP.put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + + MAP.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, "Missing delegation specifier ''{0}''", NAME); + MAP.put(ENUM_ENTRY_ILLEGAL_TYPE, "The type constructor of enum entry should be ''{0}''", NAME); + + MAP.put(UNINITIALIZED_VARIABLE, "Variable ''{0}'' must be initialized", NAME); + MAP.put(UNINITIALIZED_PARAMETER, "Parameter ''{0}'' is uninitialized here", NAME); + MAP.put(UNUSED_VARIABLE, "Variable ''{0}'' is never used", NAME); + MAP.put(UNUSED_PARAMETER, "Parameter ''{0}'' is never used", NAME); + MAP.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, "Variable ''{0}'' is assigned but never accessed", NAME); + MAP.put(VARIABLE_WITH_REDUNDANT_INITIALIZER, "Variable ''{0}'' initializer is redundant", NAME); + MAP.put(UNUSED_VALUE, "The value ''{0}'' assigned to ''{1}'' is never used", ELEMENT_TEXT, TO_STRING); + MAP.put(UNUSED_CHANGED_VALUE, "The value changed at ''{0}'' is never used", ELEMENT_TEXT); + MAP.put(UNUSED_EXPRESSION, "The expression is unused"); + MAP.put(UNUSED_FUNCTION_LITERAL, "The function literal is unused. If you mean block, you can use 'run { ... }'"); + + MAP.put(VAL_REASSIGNMENT, "Val can not be reassigned", NAME); + MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); + MAP.put(VARIABLE_EXPECTED, "Variable expected"); + + MAP.put(INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER, + "This property has a custom setter, so initialization using backing field required", NAME); + MAP.put(INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER, + "Setter of this property can be overridden, so initialization using backing field required", NAME); + + MAP.put(FUNCTION_PARAMETERS_OF_INLINE_FUNCTION, "Function parameters of inline function can only be invoked", NAME); + + MAP.put(UNREACHABLE_CODE, "Unreachable code"); + + MAP.put(MANY_CLASS_OBJECTS, "Only one class object is allowed per class"); + MAP.put(CLASS_OBJECT_NOT_ALLOWED, "A class object is not allowed here"); + MAP.put(DELEGATION_IN_TRAIT, "Traits cannot use delegation"); + MAP.put(DELEGATION_NOT_TO_TRAIT, "Only traits can be delegated to"); + MAP.put(NO_CONSTRUCTOR, "This class does not have a constructor"); + MAP.put(NOT_A_CLASS, "Not a class"); + MAP.put(ILLEGAL_ESCAPE_SEQUENCE, "Illegal escape sequence"); + + MAP.put(LOCAL_EXTENSION_PROPERTY, "Local extension properties are not allowed"); + MAP.put(LOCAL_VARIABLE_WITH_GETTER, "Local variables are not allowed to have getters"); + MAP.put(LOCAL_VARIABLE_WITH_SETTER, "Local variables are not allowed to have setters"); + MAP.put(VAL_WITH_SETTER, "A 'val'-property cannot have a setter"); + + MAP.put(NO_GET_METHOD, "No get method providing array access"); + MAP.put(NO_SET_METHOD, "No set method providing array access"); + + MAP.put(INC_DEC_SHOULD_NOT_RETURN_UNIT, "Functions inc(), dec() shouldn't return Unit to be used by operators ++, --"); + MAP.put(ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT, "Function ''{0}'' should return Unit to be used by corresponding operator ''{1}''", + NAME, ELEMENT_TEXT); + MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity: {0}", AMBIGUOUS_CALLS); + + MAP.put(EQUALS_MISSING, "No method 'equals(Any?) : Boolean' available"); + MAP.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Assignments are not expressions, and only expressions are allowed in this context"); + MAP.put(NAMESPACE_IS_NOT_AN_EXPRESSION, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); + MAP.put(SUPER_IS_NOT_AN_EXPRESSION, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING); + MAP.put(DECLARATION_IN_ILLEGAL_CONTEXT, "Declarations are not allowed in this position"); + MAP.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, "Setter parameters can not have default values"); + MAP.put(NO_THIS, "'this' is not defined in this context"); + MAP.put(SUPER_NOT_AVAILABLE, "No supertypes are accessible in this context"); + MAP.put(AMBIGUOUS_SUPER, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); + MAP.put(ABSTRACT_SUPER_CALL, "Abstract member cannot be accessed directly"); + MAP.put(NOT_A_SUPERTYPE, "Not a supertype"); + MAP.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, "Type arguments do not need to be specified in a 'super' qualifier"); + MAP.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, "No cast needed, use ':' instead"); + MAP.put(USELESS_CAST, "No cast needed"); + MAP.put(CAST_NEVER_SUCCEEDS, "This cast can never succeed"); + MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); + MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); + MAP.put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); + MAP.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); + + MAP.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, + "An ambiguity between 'iterator().hasNext()' function and 'iterator().hasNext' property"); + MAP.put(HAS_NEXT_MISSING, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); + MAP.put(HAS_NEXT_FUNCTION_AMBIGUITY, "Function 'iterator().hasNext()' is ambiguous for this expression"); + MAP.put(HAS_NEXT_MUST_BE_READABLE, "The 'iterator().hasNext' property of the loop range must be readable"); + MAP.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", + RENDER_TYPE); + MAP.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", + RENDER_TYPE); + MAP.put(NEXT_AMBIGUITY, "Function 'iterator().next()' is ambiguous for this expression"); + MAP.put(NEXT_MISSING, "Loop range must have an 'iterator().next()' function"); + MAP.put(ITERATOR_MISSING, "For-loop range must have an iterator() method"); + MAP.put(ITERATOR_AMBIGUITY, "Method 'iterator()' is ambiguous for this expression: {0}", AMBIGUOUS_CALLS); + + MAP.put(COMPARE_TO_TYPE_MISMATCH, "compareTo() must return Int, but returns {0}", RENDER_TYPE); + MAP.put(CALLEE_NOT_A_FUNCTION, "Expecting a function type, but found {0}", RENDER_TYPE); + + MAP.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, + "Returns are not allowed for functions with expression body. Use block body in '{...}'"); + MAP.put(NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY, "A 'return' expression required in a function with a block body ('{...}')"); + MAP.put(RETURN_TYPE_MISMATCH, "This function must return a value of type {0}", RENDER_TYPE); + MAP.put(EXPECTED_TYPE_MISMATCH, "Expected a value of type {0}", RENDER_TYPE); + MAP.put(ASSIGNMENT_TYPE_MISMATCH, + "Expected a value of type {0}. Assignment operation is not an expression, so it does not return any value", RENDER_TYPE); + MAP.put(IMPLICIT_CAST_TO_UNIT_OR_ANY, "Type was casted to ''{0}''. Please specify ''{0}'' as expected type, if you mean such cast", + RENDER_TYPE); + MAP.put(EXPRESSION_EXPECTED, "{0} is not an expression, and only expression are allowed here", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetExpression expression) { + String expressionType = expression.toString(); + return expressionType.substring(0, 1) + + expressionType.substring(1).toLowerCase(); + } + }); + + MAP.put(UPPER_BOUND_VIOLATED, "An upper bound {0} is violated", RENDER_TYPE); // TODO : Message + MAP.put(FINAL_CLASS_OBJECT_UPPER_BOUND, "{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE); + MAP.put(FINAL_UPPER_BOUND, "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); + MAP.put(USELESS_ELVIS, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); + MAP.put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME); + MAP.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, "Class object upper bounds of {0} have empty intersection", NAME); + + MAP.put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", TO_STRING); + MAP.put(ERROR_COMPILE_TIME_VALUE, "{0}", TO_STRING); + + MAP.put(ELSE_MISPLACED_IN_WHEN, "'else' entry must be the last one in a when-expression"); + + MAP.put(NO_ELSE_IN_WHEN, "'when' expression must contain 'else' branch"); + MAP.put(TYPE_MISMATCH_IN_RANGE, "Type mismatch: incompatible types of range and element checked in it"); + MAP.put(CYCLIC_INHERITANCE_HIERARCHY, "There's a cycle in the inheritance hierarchy for this type"); + + MAP.put(MANY_CLASSES_IN_SUPERTYPE_LIST, "Only one class may appear in a supertype list"); + MAP.put(SUPERTYPE_NOT_A_CLASS_OR_TRAIT, "Only classes and traits may serve as supertypes"); + MAP.put(SUPERTYPE_INITIALIZED_IN_TRAIT, "Traits cannot initialize supertypes"); + MAP.put(CONSTRUCTOR_IN_TRAIT, "A trait may not have a constructor"); + MAP.put(SECONDARY_CONSTRUCTORS_ARE_NOT_SUPPORTED, "Secondary constructors are not supported"); + MAP.put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice"); + MAP.put(FINAL_SUPERTYPE, "This type is final, so it cannot be inherited from"); + + MAP.put(ILLEGAL_SELECTOR, "Expression ''{0}'' cannot be a selector (occur after a dot)", TO_STRING); + + MAP.put(VALUE_PARAMETER_WITH_NO_TYPE_ANNOTATION, "A type annotation is required on a value parameter"); + MAP.put(BREAK_OR_CONTINUE_OUTSIDE_A_LOOP, "'break' and 'continue' are only allowed inside a loop"); + MAP.put(NOT_A_LOOP_LABEL, "The label ''{0}'' does not denote a loop", TO_STRING); + MAP.put(NOT_A_RETURN_LABEL, "The label ''{0}'' does not reference to a context from which we can return", TO_STRING); + + MAP.put(ANONYMOUS_INITIALIZER_WITHOUT_CONSTRUCTOR, "Anonymous initializers are only allowed in the presence of a primary constructor"); + MAP.put(NULLABLE_SUPERTYPE, "A supertype cannot be nullable"); + MAP.put(UNSAFE_CALL, "Only safe calls (?.) are allowed on a nullable receiver of type {0}", RENDER_TYPE); + MAP.put(AMBIGUOUS_LABEL, "Ambiguous label"); + MAP.put(UNSUPPORTED, "Unsupported [{0}]", TO_STRING); + MAP.put(UNNECESSARY_SAFE_CALL, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); + MAP.put(UNNECESSARY_NOT_NULL_ASSERTION, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); + MAP.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, "{0} does not refer to a type parameter of {1}", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetTypeConstraint typeConstraint) { + //noinspection ConstantConditions + return typeConstraint.getSubjectTypeParameterName().getReferencedName(); + } + }, NAME); + MAP.put(AUTOCAST_IMPOSSIBLE, "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, + NAME); + + MAP.put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, + RENDER_TYPE); + MAP.put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type Boolean, but was of type {0}", RENDER_TYPE); + MAP.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, + TO_STRING); // TODO: message + MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); + MAP.put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); + MAP.put(EXPECTED_CONDITION, "Expected condition of Boolean type"); + + MAP.put(CANNOT_CHECK_FOR_ERASED, "Cannot check for instance of erased type: {0}", RENDER_TYPE); + MAP.put(UNCHECKED_CAST, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); + + MAP.put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, + new Renderer>() { + @NotNull + @Override + public String render(@NotNull Collection types) { + StringBuilder builder = new StringBuilder(); + for (Iterator iterator = types.iterator(); iterator.hasNext(); ) { + JetType jetType = iterator.next(); + builder.append(jetType); + if (iterator.hasNext()) { + builder.append(", "); + } + } + return builder.toString(); + } + }); + + MAP.put(EQUALITY_NOT_APPLICABLE, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { + @NotNull + @Override + public String render(@NotNull JetSimpleNameExpression nameExpression) { + //noinspection ConstantConditions + return nameExpression.getReferencedName(); + } + }, TO_STRING, TO_STRING); + + MAP.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); + MAP.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); + MAP.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); + + MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of {0} is not a subtype of the return type overridden member {1}", + DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + + MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, + DescriptorRenderer.TEXT); + + MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} must be declared abstract or implement abstract member {1}", RENDER_CLASS_OR_OBJECT, + DescriptorRenderer.TEXT); + + MAP.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "{0} must override {1} because it inherits many implementations of it", + RENDER_CLASS_OR_OBJECT, DescriptorRenderer.TEXT); + + MAP.put(CONFLICTING_OVERLOADS, "{1} is already defined in ''{0}''", DescriptorRenderer.TEXT, TO_STRING); + + + MAP.put(RESULT_TYPE_MISMATCH, "{0} must return {1} but returns {2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); + MAP.put(UNSAFE_INFIX_CALL, + "Infix call corresponds to a dot-qualified call ''{0}.{1}({2})'' which is not allowed on a nullable receiver ''{0}''. " + + "Use '?.'-qualified call instead", + TO_STRING, TO_STRING, TO_STRING); + + MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity: {0}", AMBIGUOUS_CALLS); + MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied: {0}", AMBIGUOUS_CALLS); + MAP.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter {0}", DescriptorRenderer.TEXT); + MAP.put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); + MAP.put(NO_RECEIVER_ADMITTED, "No receiver can be passed to this function or property"); + + MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Can not create an instance of an abstract class"); + MAP.put(TYPE_INFERENCE_FAILED, "Type inference failed: {0}", TO_STRING); + MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0} type arguments expected", new Renderer() { + @NotNull + @Override + public String render(@NotNull Integer argument) { + return argument == 0 ? "No" : argument.toString(); + } + }); + + MAP.put(UNRESOLVED_IDE_TEMPLATE, "Unresolved IDE template: {0}", TO_STRING); + + MAP.put(DANGLING_FUNCTION_LITERAL_ARGUMENT_SUSPECTED, + "This expression is treated as an argument to the function call on the previous line. " + + "Separate it with a semicolon (;) if it is not intended to be an argument."); + + MAP.put(NOT_AN_ANNOTATION_CLASS, "{0} is not an annotation class", TO_STRING); + } + + private DefaultErrorMessages() { + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java new file mode 100644 index 00000000000..3172e3f9144 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.diagnostics.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Evgeny Gerashchenko + * @since 4/13/12 + */ +public class DiagnosticFactoryToRendererMap { + private final Map> map = + new HashMap>(); + + public final void put(SimpleDiagnosticFactory factory, String message) { + map.put(factory, new SimpleDiagnosticRenderer(message)); + } + + public final void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { + map.put(factory, new DiagnosticWithParameters1Renderer(message, rendererA)); + } + + public final void put(DiagnosticFactory2 factory, + String message, + Renderer rendererA, + Renderer rendererB) { + map.put(factory, new DiagnosticWithParameters2Renderer(message, rendererA, rendererB)); + } + + public final void put(DiagnosticFactory3 factory, + String message, + Renderer rendererA, + Renderer rendererB, + Renderer rendererC) { + map.put(factory, new DiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)); + } + + @Nullable + public final DiagnosticRenderer get(@NotNull AbstractDiagnosticFactory factory) { + return map.get(factory); + } +} From c1a9630051266e5fb742de3d4a55c85c9bbd2926 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 18:50:30 +0400 Subject: [PATCH 35/76] Moved AMBIGUOUS_CALLS from DefaultErrorMessages to Renderers. --- .../rendering/DefaultErrorMessages.java | 15 -------------- .../lang/diagnostics/rendering/Renderers.java | 20 +++++++++++++++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index f9954ace34c..f0cae982a4c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -17,11 +17,9 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.psi.JetTypeConstraint; -import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -41,19 +39,6 @@ import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; public class DefaultErrorMessages { public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); - private static final Renderer>> AMBIGUOUS_CALLS = - new Renderer>>() { - @NotNull - @Override - public String render(@NotNull Collection> argument) { - StringBuilder stringBuilder = new StringBuilder("\n"); - for (ResolvedCall call : argument) { - stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); - } - return stringBuilder.toString(); - } - }; - static { MAP.put(EXCEPTION_WHILE_ANALYZING, "{0}", new Renderer() { @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java index 8e42eb60b4e..16527b27a30 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/Renderers.java @@ -18,12 +18,16 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.Named; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.resolve.DescriptorRenderer; +import java.util.Collection; + /** * @author svtk */ @@ -80,4 +84,20 @@ public class Renderers { return DescriptorRenderer.TEXT.renderType(type); } }; + + public static final Renderer>> AMBIGUOUS_CALLS = + new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> argument) { + StringBuilder stringBuilder = new StringBuilder("\n"); + for (ResolvedCall call : argument) { + stringBuilder.append(DescriptorRenderer.TEXT.render(call.getResultingDescriptor())).append("\n"); + } + return stringBuilder.toString(); + } + }; + + private Renderers() { + } } From 370af95c8750e63f07f6c4baaaccce28e39d89d3 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 19:00:53 +0400 Subject: [PATCH 36/76] Introduced DispatchingDiagnosticRenderer, which replaced DefaultDiagnosticRenderer. --- .../jet/compiler/CompileSession.java | 4 ++-- .../rendering/DefaultErrorMessages.java | 2 ++ ...ava => DispatchingDiagnosticRenderer.java} | 22 +++++++++++-------- .../tests/org/jetbrains/jet/JetTestUtils.java | 4 ++-- .../jet/plugin/highlighter/JetPsiChecker.java | 4 ++-- 5 files changed, 21 insertions(+), 15 deletions(-) rename compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/{DefaultDiagnosticRenderer.java => DispatchingDiagnosticRenderer.java} (56%) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index 458efc9ed12..7bb24420e5a 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -36,7 +36,7 @@ import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.diagnostics.*; -import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; @@ -155,7 +155,7 @@ public class CompileSession { render = ((SyntaxErrorDiagnostic)diagnostic).message; } else { - render = DefaultDiagnosticRenderer.INSTANCE.render(diagnostic); + render = DefaultErrorMessages.RENDERER.render(diagnostic); } collector.report(diagnostic.getSeverity(), render, path, lineAndColumn.getLine(), lineAndColumn.getColumn()); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index f0cae982a4c..f83c2a65983 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lang.psi.JetTypeConstraint; @@ -38,6 +39,7 @@ import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; */ public class DefaultErrorMessages { public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); + public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAP); static { MAP.put(EXCEPTION_WHILE_ANALYZING, "{0}", new Renderer() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java similarity index 56% rename from compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java rename to compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java index 6453e0465e7..7a580b14556 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java @@ -21,21 +21,25 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic; /** * @author Evgeny Gerashchenko - * @since 4/12/12 + * @since 4/13/12 */ -public class DefaultDiagnosticRenderer implements DiagnosticRenderer { - public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer(); +public class DispatchingDiagnosticRenderer implements DiagnosticRenderer { + private final DiagnosticFactoryToRendererMap[] maps; - private final DiagnosticFactoryToRendererMap map = DefaultErrorMessages.MAP; + public DispatchingDiagnosticRenderer(DiagnosticFactoryToRendererMap... maps) { + this.maps = maps; + } @NotNull @Override public String render(@NotNull Diagnostic diagnostic) { - DiagnosticRenderer renderer = map.get(diagnostic.getFactory()); - if (renderer == null) { - throw new IllegalArgumentException("Don't know how to render diagnostic of type " + diagnostic.getFactory().getName()); + for (DiagnosticFactoryToRendererMap map : maps) { + DiagnosticRenderer renderer = map.get(diagnostic.getFactory()); + if (renderer != null) { + //noinspection unchecked + return renderer.render(diagnostic); + } } - //noinspection unchecked - return renderer.render(diagnostic); + throw new IllegalArgumentException("Don't know how to render diagnostic of type " + diagnostic.getFactory().getName()); } } diff --git a/compiler/tests/org/jetbrains/jet/JetTestUtils.java b/compiler/tests/org/jetbrains/jet/JetTestUtils.java index de37982408a..d206a7b1e97 100644 --- a/compiler/tests/org/jetbrains/jet/JetTestUtils.java +++ b/compiler/tests/org/jetbrains/jet/JetTestUtils.java @@ -27,9 +27,9 @@ import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnosticFactory; -import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Severity; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; @@ -153,7 +153,7 @@ public class JetTestUtils { @Override public void report(@NotNull Diagnostic diagnostic) { if (diagnostic.getSeverity() == Severity.ERROR) { - throw new IllegalStateException(DefaultDiagnosticRenderer.INSTANCE.render(diagnostic)); + throw new IllegalStateException(DefaultErrorMessages.RENDERER.render(diagnostic)); } } }; diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index ed012e03db0..7ea6b579896 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -33,8 +33,8 @@ import com.intellij.psi.PsiReference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.jet.lang.diagnostics.rendering.DefaultDiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.*; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -238,7 +238,7 @@ public class JetPsiChecker implements Annotator { @NotNull private static String getMessage(@NotNull Diagnostic diagnostic) { - String message = DefaultDiagnosticRenderer.INSTANCE.render(diagnostic); + String message = DefaultErrorMessages.RENDERER.render(diagnostic); if (ApplicationManager.getApplication().isInternal() || ApplicationManager.getApplication().isUnitTestMode()) { return "[" + diagnostic.getFactory().getName() + "] " + message; } From abb53d4a1805b778150ad6e88490f7b2cd4c73dc Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 19:31:08 +0400 Subject: [PATCH 37/76] Introduced IdeErrorMessages, which is now used along with DefaultErrorMessages in IDEA plugin. --- .../plugin/highlighter/IdeErrorMessages.java | 39 +++++++++++++++++++ .../jet/plugin/highlighter/JetPsiChecker.java | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java new file mode 100644 index 00000000000..e7dafaeb274 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.highlighter; + +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; +import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap; +import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; + +/** + * @author Evgeny Gerashchenko + * @since 4/13/12 + */ +public class IdeErrorMessages { + public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); + public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAP, DefaultErrorMessages.MAP); + + static { + // TODO + } + + private IdeErrorMessages() { + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index 7ea6b579896..4428919d6b9 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -238,7 +238,7 @@ public class JetPsiChecker implements Annotator { @NotNull private static String getMessage(@NotNull Diagnostic diagnostic) { - String message = DefaultErrorMessages.RENDERER.render(diagnostic); + String message = IdeErrorMessages.RENDERER.render(diagnostic); if (ApplicationManager.getApplication().isInternal() || ApplicationManager.getApplication().isUnitTestMode()) { return "[" + diagnostic.getFactory().getName() + "] " + message; } From 6fb0f79de988189d884dcac5f887273fa5e03da5 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 13 Apr 2012 19:31:40 +0400 Subject: [PATCH 38/76] Made JetPsiChecker aware of HTML diagnostics. --- .../jet/plugin/highlighter/JetPsiChecker.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java index 4428919d6b9..c11debd4cdd 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.java @@ -30,6 +30,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.MultiRangeReference; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; +import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -152,9 +153,8 @@ public class JetPsiChecker implements Annotator { if (reference instanceof MultiRangeReference) { MultiRangeReference mrr = (MultiRangeReference)reference; for (TextRange range : mrr.getRanges()) { - Annotation annotation = holder.createErrorAnnotation( - range.shiftRight(referenceExpression.getTextOffset()), - getMessage(diagnostic)); + Annotation annotation = holder.createErrorAnnotation(range.shiftRight(referenceExpression.getTextOffset()), getDefaultMessage(diagnostic)); + annotation.setTooltip(getMessage(diagnostic)); registerQuickFix(annotation, diagnostic); @@ -163,7 +163,8 @@ public class JetPsiChecker implements Annotator { } else { for (TextRange textRange : textRanges) { - Annotation annotation = holder.createErrorAnnotation(textRange, getMessage(diagnostic)); + Annotation annotation = holder.createErrorAnnotation(textRange, getDefaultMessage(diagnostic)); + annotation.setTooltip(getMessage(diagnostic)); registerQuickFix(annotation, diagnostic); annotation.setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); } @@ -174,9 +175,9 @@ public class JetPsiChecker implements Annotator { if (diagnostic.getFactory() == Errors.ILLEGAL_ESCAPE_SEQUENCE) { for (TextRange textRange : diagnostic.getTextRanges()) { - Annotation annotation = holder.createErrorAnnotation(textRange, getMessage(diagnostic)); + Annotation annotation = holder.createErrorAnnotation(textRange, getDefaultMessage(diagnostic)); + annotation.setTooltip(getMessage(diagnostic)); annotation.setTextAttributes(JetHighlightingColors.INVALID_STRING_ESCAPE); - //annotation.setEnforcedTextAttributes(TextAttributes.merge(JetHighlightingColors.INVALID_STRING_ESCAPE.getDefaultAttributes(), annotation.getTextAttributes().getDefaultAttributes())); } return; } @@ -188,7 +189,8 @@ public class JetPsiChecker implements Annotator { // Generic annotation for (TextRange textRange : textRanges) { - Annotation errorAnnotation = holder.createErrorAnnotation(textRange, getMessage(diagnostic)); + Annotation errorAnnotation = holder.createErrorAnnotation(textRange, getDefaultMessage(diagnostic)); + errorAnnotation.setTooltip(getMessage(diagnostic)); registerQuickFix(errorAnnotation, diagnostic); if (diagnostic.getFactory() == Errors.INVISIBLE_REFERENCE) { @@ -198,7 +200,8 @@ public class JetPsiChecker implements Annotator { } else if (diagnostic.getSeverity() == Severity.WARNING) { for (TextRange textRange : textRanges) { - Annotation annotation = holder.createWarningAnnotation(textRange, getMessage(diagnostic)); + Annotation annotation = holder.createWarningAnnotation(textRange, getDefaultMessage(diagnostic)); + annotation.setTooltip(getMessage(diagnostic)); registerQuickFix(annotation, diagnostic); if (diagnostic.getFactory() instanceof UnusedElementDiagnosticFactory) { @@ -240,7 +243,24 @@ public class JetPsiChecker implements Annotator { private static String getMessage(@NotNull Diagnostic diagnostic) { String message = IdeErrorMessages.RENDERER.render(diagnostic); if (ApplicationManager.getApplication().isInternal() || ApplicationManager.getApplication().isUnitTestMode()) { - return "[" + diagnostic.getFactory().getName() + "] " + message; + String factoryName = diagnostic.getFactory().getName(); + if (message.startsWith("")) { + message = String.format("[%s] %s", factoryName, message.substring("".length())); + } else { + message = String.format("[%s] %s", factoryName, message); + } + } + if (!message.startsWith("")) { + message = "" + XmlStringUtil.escapeString(message) + ""; + } + return message; + } + + @NotNull + private static String getDefaultMessage(@NotNull Diagnostic diagnostic) { + String message = DefaultErrorMessages.RENDERER.render(diagnostic); + if (ApplicationManager.getApplication().isInternal() || ApplicationManager.getApplication().isUnitTestMode()) { + return String.format("[%s] %s", diagnostic.getFactory().getName(), message); } return message; } @@ -252,6 +272,8 @@ public class JetPsiChecker implements Annotator { if (!redeclarations.add(redeclarationDiagnostic.getPsiElement())) return null; List textRanges = redeclarationDiagnostic.getTextRanges(); if (textRanges.isEmpty()) return null; - return holder.createErrorAnnotation(textRanges.get(0), getMessage(redeclarationDiagnostic)); + Annotation annotation = holder.createErrorAnnotation(textRanges.get(0), ""); + annotation.setTooltip(getMessage(redeclarationDiagnostic)); + return annotation; } } From 8d1860a5f3e362c192ce6363ea421015052a7cff Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 16 Apr 2012 17:29:02 +0400 Subject: [PATCH 39/76] Added immutability flag in DiagnosticFactoryToRendererMap. --- .../rendering/DefaultErrorMessages.java | 2 ++ .../DiagnosticFactoryToRendererMap.java | 27 ++++++++++++++----- .../plugin/highlighter/IdeErrorMessages.java | 1 + 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index f83c2a65983..2cda78e8617 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -388,6 +388,8 @@ public class DefaultErrorMessages { "Separate it with a semicolon (;) if it is not intended to be an argument."); MAP.put(NOT_AN_ANNOTATION_CLASS, "{0} is not an annotation class", TO_STRING); + + MAP.setImmutable(); } private DefaultErrorMessages() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java index 3172e3f9144..96067f8fd53 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java @@ -28,35 +28,50 @@ import java.util.Map; * @author Evgeny Gerashchenko * @since 4/13/12 */ -public class DiagnosticFactoryToRendererMap { +public final class DiagnosticFactoryToRendererMap { private final Map> map = new HashMap>(); + private boolean immutable = false; - public final void put(SimpleDiagnosticFactory factory, String message) { + private void checkMutability() { + if (immutable) { + throw new IllegalStateException("factory to renderer map is already immutable"); + } + } + + public void put(SimpleDiagnosticFactory factory, String message) { + checkMutability(); map.put(factory, new SimpleDiagnosticRenderer(message)); } - public final void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { + public void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { + checkMutability(); map.put(factory, new DiagnosticWithParameters1Renderer(message, rendererA)); } - public final void put(DiagnosticFactory2 factory, + public void put(DiagnosticFactory2 factory, String message, Renderer rendererA, Renderer rendererB) { + checkMutability(); map.put(factory, new DiagnosticWithParameters2Renderer(message, rendererA, rendererB)); } - public final void put(DiagnosticFactory3 factory, + public void put(DiagnosticFactory3 factory, String message, Renderer rendererA, Renderer rendererB, Renderer rendererC) { + checkMutability(); map.put(factory, new DiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)); } @Nullable - public final DiagnosticRenderer get(@NotNull AbstractDiagnosticFactory factory) { + public DiagnosticRenderer get(@NotNull AbstractDiagnosticFactory factory) { return map.get(factory); } + + public void setImmutable() { + immutable = false; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index e7dafaeb274..9d58c574412 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -32,6 +32,7 @@ public class IdeErrorMessages { static { // TODO + MAP.setImmutable(); } private IdeErrorMessages() { From 0f1406cf778d36b3d4438a374242bcc3aa273497 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 16 Apr 2012 23:42:09 +0400 Subject: [PATCH 40/76] Fixed some default error messages. --- .../rendering/DefaultErrorMessages.java | 74 +++++++++---------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 2cda78e8617..4f158e39693 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -76,11 +76,11 @@ public class DefaultErrorMessages { }); MAP.put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING); - MAP.put(REDUNDANT_MODIFIER, "Modifier {0} is redundant because {1} is present", TO_STRING, TO_STRING); + MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING); MAP.put(ABSTRACT_MODIFIER_IN_TRAIT, "Modifier ''abstract'' is redundant in trait"); MAP.put(OPEN_MODIFIER_IN_TRAIT, "Modifier ''open'' is redundant in trait"); MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter"); - MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait can not be final"); + MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait cannot be final"); MAP.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM, "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message MAP.put(RETURN_NOT_ALLOWED, "'return' is not allowed here"); @@ -125,19 +125,18 @@ public class DefaultErrorMessages { MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); MAP.put(PROPERTY_INITIALIZER_IN_TRAIT, "Property initializers are not allowed in traits"); MAP.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, "Initializer is not allowed here because this property has no backing field"); - MAP.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); - MAP.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function {0} in non-abstract class {1}", TO_STRING, TO_STRING, TO_STRING); - MAP.put(ABSTRACT_FUNCTION_WITH_BODY, "A function {0} with body cannot be abstract", TO_STRING); - MAP.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Method {0} without a body must be abstract", TO_STRING); - MAP.put(NON_MEMBER_ABSTRACT_FUNCTION, "Function {0} is not a class or trait member and cannot be abstract", TO_STRING); + MAP.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property ''{0}'' in non-abstract class ''{1}''", NAME, NAME, TO_STRING); // TODO remove useless parameter + MAP.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function ''{0}'' in non-abstract class ''{1}''", NAME, NAME, TO_STRING); // TODO remove useless parameter + MAP.put(ABSTRACT_FUNCTION_WITH_BODY, "A function ''{0}'' with body cannot be abstract", NAME); + MAP.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Function ''{0}'' without a body must be abstract", NAME); + MAP.put(NON_MEMBER_ABSTRACT_FUNCTION, "Function ''{0}'' is not a class or trait member and cannot be abstract", NAME); - MAP.put(NON_MEMBER_FUNCTION_NO_BODY, "Function {0} must have a body", TO_STRING); - MAP.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "Non final member in a final class"); + MAP.put(NON_MEMBER_FUNCTION_NO_BODY, "Function ''{0}'' must have a body", NAME); + MAP.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "Non-final member in a final class"); - MAP.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, "Public or protected member should specify a type"); + MAP.put(PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE, "Public or protected member should have specified type"); - MAP.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, - "Projections are not allowed on type arguments of functions and properties"); // TODO : better positioning + MAP.put(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, "Projections are not allowed on type arguments of functions and properties"); MAP.put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here"); MAP.put(SUPERTYPE_NOT_INITIALIZED_DEFAULT, "Constructor invocation should be explicitly specified"); MAP.put(SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY, "A secondary constructor may appear only in a class that has a primary constructor"); @@ -145,9 +144,8 @@ public class DefaultErrorMessages { MAP.put(BY_IN_SECONDARY_CONSTRUCTOR, "'by'-clause is only supported for primary constructors"); MAP.put(INITIALIZER_WITH_NO_ARGUMENTS, "Constructor arguments required"); MAP.put(MANY_CALLS_TO_THIS, "Only one call to 'this(...)' is allowed"); - MAP.put(NOTHING_TO_OVERRIDE, "{0} overrides nothing", DescriptorRenderer.TEXT); - MAP.put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT, - DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + MAP.put(NOTHING_TO_OVERRIDE, "''{0}'' overrides nothing", NAME); + MAP.put(VIRTUAL_MEMBER_HIDDEN, "''{0}'' hides member of supertype ''{2}'' and needs ''override'' modifier", NAME, NAME, NAME); MAP.put(ENUM_ENTRY_SHOULD_BE_INITIALIZED, "Missing delegation specifier ''{0}''", NAME); MAP.put(ENUM_ENTRY_ILLEGAL_TYPE, "The type constructor of enum entry should be ''{0}''", NAME); @@ -163,7 +161,7 @@ public class DefaultErrorMessages { MAP.put(UNUSED_EXPRESSION, "The expression is unused"); MAP.put(UNUSED_FUNCTION_LITERAL, "The function literal is unused. If you mean block, you can use 'run { ... }'"); - MAP.put(VAL_REASSIGNMENT, "Val can not be reassigned", NAME); + MAP.put(VAL_REASSIGNMENT, "Val cannot be reassigned", NAME); MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); MAP.put(VARIABLE_EXPECTED, "Variable expected"); @@ -197,12 +195,12 @@ public class DefaultErrorMessages { NAME, ELEMENT_TEXT); MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity: {0}", AMBIGUOUS_CALLS); - MAP.put(EQUALS_MISSING, "No method 'equals(Any?) : Boolean' available"); + MAP.put(EQUALS_MISSING, "No method 'equals(jet.Any?) : jet.Boolean' available"); MAP.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Assignments are not expressions, and only expressions are allowed in this context"); MAP.put(NAMESPACE_IS_NOT_AN_EXPRESSION, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); - MAP.put(SUPER_IS_NOT_AN_EXPRESSION, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING); + MAP.put(SUPER_IS_NOT_AN_EXPRESSION, "''{0}'' is not an expression, it can only be used on the left-hand side of a dot ('.')", TO_STRING); MAP.put(DECLARATION_IN_ILLEGAL_CONTEXT, "Declarations are not allowed in this position"); - MAP.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, "Setter parameters can not have default values"); + MAP.put(SETTER_PARAMETER_WITH_DEFAULT_VALUE, "Setter parameters cannot have default values"); MAP.put(NO_THIS, "'this' is not defined in this context"); MAP.put(SUPER_NOT_AVAILABLE, "No supertypes are accessible in this context"); MAP.put(AMBIGUOUS_SUPER, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); @@ -212,9 +210,9 @@ public class DefaultErrorMessages { MAP.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, "No cast needed, use ':' instead"); MAP.put(USELESS_CAST, "No cast needed"); MAP.put(CAST_NEVER_SUCCEEDS, "This cast can never succeed"); - MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); - MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. {0}", RENDER_TYPE); - MAP.put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier {0} does not have a class object", NAME); + MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE); + MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE); + MAP.put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier ''{0}'' does not have a class object", NAME); MAP.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); MAP.put(HAS_NEXT_PROPERTY_AND_FUNCTION_AMBIGUITY, @@ -222,16 +220,16 @@ public class DefaultErrorMessages { MAP.put(HAS_NEXT_MISSING, "Loop range must have an 'iterator().hasNext()' function or an 'iterator().hasNext' property"); MAP.put(HAS_NEXT_FUNCTION_AMBIGUITY, "Function 'iterator().hasNext()' is ambiguous for this expression"); MAP.put(HAS_NEXT_MUST_BE_READABLE, "The 'iterator().hasNext' property of the loop range must be readable"); - MAP.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, "The 'iterator().hasNext' property of the loop range must return Boolean, but returns {0}", + MAP.put(HAS_NEXT_PROPERTY_TYPE_MISMATCH, "The type of ''iterator().hasNext'' property of the loop range must be jet.Boolean, but is {0}", RENDER_TYPE); - MAP.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, "The 'iterator().hasNext()' function of the loop range must return Boolean, but returns {0}", + MAP.put(HAS_NEXT_FUNCTION_TYPE_MISMATCH, "The ''iterator().hasNext()'' function of the loop range must return jet.Boolean, but returns {0}", RENDER_TYPE); MAP.put(NEXT_AMBIGUITY, "Function 'iterator().next()' is ambiguous for this expression"); MAP.put(NEXT_MISSING, "Loop range must have an 'iterator().next()' function"); MAP.put(ITERATOR_MISSING, "For-loop range must have an iterator() method"); - MAP.put(ITERATOR_AMBIGUITY, "Method 'iterator()' is ambiguous for this expression: {0}", AMBIGUOUS_CALLS); + MAP.put(ITERATOR_AMBIGUITY, "Method ''iterator()'' is ambiguous for this expression: {0}", AMBIGUOUS_CALLS); - MAP.put(COMPARE_TO_TYPE_MISMATCH, "compareTo() must return Int, but returns {0}", RENDER_TYPE); + MAP.put(COMPARE_TO_TYPE_MISMATCH, "''compareTo()'' must return jet.Int, but returns {0}", RENDER_TYPE); MAP.put(CALLEE_NOT_A_FUNCTION, "Expecting a function type, but found {0}", RENDER_TYPE); MAP.put(RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, @@ -253,14 +251,14 @@ public class DefaultErrorMessages { } }); - MAP.put(UPPER_BOUND_VIOLATED, "An upper bound {0} is violated", RENDER_TYPE); // TODO : Message - MAP.put(FINAL_CLASS_OBJECT_UPPER_BOUND, "{0} is a final type, and thus a class object cannot extend it", RENDER_TYPE); - MAP.put(FINAL_UPPER_BOUND, "{0} is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); + MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds: should be subtype of ''{0}''", RENDER_TYPE); + MAP.put(FINAL_CLASS_OBJECT_UPPER_BOUND, "''{0}'' is a final type, and thus a class object cannot extend it", RENDER_TYPE); + MAP.put(FINAL_UPPER_BOUND, "''{0}'' is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); MAP.put(USELESS_ELVIS, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); MAP.put(CONFLICTING_UPPER_BOUNDS, "Upper bounds of {0} have empty intersection", NAME); MAP.put(CONFLICTING_CLASS_OBJECT_UPPER_BOUNDS, "Class object upper bounds of {0} have empty intersection", NAME); - MAP.put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", TO_STRING); + MAP.put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", DescriptorRenderer.TEXT); MAP.put(ERROR_COMPILE_TIME_VALUE, "{0}", TO_STRING); MAP.put(ELSE_MISPLACED_IN_WHEN, "'else' entry must be the last one in a when-expression"); @@ -299,12 +297,12 @@ public class DefaultErrorMessages { return typeConstraint.getSubjectTypeParameterName().getReferencedName(); } }, NAME); - MAP.put(AUTOCAST_IMPOSSIBLE, "Automatic cast to {0} is impossible, because {1} could have changed since the is-check", RENDER_TYPE, + MAP.put(AUTOCAST_IMPOSSIBLE, "Automatic cast to ''{0}'' is impossible, because ''{1}'' could have changed since the is-check", RENDER_TYPE, NAME); MAP.put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE); - MAP.put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type Boolean, but was of type {0}", RENDER_TYPE); + MAP.put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type jet.Boolean, but is of type {0}", RENDER_TYPE); MAP.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING); // TODO: message MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); @@ -314,7 +312,7 @@ public class DefaultErrorMessages { MAP.put(CANNOT_CHECK_FOR_ERASED, "Cannot check for instance of erased type: {0}", RENDER_TYPE); MAP.put(UNCHECKED_CAST, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); - MAP.put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of {1} has inconsistent values: {2}", NAME, DescriptorRenderer.TEXT, + MAP.put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of ''{1}'' has inconsistent values: {2}", NAME, NAME, new Renderer>() { @NotNull @Override @@ -344,8 +342,8 @@ public class DefaultErrorMessages { MAP.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); MAP.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); - MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of {0} is not a subtype of the return type overridden member {1}", - DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); + MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of ''{0}'' is not a subtype of the return type of overridden member {1}", + NAME, DescriptorRenderer.TEXT); MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT, DescriptorRenderer.TEXT); @@ -367,11 +365,11 @@ public class DefaultErrorMessages { MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity: {0}", AMBIGUOUS_CALLS); MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied: {0}", AMBIGUOUS_CALLS); - MAP.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter {0}", DescriptorRenderer.TEXT); + MAP.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter {0}", NAME); MAP.put(MISSING_RECEIVER, "A receiver of type {0} is required", RENDER_TYPE); MAP.put(NO_RECEIVER_ADMITTED, "No receiver can be passed to this function or property"); - MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Can not create an instance of an abstract class"); + MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class"); MAP.put(TYPE_INFERENCE_FAILED, "Type inference failed: {0}", TO_STRING); MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0} type arguments expected", new Renderer() { @NotNull @@ -387,7 +385,7 @@ public class DefaultErrorMessages { "This expression is treated as an argument to the function call on the previous line. " + "Separate it with a semicolon (;) if it is not intended to be an argument."); - MAP.put(NOT_AN_ANNOTATION_CLASS, "{0} is not an annotation class", TO_STRING); + MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING); MAP.setImmutable(); } From 2f0760c85bdced225276b56dea4b70fa15072dfa Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 16 Apr 2012 23:45:14 +0400 Subject: [PATCH 41/76] Removed useless diagnostic parameters for ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS and ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 8 ++++---- .../lang/diagnostics/rendering/DefaultErrorMessages.java | 4 ++-- .../jetbrains/jet/lang/resolve/DeclarationsChecker.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) 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 628d07a338f..7dc3b71fe62 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -123,10 +123,10 @@ public interface Errors { PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactoryPROPERTY_INITIALIZER_IN_TRAIT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory PROPERTY_INITIALIZER_NO_BACKING_FIELD = SimpleDiagnosticFactory.create(ERROR); - DiagnosticFactory3 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = - DiagnosticFactory3.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); - DiagnosticFactory3 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = - DiagnosticFactory3.create(ERROR,PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory2 ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = + DiagnosticFactory2.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); + DiagnosticFactory2 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS = + DiagnosticFactory2.create(ERROR,PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = DiagnosticFactory1.create(ERROR, PositioningStrategies.POSITION_ABSTRACT_MODIFIER); DiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 4f158e39693..9a42b6cb85e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -125,8 +125,8 @@ public class DefaultErrorMessages { MAP.put(MUST_BE_INITIALIZED_OR_BE_ABSTRACT, "Property must be initialized or be abstract"); MAP.put(PROPERTY_INITIALIZER_IN_TRAIT, "Property initializers are not allowed in traits"); MAP.put(PROPERTY_INITIALIZER_NO_BACKING_FIELD, "Initializer is not allowed here because this property has no backing field"); - MAP.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property ''{0}'' in non-abstract class ''{1}''", NAME, NAME, TO_STRING); // TODO remove useless parameter - MAP.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function ''{0}'' in non-abstract class ''{1}''", NAME, NAME, TO_STRING); // TODO remove useless parameter + MAP.put(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS, "Abstract property ''{0}'' in non-abstract class ''{1}''", NAME, NAME); + MAP.put(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, "Abstract function ''{0}'' in non-abstract class ''{1}''", NAME, NAME); MAP.put(ABSTRACT_FUNCTION_WITH_BODY, "A function ''{0}'' with body cannot be abstract", NAME); MAP.put(NON_ABSTRACT_FUNCTION_WITH_NO_BODY, "Function ''{0}'' without a body must be abstract", NAME); MAP.put(NON_MEMBER_ABSTRACT_FUNCTION, "Function ''{0}'' is not a class or trait member and cannot be abstract", NAME); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 8d4a4b70de8..c3108cb8bcc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -181,7 +181,7 @@ public class DeclarationsChecker { if (!(classDescriptor.getModality() == Modality.ABSTRACT) && classDescriptor.getKind() != ClassKind.ENUM_CLASS) { JetClass classElement = (JetClass) BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), classDescriptor); String name = property.getName(); - trace.report(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.on(property, name != null ? name : "", classDescriptor, classElement)); + trace.report(ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.on(property, name != null ? name : "", classDescriptor)); return; } if (classDescriptor.getKind() == ClassKind.TRAIT) { @@ -252,7 +252,7 @@ public class DeclarationsChecker { boolean inAbstractClass = classDescriptor.getModality() == Modality.ABSTRACT; if (hasAbstractModifier && !inAbstractClass && !inTrait && !inEnum) { JetClass classElement = (JetClass) BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), classDescriptor); - trace.report(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(function, functionDescriptor.getName(), classDescriptor, classElement)); + trace.report(ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS.on(function, functionDescriptor.getName(), classDescriptor)); } if (hasAbstractModifier && inTrait) { trace.report(ABSTRACT_MODIFIER_IN_TRAIT.on(function)); From 61a26ef5d9dc83672fa55840791f539cfcb1822f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 00:06:48 +0400 Subject: [PATCH 42/76] Added first HTML error message, for TYPE_MISMATCH diagnostic. --- .../jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 9d58c574412..feaf3a0af9b 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererM import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; +import static org.jetbrains.jet.lang.diagnostics.Errors.TYPE_MISMATCH; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; + /** * @author Evgeny Gerashchenko * @since 4/13/12 @@ -31,7 +34,7 @@ public class IdeErrorMessages { public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAP, DefaultErrorMessages.MAP); static { - // TODO + MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.setImmutable(); } From d9cfde431bb3e0e2d65762c92cb312c8352e908f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 00:54:03 +0400 Subject: [PATCH 43/76] Added "expected type" parameter to WRONG_SETTER_PARAMETER_TYPE and WRONG_GETTER_RETURN_TYPE diagnostics. --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 4 ++-- .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 4 ++-- .../org/jetbrains/jet/lang/resolve/DescriptorResolver.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) 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 7dc3b71fe62..8159fbd9a7e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -223,8 +223,8 @@ public interface Errors { SimpleDiagnosticFactory USELESS_CAST_STATIC_ASSERT_IS_FINE = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory USELESS_CAST = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory CAST_NEVER_SUCCEEDS = SimpleDiagnosticFactory.create(WARNING); - DiagnosticFactory1 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory1.create(ERROR); + DiagnosticFactory2 WRONG_SETTER_PARAMETER_TYPE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 WRONG_GETTER_RETURN_TYPE = DiagnosticFactory2.create(ERROR); DiagnosticFactory1 NO_CLASS_OBJECT = DiagnosticFactory1.create(ERROR); SimpleDiagnosticFactory NO_GENERICS_IN_SUPERTYPE_SPECIFIER = SimpleDiagnosticFactory.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 9a42b6cb85e..0a7aa886531 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -210,8 +210,8 @@ public class DefaultErrorMessages { MAP.put(USELESS_CAST_STATIC_ASSERT_IS_FINE, "No cast needed, use ':' instead"); MAP.put(USELESS_CAST, "No cast needed"); MAP.put(CAST_NEVER_SUCCEEDS, "This cast can never succeed"); - MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE); - MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE); + MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE, RENDER_TYPE); + MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property, i.e. ''{0}''", RENDER_TYPE, RENDER_TYPE); MAP.put(NO_CLASS_OBJECT, "Please specify constructor invocation; classifier ''{0}'' does not have a class object", NAME); MAP.put(NO_GENERICS_IN_SUPERTYPE_SPECIFIER, "Generic arguments of the base type must be specified"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 50802066804..d5337fb40c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -723,7 +723,7 @@ public class DescriptorResolver { JetType inType = propertyDescriptor.getType(); if (inType != null) { if (!TypeUtils.equalTypes(type, inType)) { - trace.report(WRONG_SETTER_PARAMETER_TYPE.on(typeReference, inType)); + trace.report(WRONG_SETTER_PARAMETER_TYPE.on(typeReference, inType, type)); } } else { @@ -776,7 +776,7 @@ public class DescriptorResolver { if (returnTypeReference != null) { returnType = typeResolver.resolveType(scope, returnTypeReference, trace, true); if (outType != null && !TypeUtils.equalTypes(returnType, outType)) { - trace.report(WRONG_GETTER_RETURN_TYPE.on(returnTypeReference, propertyDescriptor.getReturnType())); + trace.report(WRONG_GETTER_RETURN_TYPE.on(returnTypeReference, propertyDescriptor.getReturnType(), outType)); } } From 17d290a5da5dda8e85ed2449168e9f2a30ac6a22 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 00:58:02 +0400 Subject: [PATCH 44/76] Added HTML error message for WRONG_SETTER_PARAMETER_TYPE and WRONG_GETTER_RETURN_TYPE diagnostics. --- .../jet/plugin/highlighter/IdeErrorMessages.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index feaf3a0af9b..3bd41ac2bf1 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -23,6 +23,8 @@ import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; import static org.jetbrains.jet.lang.diagnostics.Errors.TYPE_MISMATCH; +import static org.jetbrains.jet.lang.diagnostics.Errors.WRONG_GETTER_RETURN_TYPE; +import static org.jetbrains.jet.lang.diagnostics.Errors.WRONG_SETTER_PARAMETER_TYPE; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; /** @@ -34,7 +36,13 @@ public class IdeErrorMessages { public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAP, DefaultErrorMessages.MAP); static { - MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + + MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property." + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property." + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + MAP.setImmutable(); } From 42c079ce98a1d39ed50a5e4e0ec80ab27f4765c1 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 01:45:57 +0400 Subject: [PATCH 45/76] Added "actual type" parameter for UPPER_BOUND_VIOLATED diagnostic. --- .../frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java | 2 +- .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 2 +- .../src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 8159fbd9a7e..a75cf063278 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -267,7 +267,7 @@ public interface Errors { DiagnosticFactory1 IMPLICIT_CAST_TO_UNIT_OR_ANY = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 EXPRESSION_EXPECTED = DiagnosticFactory1.create(ERROR); - DiagnosticFactory1 UPPER_BOUND_VIOLATED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory2 UPPER_BOUND_VIOLATED = DiagnosticFactory2.create(ERROR); DiagnosticFactory1 FINAL_CLASS_OBJECT_UPPER_BOUND = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 FINAL_UPPER_BOUND = DiagnosticFactory1.create(WARNING); DiagnosticFactory1 USELESS_ELVIS = DiagnosticFactory1.create(WARNING); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 0a7aa886531..0e8a1e60029 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -251,7 +251,7 @@ public class DefaultErrorMessages { } }); - MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds: should be subtype of ''{0}''", RENDER_TYPE); + MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds: should be subtype of ''{0}''", RENDER_TYPE, RENDER_TYPE); MAP.put(FINAL_CLASS_OBJECT_UPPER_BOUND, "''{0}'' is a final type, and thus a class object cannot extend it", RENDER_TYPE); MAP.put(FINAL_UPPER_BOUND, "''{0}'' is a final type, and thus a value of the type parameter is predetermined", RENDER_TYPE); MAP.put(USELESS_ELVIS, "Elvis operator (?:) always returns the left operand of non-nullable type {0}", RENDER_TYPE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index d5337fb40c9..7e2053561ca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -919,7 +919,7 @@ public class DescriptorResolver { for (JetType bound : typeParameterDescriptor.getUpperBounds()) { JetType substitutedBound = substitutor.safeSubstitute(bound, Variance.INVARIANT); if (!JetTypeChecker.INSTANCE.isSubtypeOf(typeArgument, substitutedBound)) { - trace.report(UPPER_BOUND_VIOLATED.on(argumentTypeReference, substitutedBound)); + trace.report(UPPER_BOUND_VIOLATED.on(argumentTypeReference, substitutedBound, typeArgument)); } } } From d7e9a77fdb627518a4661689d88ca1b0745326be Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 01:51:48 +0400 Subject: [PATCH 46/76] Added IDE error message for UPPER_BOUND_VIOLATED. --- .../jet/plugin/highlighter/IdeErrorMessages.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 3bd41ac2bf1..f7507daff65 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -22,9 +22,7 @@ import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererM import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; -import static org.jetbrains.jet.lang.diagnostics.Errors.TYPE_MISMATCH; -import static org.jetbrains.jet.lang.diagnostics.Errors.WRONG_GETTER_RETURN_TYPE; -import static org.jetbrains.jet.lang.diagnostics.Errors.WRONG_SETTER_PARAMETER_TYPE; +import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; /** @@ -39,9 +37,12 @@ public class IdeErrorMessages { MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property." + - "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property." + - "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + + MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds." + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.setImmutable(); } From 5a69231b92fb0a741789532bb33f67a3f722a16d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 02:11:58 +0400 Subject: [PATCH 47/76] Added IDE error message for TYPE_MISMATCH_IN_FOR_LOOP. --- .../jet/plugin/highlighter/IdeErrorMessages.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index f7507daff65..93a79b93e4d 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -37,12 +37,19 @@ public class IdeErrorMessages { MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property." + - "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + "" + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.put(WRONG_GETTER_RETURN_TYPE, "Getter return type must be equal to the type of the property." + - "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + "" + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds." + - "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + "" + + "
Expected:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + + MAP.put(TYPE_MISMATCH_IN_FOR_LOOP, "Loop parameter type mismatch." + + "" + + "
Iterated values:{0}
Parameter:{1}
", RENDER_TYPE, RENDER_TYPE); MAP.setImmutable(); } From 1123a4f438a342a57d62355f19e8dfb06081113d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 02:24:09 +0400 Subject: [PATCH 48/76] Clarified error message for TYPE_MISMATCH_IN_BINDING_PATTERN. --- .../diagnostics/rendering/DefaultErrorMessages.java | 2 +- idea/testData/checker/infos/Autocasts.jet | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 0e8a1e60029..a4bb1c5feac 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -305,7 +305,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type jet.Boolean, but is of type {0}", RENDER_TYPE); MAP.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, TO_STRING); // TODO: message - MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} must be a supertype of {1}. Use 'is' to match against {0}", RENDER_TYPE, RENDER_TYPE); + MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} is not a supertype of {1}. Use ''is'' to match against {0}", RENDER_TYPE, RENDER_TYPE); MAP.put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); MAP.put(EXPECTED_CONDITION, "Expected condition of Boolean type"); diff --git a/idea/testData/checker/infos/Autocasts.jet b/idea/testData/checker/infos/Autocasts.jet index b665d066470..75c9df003e7 100644 --- a/idea/testData/checker/infos/Autocasts.jet +++ b/idea/testData/checker/infos/Autocasts.jet @@ -66,7 +66,7 @@ fun f12(a : A?) { is A -> a.foo() is Any -> a.foo(); is Any? -> a.bar() - is val c : B -> c.foo() + is val c : B -> c.foo() is val c is C -> c.bar() is val c is C -> a.bar() else -> a?.foo() @@ -237,17 +237,17 @@ fun mergeAutocasts(a: Any?) { fun f(): String { var a: Any = 11 if (a is String) { - val i: String = a - a.compareTo("f") - val f: Function0 = { a } - return a + val i: String = a + a.compareTo("f") + val f: Function0 = { a } + return a } return "" } fun foo(var a: Any): Int { if (a is Int) { - return a + return a } return 1 } From c1dde845081b449a36dd56ff16d1b8811d43c629 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 02:25:11 +0400 Subject: [PATCH 49/76] Boolean -> jet.Boolean --- .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index a4bb1c5feac..d3b9e1076ec 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -307,7 +307,7 @@ public class DefaultErrorMessages { TO_STRING); // TODO: message MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} is not a supertype of {1}. Use ''is'' to match against {0}", RENDER_TYPE, RENDER_TYPE); MAP.put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); - MAP.put(EXPECTED_CONDITION, "Expected condition of Boolean type"); + MAP.put(EXPECTED_CONDITION, "Expected condition of jet.Boolean type"); MAP.put(CANNOT_CHECK_FOR_ERASED, "Cannot check for instance of erased type: {0}", RENDER_TYPE); MAP.put(UNCHECKED_CAST, "Unchecked cast: {0} to {1}", RENDER_TYPE, RENDER_TYPE); From 886ec6a162346ea9f4d773b286e1b6404896bafe Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 02:26:43 +0400 Subject: [PATCH 50/76] Clarified EQUALITY_NOT_APPLICABLE error message. --- .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index d3b9e1076ec..3caee29565e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -329,14 +329,14 @@ public class DefaultErrorMessages { } }); - MAP.put(EQUALITY_NOT_APPLICABLE, "Operator {0} cannot be applied to {1} and {2}", new Renderer() { + MAP.put(EQUALITY_NOT_APPLICABLE, "Operator ''{0}'' cannot be applied to ''{1}'' and ''{2}''", new Renderer() { @NotNull @Override public String render(@NotNull JetSimpleNameExpression nameExpression) { //noinspection ConstantConditions return nameExpression.getReferencedName(); } - }, TO_STRING, TO_STRING); + }, RENDER_TYPE, RENDER_TYPE); MAP.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); MAP.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); From b0843ce65601e27ba3f0206420fffec6b42f79f0 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 02:45:55 +0400 Subject: [PATCH 51/76] Added IDE error message for RETURN_TYPE_MISMATCH_ON_OVERRIDE. --- .../plugin/highlighter/IdeErrorMessages.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 93a79b93e4d..25aa8b9adf2 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -16,13 +16,14 @@ package org.jetbrains.jet.plugin.highlighter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; -import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap; -import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; -import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; +import org.jetbrains.jet.lang.diagnostics.rendering.*; +import org.jetbrains.jet.resolve.DescriptorRenderer; import static org.jetbrains.jet.lang.diagnostics.Errors.*; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.NAME; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; /** @@ -51,6 +52,16 @@ public class IdeErrorMessages { "" + "
Iterated values:{0}
Parameter:{1}
", RENDER_TYPE, RENDER_TYPE); + MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type is ''{0}'', which is not a subtype of overridden
" + + "{1}", + new Renderer() { + @NotNull + @Override + public String render(@NotNull CallableMemberDescriptor object) { + return DescriptorRenderer.TEXT.renderType(object.getReturnType()); + } + }, DescriptorRenderer.HTML); + MAP.setImmutable(); } From 529c416f359eeed89dc75e0b4b4d49fbe25b1df8 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 11:25:39 +0400 Subject: [PATCH 52/76] Added IDE error message for VAR_OVERRIDDEN_BY_VAL. --- .../org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 25aa8b9adf2..14b280abb3d 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -62,6 +62,9 @@ public class IdeErrorMessages { } }, DescriptorRenderer.HTML); + MAP.put(VAR_OVERRIDDEN_BY_VAL, "Val-property cannot override var-property
" + + "{1}", DescriptorRenderer.HTML, DescriptorRenderer.HTML); + MAP.setImmutable(); } From 3cc1a6990566b0cb5279fee01e8e2e3b86ab7132 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 12:06:30 +0400 Subject: [PATCH 53/76] Added IDE error messages for ABSTRACT_MEMBER_NOT_IMPLEMENTED and MANY_IMPL_MEMBER_NOT_IMPLEMENTED. --- .../jet/plugin/highlighter/IdeErrorMessages.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 14b280abb3d..5d61d3e7bca 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -23,8 +23,9 @@ import org.jetbrains.jet.lang.diagnostics.rendering.*; import org.jetbrains.jet.resolve.DescriptorRenderer; import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.NAME; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_CLASS_OR_OBJECT; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; /** * @author Evgeny Gerashchenko @@ -65,6 +66,13 @@ public class IdeErrorMessages { MAP.put(VAR_OVERRIDDEN_BY_VAL, "Val-property cannot override var-property
" + "{1}", DescriptorRenderer.HTML, DescriptorRenderer.HTML); + MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} must be declared abstract or implement abstract member
" + + "{1}", RENDER_CLASS_OR_OBJECT, + DescriptorRenderer.HTML); + + MAP.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "{0} must override {1}
because it inherits many implementations of it", + RENDER_CLASS_OR_OBJECT, DescriptorRenderer.HTML); + MAP.setImmutable(); } From a2a9d6847b6e06cd7d2c3956e817b1a641b5cfe8 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 12:08:48 +0400 Subject: [PATCH 54/76] Added IDE error messages for CONFLICTING_OVERLOADS. --- .../org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 1 + 1 file changed, 1 insertion(+) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 5d61d3e7bca..d22dda9ae86 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -72,6 +72,7 @@ public class IdeErrorMessages { MAP.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "{0} must override {1}
because it inherits many implementations of it", RENDER_CLASS_OR_OBJECT, DescriptorRenderer.HTML); + MAP.put(CONFLICTING_OVERLOADS, "{1}
is already defined in ''{0}''", DescriptorRenderer.HTML, TO_STRING); MAP.setImmutable(); } From a723d6b073e27e089e1cde855995867ba7e76153 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 17 Apr 2012 12:17:19 +0400 Subject: [PATCH 55/76] Added IDE error messages for RESULT_TYPE_MISMATCH. --- .../jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index d22dda9ae86..1c8fa601204 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -74,6 +74,10 @@ public class IdeErrorMessages { RENDER_CLASS_OR_OBJECT, DescriptorRenderer.HTML); MAP.put(CONFLICTING_OVERLOADS, "{1}
is already defined in ''{0}''", DescriptorRenderer.HTML, TO_STRING); + MAP.put(RESULT_TYPE_MISMATCH, "Function return type mismatch." + + "" + + "
Expected:{1}
Found:{2}
", TO_STRING, RENDER_TYPE, RENDER_TYPE); + MAP.setImmutable(); } From 5692032530055f93b028da0be19ebdb2c1840705 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 13:53:49 +0400 Subject: [PATCH 56/76] Added javadoc link to DefaultErrorMessages --- .../org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 1c8fa601204..ff119974dcf 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -28,6 +28,8 @@ import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; /** + * @see DefaultErrorMessages + * * @author Evgeny Gerashchenko * @since 4/13/12 */ From a45a7ae631e0863551f94d2c49135e25ce2b3f0d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 18:03:31 +0400 Subject: [PATCH 57/76] Made renderers added to DiagnosticWithParametersXRenderer nullable. --- .../DiagnosticFactoryToRendererMap.java | 22 ++++++------ .../rendering/DiagnosticRendererUtil.java | 34 +++++++++++++++++++ .../DiagnosticWithParameters1Renderer.java | 7 ++-- .../DiagnosticWithParameters2Renderer.java | 9 +++-- .../DiagnosticWithParameters3Renderer.java | 15 ++++---- 5 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRendererUtil.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java index 96067f8fd53..cf5615bfa5b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticFactoryToRendererMap.java @@ -39,29 +39,29 @@ public final class DiagnosticFactoryToRendererMap { } } - public void put(SimpleDiagnosticFactory factory, String message) { + public void put(@NotNull SimpleDiagnosticFactory factory, @NotNull String message) { checkMutability(); map.put(factory, new SimpleDiagnosticRenderer(message)); } - public void put(DiagnosticFactory1 factory, String message, Renderer rendererA) { + public void put(@NotNull DiagnosticFactory1 factory, @NotNull String message, @Nullable Renderer rendererA) { checkMutability(); map.put(factory, new DiagnosticWithParameters1Renderer
(message, rendererA)); } - public void put(DiagnosticFactory2 factory, - String message, - Renderer rendererA, - Renderer rendererB) { + public void put(@NotNull DiagnosticFactory2 factory, + @NotNull String message, + @Nullable Renderer rendererA, + @Nullable Renderer rendererB) { checkMutability(); map.put(factory, new DiagnosticWithParameters2Renderer(message, rendererA, rendererB)); } - public void put(DiagnosticFactory3 factory, - String message, - Renderer rendererA, - Renderer rendererB, - Renderer rendererC) { + public void put(@NotNull DiagnosticFactory3 factory, + @NotNull String message, + @Nullable Renderer rendererA, + @Nullable Renderer rendererB, + @Nullable Renderer rendererC) { checkMutability(); map.put(factory, new DiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC)); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRendererUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRendererUtil.java new file mode 100644 index 00000000000..6fdd8653ee0 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticRendererUtil.java @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.diagnostics.rendering; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Evgeny Gerashchenko + * @since 4/18/12 + */ +public class DiagnosticRendererUtil { + private DiagnosticRendererUtil() { + } + + @NotNull + public static

Object renderParameter(@NotNull P parameter, @Nullable Renderer

renderer) { + return renderer == null ? parameter : renderer.render(parameter); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java index f005f2b343b..5727b40beda 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters1Renderer.java @@ -17,10 +17,13 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; import java.text.MessageFormat; +import static org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRendererUtil.renderParameter; + /** * @author Evgeny Gerashchenko * @since 4/12/12 @@ -29,7 +32,7 @@ public class DiagnosticWithParameters1Renderer implements DiagnosticRenderer< private final MessageFormat messageFormat; private final Renderer rendererForA; - public DiagnosticWithParameters1Renderer(@NotNull String message, @NotNull Renderer rendererForA) { + public DiagnosticWithParameters1Renderer(@NotNull String message, @Nullable Renderer rendererForA) { this.messageFormat = new MessageFormat(message); this.rendererForA = rendererForA; } @@ -37,6 +40,6 @@ public class DiagnosticWithParameters1Renderer implements DiagnosticRenderer< @NotNull @Override public String render(@NotNull DiagnosticWithParameters1 diagnostic) { - return messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())}); + return messageFormat.format(new Object[]{renderParameter(diagnostic.getA(), rendererForA)}); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java index d61591c2ba5..506f7cbe767 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters2Renderer.java @@ -17,10 +17,13 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters2; import java.text.MessageFormat; +import static org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRendererUtil.renderParameter; + /** * @author Evgeny Gerashchenko * @since 4/12/12 @@ -30,7 +33,7 @@ public class DiagnosticWithParameters2Renderer implements DiagnosticRender private final Renderer rendererForA; private final Renderer rendererForB; - public DiagnosticWithParameters2Renderer(@NotNull String message, @NotNull Renderer rendererForA, @NotNull Renderer rendererForB) { + public DiagnosticWithParameters2Renderer(@NotNull String message, @Nullable Renderer rendererForA, @Nullable Renderer rendererForB) { this.messageFormat = new MessageFormat(message); this.rendererForA = rendererForA; this.rendererForB = rendererForB; @@ -40,7 +43,7 @@ public class DiagnosticWithParameters2Renderer implements DiagnosticRender @Override public String render(@NotNull DiagnosticWithParameters2 diagnostic) { return messageFormat.format(new Object[]{ - rendererForA.render(diagnostic.getA()), - rendererForB.render(diagnostic.getB())}); + renderParameter(diagnostic.getA(), rendererForA), + renderParameter(diagnostic.getB(), rendererForB)}); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java index fbb42366840..e831df6b0e3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DiagnosticWithParameters3Renderer.java @@ -17,10 +17,13 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters3; import java.text.MessageFormat; +import static org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRendererUtil.renderParameter; + /** * @author Evgeny Gerashchenko * @since 4/12/12 @@ -32,9 +35,9 @@ public class DiagnosticWithParameters3Renderer implements DiagnosticRen private final Renderer rendererForC; public DiagnosticWithParameters3Renderer(@NotNull String message, - @NotNull Renderer rendererForA, - @NotNull Renderer rendererForB, - @NotNull Renderer rendererForC) { + @Nullable Renderer rendererForA, + @Nullable Renderer rendererForB, + @Nullable Renderer rendererForC) { this.messageFormat = new MessageFormat(message); this.rendererForA = rendererForA; this.rendererForB = rendererForB; @@ -45,8 +48,8 @@ public class DiagnosticWithParameters3Renderer implements DiagnosticRen @Override public String render(@NotNull DiagnosticWithParameters3 diagnostic) { return messageFormat.format(new Object[]{ - rendererForA.render(diagnostic.getA()), - rendererForB.render(diagnostic.getB()), - rendererForC.render(diagnostic.getC())}); + renderParameter(diagnostic.getA(), rendererForA), + renderParameter(diagnostic.getB(), rendererForB), + renderParameter(diagnostic.getC(), rendererForC)}); } } From 515b79c2406bc8b51fc9b6fa432762a40e6e1eb6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 18:14:32 +0400 Subject: [PATCH 58/76] Better error message for WRONG_NUMBER_OF_TYPE_ARGUMENTS. "1 type arguments" will not be shown anymore. --- .../lang/diagnostics/rendering/DefaultErrorMessages.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 3caee29565e..4fe79cf4405 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -371,13 +371,7 @@ public class DefaultErrorMessages { MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class"); MAP.put(TYPE_INFERENCE_FAILED, "Type inference failed: {0}", TO_STRING); - MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0} type arguments expected", new Renderer() { - @NotNull - @Override - public String render(@NotNull Integer argument) { - return argument == 0 ? "No" : argument.toString(); - } - }); + MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0,choice,0#No type arguments|1#Type argument|1<{0,number,integer} type argument} expected", null); MAP.put(UNRESOLVED_IDE_TEMPLATE, "Unresolved IDE template: {0}", TO_STRING); From a824b81aa5ece5b988be1c1fa43a37d255406741 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 18:18:25 +0400 Subject: [PATCH 59/76] Minor refactoring renderer for INCOMPATIBLE_MODIFIERS. --- .../lang/diagnostics/rendering/DefaultErrorMessages.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 4fe79cf4405..e9a1481b09a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -64,12 +64,11 @@ public class DefaultErrorMessages { @Override public String render(@NotNull Collection tokens) { StringBuilder sb = new StringBuilder(); - for (Iterator iterator = tokens.iterator(); iterator.hasNext(); ) { - JetKeywordToken modifier = iterator.next(); - sb.append(modifier.getValue()); - if (iterator.hasNext()) { + for (JetKeywordToken token : tokens) { + if (sb.length() != 0) { sb.append(" "); } + sb.append(token.getValue()); } return sb.toString(); } From 7a605ccee2f5fcd5f5c3fd02badf979cdf53a8c9 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 20:05:26 +0400 Subject: [PATCH 60/76] Added IDE error message for ASSIGN_OPERATOR_AMBIGUITY. --- .../plugin/highlighter/IdeErrorMessages.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index ff119974dcf..57b7b3b9b9c 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -17,15 +17,17 @@ package org.jetbrains.jet.plugin.highlighter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.rendering.*; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.resolve.DescriptorRenderer; +import java.util.Collection; + import static org.jetbrains.jet.lang.diagnostics.Errors.*; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_CLASS_OR_OBJECT; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.RENDER_TYPE; -import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.TO_STRING; +import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; /** * @see DefaultErrorMessages @@ -40,6 +42,20 @@ public class IdeErrorMessages { static { MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", RENDER_TYPE, RENDER_TYPE); + MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity. All these functions match.

", new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> calls) { + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())).append("\n"); + stringBuilder.append("
  • "); + } + return stringBuilder.toString(); + } + }); + MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property." + "" + "
    Expected:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); From 625101b68d68c58a3bf48fca034c8cdf0d2e9359 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 20:28:46 +0400 Subject: [PATCH 61/76] Added IDE error message for ITERATOR_AMBIGUITY. --- .../plugin/highlighter/IdeErrorMessages.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 57b7b3b9b9c..4425b6aacff 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -39,22 +39,26 @@ public class IdeErrorMessages { public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAP, DefaultErrorMessages.MAP); + private static final Renderer>> HTML_AMBIGUOUS_CALLS = + new Renderer>>() { + @NotNull + @Override + public String render(@NotNull Collection> calls) { + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())).append("\n"); + stringBuilder.append("
  • "); + } + return stringBuilder.toString(); + } + }; + static { MAP.put(TYPE_MISMATCH, "Type mismatch.
    Required:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); - MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity. All these functions match.
      {0}
    ", new Renderer>>() { - @NotNull - @Override - public String render(@NotNull Collection> calls) { - StringBuilder stringBuilder = new StringBuilder(""); - for (ResolvedCall call : calls) { - stringBuilder.append("
  • "); - stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())).append("\n"); - stringBuilder.append("
  • "); - } - return stringBuilder.toString(); - } - }); + MAP.put(ASSIGN_OPERATOR_AMBIGUITY, "Assignment operators ambiguity. All these functions match.
      {0}
    ", + HTML_AMBIGUOUS_CALLS); MAP.put(WRONG_SETTER_PARAMETER_TYPE, "Setter parameter type must be equal to the type of the property." + "" + @@ -63,6 +67,8 @@ public class IdeErrorMessages { "
    Expected:{0}
    " + "
    Expected:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); + MAP.put(ITERATOR_AMBIGUITY, "Method ''iterator()'' is ambiguous for this expression.
      {0}
    ", HTML_AMBIGUOUS_CALLS); + MAP.put(UPPER_BOUND_VIOLATED, "Type argument is not within its bounds." + "" + "
    Expected:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); From 7e1059d3bd76742d62d6adfe228e41f47fbe5fa6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 20:36:43 +0400 Subject: [PATCH 62/76] Added IDE error messages for OVERLOAD_RESOLUTION_AMBIGUITY and NONE_APPLICABLE. --- .../org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 4425b6aacff..d8cc81dfaa0 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -102,6 +102,9 @@ public class IdeErrorMessages { "" + "
    Expected:{1}
    Found:{2}
    ", TO_STRING, RENDER_TYPE, RENDER_TYPE); + MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity. All these functions match.
      {0}
    ", HTML_AMBIGUOUS_CALLS); + MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", HTML_AMBIGUOUS_CALLS); + MAP.setImmutable(); } From 99acd9cdf0d12b0cd7e3c26ce50fccd46e3aea41 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 18 Apr 2012 21:25:04 +0400 Subject: [PATCH 63/76] Fixed rendering "defined in ..." DescriptorRenderer, now it doesn't render "." --- .../jet/resolve/DescriptorRenderer.java | 14 +++----- compiler/testData/renderer/Classes.kt | 36 +++++++++---------- compiler/testData/renderer/FunctionTypes.kt | 16 ++++----- compiler/testData/renderer/GlobalFunctions.kt | 18 +++++----- .../testData/renderer/GlobalProperties.kt | 14 ++++---- compiler/testData/renderer/TupleTypes.kt | 20 +++++------ 6 files changed, 56 insertions(+), 62 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index c9cb6cf9cc1..a09b73ef863 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -21,6 +21,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.rendering.Renderer; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.FqName; +import org.jetbrains.jet.lang.resolve.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeProjection; @@ -227,7 +229,8 @@ public class DescriptorRenderer implements Renderer { final DeclarationDescriptor containingDeclaration = declarationDescriptor.getContainingDeclaration(); if (containingDeclaration != null) { - renderFullyQualifiedName(containingDeclaration, stringBuilder); + FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); + stringBuilder.append(FqName.ROOT.toUnsafe().equals(fqName) ? "root package" : escape(fqName.getFqName())); } } @@ -244,15 +247,6 @@ public class DescriptorRenderer implements Renderer { return s; } - private void renderFullyQualifiedName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) { - DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); - if (containingDeclaration != null) { - renderFullyQualifiedName(containingDeclaration, stringBuilder); - stringBuilder.append("."); - } - stringBuilder.append(escape(descriptor.getName())); - } - private class RenderDeclarationDescriptorVisitor extends DeclarationDescriptorVisitor { @Override diff --git a/compiler/testData/renderer/Classes.kt b/compiler/testData/renderer/Classes.kt index ecdd7945e3c..e5e9b52e2fc 100644 --- a/compiler/testData/renderer/Classes.kt +++ b/compiler/testData/renderer/Classes.kt @@ -29,21 +29,21 @@ private enum class TheEnum(val rgb : Int) { VAL1 : TheEnum(0xFF0000) } -//package rendererTest defined in . -//internal final annotation class TheAnnotation defined in ..rendererTest -//public open class TheClass defined in ..rendererTest -// defined in ..rendererTest.TheClass -// defined in ..rendererTest.TheClass -//private final val privateVal : jet.Int defined in ..rendererTest.TheClass -//internal final val shouldBeFinal : jet.Int defined in ..rendererTest.TheClass -//protected abstract fun foo() : Unit defined in ..rendererTest.TheClass -//private final class Inner defined in ..rendererTest.TheClass -//internal final class InternalClass defined in ..rendererTest -//internal trait TheTrait defined in ..rendererTest -//internal abstract fun abstractFun() : Unit defined in ..rendererTest.TheTrait -//object : rendererTest.TheClass defined in ..rendererTest.TheTrait -//internal final fun classObjectFunction() : jet.Int defined in ..rendererTest.TheTrait. -//private final enum class TheEnum defined in ..rendererTest -//value-parameter val rgb : jet.Int defined in ..rendererTest.TheEnum. -//internal final class VAL1 : rendererTest.TheEnum defined in ..rendererTest.TheEnum.class-object-for-TheEnum -//internal final val VAL1 : rendererTest.TheEnum.class-object-for-TheEnum.VAL1 defined in ..rendererTest.TheEnum.class-object-for-TheEnum +//package rendererTest defined in root package +//internal final annotation class TheAnnotation defined in rendererTest +//public open class TheClass defined in rendererTest +// defined in rendererTest.TheClass +// defined in rendererTest.TheClass +//private final val privateVal : jet.Int defined in rendererTest.TheClass +//internal final val shouldBeFinal : jet.Int defined in rendererTest.TheClass +//protected abstract fun foo() : Unit defined in rendererTest.TheClass +//private final class Inner defined in rendererTest.TheClass +//internal final class InternalClass defined in rendererTest +//internal trait TheTrait defined in rendererTest +//internal abstract fun abstractFun() : Unit defined in rendererTest.TheTrait +//object : rendererTest.TheClass defined in rendererTest.TheTrait +//internal final fun classObjectFunction() : jet.Int defined in rendererTest.TheTrait. +//private final enum class TheEnum defined in rendererTest +//value-parameter val rgb : jet.Int defined in rendererTest.TheEnum. +//internal final class VAL1 : rendererTest.TheEnum defined in rendererTest.TheEnum.class-object-for-TheEnum +//internal final val VAL1 : rendererTest.TheEnum.class-object-for-TheEnum.VAL1 defined in rendererTest.TheEnum.class-object-for-TheEnum diff --git a/compiler/testData/renderer/FunctionTypes.kt b/compiler/testData/renderer/FunctionTypes.kt index 425c01d91be..9cb510a4e36 100644 --- a/compiler/testData/renderer/FunctionTypes.kt +++ b/compiler/testData/renderer/FunctionTypes.kt @@ -8,11 +8,11 @@ var v6 : Int.(String, Int) -> Unit var v7 : ExtensionFunction1 -//internal final var v1 : () -> Unit defined in . -//internal final var v2 : (jet.Int) -> jet.Int defined in . -//internal final var v3 : (jet.Int, #(jet.String, jet.String)) -> jet.String defined in . -//internal final var v4 : (jet.Int) -> jet.String defined in . -//internal final var v4 : (() -> jet.Int, (#(jet.String, jet.String)) -> Unit) -> jet.String defined in . -//internal final var v5 : jet.Int.() -> jet.Int defined in . -//internal final var v6 : jet.Int.(jet.String, jet.Int) -> Unit defined in . -//internal final var v7 : jet.Int.(jet.String) -> jet.Boolean defined in . +//internal final var v1 : () -> Unit defined in root package +//internal final var v2 : (jet.Int) -> jet.Int defined in root package +//internal final var v3 : (jet.Int, #(jet.String, jet.String)) -> jet.String defined in root package +//internal final var v4 : (jet.Int) -> jet.String defined in root package +//internal final var v4 : (() -> jet.Int, (#(jet.String, jet.String)) -> Unit) -> jet.String defined in root package +//internal final var v5 : jet.Int.() -> jet.Int defined in root package +//internal final var v6 : jet.Int.(jet.String, jet.Int) -> Unit defined in root package +//internal final var v7 : jet.Int.(jet.String) -> jet.Boolean defined in root package diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index 21a4d40204a..1a415f1b80f 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -10,12 +10,12 @@ private fun prv(a : String, b : Int = 5) = 5 public fun Int.ext() : Int {} -//package rendererTest defined in . -//public final fun pub() : Unit defined in ..rendererTest -//internal final fun int() : jet.String defined in ..rendererTest -//internal final fun int2(val ints : jet.IntArray) : jet.Int defined in ..rendererTest -//value-parameter vararg val ints : jet.IntArray defined in ..rendererTest.int2 -//private final fun prv(val a : jet.String, val b : jet.Int = ...) : jet.Int defined in ..rendererTest -//value-parameter val a : jet.String defined in ..rendererTest.prv -//value-parameter val b : jet.Int defined in ..rendererTest.prv -//public final fun jet.Int.ext() : jet.Int defined in ..rendererTest \ No newline at end of file +//package rendererTest defined in root package +//public final fun pub() : Unit defined in rendererTest +//internal final fun int() : jet.String defined in rendererTest +//internal final fun int2(val ints : jet.IntArray) : jet.Int defined in rendererTest +//value-parameter vararg val ints : jet.IntArray defined in rendererTest.int2 +//private final fun prv(val a : jet.String, val b : jet.Int = ...) : jet.Int defined in rendererTest +//value-parameter val a : jet.String defined in rendererTest.prv +//value-parameter val b : jet.Int defined in rendererTest.prv +//public final fun jet.Int.ext() : jet.Int defined in rendererTest \ No newline at end of file diff --git a/compiler/testData/renderer/GlobalProperties.kt b/compiler/testData/renderer/GlobalProperties.kt index 943674128cd..25ff60f9d0a 100644 --- a/compiler/testData/renderer/GlobalProperties.kt +++ b/compiler/testData/renderer/GlobalProperties.kt @@ -11,10 +11,10 @@ private var private = 5 public val Int.ext : Int get() {} -//package rendererTest defined in . -//public final val pub : jet.String defined in ..rendererTest -//internal final var int : jet.String defined in ..rendererTest -//internal final val int2 : jet.Int defined in ..rendererTest -//private final var private : jet.Int defined in ..rendererTest -//public final val jet.Int.ext : jet.Int defined in ..rendererTest -//public final fun jet.Int.get-ext() : jet.Int defined in ..rendererTest \ No newline at end of file +//package rendererTest defined in root package +//public final val pub : jet.String defined in rendererTest +//internal final var int : jet.String defined in rendererTest +//internal final val int2 : jet.Int defined in rendererTest +//private final var private : jet.Int defined in rendererTest +//public final val jet.Int.ext : jet.Int defined in rendererTest +//public final fun jet.Int.get-ext() : jet.Int defined in rendererTest \ No newline at end of file diff --git a/compiler/testData/renderer/TupleTypes.kt b/compiler/testData/renderer/TupleTypes.kt index 73f1ecb3e50..184bf00bc9f 100644 --- a/compiler/testData/renderer/TupleTypes.kt +++ b/compiler/testData/renderer/TupleTypes.kt @@ -9,13 +9,13 @@ var v8 : #(Int, String, String) var v9 : Tuple2 var v10 : Tuple3? -//internal final var v1 : Unit defined in . -//internal final var v2 : Unit? defined in . -//internal final var v3 : Unit defined in . -//internal final var v4 : Unit? defined in . -//internal final var v5 : Unit defined in . -//internal final var v6 : #(jet.Int) defined in . -//internal final var v7 : #(jet.Int)? defined in . -//internal final var v8 : #(jet.Int, jet.String, jet.String) defined in . -//internal final var v9 : #(jet.Int, jet.String) defined in . -//internal final var v10 : #(jet.Int, jet.Int, jet.Int)? defined in . +//internal final var v1 : Unit defined in root package +//internal final var v2 : Unit? defined in root package +//internal final var v3 : Unit defined in root package +//internal final var v4 : Unit? defined in root package +//internal final var v5 : Unit defined in root package +//internal final var v6 : #(jet.Int) defined in root package +//internal final var v7 : #(jet.Int)? defined in root package +//internal final var v8 : #(jet.Int, jet.String, jet.String) defined in root package +//internal final var v9 : #(jet.Int, jet.String) defined in root package +//internal final var v10 : #(jet.Int, jet.Int, jet.Int)? defined in root package From 12abe1a5ee0a74070ac430eeecbcf69c21fa5093 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 15:54:07 +0400 Subject: [PATCH 64/76] Fixed error for TYPE_MISMATCH_IN_TUPLE_PATTERN. --- .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index e9a1481b09a..6022304b0b6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -302,8 +302,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE); MAP.put(TYPE_MISMATCH_IN_CONDITION, "Condition must be of type jet.Boolean, but is of type {0}", RENDER_TYPE); - MAP.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is of type Tuple{1}", RENDER_TYPE, - TO_STRING); // TODO: message + MAP.put(TYPE_MISMATCH_IN_TUPLE_PATTERN, "Type mismatch: subject is of type {0} but the pattern is a {1}-tuple", RENDER_TYPE, TO_STRING); MAP.put(TYPE_MISMATCH_IN_BINDING_PATTERN, "{0} is not a supertype of {1}. Use ''is'' to match against {0}", RENDER_TYPE, RENDER_TYPE); MAP.put(INCOMPATIBLE_TYPES, "Incompatible types: {0} and {1}", RENDER_TYPE, RENDER_TYPE); MAP.put(EXPECTED_CONDITION, "Expected condition of jet.Boolean type"); From d28aed6494ce67944df0c12e596f3795217c9ff8 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 16:12:16 +0400 Subject: [PATCH 65/76] Improved positioning for PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT. --- .../org/jetbrains/jet/lang/diagnostics/Errors.java | 11 ++--------- .../jet/lang/diagnostics/PositioningStrategies.java | 9 +++++++++ .../tests/ProjectionOnFunctionArgumentErrror.jet | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) 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 a75cf063278..65582adaac5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -71,14 +71,7 @@ public interface Errors { SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = - SimpleDiagnosticFactory.create(ERROR, - new PositioningStrategy() { - @NotNull - @Override - public List mark(@NotNull JetTypeProjection element) { - return markNode(element.getProjectionNode()); - } - }); + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.PROJECTION_MODIFIER); SimpleDiagnosticFactoryLABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING); SimpleDiagnosticFactory EXPRESSION_EXPECTED_NAMESPACE_FOUND = SimpleDiagnosticFactory.create(ERROR); @@ -143,7 +136,7 @@ public interface Errors { SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.POSITION_NAME_IDENTIFIER); SimpleDiagnosticFactory PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT = - SimpleDiagnosticFactory.create(ERROR); // TODO : better positioning + SimpleDiagnosticFactory.create(ERROR, PositioningStrategies.PROJECTION_MODIFIER); SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory SUPERTYPE_NOT_INITIALIZED_DEFAULT = SimpleDiagnosticFactory.create(ERROR); SimpleDiagnosticFactory SECONDARY_CONSTRUCTOR_BUT_NO_PRIMARY = SimpleDiagnosticFactory.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index 5cfdb034a23..e25aaa85e88 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetTokens; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -133,4 +134,12 @@ public class PositioningStrategies { return result; } }; + + public static PositioningStrategy PROJECTION_MODIFIER = new PositioningStrategy() { + @NotNull + @Override + public List mark(@NotNull JetTypeProjection element) { + return markNode(element.getProjectionNode()); + } + }; } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.jet b/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.jet index e8b80c8f4ca..3248de9941e 100644 --- a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.jet +++ b/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.jet @@ -1,4 +1,4 @@ fun test() { fun foo(){} - foo<in Int>() + foo<in Int>() } From 1559f983aaacb2a174bc84c0d367f58f121ca889 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 16:30:34 +0400 Subject: [PATCH 66/76] Made soft keywords bold in DescriptorRenderer. --- .../org/jetbrains/jet/resolve/DescriptorRenderer.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index a09b73ef863..7d8ddddf43b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -308,22 +308,23 @@ public class DescriptorRenderer implements Renderer { } private void renderVisibility(Visibility visibility, StringBuilder builder) { - builder.append(visibility).append(" "); + builder.append(renderKeyword(visibility.toString())).append(" "); } private void renderModality(Modality modality, StringBuilder builder) { + String keyword = ""; switch (modality) { case FINAL: - builder.append("final"); + keyword = "final"; break; case OPEN: - builder.append("open"); + keyword = "open"; break; case ABSTRACT: - builder.append("abstract"); + keyword = "abstract"; break; } - builder.append(" "); + builder.append(renderKeyword(keyword)).append(" "); } @Override From 85ce85383be0c0838fca0ca2503cc9c3ac0573ff Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 18:46:45 +0400 Subject: [PATCH 67/76] Added rendering variance for type parameters in DescriptorRenderer. --- .../src/org/jetbrains/jet/resolve/DescriptorRenderer.java | 8 +++++++- compiler/testData/renderer/Classes.kt | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 7d8ddddf43b..a2ff448bc28 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -469,7 +469,13 @@ public class DescriptorRenderer implements Renderer { } protected void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { - if (!descriptor.isReified()) { + if (descriptor.isReified()) { + String variance = descriptor.getVariance().toString(); + if (!variance.isEmpty()) { + builder.append(renderKeyword(variance)).append(" "); + } + } + else { builder.append(renderKeyword("erased")).append(" "); } renderName(descriptor, builder); diff --git a/compiler/testData/renderer/Classes.kt b/compiler/testData/renderer/Classes.kt index e5e9b52e2fc..e69596a832a 100644 --- a/compiler/testData/renderer/Classes.kt +++ b/compiler/testData/renderer/Classes.kt @@ -31,8 +31,8 @@ private enum class TheEnum(val rgb : Int) { //package rendererTest defined in root package //internal final annotation class TheAnnotation defined in rendererTest -//public open class TheClass defined in rendererTest -// defined in rendererTest.TheClass +//public open class TheClass defined in rendererTest +// defined in rendererTest.TheClass // defined in rendererTest.TheClass //private final val privateVal : jet.Int defined in rendererTest.TheClass //internal final val shouldBeFinal : jet.Int defined in rendererTest.TheClass From 1f7c435a246b3d638417baa93cb9e7b2f685045d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 18:58:40 +0400 Subject: [PATCH 68/76] Removed val/var soft keywords in renderer for functions --- .../jetbrains/jet/resolve/DescriptorRenderer.java | 14 ++++++++++---- compiler/testData/renderer/GlobalFunctions.kt | 4 ++-- idea/testData/libraries/decompiled/namespace.kt | 10 +++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index a2ff448bc28..60c36f8f7fb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -81,7 +81,7 @@ public class DescriptorRenderer implements Renderer { @Override public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { - super.visitVariableDescriptor(descriptor, builder); + super.visitVariableDescriptor(descriptor, builder, true); if (descriptor.hasDefaultValue()) { builder.append(" = ..."); } @@ -260,9 +260,13 @@ public class DescriptorRenderer implements Renderer { @Override public Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder) { + return visitVariableDescriptor(descriptor, builder, false); + } + + protected Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder, boolean skipValVar) { String typeString = renderPropertyPrefixAndComputeTypeString( builder, - descriptor.isVar(), + skipValVar ? null : descriptor.isVar(), Collections.emptyList(), ReceiverDescriptor.NO_RECEIVER, descriptor.getType()); @@ -273,13 +277,15 @@ public class DescriptorRenderer implements Renderer { private String renderPropertyPrefixAndComputeTypeString( @NotNull StringBuilder builder, - boolean isVar, + @Nullable Boolean isVar, @NotNull List typeParameters, @NotNull ReceiverDescriptor receiver, @Nullable JetType outType) { String typeString = lt() + "no type>"; if (outType != null) { - builder.append(renderKeyword(isVar ? "var" : "val")).append(" "); + if (isVar != null) { + builder.append(renderKeyword(isVar ? "var" : "val")).append(" "); + } typeString = renderType(outType); } diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index 1a415f1b80f..2f834c7fd8d 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -13,9 +13,9 @@ public fun Int.ext() : Int {} //package rendererTest defined in root package //public final fun pub() : Unit defined in rendererTest //internal final fun int() : jet.String defined in rendererTest -//internal final fun int2(val ints : jet.IntArray) : jet.Int defined in rendererTest +//internal final fun int2(ints : jet.IntArray) : jet.Int defined in rendererTest //value-parameter vararg val ints : jet.IntArray defined in rendererTest.int2 -//private final fun prv(val a : jet.String, val b : jet.Int = ...) : jet.Int defined in rendererTest +//private final fun prv(a : jet.String, b : jet.Int = ...) : jet.Int defined in rendererTest //value-parameter val a : jet.String defined in rendererTest.prv //value-parameter val b : jet.Int defined in rendererTest.prv //public final fun jet.Int.ext() : jet.Int defined in rendererTest \ No newline at end of file diff --git a/idea/testData/libraries/decompiled/namespace.kt b/idea/testData/libraries/decompiled/namespace.kt index 100819a0647..7357f1b34c7 100644 --- a/idea/testData/libraries/decompiled/namespace.kt +++ b/idea/testData/libraries/decompiled/namespace.kt @@ -15,12 +15,12 @@ package testData.libraries [public final fun func() : Unit { /* compiled code */ }] -[public final fun func(val a : jet.Int, val b : jet.Int) : Unit { /* compiled code */ }] +[public final fun func(a : jet.Int, b : jet.Int) : Unit { /* compiled code */ }] -[public final fun func(val a : jet.Int, val b : jet.String = /* compiled code */) : Unit { /* compiled code */ }] +[public final fun func(a : jet.Int, b : jet.String = /* compiled code */) : Unit { /* compiled code */ }] -[public final fun func(val str : jet.String) : Unit { /* compiled code */ }] +[public final fun func(str : jet.String) : Unit { /* compiled code */ }] -[public final fun main(val args : jet.Array) : Unit { /* compiled code */ }] +[public final fun main(args : jet.Array) : Unit { /* compiled code */ }] -[public final fun T.filter(val predicate : (T) -> jet.Boolean) : T? { /* compiled code */ }] +[public final fun T.filter(predicate : (T) -> jet.Boolean) : T? { /* compiled code */ }] From 90ac45f3f974f95287da7a57cc662bfa9b7b55db Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 22:53:42 +0400 Subject: [PATCH 69/76] Added extra space after function type arguments list in DescriptorRenderer. Added test. --- .../src/org/jetbrains/jet/resolve/DescriptorRenderer.java | 1 + compiler/testData/renderer/GlobalFunctions.kt | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 60c36f8f7fb..fe48060d1bd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -388,6 +388,7 @@ public class DescriptorRenderer implements Renderer { } } builder.append(">"); + return true; } return false; } diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index 2f834c7fd8d..a8a859da282 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -10,6 +10,8 @@ private fun prv(a : String, b : Int = 5) = 5 public fun Int.ext() : Int {} +public fun withTypeParam(a : Array) : Int {} + //package rendererTest defined in root package //public final fun pub() : Unit defined in rendererTest //internal final fun int() : jet.String defined in rendererTest @@ -18,4 +20,7 @@ public fun Int.ext() : Int {} //private final fun prv(a : jet.String, b : jet.Int = ...) : jet.Int defined in rendererTest //value-parameter val a : jet.String defined in rendererTest.prv //value-parameter val b : jet.Int defined in rendererTest.prv -//public final fun jet.Int.ext() : jet.Int defined in rendererTest \ No newline at end of file +//public final fun jet.Int.ext() : jet.Int defined in rendererTest +//public final fun withTypeParam(a : jet.Array) : jet.Int defined in rendererTest +// defined in rendererTest.withTypeParam +//value-parameter val a : jet.Array defined in rendererTest.withTypeParam \ No newline at end of file From 9a3af476e543124a17d3add287eff50fe0510029 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 23:36:39 +0400 Subject: [PATCH 70/76] Implemented getDiagnostics() in BindingContext returned by DelegatingBindingTrace. --- .../org/jetbrains/jet/lang/resolve/DelegatingBindingTrace.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegatingBindingTrace.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegatingBindingTrace.java index f971dcdb619..f7159a905cc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegatingBindingTrace.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegatingBindingTrace.java @@ -36,7 +36,7 @@ public class DelegatingBindingTrace implements BindingTrace { private final BindingContext bindingContext = new BindingContext() { @Override public Collection getDiagnostics() { - throw new UnsupportedOperationException(); // TODO + return diagnostics; } @Override @@ -57,6 +57,7 @@ public class DelegatingBindingTrace implements BindingTrace { } @Override + @NotNull public BindingContext getBindingContext() { return bindingContext; } From 60622337c322914a77dcf37b489aec7f5d43d9e6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 19 Apr 2012 23:41:52 +0400 Subject: [PATCH 71/76] Implemented stub of highlighting parameters in error tooltip for NONE_APPLICABLE. --- .../plugin/highlighter/IdeErrorMessages.java | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index d8cc81dfaa0..66d97803a6a 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -16,15 +16,27 @@ package org.jetbrains.jet.plugin.highlighter; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; +import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.rendering.*; +import org.jetbrains.jet.lang.psi.JetValueArgument; +import org.jetbrains.jet.lang.psi.JetValueArgumentList; +import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; +import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; +import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.Collection; +import java.util.Map; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -54,6 +66,62 @@ public class IdeErrorMessages { } }; + private static final Renderer>> NONE_APPLICABLE_CALLS = + new Renderer>>() { + @Nullable + private ValueParameterDescriptor findParameterByArgumentExpression( + ResolvedCall call, + JetValueArgument argument) { + for (Map.Entry entry : call.getValueArguments() + .entrySet()) { + for (ValueArgument va : entry.getValue().getArguments()) { + if (va == argument) { + return entry.getKey(); + } + } + } + return null; + } + + @NotNull + @Override + public String render(@NotNull Collection> calls) { + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())); + if (call instanceof ResolvedCallImpl) { + Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); + stringBuilder.append(" | "); + for (Diagnostic diagnostic : diagnostics) { + //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); + PsiElement element = diagnostic.getPsiElement(); + JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); + assert argumentList != null; + JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); + if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { + stringBuilder.append("LAST )"); + } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { + ValueParameterDescriptor valueParameterDescriptor = + ((DiagnosticWithParameters1)diagnostic).getA(); + stringBuilder.append("ARGUMENT ").append(valueParameterDescriptor.getName()).append(" "); + } else { + if (argument != null) { + assert argument.getParent() == argumentList; // TODO check that this really can't happen + ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); + if (parameter != null) { + stringBuilder.append("ARGUMENT ").append(parameter.getName()).append(" "); + } + } + } + } + } + stringBuilder.append("
  • "); + } + return stringBuilder.toString(); + } + }; + static { MAP.put(TYPE_MISMATCH, "Type mismatch.
    Required:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); @@ -103,7 +171,8 @@ public class IdeErrorMessages { "Found:{2}", TO_STRING, RENDER_TYPE, RENDER_TYPE); MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity. All these functions match.
      {0}
    ", HTML_AMBIGUOUS_CALLS); - MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", HTML_AMBIGUOUS_CALLS); + MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", + NONE_APPLICABLE_CALLS); MAP.setImmutable(); } From eddc550139306137144e4762bb5d6418b9d002a3 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 13:27:53 +0400 Subject: [PATCH 72/76] Implemented highlighting arguments which don't fit in tooltip. --- .../plugin/highlighter/IdeErrorMessages.java | 95 +++++++++++++------ 1 file changed, 64 insertions(+), 31 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 66d97803a6a..dc3ce62f1c3 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; @@ -30,13 +31,15 @@ import org.jetbrains.jet.lang.diagnostics.rendering.*; import org.jetbrains.jet.lang.psi.JetValueArgument; import org.jetbrains.jet.lang.psi.JetValueArgumentList; import org.jetbrains.jet.lang.psi.ValueArgument; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.FqName; +import org.jetbrains.jet.lang.resolve.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; import org.jetbrains.jet.resolve.DescriptorRenderer; -import java.util.Collection; -import java.util.Map; +import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -83,39 +86,69 @@ public class IdeErrorMessages { return null; } - @NotNull - @Override - public String render(@NotNull Collection> calls) { - StringBuilder stringBuilder = new StringBuilder(""); - for (ResolvedCall call : calls) { - stringBuilder.append("
  • "); - stringBuilder.append(DescriptorRenderer.HTML.render(call.getResultingDescriptor())); - if (call instanceof ResolvedCallImpl) { - Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); - stringBuilder.append(" | "); - for (Diagnostic diagnostic : diagnostics) { - //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); - PsiElement element = diagnostic.getPsiElement(); - JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); - assert argumentList != null; - JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); - if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { - stringBuilder.append("LAST )"); - } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { - ValueParameterDescriptor valueParameterDescriptor = - ((DiagnosticWithParameters1)diagnostic).getA(); - stringBuilder.append("ARGUMENT ").append(valueParameterDescriptor.getName()).append(" "); - } else { - if (argument != null) { - assert argument.getParent() == argumentList; // TODO check that this really can't happen - ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); - if (parameter != null) { - stringBuilder.append("ARGUMENT ").append(parameter.getName()).append(" "); - } + private Set getParametersToHighlight(ResolvedCall call) { + Set parameters = new HashSet(); + if (call instanceof ResolvedCallImpl) { + Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); + for (Diagnostic diagnostic : diagnostics) { + //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); + PsiElement element = diagnostic.getPsiElement(); + JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); + assert argumentList != null; + JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); + if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { + parameters.add(null); + } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { + ValueParameterDescriptor parameter = + ((DiagnosticWithParameters1)diagnostic).getA(); + parameters.add(parameter); + } else { + if (argument != null) { + assert argument.getParent() == argumentList; // TODO check that this really can't happen + ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); + if (parameter != null) { + parameters.add(parameter); } } } } + } + return parameters; + } + + @NotNull + @Override + public String render(@NotNull Collection> calls) { + String RED_TEMPLATE = "%s"; + + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + CallableDescriptor funDescriptor = call.getResultingDescriptor(); + Set parametersToHighlight = getParametersToHighlight(call); + + stringBuilder.append(funDescriptor.getName()).append("("); + boolean first = true; + DescriptorRenderer htmlRend = DescriptorRenderer.HTML; + for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { + if (!first) { + stringBuilder.append(", "); + } + String paramType = htmlRend.renderType(parameter.getType()); + if (parametersToHighlight.contains(parameter)) { + paramType = String.format(RED_TEMPLATE, paramType); + } + stringBuilder.append(paramType); + + first = false; + } + stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")"); + stringBuilder.append(" ").append(htmlRend.renderMessage("defined in")).append(" "); + DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration(); + if (containingDeclaration != null) { + FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); + stringBuilder.append(FqName.ROOT.toUnsafe().equals(fqName) ? "root package" : fqName.getFqName()); + } stringBuilder.append("
  • "); } return stringBuilder.toString(); From 1f19c6a0f0eef7d51e5b0ac8e81b8d6bc6449bd9 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 13:29:47 +0400 Subject: [PATCH 73/76] Extracted class NoneApplicableCallsRenderer. --- .../plugin/highlighter/IdeErrorMessages.java | 173 +++++++++--------- 1 file changed, 86 insertions(+), 87 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index dc3ce62f1c3..2cf93c7f94b 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -69,92 +69,6 @@ public class IdeErrorMessages { } }; - private static final Renderer>> NONE_APPLICABLE_CALLS = - new Renderer>>() { - @Nullable - private ValueParameterDescriptor findParameterByArgumentExpression( - ResolvedCall call, - JetValueArgument argument) { - for (Map.Entry entry : call.getValueArguments() - .entrySet()) { - for (ValueArgument va : entry.getValue().getArguments()) { - if (va == argument) { - return entry.getKey(); - } - } - } - return null; - } - - private Set getParametersToHighlight(ResolvedCall call) { - Set parameters = new HashSet(); - if (call instanceof ResolvedCallImpl) { - Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); - for (Diagnostic diagnostic : diagnostics) { - //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); - PsiElement element = diagnostic.getPsiElement(); - JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); - assert argumentList != null; - JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); - if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { - parameters.add(null); - } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { - ValueParameterDescriptor parameter = - ((DiagnosticWithParameters1)diagnostic).getA(); - parameters.add(parameter); - } else { - if (argument != null) { - assert argument.getParent() == argumentList; // TODO check that this really can't happen - ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); - if (parameter != null) { - parameters.add(parameter); - } - } - } - } - } - return parameters; - } - - @NotNull - @Override - public String render(@NotNull Collection> calls) { - String RED_TEMPLATE = "%s"; - - StringBuilder stringBuilder = new StringBuilder(""); - for (ResolvedCall call : calls) { - stringBuilder.append("
  • "); - CallableDescriptor funDescriptor = call.getResultingDescriptor(); - Set parametersToHighlight = getParametersToHighlight(call); - - stringBuilder.append(funDescriptor.getName()).append("("); - boolean first = true; - DescriptorRenderer htmlRend = DescriptorRenderer.HTML; - for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { - if (!first) { - stringBuilder.append(", "); - } - String paramType = htmlRend.renderType(parameter.getType()); - if (parametersToHighlight.contains(parameter)) { - paramType = String.format(RED_TEMPLATE, paramType); - } - stringBuilder.append(paramType); - - first = false; - } - stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")"); - stringBuilder.append(" ").append(htmlRend.renderMessage("defined in")).append(" "); - DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration(); - if (containingDeclaration != null) { - FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); - stringBuilder.append(FqName.ROOT.toUnsafe().equals(fqName) ? "root package" : fqName.getFqName()); - } - stringBuilder.append("
  • "); - } - return stringBuilder.toString(); - } - }; - static { MAP.put(TYPE_MISMATCH, "Type mismatch.
    Required:{0}
    Found:{1}
    ", RENDER_TYPE, RENDER_TYPE); @@ -205,11 +119,96 @@ public class IdeErrorMessages { MAP.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity. All these functions match.
      {0}
    ", HTML_AMBIGUOUS_CALLS); MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied.
      {0}
    ", - NONE_APPLICABLE_CALLS); + new NoneApplicableCallsRenderer()); MAP.setImmutable(); } private IdeErrorMessages() { } + + private static class NoneApplicableCallsRenderer implements Renderer>> { + @Nullable + private static ValueParameterDescriptor findParameterByArgumentExpression( + ResolvedCall call, + JetValueArgument argument) { + for (Map.Entry entry : call.getValueArguments() + .entrySet()) { + for (ValueArgument va : entry.getValue().getArguments()) { + if (va == argument) { + return entry.getKey(); + } + } + } + return null; + } + + private static Set getParametersToHighlight(ResolvedCall call) { + Set parameters = new HashSet(); + if (call instanceof ResolvedCallImpl) { + Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); + for (Diagnostic diagnostic : diagnostics) { + //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); + PsiElement element = diagnostic.getPsiElement(); + JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); + assert argumentList != null; + JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); + if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { + parameters.add(null); + } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { + ValueParameterDescriptor parameter = + ((DiagnosticWithParameters1)diagnostic).getA(); + parameters.add(parameter); + } else { + if (argument != null) { + assert argument.getParent() == argumentList; // TODO check that this really can't happen + ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); + if (parameter != null) { + parameters.add(parameter); + } + } + } + } + } + return parameters; + } + + @NotNull + @Override + public String render(@NotNull Collection> calls) { + String RED_TEMPLATE = "%s"; + + StringBuilder stringBuilder = new StringBuilder(""); + for (ResolvedCall call : calls) { + stringBuilder.append("
  • "); + CallableDescriptor funDescriptor = call.getResultingDescriptor(); + Set parametersToHighlight = getParametersToHighlight(call); + + stringBuilder.append(funDescriptor.getName()).append("("); + boolean first = true; + DescriptorRenderer htmlRend = DescriptorRenderer.HTML; + for (ValueParameterDescriptor parameter : funDescriptor.getValueParameters()) { + if (!first) { + stringBuilder.append(", "); + } + String paramType = htmlRend.renderType(parameter.getType()); + if (parametersToHighlight.contains(parameter)) { + paramType = String.format(RED_TEMPLATE, paramType); + } + stringBuilder.append(paramType); + + first = false; + } + stringBuilder.append(parametersToHighlight.contains(null) ? String.format(RED_TEMPLATE, ")") : ")"); + stringBuilder.append(" ").append(htmlRend.renderMessage("defined in")).append(" "); + DeclarationDescriptor containingDeclaration = funDescriptor.getContainingDeclaration(); + if (containingDeclaration != null) { + FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); + stringBuilder.append(FqName.ROOT.toUnsafe().equals(fqName) ? "root package" : fqName.getFqName()); + } + stringBuilder.append("
  • "); + } + return stringBuilder.toString(); + } + } } From 0f0330a4b4fc6f9aa8cb9b62967403417ea1c733 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 18:54:26 +0400 Subject: [PATCH 74/76] Added rendering vararg keywords and valid parameter type in this case. #KT-1840 fixed --- .../jetbrains/jet/resolve/DescriptorRenderer.java | 13 +++++++++---- compiler/testData/renderer/GlobalFunctions.kt | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index fe48060d1bd..92ba84da251 100644 --- a/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -252,9 +252,6 @@ public class DescriptorRenderer implements Renderer { @Override public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { builder.append(renderKeyword("value-parameter")).append(" "); - if (descriptor.getVarargElementType() != null) { - builder.append(renderKeyword("vararg")).append(" "); - } return super.visitValueParameterDescriptor(descriptor, builder); } @@ -264,12 +261,20 @@ public class DescriptorRenderer implements Renderer { } protected Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder, boolean skipValVar) { + JetType type = descriptor.getType(); + if (descriptor instanceof ValueParameterDescriptor) { + JetType varargElementType = ((ValueParameterDescriptor)descriptor).getVarargElementType(); + if (varargElementType != null) { + builder.append(renderKeyword("vararg")).append(" "); + type = varargElementType; + } + } String typeString = renderPropertyPrefixAndComputeTypeString( builder, skipValVar ? null : descriptor.isVar(), Collections.emptyList(), ReceiverDescriptor.NO_RECEIVER, - descriptor.getType()); + type); renderName(descriptor, builder); builder.append(" : ").append(escape(typeString)); return super.visitVariableDescriptor(descriptor, builder); diff --git a/compiler/testData/renderer/GlobalFunctions.kt b/compiler/testData/renderer/GlobalFunctions.kt index a8a859da282..b2226aa8547 100644 --- a/compiler/testData/renderer/GlobalFunctions.kt +++ b/compiler/testData/renderer/GlobalFunctions.kt @@ -15,8 +15,8 @@ public fun withTypeParam(a : Array) : Int {} //package rendererTest defined in root package //public final fun pub() : Unit defined in rendererTest //internal final fun int() : jet.String defined in rendererTest -//internal final fun int2(ints : jet.IntArray) : jet.Int defined in rendererTest -//value-parameter vararg val ints : jet.IntArray defined in rendererTest.int2 +//internal final fun int2(vararg ints : jet.Int) : jet.Int defined in rendererTest +//value-parameter vararg val ints : jet.Int defined in rendererTest.int2 //private final fun prv(a : jet.String, b : jet.Int = ...) : jet.Int defined in rendererTest //value-parameter val a : jet.String defined in rendererTest.prv //value-parameter val b : jet.Int defined in rendererTest.prv From 466e6697270df36bc323a68f5a131268228e522b Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 19:14:54 +0400 Subject: [PATCH 75/76] Added valid rendering varargs and parameters with default values in NONE_APPLICABLE diagnostic. --- .../plugin/highlighter/IdeErrorMessages.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 2cf93c7f94b..4497d018375 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -37,9 +37,13 @@ import org.jetbrains.jet.lang.resolve.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCallImpl; import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument; +import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.resolve.DescriptorRenderer; -import java.util.*; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.diagnostics.rendering.Renderers.*; @@ -191,11 +195,19 @@ public class IdeErrorMessages { if (!first) { stringBuilder.append(", "); } - String paramType = htmlRend.renderType(parameter.getType()); - if (parametersToHighlight.contains(parameter)) { - paramType = String.format(RED_TEMPLATE, paramType); + JetType type = parameter.getType(); + JetType varargElementType = parameter.getVarargElementType(); + if (varargElementType != null) { + type = varargElementType; } - stringBuilder.append(paramType); + String paramString = (varargElementType != null ? "vararg " : "") + htmlRend.renderType(type); + if (parameter.hasDefaultValue()) { + paramString += " = ..."; + } + if (parametersToHighlight.contains(parameter)) { + paramString = String.format(RED_TEMPLATE, paramString); + } + stringBuilder.append(paramString); first = false; } From e4eb48e61ad413b292eac34396f0bad73e65dd02 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 20 Apr 2012 20:43:18 +0400 Subject: [PATCH 76/76] Got rid of saving argument list in NONE_APPLICABLE diagnostic. --- .../jet/plugin/highlighter/IdeErrorMessages.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index 4497d018375..ea0c7300bdb 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters1; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.rendering.*; import org.jetbrains.jet.lang.psi.JetValueArgument; -import org.jetbrains.jet.lang.psi.JetValueArgumentList; import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.FqName; @@ -136,8 +135,7 @@ public class IdeErrorMessages { private static ValueParameterDescriptor findParameterByArgumentExpression( ResolvedCall call, JetValueArgument argument) { - for (Map.Entry entry : call.getValueArguments() - .entrySet()) { + for (Map.Entry entry : call.getValueArguments().entrySet()) { for (ValueArgument va : entry.getValue().getArguments()) { if (va == argument) { return entry.getKey(); @@ -152,11 +150,6 @@ public class IdeErrorMessages { if (call instanceof ResolvedCallImpl) { Collection diagnostics = ((ResolvedCallImpl)call).getTrace().getBindingContext().getDiagnostics(); for (Diagnostic diagnostic : diagnostics) { - //stringBuilder.append(DefaultErrorMessages.RENDERER.render(diagnostic)); - PsiElement element = diagnostic.getPsiElement(); - JetValueArgumentList argumentList = PsiTreeUtil.getParentOfType(element, JetValueArgumentList.class, false); - assert argumentList != null; - JetValueArgument argument = PsiTreeUtil.getParentOfType(element, JetValueArgument.class, false); if (diagnostic.getFactory() == Errors.TOO_MANY_ARGUMENTS) { parameters.add(null); } else if (diagnostic.getFactory() == Errors.NO_VALUE_FOR_PARAMETER) { @@ -164,8 +157,8 @@ public class IdeErrorMessages { ((DiagnosticWithParameters1)diagnostic).getA(); parameters.add(parameter); } else { + JetValueArgument argument = PsiTreeUtil.getParentOfType(diagnostic.getPsiElement(), JetValueArgument.class, false); if (argument != null) { - assert argument.getParent() == argumentList; // TODO check that this really can't happen ValueParameterDescriptor parameter = findParameterByArgumentExpression(call, argument); if (parameter != null) { parameters.add(parameter);