blob: 7e7b32183d30c7de2154cd700efac5656bc24ea1 [file] [log] [blame]
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;
}
}
}