package lombok.javac.java7;
import java.nio.CharBuffer;
import lombok.javac.CommentInfo;
import lombok.javac.CommentInfo.EndConnection;
import lombok.javac.CommentInfo.StartConnection;
import com.sun.tools.javac.parser.Scanner;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
public class extends Scanner {
private final ListBuffer<CommentInfo> comments = new ListBuffer<CommentInfo>();
private int = 0;
public (CommentCollectingScannerFactory factory, CharBuffer charBuffer) {
super(factory, charBuffer);
}
public (CommentCollectingScannerFactory factory, char[] input, int inputLength) {
super(factory, input, inputLength);
}
@Override
protected void processComment(CommentStyle style) {
int prevEndPos = Math.max(prevEndPos(), endComment);
int pos = pos();
int endPos = endPos();
endComment = endPos;
String content = new String(getRawCharacters(pos, endPos));
StartConnection start = determineStartConnection(prevEndPos, pos);
EndConnection end = determineEndConnection(endPos);
CommentInfo comment = new CommentInfo(prevEndPos, pos, endPos, content, start, end);
comments.append(comment);
super.processComment(style);
}
private EndConnection (int pos) {
boolean first = true;
for (int i = pos;; i++) {
char c;
try {
c = getRawCharacters(i, i + 1)[0];
} catch (IndexOutOfBoundsException e) {
c = '\n';
}
if (isNewLine(c)) {
return EndConnection.ON_NEXT_LINE;
}
if (Character.isWhitespace(c)) {
first = false;
continue;
}
return first ? EndConnection.DIRECT_AFTER_COMMENT : EndConnection.AFTER_COMMENT;
}
}
private StartConnection (int from, int to) {
if (from == to) {
return StartConnection.DIRECT_AFTER_PREVIOUS;
}
char[] between = getRawCharacters(from, to);
if (isNewLine(between[between.length - 1])) {
return StartConnection.START_OF_LINE;
}
for (char c : between) {
if (isNewLine(c)) {
return StartConnection.ON_NEXT_LINE;
}
}
return StartConnection.AFTER_PREVIOUS;
}
private boolean (char c) {
return c == '\n' || c == '\r';
}
public List<CommentInfo> getComments() {
return comments.toList();
}
}