private FunctionPointerTypeSymbol SubstituteFunctionPointerType(FunctionPointerTypeSymbol f) { var substitutedReturnType = f.Signature.ReturnTypeWithAnnotations.SubstituteType(this); var refCustomModifiers = f.Signature.RefCustomModifiers; var substitutedRefCustomModifiers = SubstituteCustomModifiers(refCustomModifiers); var parameterTypesWithAnnotations = f.Signature.ParameterTypesWithAnnotations; ImmutableArray <TypeWithAnnotations> substitutedParamTypes = SubstituteTypes( parameterTypesWithAnnotations ); ImmutableArray <ImmutableArray <CustomModifier> > substitutedParamModifiers = default; var paramCount = f.Signature.Parameters.Length; if (paramCount > 0) { var builder = ArrayBuilder <ImmutableArray <CustomModifier> > .GetInstance(paramCount); bool didSubstitute = false; foreach (var param in f.Signature.Parameters) { var substituted = SubstituteCustomModifiers(param.RefCustomModifiers); builder.Add(substituted); if (substituted != param.RefCustomModifiers) { didSubstitute = true; } } if (didSubstitute) { substitutedParamModifiers = builder.ToImmutableAndFree(); } else { builder.Free(); } } if ( substitutedParamTypes != parameterTypesWithAnnotations || !substitutedParamModifiers.IsDefault || !f.Signature.ReturnTypeWithAnnotations.IsSameAs(substitutedReturnType) || substitutedRefCustomModifiers != refCustomModifiers ) { f = f.SubstituteTypeSymbol( substitutedReturnType, substitutedParamTypes, refCustomModifiers, substitutedParamModifiers ); } return(f); }