package com.google.caja.ancillary.linter;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import com.drawbridge.text.DocumentError;
import com.drawbridge.text.TextPanel;
import com.drawbridge.utils.AnalyticUtils;
import com.drawbridge.utils.Utils;
import com.drawbridge.vl.VLPanel;
import com.google.caja.lexer.FilePosition;
import com.google.caja.parser.js.Block;
import com.google.caja.reporting.Message;
import com.google.caja.reporting.MessageLevel;
import com.google.caja.reporting.MessagePart;
import com.google.caja.reporting.MessageQueue;
import com.google.caja.reporting.MessageType;
import com.google.caja.reporting.SimpleMessageQueue;
import com.google.caja.util.CajaTestCase;
import com.google.caja.util.Sets;
public class LintHelper extends CajaTestCase
{
final static class LintJobMaker
{
private final Block node;
private final Set<String> provides = Sets.newLinkedHashSet(),
requires = Sets.newLinkedHashSet(),
overrides = Sets.newLinkedHashSet();
LintJobMaker(Block node) {
this.node = node;
}
LintJobMaker withProvides(String... idents)
{
provides.addAll(Arrays.asList(idents));
return this;
}
LintJobMaker withRequires(String... idents)
{
requires.addAll(Arrays.asList(idents));
return this;
}
LintJobMaker withOverrides(String... idents)
{
overrides.addAll(Arrays.asList(idents));
return this;
}
Linter.LintJob make()
{
return new Linter.LintJob(node.getFilePosition().source(), requires, provides, overrides, node);
}
}
private void runLinterTest(int lineErrorOffset, List<Linter.LintJob> inputs)
{
try {
MessageQueue mq = new SimpleMessageQueue();
Linter.lint(inputs, new Linter.Environment(Sets.<String> newHashSet()), mq);
Utils.out.println(getClass(), "Lint messages:" + mq.getMessages().size());
for (Message msg : mq.getMessages()) {
List<MessagePart> messageParts = msg.getMessageParts();
if (msg.getMessageType() != MessageType.INVALID_ASSIGNMENT && (msg.getMessageLevel() == MessageLevel.ERROR || msg.getMessageLevel() == MessageLevel.FATAL_ERROR)) {
Utils.out.println(getClass(), "Error message:" + msg.getMessageLevel().name() + ", " + messageParts.get(1));
if (messageParts != null && messageParts.size() == 2) {
FilePosition fp = (FilePosition) messageParts.get(0);
String title = "ErrorX";
String message = msg.getMessageType().name() + ": " + messageParts.get(1).toString();
AnalyticUtils.recordLintError(message, fp.startLineNo() - 1);
if(TextPanel.hasInstance())
TextPanel.getInstance().getDocument().setDocumentError(new DocumentError(fp.startLineNo() - 1 - lineErrorOffset, title, message));
if(VLPanel.hasInstance())
VLPanel.getInstance().mCanvas.mDocumentError = new DocumentError(fp.startLineNo() - 1 - lineErrorOffset, title, message);
Utils.out.println(getClass(), "Error at " + (fp.startLineNo() - 1 - lineErrorOffset) + ":" + message);
}
else {
throw new RuntimeException("Unexpected number of message parts!");
}
}
}
} catch (Exception e) {
Utils.out.println(getClass(), "Lint exception----------"); // Linter parse exception
}
}
public void runTest(int lineErrorOffset, String string)
{
try
{
setUp();
runLinterTest(lineErrorOffset, jobs(new LintJobMaker(js(fromString(string))).make()));
} catch (Exception e)
{
}
}
private static List<Linter.LintJob> jobs(Linter.LintJob... jobs)
{
return Arrays.asList(jobs);
}
}