extend method

List<Extend> extend ({bool isRule: false })

extend syntax - used to extend selectors:

:extend( )

Implementation

List<Extend> extend({bool isRule = false}) {
  Element e;
  List<Element> elements;
  List<Extend> extendedList;
  final int index = parserInput.i;
  String option;

  if (parserInput.$str(isRule ? '&:extend(' : ':extend(') == null) {
    return null;
  }

  do {
    option = null;
    elements = null;
    while ((option = parserInput.$re(_extendRegExp, 1)) == null) {
      e = element();
      if (e == null) break;

      (elements ??= <Element>[]).add(e);
    }

    if (elements == null) {
      parserInput.error('Missing target selector for :extend().');
    }

    (extendedList ??= <Extend>[])
        .add(Extend(Selector(elements), option, index, fileInfo));
  } while (parserInput.$char(',') != null);

  parserInput.expectChar(')');
  if (isRule) parserInput.expectChar(';');

  return extendedList;

//2.5.3 20151120
//
// // extend syntax - used to extend selectors
// //
// extend: function(isRule) {
//     var elements, e, index = parserInput.i, option, extendList, extend;
//
//     if (!parserInput.$str(isRule ? "&:extend(" : ":extend(")) {
//         return;
//     }
//
//     do {
//         option = null;
//         elements = null;
//         while (! (option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) {
//             e = this.element();
//             if (!e) {
//                 break;
//             }
//             if (elements) {
//                 elements.push(e);
//             } else {
//                 elements = [ e ];
//             }
//         }
//
//         option = option && option[1];
//         if (!elements) {
//             error("Missing target selector for :extend().");
//         }
//         extend = new(tree.Extend)(new(tree.Selector)(elements), option, index);
//         if (extendList) {
//             extendList.push(extend);
//         } else {
//             extendList = [ extend ];
//         }
//     } while (parserInput.$char(","));
//
//     expect(/^\)/);
//
//     if (isRule) {
//         expect(/^;/);
//     }
//
//     return extendList;
// },
}