コード例 #1
0
 public void WriteFixedArrayInitializer(AstFixedArrayInitializer a)
 {
     Write(a.Source);
     Write(a.OptionalElementType);
     Write(a.OptionalSize);
     WriteExpressions(a.OptionalValues);
 }
コード例 #2
0
        public FixedArrayDeclaration CompileFixedArrayDeclaration(Source src, DataType dt, string name, AstFixedArrayInitializer s)
        {
            DataType   et   = null;
            Expression size = null;

            Expression[] values = null;

            if (s.OptionalElementType != null)
            {
                et = NameResolver.GetType(Namescope, s.OptionalElementType);
            }

            if (s.OptionalSize != null)
            {
                size = CompileImplicitCast(s.OptionalSize.Source, Essentials.Int, CompileExpression(s.OptionalSize));
            }

            if (s.OptionalValues != null)
            {
                values = new Expression[s.OptionalValues.Count];

                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = CompileExpression(s.OptionalValues[i]);
                }

                if (et != null)
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        values[i] = CompileImplicitCast(values[i].Source, et, values[i]);
                    }
                }
                else
                {
                    var it = TryGetImplicitElementType(values);

                    if (it == null)
                    {
                        Log.Error(s.Source, ErrorCode.E0000, "No best type found for implicitly typed fixed array");
                        it = DataType.Invalid;
                    }

                    et = it;
                }

                if (size != null)
                {
                    Compiler.ConstantFolder.TryMakeConstant(ref size);

                    if (size.ExpressionType != ExpressionType.Constant || (int)size.ConstantValue != values.Length)
                    {
                        Log.Error(size.Source, ErrorCode.E0000, "Fixed array size does not match initializer count");
                    }
                }
                else
                {
                    size = new Constant(s.Source, Essentials.Int, values.Length);
                }
            }
            else if (et == null)
            {
                Log.Error(s.Source, ErrorCode.E0000, "Must provide non-empty initializer list for implicitly typed fixed arrays");
                et = DataType.Invalid;
            }
            else if (size == null)
            {
                Log.Error(s.Source, ErrorCode.E0000, "Must provide non-empty initializer list for implicitly sized fixed arrays");
                size = new Constant(s.Source, DataType.Invalid, -1);
            }

            if (dt != null)
            {
                var fat = dt as FixedArrayType;

                if (fat == null ||
                    !fat.ElementType.Equals(et) ||
                    fat.OptionalSize != null && !fat.OptionalSize.Equals(size))
                {
                    Log.Error(src, ErrorCode.E0000, "Declaring type must be 'fixed " + et + "[" + size + "]' or 'fixed " + et + "[]'");
                }
            }

            var var = new Variable(s.Source, Function, name, new FixedArrayType(s.Source, et, size, Essentials.Int));

            CurrentVariableScope.Variables[name] = var;
            return(new FixedArrayDeclaration(var, values));
        }