Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Unified Diff: pkg/csslib/lib/parser.dart

Issue 751453004: Improve the speed and memory efficiency of csslib parsing. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/csslib/CHANGELOG.md ('k') | pkg/csslib/lib/src/token.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « pkg/csslib/CHANGELOG.md ('k') | pkg/csslib/lib/src/token.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698