Introduced factory to renderer map in DefaultDiagnosticRenderer. Added first renderer there.

This commit is contained in:
Evgeny Gerashchenko
2012-04-12 15:50:29 +04:00
parent 6a13510741
commit 46d929efa1
5 changed files with 52 additions and 6 deletions
@@ -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<Diagnostic> {
public static final DefaultDiagnosticRenderer INSTANCE = new DefaultDiagnosticRenderer();
private final Map<AbstractDiagnosticFactory, DiagnosticRenderer<?>> factoryToRenderer = new HashMap<AbstractDiagnosticFactory, DiagnosticRenderer<?>>();
private DefaultDiagnosticRenderer() {
factoryToRenderer.put(EXCEPTION_WHILE_ANALYZING, new DiagnosticWithParameters1Renderer<JetFile, Throwable>("{0}", new Renderer<Throwable>() {
@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<E extends PsiElement, A> implements DiagnosticRenderer<DiagnosticWithParameters1<E, A>> {
private final MessageFormat messageFormat;
private final Renderer<? super A> rendererForA;
private DiagnosticWithParameters1Renderer(@NotNull String message, @NotNull Renderer<? super A> rendererForA) {
this.messageFormat = new MessageFormat(message);
this.rendererForA = rendererForA;
}
@NotNull
@Override
public String render(@Nullable DiagnosticWithParameters1<E, A> diagnostic) {
return diagnostic == null ? "null" : messageFormat.format(new Object[]{rendererForA.render(diagnostic.getA())});
}
}
}
@@ -23,8 +23,8 @@ import org.jetbrains.annotations.Nullable;
* @author Evgeny Gerashchenko
* @since 4/12/12
*/
public interface DiagnosticRenderer extends Renderer<Diagnostic> {
public interface DiagnosticRenderer<D extends Diagnostic> extends Renderer<D> {
@NotNull
@Override
String render(@Nullable Diagnostic diagnostic);
String render(@Nullable D diagnostic);
}
@@ -55,6 +55,7 @@ public class DiagnosticWithParameters1<E extends PsiElement, A> extends Abstract
return getFactory().getTextRanges(this);
}
@NotNull
public A getA() {
return a;
}
@@ -58,10 +58,12 @@ public class DiagnosticWithParameters2<E extends PsiElement, A, B> extends Abstr
return getFactory().getTextRanges(this);
}
@NotNull
public A getA() {
return a;
}
@NotNull
public B getB() {
return b;
}
@@ -61,14 +61,17 @@ public class DiagnosticWithParameters3<E extends PsiElement, A, B, C> extends Ab
return getFactory().getTextRanges(this);
}
@NotNull
public A getA() {
return a;
}
@NotNull
public B getB() {
return b;
}
@NotNull
public C getC() {
return c;
}