| package org.chromium.devtools.jsdoc; |
| |
| import com.google.javascript.jscomp.SourceFile; |
| import com.google.javascript.rhino.Node; |
| |
| import java.io.IOException; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.SortedSet; |
| import java.util.TreeSet; |
| |
| public class ValidatorContext { |
| private static final Comparator<MessageRecord> MESSAGE_RECORD_COMPARATOR = |
| new Comparator<MessageRecord>() { |
| @Override |
| public int compare(MessageRecord left, MessageRecord right) { |
| return left.position - right.position; |
| } |
| }; |
| |
| public final String scriptFileName; |
| public final SourceFile sourceFile; |
| private final SortedSet<MessageRecord> validationResult = |
| new TreeSet<>(MESSAGE_RECORD_COMPARATOR); |
| |
| public ValidatorContext(String text, String scriptFileName) { |
| this.scriptFileName = scriptFileName; |
| this.sourceFile = SourceFile.builder().buildFromCode(scriptFileName, text); |
| } |
| |
| public SortedSet<MessageRecord> getValidationResult() { |
| return Collections.unmodifiableSortedSet(validationResult); |
| } |
| |
| public String getNodeText(Node node) { |
| if (node == null) { |
| return null; |
| } |
| try { |
| return sourceFile.getCode().substring( |
| node.getSourceOffset(), node.getSourceOffset() + node.getLength()); |
| } catch (IOException e) { |
| return null; |
| } |
| } |
| |
| public SourcePosition getPosition(int offset) { |
| return new SourcePosition( |
| sourceFile.getLineOfOffset(offset), sourceFile.getColumnOfOffset(offset)); |
| } |
| |
| public void reportErrorInNode(Node node, int offsetInNodeText, String errorText) { |
| int errorAbsoluteOffset = node.getSourceOffset() + offsetInNodeText; |
| reportErrorAtOffset(errorAbsoluteOffset, errorText); |
| } |
| |
| public void reportErrorAtOffset(int offset, String errorText) { |
| SourcePosition position = getPosition(offset); |
| StringBuilder positionMarker = new StringBuilder(position.column + 1); |
| for (int i = position.column; i > 0; --i) { |
| positionMarker.append(' '); |
| } |
| positionMarker.append('^'); |
| String message = String.format("%s:%d: ERROR - %s%n%s%n%s%n", scriptFileName, position.line, |
| errorText, sourceFile.getLine(position.line), positionMarker.toString()); |
| validationResult.add(new MessageRecord(offset, message)); |
| } |
| |
| public static class MessageRecord { |
| public final int position; |
| public final String text; |
| |
| public MessageRecord(int position, String text) { |
| this.position = position; |
| this.text = text; |
| } |
| } |
| |
| public static class SourcePosition { |
| public final int line; |
| public final int column; |
| |
| public SourcePosition(int line, int column) { |
| this.line = line; |
| this.column = column; |
| } |
| } |
| } |