Index: pkg/csslib/lib/parser.dart |
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart |
index 282fe591c49488fb20803cf9ffbf8dad8a4cd827..6060166944ec8d7fdbf5e4e16846840eee9fd1e0 100644 |
--- a/pkg/csslib/lib/parser.dart |
+++ b/pkg/csslib/lib/parser.dart |
@@ -196,7 +196,7 @@ class _Parser { |
StyleSheet parse() { |
List<TreeNode> productions = []; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { |
// TODO(terry): Need to handle charset. |
var directive = processDirective(); |
@@ -222,7 +222,7 @@ class _Parser { |
StyleSheet parseSelector() { |
List<TreeNode> productions = []; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) { |
var selector = processSelector(); |
if (selector != null) { |
@@ -334,12 +334,14 @@ class _Parser { |
messages.warning(message, location); |
} |
- SourceSpan _makeSpan(int start) { |
+ SourceSpan _makeSpan(FileSpan start) { |
// TODO(terry): there are places where we are creating spans before we eat |
- // the tokens, so using _previousToken.end is not always valid. |
- var end = _previousToken != null && _previousToken.end >= start |
- ? _previousToken.end : _peekToken.end; |
- return file.span(start, end); |
+ // the tokens, so using _previousToken is not always valid. |
+ // TODO(nweiz): use < rather than compareTo when SourceSpan supports it. |
+ if (_previousToken == null || _previousToken.span.compareTo(start) < 0) { |
+ return start; |
+ } |
+ return start.expand(_previousToken.span); |
} |
/////////////////////////////////////////////////////////////////// |
@@ -389,7 +391,7 @@ class _Parser { |
// Grammar: [ONLY | NOT]? S* media_type S* |
// [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]* |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
// Is it a unary media operator? |
var op = _peekToken.text; |
@@ -408,7 +410,7 @@ class _Parser { |
} |
} |
_next(); |
- start = _peekToken.start; |
+ start = _peekToken.span; |
} |
var type; |
@@ -441,14 +443,14 @@ class _Parser { |
} |
MediaExpression processMediaExpression([bool andOperator = false]) { |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
// Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S* |
if (_maybeEat(TokenKind.LPAREN)) { |
if (_peekIdentifier()) { |
var feature = identifier(); // Media feature. |
while (_maybeEat(TokenKind.COLON)) { |
- int startExpr = _peekToken.start; |
+ var startExpr = _peekToken.span; |
var exprs = processExpr(); |
if (_maybeEat(TokenKind.RPAREN)) { |
return new MediaExpression(andOperator, feature, exprs, |
@@ -484,7 +486,7 @@ class _Parser { |
* content '@content' |
*/ |
processDirective() { |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
var tokId = processVariableOrDirective(); |
if (tokId is VarDefinitionDirective) return tokId; |
@@ -703,7 +705,7 @@ class _Parser { |
List<TreeNode> productions = []; |
- start = _peekToken.start; |
+ start = _peekToken.span; |
while (!_maybeEat(TokenKind.END_OF_FILE)) { |
RuleSet ruleset = processRuleSet(); |
if (ruleset == null) { |
@@ -755,7 +757,7 @@ class _Parser { |
namespaceUri, _makeSpan(start)); |
case TokenKind.DIRECTIVE_MIXIN: |
- return processMixin(start); |
+ return processMixin(); |
case TokenKind.DIRECTIVE_INCLUDE: |
return processInclude( _makeSpan(start)); |
@@ -778,7 +780,7 @@ class _Parser { |
* [ruleset | property | directive]* |
* '}' |
*/ |
- MixinDefinition processMixin(int start) { |
+ MixinDefinition processMixin() { |
_next(); |
var name = identifier(); |
@@ -793,7 +795,7 @@ class _Parser { |
if (varDef is VarDefinitionDirective || varDef is VarDefinition) { |
params.add(varDef); |
} else if (mustHaveParam) { |
- _warning("Expecting parameter", _makeSpan(_peekToken.start)); |
+ _warning("Expecting parameter", _makeSpan(_peekToken.span)); |
keepGoing = false; |
} |
if (_maybeEat(TokenKind.COMMA)) { |
@@ -810,7 +812,7 @@ class _Parser { |
List<TreeNode> declarations = []; |
var mixinDirective; |
- start = _peekToken.start; |
+ var start = _peekToken.span; |
while (!_maybeEat(TokenKind.END_OF_FILE)) { |
var directive = processDirective(); |
if (directive != null) { |
@@ -833,7 +835,7 @@ class _Parser { |
include.span)); |
} else { |
_warning("Error mixing of top-level vs declarations mixins", |
- _makeSpan(include)); |
+ _makeSpan(include.span)); |
} |
}); |
declGroup.declarations.insertAll(0, newDecls); |
@@ -882,7 +884,7 @@ class _Parser { |
* return the token id of a directive or -1 if neither. |
*/ |
processVariableOrDirective({bool mixinParameter: false}) { |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
var tokId = _peek(); |
// Handle case for @ directive (where there's a whitespace between the @ |
@@ -1046,7 +1048,7 @@ class _Parser { |
} |
DeclarationGroup processDeclarations({bool checkBrace: true}) { |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
if (checkBrace) _eat(TokenKind.LBRACE); |
@@ -1104,7 +1106,7 @@ class _Parser { |
List<DeclarationGroup> processMarginsDeclarations() { |
List groups = []; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
_eat(TokenKind.LBRACE); |
@@ -1189,7 +1191,7 @@ class _Parser { |
SelectorGroup processSelectorGroup() { |
List<Selector> selectors = []; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
do { |
Selector selector = processSelector(); |
@@ -1208,7 +1210,7 @@ class _Parser { |
*/ |
Selector processSelector() { |
var simpleSequences = <SimpleSelectorSequence>[]; |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
while (true) { |
// First item is never descendant make sure it's COMBINATOR_NONE. |
var selectorItem = simpleSelectorSequence(simpleSequences.length == 0); |
@@ -1225,7 +1227,7 @@ class _Parser { |
} |
simpleSelectorSequence(bool forceCombinatorNone) { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
var combinatorType = TokenKind.COMBINATOR_NONE; |
var thisOperator = false; |
@@ -1301,12 +1303,12 @@ class _Parser { |
// code. |
// TODO(terry): Need to handle attribute namespace too. |
var first; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
switch (_peek()) { |
case TokenKind.ASTERISK: |
// Mark as universal namespace. |
var tok = _next(); |
- first = new Wildcard(_makeSpan(tok.start)); |
+ first = new Wildcard(_makeSpan(tok.span)); |
break; |
case TokenKind.IDENTIFIER: |
first = identifier(); |
@@ -1329,7 +1331,7 @@ class _Parser { |
case TokenKind.ASTERISK: |
// Mark as universal element |
var tok = _next(); |
- element = new Wildcard(_makeSpan(tok.start)); |
+ element = new Wildcard(_makeSpan(tok.span)); |
break; |
case TokenKind.IDENTIFIER: |
element = identifier(); |
@@ -1366,7 +1368,7 @@ class _Parser { |
*/ |
simpleSelectorTail() { |
// Check for HASH | class | attrib | pseudo | negation |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
switch (_peek()) { |
case TokenKind.HASH: |
_eat(TokenKind.HASH); |
@@ -1413,7 +1415,7 @@ class _Parser { |
} |
} |
- processPseudoSelector(int start) { |
+ processPseudoSelector(FileSpan start) { |
// :pseudo-class ::pseudo-element |
// TODO(terry): '::' should be token. |
_eat(TokenKind.COLON); |
@@ -1492,7 +1494,7 @@ class _Parser { |
* NUMBER {num} |
*/ |
processSelectorExpression() { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
var expressions = []; |
@@ -1503,12 +1505,12 @@ class _Parser { |
while (keepParsing) { |
switch (_peek()) { |
case TokenKind.PLUS: |
- start = _peekToken.start; |
+ start = _peekToken.span; |
termToken = _next(); |
expressions.add(new OperatorPlus(_makeSpan(start))); |
break; |
case TokenKind.MINUS: |
- start = _peekToken.start; |
+ start = _peekToken.span; |
termToken = _next(); |
expressions.add(new OperatorMinus(_makeSpan(start))); |
break; |
@@ -1573,7 +1575,7 @@ class _Parser { |
// |
// |
AttributeSelector processAttribute() { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
if (_maybeEat(TokenKind.LBRACK)) { |
var attrName = identifier(); |
@@ -1629,7 +1631,7 @@ class _Parser { |
Declaration processDeclaration(List dartStyles) { |
Declaration decl; |
- int start = _peekToken.start; |
+ var start = _peekToken.span; |
// IE7 hack of * before property name if so the property is IE7 or below. |
var ie7 = _peekKind(TokenKind.ASTERISK); |
@@ -1681,7 +1683,7 @@ class _Parser { |
simpleSequences.add(selector); |
} |
if (_peekKind(TokenKind.COLON)) { |
- var pseudoSelector = processPseudoSelector(_peekToken.start); |
+ var pseudoSelector = processPseudoSelector(_peekToken.span); |
if (pseudoSelector is PseudoElementSelector || |
pseudoSelector is PseudoClassSelector) { |
simpleSequences.add(pseudoSelector); |
@@ -2033,7 +2035,7 @@ class _Parser { |
// term: (see processTerm) |
// |
Expressions processExpr([bool ieFilter = false]) { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
var expressions = new Expressions(_makeSpan(start)); |
var keepGoing = true; |
@@ -2041,7 +2043,7 @@ class _Parser { |
while (keepGoing && (expr = processTerm(ieFilter)) != null) { |
var op; |
- var opStart = _peekToken.start; |
+ var opStart = _peekToken.span; |
switch (_peek()) { |
case TokenKind.SLASH: |
@@ -2053,7 +2055,7 @@ class _Parser { |
case TokenKind.BACKSLASH: |
// Backslash outside of string; detected IE8 or older signaled by \9 at |
// end of an expression. |
- var ie8Start = _peekToken.start; |
+ var ie8Start = _peekToken.span; |
_next(); |
if (_peekKind(TokenKind.INTEGER)) { |
@@ -2117,7 +2119,7 @@ class _Parser { |
// function: IDENT '(' expr ')' |
// |
processTerm([bool ieFilter = false]) { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
Token t; // token for term's value |
var value; // value of term (numeric values) |
@@ -2364,7 +2366,7 @@ class _Parser { |
} |
String processQuotedString([bool urlString = false]) { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
// URI term sucks up everything inside of quotes(' or ") or between parens |
var stopToken = urlString ? TokenKind.RPAREN : -1; |
@@ -2377,19 +2379,19 @@ class _Parser { |
switch (_peek()) { |
case TokenKind.SINGLE_QUOTE: |
stopToken = TokenKind.SINGLE_QUOTE; |
- start = _peekToken.start + 1; // Skip the quote might have whitespace. |
- _next(); // Skip the SINGLE_QUOTE. |
+ _next(); // Skip the SINGLE_QUOTE. |
+ start = _peekToken.span; |
sra1
2014/12/02 23:43:45
Will the _peekToken always have a span starting im
|
break; |
case TokenKind.DOUBLE_QUOTE: |
stopToken = TokenKind.DOUBLE_QUOTE; |
- start = _peekToken.start + 1; // Skip the quote might have whitespace. |
- _next(); // Skip the DOUBLE_QUOTE. |
+ _next(); // Skip the DOUBLE_QUOTE. |
+ start = _peekToken.span; |
break; |
default: |
if (urlString) { |
if (_peek() == TokenKind.LPAREN) { |
_next(); // Skip the LPAREN. |
- start = _peekToken.start; |
+ start = _peekToken.span; |
} |
stopToken = TokenKind.RPAREN; |
} else { |
@@ -2399,8 +2401,6 @@ class _Parser { |
} |
// Gobble up everything until we hit our stop token. |
- var runningStart = _peekToken.start; |
- |
var stringValue = new StringBuffer(); |
while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) { |
stringValue.write(_next().text); |
@@ -2426,7 +2426,7 @@ class _Parser { |
* We'll just parse everything after the 'progid:' look for the left paren |
* then parse to the right paren ignoring everything in between. |
*/ |
- processIEFilter(int startAfterProgidColon) { |
+ processIEFilter(FileSpan startAfterProgidColon) { |
var parens = 0; |
while (_peek() != TokenKind.END_OF_FILE) { |
@@ -2438,7 +2438,7 @@ class _Parser { |
case TokenKind.RPAREN: |
_eat(TokenKind.RPAREN); |
if (--parens == 0) { |
- var tok = tokenizer.makeIEFilter(startAfterProgidColon, |
+ var tok = tokenizer.makeIEFilter(startAfterProgidColon.start.offset, |
_peekToken.start); |
return new LiteralTerm(tok.text, tok.text, tok.span); |
} |
@@ -2454,7 +2454,7 @@ class _Parser { |
// function: IDENT '(' expr ')' |
// |
processFunction(Identifier func) { |
- var start = _peekToken.start; |
+ var start = _peekToken.span; |
var name = func.name; |
@@ -2519,10 +2519,10 @@ class _Parser { |
if (isChecked) { |
_warning('expected identifier, but found $tok', tok.span); |
} |
- return new Identifier("", _makeSpan(tok.start)); |
+ return new Identifier("", _makeSpan(tok.span)); |
} |
- return new Identifier(tok.text, _makeSpan(tok.start)); |
+ return new Identifier(tok.text, _makeSpan(tok.span)); |
} |
// TODO(terry): Move this to base <= 36 and into shared code. |