提交 1e1cad92 编写于 作者: A Andrey Breslav

Factories moved out of Errors.java

上级 e7521711
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;
import java.text.MessageFormat;
/**
* @author abreslav
*/
public class AbstractDiagnosticFactory implements DiagnosticFactory {
protected final MessageFormat messageFormat;
protected final Severity severity;
public AbstractDiagnosticFactory(Severity severity, String message) {
this.severity = severity;
this.messageFormat = new MessageFormat(message);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((DiagnosticWithTextRange) diagnostic).getTextRange();
}
}
package org.jetbrains.jet.lang.diagnostics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.resolve.DescriptorRenderer;
import java.util.Collection;
/**
* @author abreslav
*/
public class AmbiguousDescriptorDiagnosticFactory extends ParameterizedDiagnosticFactory1<Collection<? extends CallableDescriptor>> {
public static AmbiguousDescriptorDiagnosticFactory create(String messageTemplate) {
return new AmbiguousDescriptorDiagnosticFactory(messageTemplate);
}
public AmbiguousDescriptorDiagnosticFactory(String messageTemplate) {
super(Severity.ERROR, messageTemplate);
}
@Override
protected String makeMessageFor(@NotNull Collection<? extends CallableDescriptor> argument) {
StringBuilder stringBuilder = new StringBuilder("\n");
for (CallableDescriptor descriptor : argument) {
stringBuilder.append(DescriptorRenderer.TEXT.render(descriptor)).append("\n");
}
return stringBuilder.toString();
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.resolve.DescriptorRenderer;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Iterator;
......@@ -21,204 +17,7 @@ import static org.jetbrains.jet.lang.diagnostics.Severity.WARNING;
*/
public interface Errors {
public class AbstractDiagnosticFactory implements DiagnosticFactory {
protected final MessageFormat messageFormat;
protected final Severity severity;
public AbstractDiagnosticFactory(Severity severity, String message) {
this.severity = severity;
this.messageFormat = new MessageFormat(message);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((DiagnosticWithTextRange) diagnostic).getTextRange();
}
}
public class SimpleDiagnosticFactory implements DiagnosticFactory {
public static SimpleDiagnosticFactory create(Severity severity, String message) {
return new SimpleDiagnosticFactory(severity, message);
}
protected final String message;
protected final Severity severity;
public SimpleDiagnosticFactory(Severity severity, String message) {
this.message = message;
this.severity = severity;
}
@NotNull
public Diagnostic on(@NotNull TextRange range) {
return new GenericDiagnostic(this, severity, message, range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node) {
return on(node.getTextRange());
}
@NotNull
public Diagnostic on(@NotNull PsiElement element) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, message, element);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((DiagnosticWithTextRange) diagnostic).getTextRange();
}
}
public class ParameterizedDiagnosticFactory1<T> extends AbstractDiagnosticFactory {
public static <T> ParameterizedDiagnosticFactory1<T> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory1<T>(severity, messageStub);
}
protected ParameterizedDiagnosticFactory1(Severity severity, String messageStub) {
super(severity, messageStub);
}
private String makeMessage(@NotNull T argument) {
return messageFormat.format(new Object[]{makeMessageFor(argument)});
}
protected String makeMessageFor(T argument) {
return argument.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull T argument) {
return new GenericDiagnostic(this, severity, makeMessage(argument), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull T argument) {
return on(node.getTextRange(), argument);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull T argument) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(argument), element);
}
}
public class ParameterizedDiagnosticFactory2<A, B> extends AbstractDiagnosticFactory {
public static <A, B> ParameterizedDiagnosticFactory2<A, B> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory2<A, B>(severity, messageStub);
}
protected ParameterizedDiagnosticFactory2(Severity severity, String messageStub) {
super(severity, messageStub);
}
protected String makeMessage(@NotNull A a, @NotNull B b) {
return messageFormat.format(new Object[] {makeMessageForA(a), makeMessageForB(b)});
}
protected String makeMessageForA(@NotNull A a) {
return a.toString();
}
protected String makeMessageForB(@NotNull B b) {
return b.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull A a, @NotNull B b) {
return new GenericDiagnostic(this, severity, makeMessage(a, b), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull A a, @NotNull B b) {
return on(node.getTextRange(), a, b);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull A a, @NotNull B b) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(a, b), element);
}
}
public class ParameterizedDiagnosticFactory3<A, B, C> extends AbstractDiagnosticFactory {
public static <A, B, C> ParameterizedDiagnosticFactory3<A, B, C> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory3<A, B, C>(severity, messageStub);
}
protected ParameterizedDiagnosticFactory3(Severity severity, String messageStub) {
super(severity, messageStub);
}
protected String makeMessage(@NotNull A a, @NotNull B b, @NotNull C c) {
return messageFormat.format(new Object[]{makeMessageForA(a), makeMessageForB(b), makeMessageForC(c)});
}
protected String makeMessageForA(@NotNull A a) {
return a.toString();
}
protected String makeMessageForB(@NotNull B b) {
return b.toString();
}
protected String makeMessageForC(@NotNull C c) {
return c.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull A a, @NotNull B b, @NotNull C c) {
return new GenericDiagnostic(this, severity, makeMessage(a, b, c), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull A a, @NotNull B b, @NotNull C c) {
return on(node.getTextRange(), a, b, c);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull A a, @NotNull B b, @NotNull C c) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(a, b, c), element);
}
}
public class UnresolvedReferenceDiagnosticFactory implements DiagnosticFactory {
private UnresolvedReferenceDiagnosticFactory() {}
public UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) {
return new UnresolvedReferenceDiagnostic(reference);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((UnresolvedReferenceDiagnostic) diagnostic).getTextRange();
}
}
public class AmbiguousDescriptorDiagnosticFactory extends ParameterizedDiagnosticFactory1<Collection<? extends CallableDescriptor>> {
public static AmbiguousDescriptorDiagnosticFactory create(String messageTemplate) {
return new AmbiguousDescriptorDiagnosticFactory(messageTemplate);
}
protected AmbiguousDescriptorDiagnosticFactory(String messageTemplate) {
super(Severity.ERROR, messageTemplate);
}
@Override
protected String makeMessageFor(@NotNull Collection<? extends CallableDescriptor> argument) {
StringBuilder stringBuilder = new StringBuilder("\n");
for (CallableDescriptor descriptor : argument) {
stringBuilder.append(DescriptorRenderer.TEXT.render(descriptor)).append("\n");
}
return stringBuilder.toString();
}
}
UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = new UnresolvedReferenceDiagnosticFactory();
UnresolvedReferenceDiagnosticFactory UNRESOLVED_REFERENCE = UnresolvedReferenceDiagnosticFactory.INSTANCE;
SimpleDiagnosticFactory SAFE_CALLS_ARE_NOT_ALLOWED_ON_NAMESPACES = SimpleDiagnosticFactory.create(ERROR, "Safe calls are not allowed on namespaces");
SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR, "Type checking has run into a recursive problem"); // TODO: message
SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "'return' is not allowed here");
......@@ -481,60 +280,6 @@ public interface Errors {
};
class RedeclarationDiagnosticFactory implements DiagnosticFactory {
public static final RedeclarationDiagnosticFactory INSTANCE = new RedeclarationDiagnosticFactory();
private RedeclarationDiagnosticFactory() {}
public RedeclarationDiagnostic on(DeclarationDescriptor a, DeclarationDescriptor b) {
return new RedeclarationDiagnostic(a, b);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
throw new UnsupportedOperationException(); // TODO
}
}
class RedeclarationDiagnostic implements Diagnostic {
private final DeclarationDescriptor a;
private final DeclarationDescriptor b;
public RedeclarationDiagnostic(DeclarationDescriptor a, DeclarationDescriptor b) {
this.a = a;
this.b = b;
}
public DeclarationDescriptor getA() {
return a;
}
public DeclarationDescriptor getB() {
return b;
}
@NotNull
@Override
public DiagnosticFactory getFactory() {
return RedeclarationDiagnosticFactory.INSTANCE;
}
@NotNull
@Override
public String getMessage() {
return "Redeclaration";
}
@NotNull
@Override
public Severity getSeverity() {
return ERROR;
}
}
RedeclarationDiagnosticFactory REDECLARATION = RedeclarationDiagnosticFactory.INSTANCE;
public class UnresolvedReferenceDiagnostic extends DiagnosticWithPsiElement<JetReferenceExpression> {
......
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
/**
* @author abreslav
*/
public class ParameterizedDiagnosticFactory1<T> extends AbstractDiagnosticFactory {
public static <T> ParameterizedDiagnosticFactory1<T> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory1<T>(severity, messageStub);
}
public ParameterizedDiagnosticFactory1(Severity severity, String messageStub) {
super(severity, messageStub);
}
private String makeMessage(@NotNull T argument) {
return messageFormat.format(new Object[]{makeMessageFor(argument)});
}
protected String makeMessageFor(T argument) {
return argument.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull T argument) {
return new GenericDiagnostic(this, severity, makeMessage(argument), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull T argument) {
return on(node.getTextRange(), argument);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull T argument) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(argument), element);
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
/**
* @author abreslav
*/
public class ParameterizedDiagnosticFactory2<A, B> extends AbstractDiagnosticFactory {
public static <A, B> ParameterizedDiagnosticFactory2<A, B> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory2<A, B>(severity, messageStub);
}
public ParameterizedDiagnosticFactory2(Severity severity, String messageStub) {
super(severity, messageStub);
}
protected String makeMessage(@NotNull A a, @NotNull B b) {
return messageFormat.format(new Object[] {makeMessageForA(a), makeMessageForB(b)});
}
protected String makeMessageForA(@NotNull A a) {
return a.toString();
}
protected String makeMessageForB(@NotNull B b) {
return b.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull A a, @NotNull B b) {
return new GenericDiagnostic(this, severity, makeMessage(a, b), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull A a, @NotNull B b) {
return on(node.getTextRange(), a, b);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull A a, @NotNull B b) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(a, b), element);
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
/**
* @author abreslav
*/
public class ParameterizedDiagnosticFactory3<A, B, C> extends AbstractDiagnosticFactory {
public static <A, B, C> ParameterizedDiagnosticFactory3<A, B, C> create(Severity severity, String messageStub) {
return new ParameterizedDiagnosticFactory3<A, B, C>(severity, messageStub);
}
public ParameterizedDiagnosticFactory3(Severity severity, String messageStub) {
super(severity, messageStub);
}
protected String makeMessage(@NotNull A a, @NotNull B b, @NotNull C c) {
return messageFormat.format(new Object[]{makeMessageForA(a), makeMessageForB(b), makeMessageForC(c)});
}
protected String makeMessageForA(@NotNull A a) {
return a.toString();
}
protected String makeMessageForB(@NotNull B b) {
return b.toString();
}
protected String makeMessageForC(@NotNull C c) {
return c.toString();
}
@NotNull
public Diagnostic on(@NotNull TextRange range, @NotNull A a, @NotNull B b, @NotNull C c) {
return new GenericDiagnostic(this, severity, makeMessage(a, b, c), range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node, @NotNull A a, @NotNull B b, @NotNull C c) {
return on(node.getTextRange(), a, b, c);
}
@NotNull
public Diagnostic on(@NotNull PsiElement element, @NotNull A a, @NotNull B b, @NotNull C c) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, makeMessage(a, b, c), element);
}
}
package org.jetbrains.jet.lang.diagnostics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import static org.jetbrains.jet.lang.diagnostics.Severity.ERROR;
/**
* @author abreslav
*/
public class RedeclarationDiagnostic implements Diagnostic {
private final DeclarationDescriptor a;
private final DeclarationDescriptor b;
public RedeclarationDiagnostic(DeclarationDescriptor a, DeclarationDescriptor b) {
this.a = a;
this.b = b;
}
public DeclarationDescriptor getA() {
return a;
}
public DeclarationDescriptor getB() {
return b;
}
@NotNull
@Override
public DiagnosticFactory getFactory() {
return RedeclarationDiagnosticFactory.INSTANCE;
}
@NotNull
@Override
public String getMessage() {
return "Redeclaration";
}
@NotNull
@Override
public Severity getSeverity() {
return ERROR;
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
/**
* @author abreslav
*/
public class RedeclarationDiagnosticFactory implements DiagnosticFactory {
public static final RedeclarationDiagnosticFactory INSTANCE = new RedeclarationDiagnosticFactory();
public RedeclarationDiagnosticFactory() {}
public RedeclarationDiagnostic on(DeclarationDescriptor a, DeclarationDescriptor b) {
return new RedeclarationDiagnostic(a, b);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
throw new UnsupportedOperationException(); // TODO
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
/**
* @author abreslav
*/
public class SimpleDiagnosticFactory implements DiagnosticFactory {
public static SimpleDiagnosticFactory create(Severity severity, String message) {
return new SimpleDiagnosticFactory(severity, message);
}
protected final String message;
protected final Severity severity;
public SimpleDiagnosticFactory(Severity severity, String message) {
this.message = message;
this.severity = severity;
}
@NotNull
public Diagnostic on(@NotNull TextRange range) {
return new GenericDiagnostic(this, severity, message, range);
}
@NotNull
public Diagnostic on(@NotNull ASTNode node) {
return on(node.getTextRange());
}
@NotNull
public Diagnostic on(@NotNull PsiElement element) {
return new DiagnosticWithPsiElement<PsiElement>(this, severity, message, element);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((DiagnosticWithTextRange) diagnostic).getTextRange();
}
}
package org.jetbrains.jet.lang.diagnostics;
import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
/**
* @author abreslav
*/
public class UnresolvedReferenceDiagnosticFactory implements DiagnosticFactory {
public static final UnresolvedReferenceDiagnosticFactory INSTANCE = new UnresolvedReferenceDiagnosticFactory();
public UnresolvedReferenceDiagnosticFactory() {}
public Errors.UnresolvedReferenceDiagnostic on(@NotNull JetReferenceExpression reference) {
return new Errors.UnresolvedReferenceDiagnostic(reference);
}
@NotNull
@Override
public TextRange getMarkerPosition(@NotNull Diagnostic diagnostic) {
return ((Errors.UnresolvedReferenceDiagnostic) diagnostic).getTextRange();
}
}
......@@ -14,6 +14,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.diagnostics.RedeclarationDiagnostic;
import org.jetbrains.jet.lang.diagnostics.Severity;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
......@@ -120,8 +121,8 @@ public class JetPsiChecker implements Annotator {
holder.createErrorAnnotation(referenceExpression, "Unresolved").setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL);
}
}
else if (diagnostic instanceof Errors.RedeclarationDiagnostic) {
Errors.RedeclarationDiagnostic redeclarationDiagnostic = (Errors.RedeclarationDiagnostic) diagnostic;
else if (diagnostic instanceof RedeclarationDiagnostic) {
RedeclarationDiagnostic redeclarationDiagnostic = (RedeclarationDiagnostic) diagnostic;
markRedeclaration(redeclarations, redeclarationDiagnostic.getA(), bindingContext, holder);
markRedeclaration(redeclarations, redeclarationDiagnostic.getB(), bindingContext, holder);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册