Got rid of storing diagnostic messages inside them: now they are generated on demand.

This commit is contained in:
Evgeny Gerashchenko
2012-04-11 20:58:21 +04:00
parent 927fb30fd4
commit 03fac49191
13 changed files with 79 additions and 41 deletions
@@ -25,15 +25,15 @@ import org.jetbrains.annotations.NotNull;
*/ */
public abstract class AbstractDiagnostic<E extends PsiElement> implements ParametrizedDiagnostic<E> { public abstract class AbstractDiagnostic<E extends PsiElement> implements ParametrizedDiagnostic<E> {
private final E psiElement; private final E psiElement;
private final String message;
private final AbstractDiagnosticFactory factory; private final AbstractDiagnosticFactory factory;
private final Severity severity; 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.psiElement = psiElement;
this.factory = factory; this.factory = factory;
this.severity = severity; this.severity = severity;
this.message = message;
} }
@NotNull @NotNull
@@ -48,12 +48,6 @@ public abstract class AbstractDiagnostic<E extends PsiElement> implements Parame
return psiElement.getContainingFile(); return psiElement.getContainingFile();
} }
@NotNull
@Override
public String getMessage() {
return message;
}
@NotNull @NotNull
@Override @Override
public Severity getSeverity() { public Severity getSeverity() {
@@ -38,8 +38,12 @@ public class DiagnosticFactory<E extends PsiElement> extends DiagnosticFactoryWi
return new DiagnosticFactory<T>(severity, message, positioningStrategy); return new DiagnosticFactory<T>(severity, message, positioningStrategy);
} }
String getMessage() {
return message;
}
@NotNull @NotNull
public ParametrizedDiagnostic<E> on(@NotNull E element) { public ParametrizedDiagnostic<E> on(@NotNull E element) {
return new DiagnosticWithPsiElement<E>(element, this, severity, message); return new DiagnosticWithPsiElement<E>(element, this, severity);
} }
} }
@@ -35,7 +35,7 @@ public class DiagnosticFactory1<E extends PsiElement, A> extends DiagnosticFacto
@NotNull @NotNull
public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A argument) { public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A argument) {
return new DiagnosticWithParameters1<E, A>(element, argument, this, severity, makeMessage(argument)); return new DiagnosticWithParameters1<E, A>(element, argument, this, severity);
} }
protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy<? super E> positioningStrategy, Renderer<? super A> renderer) { protected DiagnosticFactory1(Severity severity, String message, PositioningStrategy<? super E> positioningStrategy, Renderer<? super A> renderer) {
@@ -26,7 +26,7 @@ public class DiagnosticFactory2<E extends PsiElement, A, B> extends DiagnosticFa
private final Renderer<? super A> rendererForA; private final Renderer<? super A> rendererForA;
private final Renderer<? super B> rendererForB; private final Renderer<? super B> 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)}); return messageFormat.format(new Object[] {makeMessageForA(a), makeMessageForB(b)});
} }
@@ -40,7 +40,7 @@ public class DiagnosticFactory2<E extends PsiElement, A, B> extends DiagnosticFa
@NotNull @NotNull
public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A a, @NotNull B b) { public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A a, @NotNull B b) {
return new DiagnosticWithParameters2<E, A, B>(element, a, b, this, severity, makeMessage(a, b)); return new DiagnosticWithParameters2<E, A, B>(element, a, b, this, severity);
} }
@@ -50,7 +50,7 @@ public class DiagnosticFactory3<E extends PsiElement, A, B, C> extends Diagnosti
return new DiagnosticFactory3<T, A, B, C>(severity, messageStub, positioningStrategy, rendererForA, rendererForB, rendererForC); return new DiagnosticFactory3<T, A, B, C>(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)}); return messageFormat.format(new Object[]{makeMessageForA(a), makeMessageForB(b), makeMessageForC(c)});
} }
@@ -67,6 +67,6 @@ public class DiagnosticFactory3<E extends PsiElement, A, B, C> extends Diagnosti
} }
@NotNull @NotNull
public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A a, @NotNull B b, @NotNull C c) { public ParametrizedDiagnostic<E> on(@NotNull E element, @NotNull A a, @NotNull B b, @NotNull C c) {
return new DiagnosticWithParameters3<E, A, B, C>(element, a, b, c, this, severity, makeMessage(a, b, c)); return new DiagnosticWithParameters3<E, A, B, C>(element, a, b, c, this, severity);
} }
} }
@@ -32,9 +32,8 @@ public class DiagnosticWithParameters1<E extends PsiElement, A> extends Abstract
public DiagnosticWithParameters1(@NotNull E psiElement, public DiagnosticWithParameters1(@NotNull E psiElement,
@NotNull A a, @NotNull A a,
@NotNull DiagnosticFactory1<E, A> factory, @NotNull DiagnosticFactory1<E, A> factory,
@NotNull Severity severity, @NotNull Severity severity) {
@NotNull String message) { super(psiElement, factory, severity);
super(psiElement, factory, severity, message);
this.a = a; this.a = a;
} }
@@ -44,6 +43,12 @@ public class DiagnosticWithParameters1<E extends PsiElement, A> extends Abstract
return (DiagnosticFactory1<E, A>)super.getFactory(); return (DiagnosticFactory1<E, A>)super.getFactory();
} }
@NotNull
@Override
public String getMessage() {
return getFactory().makeMessage(a);
}
@Override @Override
@NotNull @NotNull
public List<TextRange> getTextRanges() { public List<TextRange> getTextRanges() {
@@ -34,9 +34,8 @@ public class DiagnosticWithParameters2<E extends PsiElement, A, B> extends Abstr
@NotNull A a, @NotNull A a,
@NotNull B b, @NotNull B b,
@NotNull DiagnosticFactory2<E, A, B> factory, @NotNull DiagnosticFactory2<E, A, B> factory,
@NotNull Severity severity, @NotNull Severity severity) {
@NotNull String message) { super(psiElement, factory, severity);
super(psiElement, factory, severity, message);
this.a = a; this.a = a;
this.b = b; this.b = b;
} }
@@ -47,6 +46,12 @@ public class DiagnosticWithParameters2<E extends PsiElement, A, B> extends Abstr
return (DiagnosticFactory2<E, A, B>)super.getFactory(); return (DiagnosticFactory2<E, A, B>)super.getFactory();
} }
@NotNull
@Override
public String getMessage() {
return getFactory().makeMessage(a, b);
}
@Override @Override
@NotNull @NotNull
public List<TextRange> getTextRanges() { public List<TextRange> getTextRanges() {
@@ -36,9 +36,8 @@ public class DiagnosticWithParameters3<E extends PsiElement, A, B, C> extends Ab
@NotNull B b, @NotNull B b,
@NotNull C c, @NotNull C c,
@NotNull DiagnosticFactory3<E, A, B, C> factory, @NotNull DiagnosticFactory3<E, A, B, C> factory,
@NotNull Severity severity, @NotNull Severity severity) {
@NotNull String message) { super(psiElement, factory, severity);
super(psiElement, factory, severity, message);
this.a = a; this.a = a;
this.b = b; this.b = b;
this.c = c; this.c = c;
@@ -50,6 +49,12 @@ public class DiagnosticWithParameters3<E extends PsiElement, A, B, C> extends Ab
return (DiagnosticFactory3<E, A, B, C>)super.getFactory(); return (DiagnosticFactory3<E, A, B, C>)super.getFactory();
} }
@NotNull
@Override
public String getMessage() {
return getFactory().makeMessage(a, b, c);
}
@Override @Override
@NotNull @NotNull
public List<TextRange> getTextRanges() { public List<TextRange> getTextRanges() {
@@ -26,14 +26,22 @@ import java.util.List;
* @author svtk * @author svtk
*/ */
public class DiagnosticWithPsiElement<E extends PsiElement> extends AbstractDiagnostic<E> { public class DiagnosticWithPsiElement<E extends PsiElement> extends AbstractDiagnostic<E> {
public DiagnosticWithPsiElement(@NotNull E psiElement, @NotNull DiagnosticFactoryWithPsiElement<E> factory, @NotNull Severity severity, @NotNull String message) { public DiagnosticWithPsiElement(@NotNull E psiElement,
super(psiElement, factory, severity, message); @NotNull DiagnosticFactory<E> factory,
@NotNull Severity severity) {
super(psiElement, factory, severity);
} }
@NotNull @NotNull
@Override @Override
public DiagnosticFactoryWithPsiElement<E> getFactory() { public DiagnosticFactory<E> getFactory() {
return (DiagnosticFactoryWithPsiElement<E>)super.getFactory(); return (DiagnosticFactory<E>)super.getFactory();
}
@NotNull
@Override
public String getMessage() {
return getFactory().getMessage();
} }
@Override @Override
@@ -33,9 +33,23 @@ import java.util.List;
*/ */
public interface RedeclarationDiagnostic extends Diagnostic { public interface RedeclarationDiagnostic extends Diagnostic {
class SimpleRedeclarationDiagnostic extends AbstractDiagnostic<PsiElement> implements RedeclarationDiagnostic { class SimpleRedeclarationDiagnostic extends AbstractDiagnostic<PsiElement> implements RedeclarationDiagnostic {
private String name;
public SimpleRedeclarationDiagnostic(@NotNull PsiElement psiElement, @NotNull String name, RedeclarationDiagnosticFactory factory) { 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 @NotNull
@@ -30,15 +30,21 @@ import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR;
* @author abreslav * @author abreslav
*/ */
public class UnresolvedReferenceDiagnostic extends AbstractDiagnostic<JetReferenceExpression> { public class UnresolvedReferenceDiagnostic extends AbstractDiagnostic<JetReferenceExpression> {
@NotNull
@Override
public UnresolvedReferenceDiagnosticFactory getFactory() {
return (UnresolvedReferenceDiagnosticFactory)super.getFactory();
}
public UnresolvedReferenceDiagnostic(JetReferenceExpression referenceExpression, String message) { public UnresolvedReferenceDiagnostic(@NotNull JetReferenceExpression referenceExpression,
super(referenceExpression, Errors.UNRESOLVED_REFERENCE, ERROR, message); @NotNull UnresolvedReferenceDiagnosticFactory factory) {
super(referenceExpression, factory, ERROR);
} }
@NotNull @NotNull
@Override @Override
public String getMessage() { public String getMessage() {
return super.getMessage() + ": " + getPsiElement().getText(); return getFactory().getMessage() + ": " + getPsiElement().getText();
} }
@NotNull @NotNull
@@ -16,28 +16,25 @@
package org.jetbrains.jet.lang.diagnostics; 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.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetArrayAccessExpression;
import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import java.util.List;
/** /**
* @author abreslav * @author abreslav
*/ */
public class UnresolvedReferenceDiagnosticFactory extends AbstractDiagnosticFactory { public class UnresolvedReferenceDiagnosticFactory extends AbstractDiagnosticFactory {
private final String message; private final String message;
private UnresolvedReferenceDiagnosticFactory(String message) { private UnresolvedReferenceDiagnosticFactory(String message) {
this.message = message; this.message = message;
} }
String getMessage() {
return message;
}
public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) { public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) {
return new UnresolvedReferenceDiagnostic(reference, message); return new UnresolvedReferenceDiagnostic(reference, this);
} }
public static UnresolvedReferenceDiagnosticFactory create(String message) { public static UnresolvedReferenceDiagnosticFactory create(String message) {
@@ -19,5 +19,5 @@ fun test() {
bar(1, 1, "") bar(1, 1, "")
bar(1, 1, "") bar(1, 1, "")
bar(1, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>z<!> = "") bar(1, <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>z<!> = "")
bar<!NO_VALUE_FOR_PARAMETER!>(1, <!UNRESOLVED_REFERENCE, MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>zz<!> = "", <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!><!UNRESOLVED_REFERENCE!>zz<!>.foo<!>)<!> bar<!NO_VALUE_FOR_PARAMETER!>(1, <!NAMED_PARAMETER_NOT_FOUND, MIXING_NAMED_AND_POSITIONED_ARGUMENTS!>zz<!> = "", <!MIXING_NAMED_AND_POSITIONED_ARGUMENTS!><!UNRESOLVED_REFERENCE!>zz<!>.foo<!>)<!>
} }