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); } }