ZoneCodeGenerator: Fix forward declarations not being resolved for typedefs

This commit is contained in:
Jan 2019-12-05 02:54:56 +01:00
parent ffda895f95
commit 42e571427b
2 changed files with 30 additions and 15 deletions

View File

@ -79,7 +79,8 @@ namespace ZoneCodeGenerator.Parsing.C_Header.Impl
var existingForwardDeclaration = forwardDeclarations[forwardDeclaration.FullName]; var existingForwardDeclaration = forwardDeclarations[forwardDeclaration.FullName];
if (existingForwardDeclaration.Type != forwardDeclaration.Type) if (existingForwardDeclaration.Type != forwardDeclaration.Type)
throw new ParserException($"Forward declaration of type '{forwardDeclaration.FullName}' already done with different type."); throw new ParserException(
$"Forward declaration of type '{forwardDeclaration.FullName}' already done with different type.");
} }
else else
{ {
@ -91,7 +92,8 @@ namespace ZoneCodeGenerator.Parsing.C_Header.Impl
{ {
var currentNamespaceTypename = Namespace.Combine(CurrentNamespace, typename); var currentNamespaceTypename = Namespace.Combine(CurrentNamespace, typename);
var baseType = DataTypeBaseType.BASE_TYPES.FirstOrDefault(databaseBaseType => databaseBaseType.Name.Equals(typename)); var baseType =
DataTypeBaseType.BASE_TYPES.FirstOrDefault(databaseBaseType => databaseBaseType.Name.Equals(typename));
if (baseType != null) if (baseType != null)
return baseType; return baseType;
@ -159,14 +161,20 @@ namespace ZoneCodeGenerator.Parsing.C_Header.Impl
foreach (var dataType in dataTypes.Values) foreach (var dataType in dataTypes.Values)
{ {
if (!(dataType is DataTypeWithMembers dataTypeWithMembers)) continue; if (dataType is DataTypeWithMembers dataTypeWithMembers)
{
foreach (var variable in dataTypeWithMembers.Members) foreach (var variable in dataTypeWithMembers.Members)
{ {
if (variable.VariableType.Type is ForwardDeclaration forwardDeclaration) if (variable.VariableType.Type is ForwardDeclaration forwardDeclaration)
variable.VariableType.Type = forwardDeclaration.ForwardedType; variable.VariableType.Type = forwardDeclaration.ForwardedType;
} }
} }
else if (dataType is DataTypeTypedef typeDef)
{
if (typeDef.TypeDefinition.Type is ForwardDeclaration forwardDeclaration)
typeDef.TypeDefinition.Type = forwardDeclaration.ForwardedType;
}
}
} }
public void FinishAndSaveTo(IDataRepository dataRepository) public void FinishAndSaveTo(IDataRepository dataRepository)

View File

@ -112,7 +112,14 @@ namespace ZoneCodeGenerator.Persistence
{ {
StructureInformation memberStructureInformation = null; StructureInformation memberStructureInformation = null;
if (member.VariableType.Type is DataTypeWithMembers memberType) var memberDataType = member.VariableType.Type;
while (memberDataType is DataTypeTypedef typedef)
{
memberDataType = typedef.TypeDefinition.Type;
}
if (memberDataType is DataTypeWithMembers memberType)
{ {
memberStructureInformation = GetInformationFor(memberType); memberStructureInformation = GetInformationFor(memberType);
} }