/// <summary> /// Creates a new anonymous type descriptor based on 'this' one, /// but having field types passed as an argument. /// </summary> internal AnonymousTypeDescriptor WithNewFieldsTypes(ImmutableArray <TypeSymbolWithAnnotations> newFieldTypes) { Debug.Assert(!newFieldTypes.IsDefault); Debug.Assert(newFieldTypes.Length == this.Fields.Length); AnonymousTypeField[] newFields = new AnonymousTypeField[this.Fields.Length]; for (int i = 0; i < newFields.Length; i++) { var field = this.Fields[i]; newFields[i] = new AnonymousTypeField(field.Name, field.Location, newFieldTypes[i]); } return(new AnonymousTypeDescriptor(newFields.AsImmutable(), this.Location)); }
internal AnonymousTypeTemplateSymbol(AnonymousTypeManager manager, AnonymousTypeDescriptor typeDescr) { this.Manager = manager; this.TypeDescriptorKey = typeDescr.Key; _smallestLocation = typeDescr.Location; // Will be set when the type's metadata is ready to be emitted, // <anonymous-type>.Name will throw exception if requested // before that moment. _nameAndIndex = null; int fieldsCount = typeDescr.Fields.Length; // members Symbol[] members = new Symbol[fieldsCount * 3 + 1]; int memberIndex = 0; // The array storing property symbols to be used in // generation of constructor and other methods if (fieldsCount > 0) { AnonymousTypePropertySymbol[] propertiesArray = new AnonymousTypePropertySymbol[fieldsCount]; TypeParameterSymbol[] typeParametersArray = new TypeParameterSymbol[fieldsCount]; // Process fields for (int fieldIndex = 0; fieldIndex < fieldsCount; fieldIndex++) { AnonymousTypeField field = typeDescr.Fields[fieldIndex]; // Add a type parameter AnonymousTypeParameterSymbol typeParameter = new AnonymousTypeParameterSymbol(this, fieldIndex, GeneratedNames.MakeAnonymousTypeParameterName(field.Name)); typeParametersArray[fieldIndex] = typeParameter; // Add a property AnonymousTypePropertySymbol property = new AnonymousTypePropertySymbol(this, field, TypeSymbolWithAnnotations.Create(typeParameter)); propertiesArray[fieldIndex] = property; // Property related symbols members[memberIndex++] = property; members[memberIndex++] = property.BackingField; members[memberIndex++] = property.GetMethod; } _typeParameters = typeParametersArray.AsImmutable(); this.Properties = propertiesArray.AsImmutable(); } else { _typeParameters = ImmutableArray <TypeParameterSymbol> .Empty; this.Properties = ImmutableArray <AnonymousTypePropertySymbol> .Empty; } // Add a constructor members[memberIndex++] = new AnonymousTypeConstructorSymbol(this, this.Properties); _members = members.AsImmutable(); Debug.Assert(memberIndex == _members.Length); // fill nameToSymbols map foreach (var symbol in _members) { _nameToSymbols.Add(symbol.Name, symbol); } // special members: Equals, GetHashCode, ToString MethodSymbol[] specialMembers = new MethodSymbol[3]; specialMembers[0] = new AnonymousTypeEqualsMethodSymbol(this); specialMembers[1] = new AnonymousTypeGetHashCodeMethodSymbol(this); specialMembers[2] = new AnonymousTypeToStringMethodSymbol(this); this.SpecialMembers = specialMembers.AsImmutable(); }
internal AnonymousTypePropertySymbol(AnonymousTypePublicSymbol container, AnonymousTypeField field) { _containingType = container; _type = field.Type; _name = field.Name; _locations = ImmutableArray.Create <Location>(field.Location); _getMethod = new AnonymousTypePropertyGetAccessorSymbol(this); _backingField = null; }
internal AnonymousTypePropertySymbol(AnonymousTypeTemplateSymbol container, AnonymousTypeField field, TypeSymbolWithAnnotations fieldTypeSymbol) { _containingType = container; _type = fieldTypeSymbol; _name = field.Name; _locations = ImmutableArray <Location> .Empty; _getMethod = new AnonymousTypePropertyGetAccessorSymbol(this); _backingField = new AnonymousTypeFieldSymbol(this); }