@@ -962,6 +962,8 @@ abstract class StylesheetParser extends Parser {
962
962
hiddenVariables = members.item2;
963
963
}
964
964
965
+ var configuration = _configuration (allowGuarded: true );
966
+
965
967
expectStatementSeparator ("@forward rule" );
966
968
var span = scanner.spanFrom (start);
967
969
if (! _isUseAllowed) {
@@ -971,13 +973,14 @@ abstract class StylesheetParser extends Parser {
971
973
if (shownMixinsAndFunctions != null ) {
972
974
return ForwardRule .show (
973
975
url, shownMixinsAndFunctions, shownVariables, span,
974
- prefix: prefix);
976
+ prefix: prefix, configuration : configuration );
975
977
} else if (hiddenMixinsAndFunctions != null ) {
976
978
return ForwardRule .hide (
977
979
url, hiddenMixinsAndFunctions, hiddenVariables, span,
978
- prefix: prefix);
980
+ prefix: prefix, configuration : configuration );
979
981
} else {
980
- return ForwardRule (url, span, prefix: prefix);
982
+ return ForwardRule (url, span,
983
+ prefix: prefix, configuration: configuration);
981
984
}
982
985
}
983
986
@@ -1350,7 +1353,7 @@ relase. For details, see http://bit.ly/moz-document.
1350
1353
1351
1354
var namespace = _useNamespace (url, start);
1352
1355
whitespace ();
1353
- var configuration = _useConfiguration ();
1356
+ var configuration = _configuration ();
1354
1357
1355
1358
expectStatementSeparator ("@use rule" );
1356
1359
@@ -1381,14 +1384,18 @@ relase. For details, see http://bit.ly/moz-document.
1381
1384
}
1382
1385
}
1383
1386
1384
- /// Returns the map from variable names to expressions from a `@use` rule's
1385
- /// `with` clause.
1387
+ /// Returns the list of configured variables from a `@use` or `@forward`
1388
+ /// rule's `with` clause.
1389
+ ///
1390
+ /// If `allowGuarded` is `true` , this will allow configured variable with the
1391
+ /// `!default` flag.
1386
1392
///
1387
1393
/// Returns `null` if there is no `with` clause.
1388
- Map < String , Tuple2 < Expression , FileSpan >> _useConfiguration ( ) {
1394
+ List < ConfiguredVariable > _configuration ({ bool allowGuarded = false } ) {
1389
1395
if (! scanIdentifier ("with" )) return null ;
1390
1396
1391
- var configuration = < String , Tuple2 <Expression , FileSpan >> {};
1397
+ var variableNames = < String > {};
1398
+ var configuration = < ConfiguredVariable > [];
1392
1399
whitespace ();
1393
1400
scanner.expectChar ($lparen);
1394
1401
@@ -1401,12 +1408,25 @@ relase. For details, see http://bit.ly/moz-document.
1401
1408
scanner.expectChar ($colon);
1402
1409
whitespace ();
1403
1410
var expression = _expressionUntilComma ();
1404
- var span = scanner.spanFrom (variableStart);
1405
1411
1406
- if (configuration.containsKey (name)) {
1412
+ var guarded = false ;
1413
+ var flagStart = scanner.state;
1414
+ if (allowGuarded && scanner.scanChar ($exclamation)) {
1415
+ var flag = identifier ();
1416
+ if (flag == 'default' ) {
1417
+ guarded = true ;
1418
+ } else {
1419
+ error ("Invalid flag name." , scanner.spanFrom (flagStart));
1420
+ }
1421
+ }
1422
+
1423
+ var span = scanner.spanFrom (variableStart);
1424
+ if (variableNames.contains (name)) {
1407
1425
error ("The same variable may only be configured once." , span);
1408
1426
}
1409
- configuration[name] = Tuple2 (expression, span);
1427
+ variableNames.add (name);
1428
+ configuration
1429
+ .add (ConfiguredVariable (name, expression, span, guarded: guarded));
1410
1430
1411
1431
if (! scanner.scanChar ($comma)) break ;
1412
1432
whitespace ();
0 commit comments