docs: function () {
                      var elements = [], e, c, argsSemiColon = [], argsComma = [], args, delim, arg, nameLoop, expressions, isSemiColonSeperated, expressionContainsNamed, index = i, s = input.charAt(i), name, value, important = false;
  
                      if (s !== '.' && s !== '#') { return }
                      
                      save(); // stop us absorbing part of an invalid selector
  
                      while (e = $(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)) {
                          elements.push(new(tree.Element)(c, e, i));
                          c = $('>');
                      }
                      if ($('(')) {
                          expressions = [];
                          while (arg = $(this.expression)) {
                              nameLoop = null;
                              value = arg;
  
                              // Variable
                              if (arg.value.length == 1) {
                                  var val = arg.value[0];
                                  if (val instanceof tree.Variable) {
                                      if ($(':')) {
                                          if (expressions.length > 0) {
                                              if (isSemiColonSeperated) {
                                                  error("Cannot mix ; and , as delimiter types");
                                              }
                                              expressionContainsNamed = true;
                                          }
                                          value = expect(this.expression);
                                          nameLoop = (name = val.name);
                                      }
                                  }
                              }
                              
                              expressions.push(value);
                              
                              argsComma.push({ name: nameLoop, value: value });
                              
                              if ($(',')) {
                                  continue;
                              }
                              
                              if ($(';') || isSemiColonSeperated) {
                              
                                  if (expressionContainsNamed) {
                                      error("Cannot mix ; and , as delimiter types");
                                  }
                              
                                  isSemiColonSeperated = true;
                                                          
                                  if (expressions.length > 1) {
                                      value = new(tree.Value)(expressions);
                                  }
                                  argsSemiColon.push({ name: name, value: value });
                              
                                  name = null;
                                  expressions = [];
                                  expressionContainsNamed = false;
                              }
                          }
  
                          expect(')');
                      }
  
                      args = isSemiColonSeperated ? argsSemiColon : argsComma;
  
                      if ($(this.important)) {
                          important = true;
                      }
  
                      if (elements.length > 0 && ($(';') || peek('}'))) {
                          return new(tree.mixin.Call)(elements, args, index, env.filename, important);
                      }
                      
                      restore();
                  }