in lib/parser.dart [1215:1298]
List<DeclarationGroup> processMarginsDeclarations() {
var groups = <DeclarationGroup>[];
var start = _peekToken.span;
_eat(TokenKind.LBRACE);
var decls = <Declaration>[];
var dartStyles =
<DartStyleExpression>[]; // List of latest styles exposed to Dart.
do {
switch (_peek()) {
case TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER:
case TokenKind.MARGIN_DIRECTIVE_TOPLEFT:
case TokenKind.MARGIN_DIRECTIVE_TOPCENTER:
case TokenKind.MARGIN_DIRECTIVE_TOPRIGHT:
case TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER:
case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER:
case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT:
case TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER:
case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT:
case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER:
case TokenKind.MARGIN_DIRECTIVE_LEFTTOP:
case TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE:
case TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM:
case TokenKind.MARGIN_DIRECTIVE_RIGHTTOP:
case TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE:
case TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM:
// Margin syms processed.
// margin :
// margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
//
// margin_sym : @top-left-corner, @top-left, @bottom-left, etc.
var marginSym = _peek();
_next();
var declGroup = processDeclarations();
groups.add(
MarginGroup(marginSym, declGroup.declarations, _makeSpan(start)));
break;
default:
var decl = processDeclaration(dartStyles);
if (decl != null) {
if (decl.hasDartStyle) {
var newDartStyle = decl.dartStyle!;
// Replace or add latest Dart style.
var replaced = false;
for (var i = 0; i < dartStyles.length; i++) {
var dartStyle = dartStyles[i];
if (dartStyle.isSame(newDartStyle)) {
dartStyles[i] = newDartStyle;
replaced = true;
break;
}
}
if (!replaced) {
dartStyles.add(newDartStyle);
}
}
decls.add(decl);
}
_maybeEat(TokenKind.SEMICOLON);
break;
}
} while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile());
// Fixup declaration to only have dartStyle that are live for this set of
// declarations.
for (var decl in decls) {
if (decl.hasDartStyle && !dartStyles.contains(decl.dartStyle)) {
// Dart style not live, ignore these styles in this Declarations.
decl.dartStyle = null;
}
}
if (decls.isNotEmpty) {
groups.add(DeclarationGroup(decls, _makeSpan(start)));
}
return groups;
}