code: function () {
                      var s = input.charAt(i), important = false, index = i, elemIndex,
                          elements, elem, e, c, args;
  
                      if (s !== '.' && s !== '#') { return; }
  
                      save(); // stop us absorbing part of an invalid selector
  
                      while (true) {
                          elemIndex = i;
                          e = $re(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/);
                          if (!e) {
                              break;
                          }
                          elem = new(tree.Element)(c, e, elemIndex, env.currentFileInfo);
                          if (elements) { elements.push(elem); } else { elements = [ elem ]; }
                          c = $char('>');
                      }
  
                      if (elements) {
                          if ($char('(')) {
                              args = this.args(true).args;
                              expectChar(')');
                          }
  
                          if (parsers.important()) {
                              important = true;
                          }
  
                          if (parsers.end()) {
                              return new(tree.mixin.Call)(elements, args, index, env.currentFileInfo, important);
                          }
                      }
  
                      restore();
                  }
docs: A Mixin call, with an optional argument list  #mixins > .square(#fff); .rounded(4px, black); .button;  The `while` loop is there because mixins can be namespaced, but we only support the child and descendant selector for now.