BFSchema.TypeChecking.Check C# (CSharp) Method

Check() public method

public Check ( BinaryFileSchema schema ) : void
schema BinaryFileSchema
return void
        public void Check( BinaryFileSchema schema )
        {
            foreach (IBfsDataBlock block in schema.DatablockList)
            {
                //Assignment expressions on local variables
                foreach (BfsLocalField local in block.LocalFieldList)
                    if (local.AssignmentExpression != null)
                    {
                        if (local.PrimitiveType.ArrayExtension != null)
                            BfsCompiler.ReportError(local.SourceRange,
                                "Local variables with array extensions cannot have assignment expressions.");

                        CheckExpression(local.AssignmentExpression, block);
                        CheckAssignment(local.SourceRange, local.PrimitiveType.PrimitiveType, local.AssignmentExpression.PrimitiveType);
                    }

                //Check conditional expressions + array extensions
                if (block is IBfsStructType)
                {
                    IBfsStructType structType = (IBfsStructType)block;
                    foreach (BfsStructField field in structType.StructFields.Values)
                    {
                        if (field.Conditional != null)
                        {
                            CheckExpression(field.Conditional, block);
                            if (field.Conditional.PrimitiveType != BfsPrimitiveTypeEnum.Bool)
                                BfsCompiler.ReportError(field.Conditional.SourceRange,
                                    "The conditional isn't of boolean type!");
                        }

                        if (field.FieldType.ArrayExtension != null && field.FieldType.ArrayExtension is BfsKnownArray)
                        {
                            BfsKnownArray arr = field.FieldType.ArrayExtension as BfsKnownArray;
                            CheckExpression(arr.Expression, block);
                            if (arr.Expression.PrimitiveType <= BfsPrimitiveTypeEnum.Bool
                                && arr.Expression.PrimitiveType != BfsPrimitiveTypeEnum.CallExpression)
                                BfsCompiler.ReportError(arr.SourceRange,
                                    "Unsuitable type for array-extension: " + arr.Expression.PrimitiveType );
                        }
                    }
                }
                // All the expressions in action-lists for both Enums and BitFields
                else if (block is BfsEnum)
                {
                    foreach (BfsEnumField field in (block as BfsEnum).EnumFields)
                        if (field.Actions != null)
                            foreach (IBfsAction action in field.Actions)
                                if (action is BfsActionAssignment)
                                {
                                    BfsActionAssignment a = action as BfsActionAssignment;
                                    CheckExpression(a.Expression, block);
                                    CheckAssignment(a.SourceRange, a.LocalVariable.PrimitiveType.PrimitiveType, a.Expression.PrimitiveType);
                                }
                }
                else if (block is BfsBitfield)
                {
                    foreach (BfsBitfieldField field in (block as BfsBitfield).BitFieldFields)
                        if (field.Actions != null)
                            foreach (IBfsAction action in field.Actions)
                                if (action is BfsActionAssignment)
                                {
                                    BfsActionAssignment a = action as BfsActionAssignment;
                                    CheckExpression(a.Expression, block);
                                    CheckAssignment(a.SourceRange, a.LocalVariable.PrimitiveType.PrimitiveType, a.Expression.PrimitiveType);
                                }
                }
            }
        }