memberSet method

  1. @override
void memberSet(
  1. String id,
  2. dynamic value, {
  3. String? from,
  4. bool defineIfAbsent = false,
})
override

Set the value of a static member of this HTClass via memberGet operator '.' for symbol searching, use the same name method on HTClassNamespace instead.

Implementation

@override
void memberSet(String id, dynamic value,
    {String? from, bool defineIfAbsent = false}) {
  final setter = '${InternalIdentifier.setter}$id';

  if (isExternal) {
    externalClass!.memberSet('$id.$id', value);
    return;
  } else {
    if (namespace.symbols.containsKey(id)) {
      final decl = namespace.symbols[id];
      if (decl is HTDeclaration) {
        if (decl.isStatic) {
          if (decl.isPrivate &&
              from != null &&
              !from.startsWith(namespace.fullName)) {
            throw HTError.privateMember(id);
          }
          decl.resolve();
          decl.value = value;
          return;
        }
      } else {
        if (interpreter.lexicon.isPrivate(id) &&
            from != null &&
            !from.startsWith(namespace.fullName)) {
          throw HTError.privateMember(id);
        }
        namespace.symbols[id] = value;
        return;
      }
      // TODO: non-static error prompt
    } else if (namespace.symbols.containsKey(setter)) {
      final decl = namespace.symbols[setter];
      if (decl is! HTFunction) return;
      if (decl.isStatic) {
        if (decl.isPrivate &&
            from != null &&
            !from.startsWith(namespace.fullName)) {
          throw HTError.privateMember(id);
        }
        decl.resolve();
        decl.call(positionalArgs: [value]);
        return;
      }
      // TODO: non-static error prompt
    }
  }

  throw HTError.undefined(id,
      filename: interpreter.currentFile,
      line: interpreter.currentLine,
      column: interpreter.currentColumn);
}