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); }
public ForeignFunctionDeclaration(PtUseFfi source, string name, ForeignParameters parameters, IType result) { Source = source; Name = name; Parameters = parameters; Result = result; }
public UseForeignFunction(PtUseFfi source, ForeignFunctionDeclaration function) { Source = source; Function = function; }
protected virtual void DoVisit(PtUseFfi node) => VisitChildren(node);
protected override void DoVisit(PtUseFfi node) { Ffis.Add($"use {node.FfiName}"); }
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)); }