variableCall method

Node variableCall ([String parsedName ])

Call a variable value to retrieve a detached ruleset or a value from a detached ruleset's rules.

@fink();
@fink;
color: @fink[@color];

Implementation

Node variableCall([String parsedName]) {
  final int index = parserInput.i;
  final bool inValue = parsedName != null;
  String name = parsedName;
  List<String> lsName; // Each () matched in regExp

  parserInput.save();
  if (inValue ||
      (parserInput.currentChar() == '@' &&
          (lsName = parserInput.$re(_variableCallRegExp)) != null)) {
    final List<String> lookups = mixin.ruleLookups();

    if (lookups == null &&
        ((inValue && parserInput.$str('()') != '()') ||
            (lsName?.elementAt(2) != '()'))) {
      // lsName[2]
      parserInput.restore("Missing '[...]' lookup in variable call");
      return null;
    }

    if (!inValue) name = lsName[1];

    final VariableCall call = VariableCall(name, index, fileInfo);

    if (!inValue && end()) {
      parserInput.forget();
      return call;
    } else {
      parserInput.forget();
      return NamespaceValue(call, lookups, index: index, fileInfo: fileInfo);
    }
  }

  parserInput.restore();
  return null;

// 3.10.3 20190923
//  variableCall: function (parsedName) {
//      let lookups;
//      const i = parserInput.i;
//      const inValue = !!parsedName;
//      let name = parsedName;
//
//      parserInput.save();
//
//      if (name || (parserInput.currentChar() === '@'
//          && (name = parserInput.$re(/^(@[\w-]+)(\(\s*\))?/)))) {
//
//          lookups = this.mixin.ruleLookups();
//
//          if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {
//              parserInput.restore('Missing \'[...]\' lookup in variable call');
//              return;
//          }
//
//          if (!inValue) {
//              name = name[1];
//          }
//
//          const call = new tree.VariableCall(name, i, fileInfo);
//          if (!inValue && parsers.end()) {
//              parserInput.forget();
//              return call;
//          }
//          else {
//              parserInput.forget();
//              return new tree.NamespaceValue(call, lookups, i, fileInfo);
//          }
//      }
//
//      parserInput.restore();
//  },
}