Ejemplo n.º 1
0
        private PtUse?TryUse()
        {
            if (MayBegin(TK.Use))
            {
                var name = TryUseName();

                if (Iss(TK.At))
                {
                    Match(TK.At);
                    var ffiName    = FfiName();
                    var returnType = TypeArguments();
                    var parameters = Parameters();
                    var partial    = MayPartial();
                    var guard      = TryUseGuard();

                    var use = new PtUseFfi(End(), name, ffiName, returnType, parameters, partial, guard);

                    return(use);
                }
                else if (Iss(TK.String))
                {
                    var uri   = String();
                    var guard = TryUseGuard();
                    return(new PtUseUri(End(), name, uri, guard));
                }
            }

            return(null);
        }
Ejemplo n.º 2
0
 public ForeignFunctionDeclaration(PtUseFfi source, string name, ForeignParameters parameters, IType result)
 {
     Source     = source;
     Name       = name;
     Parameters = parameters;
     Result     = result;
 }
Ejemplo n.º 3
0
 public UseForeignFunction(PtUseFfi source, ForeignFunctionDeclaration function)
 {
     Source   = source;
     Function = function;
 }
Ejemplo n.º 4
0
 protected virtual void DoVisit(PtUseFfi node) => VisitChildren(node);
Ejemplo n.º 5
0
 protected override void DoVisit(PtUseFfi node)
 {
     Ffis.Add($"use {node.FfiName}");
 }
Ejemplo n.º 6
0
        private IUse DecodeUseFfi(PtUseFfi use)
        {
            if (use.Name != null)
            {
                throw new System.NotImplementedException();
            }
            if (use.Partial)
            {
                throw new System.NotImplementedException();
            }

            string name;

            if (use.FfiName.Name is PtString str)
            {
                name = str.Value;
            }
            else if (use.FfiName.Name is PtIdentifier id)
            {
                name = id.Value;
            }
            else
            {
                throw new System.InvalidOperationException();
            }

            if (use.TypeArguments.Arguments.Count != 1)
            {
                Errors.Help.Add(
                    use.TypeArguments.Span,
                    ErrNo.Err005,
                    "return of a foreign function call must have exactly one type");
            }

            var result = new AnyType(use.TypeArguments.Arguments[0]);

            var  items    = new List <Parameter>();
            bool ellipsis = false;

            foreach (var prm in use.Parameters.Items)
            {
                if (ellipsis)
                {
                    Errors.Help.Add(
                        use.Parameters.Items.OfType <PtEllipsisParameter>().First().Span,
                        ErrNo.Err004,
                        "ellipis ``...´´ must be last in foreign function declaration");
                }
                switch (prm)
                {
                case PtEllipsisParameter ell:
                    ellipsis = true;
                    break;

                case PtRegularParameter reg:
                    items.Add(new Parameter(reg, reg.Name.Value, new AnyType(reg.Type), reg.Value == null ? null : new AnyExpression(reg.Value)));
                    break;
                }
            }

            var parameters = new ForeignParameters(use.Parameters, items, ellipsis);

            var function = new ForeignFunctionDeclaration(use, name, parameters, result);

            return(new UseForeignFunction(use, function));
        }