ZoneCodeGenerator: Make setting a dynamic array size only possible if the targeted member is the last entry of its structure

This commit is contained in:
Jan 2019-12-22 16:15:45 +01:00
parent 57ef79692a
commit ec8c00a4b9

View File

@ -26,13 +26,12 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests
public TestArraySize() : base(matchers) public TestArraySize() : base(matchers)
{ {
} }
protected override void ProcessMatch(ICommandParserState state) protected override void ProcessMatch(ICommandParserState state)
{ {
var typeName = NextMatch(TypeNameToken); var typeName = NextMatch(TypeNameToken);
var typeNameParts = typeName.Split(new[] { "::" }, StringSplitOptions.None); var typeNameParts = typeName.Split(new[] {"::"}, StringSplitOptions.None);
if (state.DataTypeInUse != null if (state.DataTypeInUse != null
&& state.GetMembersFromParts(typeNameParts, state.DataTypeInUse, out var typeMembers)) && state.GetMembersFromParts(typeNameParts, state.DataTypeInUse, out var typeMembers))
{ {
@ -62,6 +61,13 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests
var reference = referencedMember.Member.VariableType.References.OfType<ReferenceTypeArray>() var reference = referencedMember.Member.VariableType.References.OfType<ReferenceTypeArray>()
.FirstOrDefault(); .FirstOrDefault();
if (!referencedMember.Parent.IsUnion &&
referencedMember.Parent.Type.Members.Last() != referencedMember.Member)
{
throw new TestFailedException(
"Cannot change the array size of a member that is not the last member of its structure.");
}
if (reference != null) if (reference != null)
reference.DynamicSize = evaluation; reference.DynamicSize = evaluation;
else else
@ -74,10 +80,10 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests
if (state.DataTypeInUse != null if (state.DataTypeInUse != null
&& state.DataTypeInUse != referencedType) && state.DataTypeInUse != referencedType)
{ {
return new[] { state.DataTypeInUse, referencedType }; return new[] {state.DataTypeInUse, referencedType};
} }
return new[] { referencedType }; return new[] {referencedType};
} }
} }
} }