Esempio n. 1
0
        public static StandardFunction FromContext(SSLParser.StandardFunctionContext ctx, SSLVisitor vis)
        {
            var rtype = ReflectionUtils.TranslateTypeContext(ctx.type());
            var fname = ctx.Name.Text;

            List <Param> pars = new List <Param>();

            if (ctx.Params != null)
            {
                foreach (var pctx in ctx.Params._PList)
                {
                    var pname = pctx.Name.Text;
                    var aidx  = pctx.Access?.Type ?? SSLParser.KW_IN;
                    var acs   = (aidx == SSLParser.KW_OUT) ? Access.Out : (aidx == SSLParser.KW_INOUT) ? Access.InOut : Access.In;
                    var ptype = ReflectionUtils.TranslateTypeContext(pctx.type());
                    if (ptype == ShaderType.Void)
                    {
                        vis.Error(ctx, $"The parameter '{pname}' cannot have type 'void'.");
                    }
                    var fidx = pars.FindIndex(ep => ep.Name == pname);
                    if (fidx != -1)
                    {
                        vis.Error(ctx, $"Duplicate parameter name '{pname}' in the function parameter list.");
                    }
                    pars.Add(new Param {
                        Name = pname, Type = ptype.Value, Access = acs
                    });
                }
            }

            return(new StandardFunction(fname, rtype.Value, pars.ToArray()));
        }
Esempio n. 2
0
        public StandardFunction AddFunction(SSLParser.StandardFunctionContext ctx, SSLVisitor vis)
        {
            var func = StandardFunction.FromContext(ctx, vis);

            var pre = FindFunction(func.Name);

            if (pre != null)
            {
                vis.Error(ctx, $"A function with the name '{func.Name}' already exists in the shader.");
            }

            _functions.Add(func.Name, func);
            return(func);
        }