internal abstract class FSharpPropertyBase()

in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpPropertyBase.cs [82:143]


  internal abstract class FSharpPropertyBase<TDeclaration>([NotNull] ITypeMemberDeclaration declaration)
    : FSharpMemberBase<TDeclaration>(declaration), IFSharpParameterOwnerMember, IProperty
    where TDeclaration : IOverridableMemberDeclaration
  {
    protected override FSharpSymbol GetActualSymbol(FSharpSymbol symbol)
    {
      if (!(symbol is FSharpMemberOrFunctionOrValue mfv))
        return null;

      if (mfv.IsProperty || !mfv.IsModuleValueOrMember)
        return mfv;

      if (mfv.AccessorProperty?.Value is { } prop)
        return prop;

      var members = mfv.DeclaringEntity?.Value.MembersFunctionsAndValues;
      return members?.FirstOrDefault(m => m.IsProperty && m.LogicalName == mfv.LogicalName) ?? mfv;
    }

    public IType Type => ReturnType;

    public override IType ReturnType
    {
      get
      {
        var mfv = Mfv;
        if (mfv == null)
          return TypeFactory.CreateUnknownType(Module);

        var returnType = mfv.IsPropertySetterMethod
          ? mfv.CurriedParameterGroups[0][0].Type
          : mfv.ReturnParameter.Type;

        return GetType(returnType);
      }
    }

    public InvocableSignature GetSignature(ISubstitution substitution) => new(this, substitution);

    public override DeclaredElementType GetElementType() =>
      CLRDeclaredElementType.PROPERTY;

    public string GetDefaultPropertyMetadataName() => ShortName;

    public IAccessor Getter => IsReadable ? new FSharpPropertyImplicitAccessor(this, AccessorKind.GETTER) : null;
    public IAccessor Setter => IsWritable ? new FSharpPropertyImplicitAccessor(this, AccessorKind.SETTER) : null;

    public abstract bool IsReadable { get; }
    public abstract bool IsWritable { get; }
    public bool IsRequired => false;
    public bool IsAuto => false;
    public virtual bool IsDefault => false;

    public override bool Equals(object obj) =>
      obj is IProperty && base.Equals(obj);

    public override int GetHashCode() =>
      ShortName.GetHashCode();

    public IList<IList<IFSharpParameter>> FSharpParameterGroups => this.GetFSharpParameterGroups();
    public IFSharpParameter GetParameter(FSharpParameterIndex index) => this.GetFSharpParameter(index);
  }