/// <summary> /// Initializes a new <see cref="RuntimeWrapperObj"/> bound to a <see cref="IAccessorVisitor"/>. /// </summary> /// <param name="v">The wrapped acess visitor.</param> public RuntimeWrapperObj(IAccessorVisitor v) { if (v == null) { throw new ArgumentNullException(nameof(v)); } _value = v; }
public override Mutator AcceptExtract(IAccessorVisitor visitor) { return(visitor.Extract(this)); }
public override Mutator AcceptAssignment(IAccessorVisitor visitor, Mutator value) { return(visitor.WithAssignment(this, value)); }
public abstract Mutator AcceptExtract(IAccessorVisitor visitor);
public abstract Mutator AcceptAssignment(IAccessorVisitor visitor, Mutator value);
public override Mutator GetMutator(IAccessorVisitor visitor) { return(AcceptExtract(visitor)); }
/// <summary> /// Registers a external global object. /// </summary> /// <param name="name"> /// Name of the object including an optional namespace prefix ("System.FileSystem.FileReader"). /// Must be unique and none of its namespaces must be the same as as already registered object /// otherwise an exception is thrown. /// Must not ne null, empty, starts or ends with a dot nor contains double dots or space. /// </param> /// <param name="o">The object to register. Must not be null.</param> public void Register(string name, object o) { if (o == null) { throw new ArgumentNullException(nameof(o)); } if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException(nameof(name)); } if (name.IndexOfAny(_invalidNameChars) >= 0) { throw new ArgumentException("Invalid namespace (no white space, comma, parens allowed).", nameof(name)); } var nsName = SplitNamespace(name); List <string> validNamespaces = null; if (!string.IsNullOrEmpty(nsName.Key)) { validNamespaces = new List <string>(); // Checks that none of the above parents are objects. string ns = nsName.Key; int idx; for ( ; ;) { if (_objects.ContainsKey(ns)) { throw new ArgumentException($"Object '{nsName.Value}' cannot be registered in namespace '{nsName.Key}' since '{ns}' is already a registered object.", nameof(name)); } validNamespaces.Add(ns); idx = ns.LastIndexOf('.'); if (idx < 0) { break; } if (idx == 0 || idx == ns.Length - 1) { throw new ArgumentException("Invalid dots in namespace.", nameof(name)); } ns = ns.Substring(0, idx); } } if (_namespaces.Contains(name)) { throw new ArgumentException($"Object '{name}' is already registered as a namespace.", nameof(name)); } var oR = o as RuntimeObj; if (oR == null) { IAccessorVisitor v = o as IAccessorVisitor; oR = v != null ? new RuntimeWrapperObj(v) : Create(o); } _objects.Add(name, oR); // Time to register the valid namespaces if any. if (validNamespaces != null) { foreach (var n in validNamespaces) { _namespaces.Add(n); } } }
/// <summary> /// Evaluate an accessor or just return a mutator /// </summary> /// <param name="visitor">The context for the evaluation</param> /// <returns></returns> public abstract Mutator GetMutator(IAccessorVisitor visitor);
public override Mutator GetMutator(IAccessorVisitor visitor) { return(this); }