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);
}