Exemplo n.º 1
0
 protected override void OnDeserialized()
 {
     base.OnDeserialized();
     if (Outputs.All(p => p.AssetId != Blockchain.AntShare.Hash))
     {
         throw new FormatException();
     }
 }
Exemplo n.º 2
0
        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
            });