public class FSharpMethodParameter()

in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpMethodParameter.cs [15:99]


  public class FSharpMethodParameter([NotNull] IFSharpParameterOwner owner, FSharpParameterIndex index)
    : FSharpMethodParameterBase(owner, index)
  {
    [CanBeNull]
    public FSharpParameter FcsParameter
    {
      get
      {
        if (Owner is not IFSharpMember { Mfv.CurriedParameterGroups: var fcsParamGroups })
          return null;

        var paramGroup = fcsParamGroups.ElementAtOrDefault(FSharpIndex.GroupIndex);
        if (paramGroup == null)
          return null;

        if (FSharpIndex.ParameterIndex is not { } paramIndex)
          return paramGroup.Count == 1 ? paramGroup[0] : null;

        return paramGroup.ElementAtOrDefault(paramIndex);
      }
    }

    public override IType Type =>
      Owner is IFSharpTypeParametersOwner fsTypeParamOwner && FcsParameter is { } fcsParam
        ? fcsParam.Type.MapType(fsTypeParamOwner.AllTypeParameters, Module, true)
        : TypeFactory.CreateUnknownType(Module);

    public override string ShortName =>
      FcsParameter?.DisplayName is { } name && !name.RemoveBackticks().IsEmpty()
        ? name
        : SharedImplUtil.MISSING_DECLARATION_NAME;

    public override string SourceName => ShortName; // todo: calc from decl

    public override bool HasAttributeInstance(IClrTypeName clrName, AttributesSource attributesSource) =>
      FcsParameter?.Attributes.HasAttributeInstance(clrName.FullName) ?? false;

    public override IList<IAttributeInstance> GetAttributeInstances(AttributesSource attributesSource) =>
      FcsParameter?.Attributes.ToAttributeInstances(Module) ?? EmptyList<IAttributeInstance>.Instance;

    public override IList<IAttributeInstance> GetAttributeInstances(IClrTypeName clrName,
      AttributesSource attributesSource) =>
      FcsParameter?.Attributes.GetAttributes(clrName.FullName).ToAttributeInstances(Module) ??
      EmptyList<IAttributeInstance>.Instance;

    public override DefaultValue GetDefaultValue()
    {
      bool IsDefaultParamValueAttr(FSharpAttribute a) =>
        a.GetClrNameFullName() == PredefinedType.DEFAULTPARAMETERVALUE_ATTRIBUTE_CLASS.FullName;

      try
      {
        // todo: implement DefaultValue in FCS
        var defaultValueFcsAttr = FcsParameter?.Attributes.FirstOrDefault(IsDefaultParamValueAttr);
        var defaultValue = defaultValueFcsAttr?.ConstructorArguments.FirstOrDefault();
        return defaultValue != null
          ? new DefaultValue(Type, ConstantValue.Create(defaultValue.Item2, Type))
          : new DefaultValue(Type, Type);
      }
      // todo: change exception in FCS
      catch (Exception)
      {
        return DefaultValue.BAD_VALUE;
      }
    }

    public override ParameterKind Kind => FcsParameter?.MapParameterKind() ?? ParameterKind.VALUE;
    public override bool IsParams => IsParameterArray;

    public override bool IsParameterArray =>
      Owner is IFSharpFunction && FcsParameter is { IsParamArrayArg: true };

    public override bool IsParameterCollection => false;

    // todo: implement IsCliOptional in FCS
    public override bool IsOptional =>
      FcsParameter?.Attributes.HasAttributeInstance(PredefinedType.OPTIONAL_ATTRIBUTE_CLASS) ?? false;
    
    public override bool Equals(object obj) =>
      obj is FSharpMethodParameter fsParam && 
      FSharpIndex == fsParam.FSharpIndex && Owner.Equals(fsParam.Owner);

    public override int GetHashCode() =>
      197 * Owner.GetHashCode() + 47 * FSharpIndex.GetHashCode();
  }