| Index: compiler/java/com/google/dart/compiler/parser/DartScanner.java
|
| diff --git a/compiler/java/com/google/dart/compiler/parser/DartScanner.java b/compiler/java/com/google/dart/compiler/parser/DartScanner.java
|
| index 439688791f687c798469ae5e0b685558c605230c..904c13c21532d85ce2300143076a610cab70f49e 100644
|
| --- a/compiler/java/com/google/dart/compiler/parser/DartScanner.java
|
| +++ b/compiler/java/com/google/dart/compiler/parser/DartScanner.java
|
| @@ -18,87 +18,33 @@ import java.util.Stack;
|
| public class DartScanner {
|
|
|
| /**
|
| - * Represents a position in a source file, including absolute character position,
|
| - * line, and column.
|
| - */
|
| - public static class Position {
|
| - private int pos;
|
| - private int line;
|
| - private int col;
|
| -
|
| - public Position(int pos, int line, int col) {
|
| - this.pos = pos;
|
| - this.line = line;
|
| - this.col = col;
|
| - }
|
| -
|
| - public Position copy() {
|
| - return new Position(pos, line, col);
|
| - }
|
| -
|
| - public int getPos() {
|
| - return pos;
|
| - }
|
| -
|
| - public int getLine() {
|
| - return line;
|
| - }
|
| -
|
| - public int getCol() {
|
| - return col;
|
| - }
|
| -
|
| - public void advance(boolean isNewline) {
|
| - ++pos;
|
| - if (isNewline) {
|
| - col = 1;
|
| - ++line;
|
| - } else {
|
| - ++col;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @return the {@link Position} which is advanced on the given number of columns, on the same
|
| - * line.
|
| - */
|
| - public Position getAdvancedColumns(int cols) {
|
| - return new Position(pos + cols, line, col + cols);
|
| - }
|
| -
|
| - @Override
|
| - public String toString() {
|
| - return line + "," + col + "@" + pos;
|
| - }
|
| - }
|
| -
|
| - /**
|
| * Represents a span of characters in a source file.
|
| */
|
| public static class Location {
|
| public static final Location NONE = null;
|
| - private Position begin, end;
|
| + private int begin;
|
| + private int end;
|
|
|
| - public Location(Position begin, Position end) {
|
| + public Location(int begin, int end) {
|
| this.begin = begin;
|
| this.end = end;
|
| }
|
|
|
| - public Location(Position begin) {
|
| + public Location(int begin) {
|
| this.begin = this.end = begin;
|
| }
|
|
|
| - public Position getBegin() {
|
| + public int getBegin() {
|
| return begin;
|
| }
|
|
|
| - public Position getEnd() {
|
| + public int getEnd() {
|
| return end;
|
| }
|
|
|
| @Override
|
| public String toString() {
|
| - return begin.toString() + "::" + end.toString();
|
| + return begin + "::" + end;
|
| }
|
| }
|
|
|
| @@ -252,8 +198,8 @@ public class DartScanner {
|
| }
|
|
|
| private int lookahead[] = new int[NUM_LOOKAHEAD];
|
| - private Position lookaheadPos[] = new Position[NUM_LOOKAHEAD];
|
| - private Position nextLookaheadPos;
|
| + private int lookaheadPos[] = new int[NUM_LOOKAHEAD];
|
| + private int nextLookaheadPos;
|
| private ArrayList<TokenData> tokens;
|
| private TokenData lastToken;
|
|
|
| @@ -435,7 +381,6 @@ public class DartScanner {
|
| return c == ' ' || c == '\t';
|
| }
|
|
|
| - private int commentLineCount;
|
| private int commentCharCount;
|
| private int lastCommentStart;
|
| private int lastCommentStop;
|
| @@ -455,9 +400,9 @@ public class DartScanner {
|
|
|
| // Initialize lookahead positions.
|
| // TODO Determine if line & column should be relative to 0 or 'start'
|
| - internalState.nextLookaheadPos = new Position(start, 1, 1);
|
| + internalState.nextLookaheadPos = start;
|
| for (int i = 0; i < internalState.lookaheadPos.length; ++i) {
|
| - internalState.lookaheadPos[i] = new Position(start, 1, 1);
|
| + internalState.lookaheadPos[i] = start;
|
| }
|
|
|
| // Fill all the characters in the look-ahead and all the peek
|
| @@ -474,30 +419,10 @@ public class DartScanner {
|
| }
|
|
|
| /**
|
| - * Returns the number of lines of source that were scanned, excluding the number of lines
|
| - * consumed by comments.
|
| - */
|
| - public int getNonCommentLineCount() {
|
| - return getLineCount() - commentLineCount;
|
| - }
|
| -
|
| - /**
|
| - * Returns the number of lines of source that were scanned.
|
| - */
|
| - public int getLineCount() {
|
| - int lineCount = internalState.nextLookaheadPos.line;
|
| - if (isEos()) {
|
| - // At the end of the file the next line has advanced one past the end
|
| - lineCount -= 1;
|
| - }
|
| - return lineCount;
|
| - }
|
| -
|
| - /**
|
| * Returns the number of characters of source code that were scanned.
|
| */
|
| public int getCharCount() {
|
| - return internalState.nextLookaheadPos.pos;
|
| + return internalState.nextLookaheadPos;
|
| }
|
|
|
| /**
|
| @@ -647,32 +572,28 @@ public class DartScanner {
|
| * invocation.
|
| * @param start the character position of the second character in the comment
|
| * @param stop the character position of the final character in the comment
|
| - * @param line the line number at <code>start</code>
|
| - * @param col the column number at <code>start</code>
|
| */
|
| - protected void recordCommentLocation(int start, int stop, int line, int col) {
|
| + protected void recordCommentLocation(int start, int stop) {
|
| }
|
|
|
| private void advance() {
|
| for (int i = 0; i < NUM_LOOKAHEAD - 1; ++i) {
|
| internalState.lookahead[i] = internalState.lookahead[i + 1];
|
| - internalState.lookaheadPos[i] = internalState.lookaheadPos[i + 1].copy();
|
| + internalState.lookaheadPos[i] = internalState.lookaheadPos[i + 1];
|
| }
|
| - if (internalState.nextLookaheadPos.pos < source.length()) {
|
| - int ch = source.codePointAt(internalState.nextLookaheadPos.pos);
|
| + if (internalState.nextLookaheadPos < source.length()) {
|
| + int ch = source.codePointAt(internalState.nextLookaheadPos);
|
| internalState.lookahead[NUM_LOOKAHEAD - 1] = ch;
|
| - internalState.lookaheadPos[NUM_LOOKAHEAD - 1] = internalState.nextLookaheadPos.copy();
|
| - internalState.nextLookaheadPos.advance(ch == '\n');
|
| + internalState.lookaheadPos[NUM_LOOKAHEAD - 1] = internalState.nextLookaheadPos;
|
| + internalState.nextLookaheadPos++;
|
| } else {
|
| // Let the last look-ahead position be past the source. This makes
|
| // the position information for the last token correct.
|
| internalState.lookahead[NUM_LOOKAHEAD - 1] = -1;
|
| - internalState.lookaheadPos[NUM_LOOKAHEAD - 1] = new Position(source.length(),
|
| - internalState.nextLookaheadPos.line, internalState.nextLookaheadPos.col);
|
| + internalState.lookaheadPos[NUM_LOOKAHEAD - 1] = source.length();
|
|
|
| // Leave the nextLookahead position pointing to the line after the last line
|
| - internalState.nextLookaheadPos = new Position(source.length(),
|
| - internalState.nextLookaheadPos.line + 1, 1);
|
| + internalState.nextLookaheadPos = source.length();
|
| }
|
| }
|
|
|
| @@ -688,17 +609,16 @@ public class DartScanner {
|
| * @param endLine the line number of the last line of the comment
|
| * @param col the column number at <code>start</code>
|
| */
|
| - private void commentLocation(int start, int stop, int startLine, int endLine, int col) {
|
| + private void commentLocation(int start, int stop) {
|
| if (start <= lastCommentStart && stop <= lastCommentStop) {
|
| return;
|
| }
|
|
|
| lastCommentStart = start;
|
| lastCommentStop = stop;
|
| - commentLineCount += endLine - startLine + 1;
|
| commentCharCount += stop - start + 1;
|
|
|
| - recordCommentLocation(start, stop, startLine, col);
|
| + recordCommentLocation(start, stop);
|
| }
|
|
|
| private boolean is(int c) {
|
| @@ -715,7 +635,7 @@ public class DartScanner {
|
| }
|
|
|
| // Get the current source code position.
|
| - private Position position() {
|
| + private int position() {
|
| return internalState.lookaheadPos[0];
|
| }
|
|
|
| @@ -727,7 +647,7 @@ public class DartScanner {
|
| while (true) {
|
| internalState.lastToken = new TokenData();
|
| Token token;
|
| - Position begin, end;
|
| + int begin, end;
|
| do {
|
| skipWhiteSpace();
|
| begin = position();
|
| @@ -757,7 +677,7 @@ public class DartScanner {
|
|
|
| private Token scanIdentifier(boolean allowDollars) {
|
| assert (isIdentifierStart(lookahead(0)));
|
| - Position begin = position();
|
| + int begin = position();
|
| while (true) {
|
| int nextChar = lookahead(0);
|
| if (!isIdentifierPart(nextChar) || (!allowDollars && nextChar == '$')) {
|
| @@ -765,11 +685,11 @@ public class DartScanner {
|
| }
|
| advance();
|
| }
|
| - int size = position().pos - begin.pos;
|
| + int size = position() - begin;
|
|
|
| // Use a substring of the source string instead of copying all the
|
| // characters to the token value buffer.
|
| - String result = source.substring(begin.pos, begin.pos + size);
|
| + String result = source.substring(begin, begin + size);
|
| internalState.lastToken.value = result;
|
| return Token.lookup(result);
|
| }
|
| @@ -777,7 +697,7 @@ public class DartScanner {
|
| private Token scanNumber() {
|
| boolean isDouble = false;
|
| assert (isDecimalDigit(lookahead(0)) || is('.'));
|
| - Position begin = position();
|
| + int begin = position();
|
| while (isDecimalDigit(lookahead(0)))
|
| advance();
|
| if (is('.') && isDecimalDigit(lookahead(1))) {
|
| @@ -801,8 +721,8 @@ public class DartScanner {
|
| // Number literals must not be followed directly by an identifier.
|
| return Token.ILLEGAL;
|
| }
|
| - int size = position().pos - begin.pos;
|
| - internalState.lastToken.value = source.substring(begin.pos, begin.pos + size);
|
| + int size = position() - begin;
|
| + internalState.lastToken.value = source.substring(begin, begin + size);
|
| return isDouble ? Token.DOUBLE_LITERAL : Token.INTEGER_LITERAL;
|
| }
|
|
|
| @@ -816,7 +736,7 @@ public class DartScanner {
|
| advance();
|
| advance();
|
|
|
| - Position begin = position();
|
| + int begin = position();
|
| if (!isHexDigit(lookahead(0))) {
|
| return Token.ILLEGAL;
|
| }
|
| @@ -827,7 +747,7 @@ public class DartScanner {
|
| if (isIdentifierStart(lookahead(0))) {
|
| return Token.ILLEGAL;
|
| }
|
| - internalState.lastToken.value = source.substring(begin.pos, position().pos);
|
| + internalState.lastToken.value = source.substring(begin, position());
|
| return Token.HEX_LITERAL;
|
| }
|
|
|
| @@ -1316,18 +1236,16 @@ public class DartScanner {
|
| */
|
| private Token scanDirective() {
|
| assert (is('#'));
|
| - Position currPos = position();
|
| - int start = currPos.pos;
|
| - int line = currPos.line;
|
| - int col = currPos.col;
|
| + int currPos = position();
|
| + int start = currPos;
|
|
|
| // Skip over the #! if it exists and consider it a comment
|
| if (start == 0) {
|
| if (lookahead(1) == '!') {
|
| while (!isEos() && !isLineTerminator(lookahead(0)))
|
| advance();
|
| - int stop = internalState.lookaheadPos[0].pos;
|
| - commentLocation(start, stop, line, internalState.lookaheadPos[0].line, col);
|
| + int stop = internalState.lookaheadPos[0];
|
| + commentLocation(start, stop);
|
| return Token.COMMENT;
|
| }
|
| }
|
| @@ -1345,7 +1263,7 @@ public class DartScanner {
|
| }
|
| advance();
|
| }
|
| - String syntax = source.substring(start, position().pos);
|
| + String syntax = source.substring(start, position());
|
| Token token = Token.lookup(syntax);
|
| return token == Token.IDENTIFIER ? Token.ILLEGAL : token;
|
| }
|
| @@ -1365,10 +1283,8 @@ public class DartScanner {
|
|
|
| private Token skipMultiLineComment() {
|
| assert (is('*'));
|
| - Position currPos = internalState.lookaheadPos[0];
|
| - int start = currPos.pos - 1;
|
| - int line = currPos.line;
|
| - int col = currPos.col;
|
| + int currPos = internalState.lookaheadPos[0];
|
| + int start = currPos - 1;
|
| int commentDepth = 1;
|
| advance();
|
| while (!isEos()) {
|
| @@ -1377,8 +1293,8 @@ public class DartScanner {
|
| if (first == '*' && is('/')) {
|
| if(--commentDepth == 0) {
|
| Token result = select(Token.COMMENT);
|
| - int stop = internalState.lookaheadPos[0].pos;
|
| - commentLocation(start, stop, line, internalState.lookaheadPos[0].line, col);
|
| + int stop = internalState.lookaheadPos[0];
|
| + commentLocation(start, stop);
|
| return result;
|
| }
|
| advance();
|
| @@ -1387,23 +1303,21 @@ public class DartScanner {
|
| advance();
|
| }
|
| }
|
| - int stop = internalState.lookaheadPos[0].pos;
|
| - commentLocation(start, stop, line, internalState.lookaheadPos[0].line, col);
|
| + int stop = internalState.lookaheadPos[0];
|
| + commentLocation(start, stop);
|
| // Unterminated multi-line comment.
|
| return Token.ILLEGAL;
|
| }
|
|
|
| private Token skipSingleLineComment() {
|
| assert (is('/'));
|
| - Position currPos = internalState.lookaheadPos[0];
|
| - int start = currPos.pos - 1;
|
| - int line = currPos.line;
|
| - int col = currPos.col;
|
| + int currPos = internalState.lookaheadPos[0];
|
| + int start = currPos - 1;
|
| advance();
|
| while (!isEos() && !isLineTerminator(lookahead(0)))
|
| advance();
|
| - int stop = internalState.lookaheadPos[0].pos;
|
| - commentLocation(start, stop, line, internalState.lookaheadPos[0].line, col);
|
| + int stop = internalState.lookaheadPos[0];
|
| + commentLocation(start, stop);
|
| return Token.COMMENT;
|
| }
|
|
|
|
|