protected override void OnDeserialized() { base.OnDeserialized(); if (Outputs.All(p => p.AssetId != Blockchain.AntShare.Hash)) { throw new FormatException(); } }
public override IFunction CallInternal(IFunction[] arguments, string output, CompilationContext context) { if (IsNamespace && arguments.Length == 0) { return(CompileIntermediate(arguments, output, context)); } else if (IsNamespace && !IsClass) { return(context.LogError($"This is a Namespace, so it has no constructor")); } if (IsClass && arguments.Length == Inputs.Length && Outputs.All(p => p.Name != output) && NamespaceMembers.Contains(output)) { var memberFunction = CompileIntermediate(Array.Empty <IFunction>(), output, context); if (memberFunction.Inputs.Length > 0 && memberFunction.Inputs[0].Name == "this") { var classInstance = this.Call(arguments, context); return(classInstance.AsMethod(memberFunction, MakeCallSite(Ast), context)); } } context.Push(MakeCallSite(Ast)); if (this.CheckArguments(arguments, output, context) != null) { context.Pop(); return(Error.Instance); } context.Pop(); if (IsClass) { return(arguments[Array.FindIndex(Outputs, p => p.Name == output)]); } var outputPort = Outputs.First(p => p.Name == output); var outValue = CompileIntermediate(arguments, output, context); var success = outputPort.Type.SatisfiedBy(outValue, context); return(success switch { false => context.LogError("ELE0008", $"Output `{outputPort}` was not satisfied by its value `{outValue}` (See previous errors)"), null => Error.Instance, _ => outValue });