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);
            }
        }
Exemple #2
0
        public bool TryAddField(AstTypeDefinitionStructField field)
        {
            var success = base.TryAddField(field);

            if (success)
            {
                SymbolTable.Add(field);
            }

            return(success);
        }