public void Instantiate(AstTypeReferenceType type) { Ast.Guard(type.TemplateArguments.Count() == TemplateDefinition.TemplateParameters.Count(), $"The number of template parameters do not match the TemplateDefinition {TemplateDefinition.Identifier.NativeFullName}"); Context = type.Context; this.SetIdentifier(type.Identifier.MakeCopy()); _templateArguments = new AstTemplateArgumentMap( TemplateDefinition.TemplateParameters, type.TemplateArguments); foreach (var field in TemplateDefinition.Fields) { var fieldDef = new AstTypeDefinitionStructField(); fieldDef.SetIdentifier(field.Identifier.MakeCopy()); if (field.IsTemplate) { var templateArgument = _templateArguments.LookupArgument(field.TypeReference.Identifier); Ast.Guard(templateArgument, $"No Template Argument was found for {field.TypeReference.Identifier.CanonicalFullName}"); fieldDef.SetTypeReference(templateArgument !.TypeReference.MakeCopy()); } else { fieldDef.SetTypeReference(field.TypeReference.MakeCopy()); } this.AddField(fieldDef); type.Symbol.SymbolTable.Add(fieldDef); } }
public bool TryAddField(AstTypeDefinitionStructField field) { var success = base.TryAddField(field); if (success) { SymbolTable.Add(field); } return(success); }