/// <summary> /// Construct a parameter symbol for a property loaded from metadata. /// </summary> /// <param name="moduleSymbol"></param> /// <param name="containingSymbol"></param> /// <param name="ordinal"></param> /// <param name="handle">The property parameter doesn't have a name in metadata, /// so this is the handle of a corresponding accessor parameter, if there is one, /// or of the ParamInfo passed in, otherwise).</param> /// <param name="isBad" /> /// <param name="parameter"></param> internal static PEParameterSymbol Create( PEModuleSymbol moduleSymbol, PEPropertySymbol containingSymbol, int ordinal, ParameterHandle handle, ParamInfo <TypeSymbol> parameter, out bool isBad) { return(Create(moduleSymbol, containingSymbol, ordinal, parameter.IsByRef, parameter.Type, handle, parameter.CustomModifiers, out isBad)); }
private static ImmutableArray <ParameterSymbol> GetParameters( PEModuleSymbol moduleSymbol, PEPropertySymbol property, ParamInfo <TypeSymbol>[] propertyParams, ParamInfo <TypeSymbol>[] accessorParams, out bool anyParameterIsBad) { anyParameterIsBad = false; // First parameter is the property type. if (propertyParams.Length < 2) { return(ImmutableArray <ParameterSymbol> .Empty); } var numAccessorParams = accessorParams.Length; var parameters = new ParameterSymbol[propertyParams.Length - 1]; for (int i = 1; i < propertyParams.Length; i++) // from 1 to skip property/return type { // NOTE: this is a best guess at the Dev10 behavior. The actual behavior is // in the unmanaged helper code that Dev10 uses to load the metadata. var propertyParam = propertyParams[i]; var paramHandle = i < numAccessorParams ? accessorParams[i].Handle : propertyParam.Handle; var ordinal = i - 1; bool isBad; parameters[ordinal] = PEParameterSymbol.Create(moduleSymbol, property, ordinal, paramHandle, propertyParam, out isBad); if (isBad) { anyParameterIsBad = true; } } return(parameters.AsImmutableOrNull()); }
/// <summary> /// Associate the method with a particular property. Returns /// false if the method is already associated with a property or event. /// </summary> internal bool SetAssociatedProperty(PEPropertySymbol propertySymbol, MethodKind methodKind) { Debug.Assert((methodKind == MethodKind.PropertyGet) || (methodKind == MethodKind.PropertySet)); return(this.SetAssociatedPropertyOrEvent(propertySymbol, methodKind)); }
private static ImmutableArray<ParameterSymbol> GetParameters( PEModuleSymbol moduleSymbol, PEPropertySymbol property, ParamInfo<TypeSymbol>[] propertyParams, ParamInfo<TypeSymbol>[] accessorParams, out bool anyParameterIsBad) { anyParameterIsBad = false; // First parameter is the property type. if (propertyParams.Length < 2) { return ImmutableArray<ParameterSymbol>.Empty; } var numAccessorParams = accessorParams.Length; var parameters = new ParameterSymbol[propertyParams.Length - 1]; for (int i = 1; i < propertyParams.Length; i++) // from 1 to skip property/return type { // NOTE: this is a best guess at the Dev10 behavior. The actual behavior is // in the unmanaged helper code that Dev10 uses to load the metadata. var propertyParam = propertyParams[i]; var paramHandle = i < numAccessorParams ? accessorParams[i].Handle : propertyParam.Handle; var ordinal = i - 1; bool isBad; parameters[ordinal] = PEParameterSymbol.Create(moduleSymbol, property, ordinal, paramHandle, propertyParam, out isBad); if (isBad) { anyParameterIsBad = true; } } return parameters.AsImmutableOrNull(); }
/// <summary> /// Construct a parameter symbol for a property loaded from metadata. /// </summary> /// <param name="moduleSymbol"></param> /// <param name="containingSymbol"></param> /// <param name="ordinal"></param> /// <param name="handle">The property parameter doesn't have a name in metadata, /// so this is the handle of a corresponding accessor parameter, if there is one, /// or of the ParamInfo passed in, otherwise).</param> /// <param name="isBad" /> /// <param name="parameter"></param> internal static PEParameterSymbol Create( PEModuleSymbol moduleSymbol, PEPropertySymbol containingSymbol, int ordinal, ParameterHandle handle, ParamInfo<TypeSymbol> parameter, out bool isBad) { return Create(moduleSymbol, containingSymbol, ordinal, parameter.IsByRef, parameter.CountOfCustomModifiersPrecedingByRef, parameter.Type, handle, parameter.CustomModifiers, out isBad); }