Beispiel #1
0
        protected override IType ValidateExpr(Environment env)
        {
            EnsureValidBinding(env);

            if (!(Binding.Type is IFunctionType func))
            {
                throw new TranspilationException($"Cannot invoke non-invokable '{Name}'", Location);
            }

            AssertParameterCount(func);

            Exprs.ForEach(expr => expr.Validate(env));

            if (func is GenericFunctionWrapper wrapper)
            {
                func = SpecifyFunc(wrapper, env);
            }
            else if (Handle != null)
            {
                throw new TranspilationException($"Cannot specify generic types for non-generic function '{Name}'.", Location);
            }

            foreach (var(expr, type) in Exprs.Zip(func.ParameterTypes))
            {
                expr.AssertType(type);
            }

            // We re-assign the name such that it will be converted properly
            Name = Binding?.Name ?? Name;

            return(func.ReturnType);
        }
Beispiel #2
0
        public object ToEnumerableLoop(BindingCallExpr expr)
        {
            var token          = expr.ParamList[2] as TokenData;
            var varname        = (string)expr.ParamList[0];
            var enableWith     = (bool)expr.ParamList[1];
            var collectionName = varname + "s";
            var varExpr        = Exprs.Ident(collectionName, token);
            var loopexpr       = Exprs.ForEach(varname, varExpr, token);

            ((BlockExpr)loopexpr).EnableAutoVariable = enableWith;
            return(loopexpr);
        }
Beispiel #3
0
        /// <summary>
        /// return value;
        /// </summary>
        /// <returns></returns>
        private Expr ParseForIn()
        {
            var startToken = _tokenIt.NextToken;
            var varname    = _tokenIt.ExpectId();

            _tokenIt.Expect(Tokens.In);
            var sourcename = _tokenIt.ExpectId();

            _tokenIt.Expect(Tokens.RightParenthesis);
            var stmt = Exprs.ForEach(varname, new ConstantExpr(sourcename), startToken) as BlockExpr;

            ParseBlock(stmt);
            return(stmt);
        }