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);
}
}
}
}