Skip to content

Commit 57ca813

Browse files
committed
Improve error reporting: property setter in constructor expression - fixes #1112
1 parent 714ad7f commit 57ca813

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

src/fsharp/ConstraintSolver.fs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2010,10 +2010,22 @@ and ReportNoCandidatesError (csenv:ConstraintSolverEnv) (nUnnamedCallerArgs,nNam
20102010

20112011
// One method, incorrect name/arg assignment
20122012
| _,_,_,_,([],[cmeth]) ->
2013-
let msgNum,msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo amap m denv cmeth.Method)
2013+
let minfo = cmeth.Method
2014+
let msgNum,msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo amap m denv minfo)
20142015
let msgNum,msgText,msgRange =
20152016
match cmeth.UnassignedNamedArgs with
2016-
| CallerNamedArg(id,_) :: _ -> (msgNum,FSComp.SR.csMemberHasNoArgumentOrReturnProperty(methodName, id.idText, msgText),id.idRange)
2017+
| CallerNamedArg(id,_) :: _ ->
2018+
if minfo.IsConstructor then
2019+
let typ = minfo.DeclaringEntityRef
2020+
2021+
let predictions =
2022+
typ.AllInstanceFieldsAsList
2023+
|> List.map (fun p -> p.Name.Replace("@",""))
2024+
|> ErrorResolutionHints.FilterPredictions id.idText
2025+
2026+
msgNum,FSComp.SR.csCtorHasNoArgumentOrReturnProperty(methodName, id.idText, msgText, ErrorResolutionHints.FormatPredictions predictions),id.idRange
2027+
else
2028+
msgNum,FSComp.SR.csMemberHasNoArgumentOrReturnProperty(methodName, id.idText, msgText),id.idRange
20172029
| [] -> (msgNum,msgText,m)
20182030
ErrorD (Error ((msgNum,msgText),msgRange))
20192031

src/fsharp/FSComp.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ csGenericConstructRequiresPublicDefaultConstructor,"A generic construct requires
334334
492,csMethodIsNotAStaticMethod,"%s is not a static method"
335335
493,csMethodIsNotAnInstanceMethod,"%s is not an instance method"
336336
csMemberHasNoArgumentOrReturnProperty,"The member or object constructor '%s' has no argument or settable return property '%s'. %s."
337+
csCtorHasNoArgumentOrReturnProperty,"The object constructor '%s' has no argument or settable return property '%s'. %s. %s"
337338
495,csRequiredSignatureIs,"The required signature is %s"
338339
496,csMemberSignatureMismatch,"The member or object constructor '%s' requires %d argument(s). The required signature is '%s'."
339340
497,csMemberSignatureMismatch2,"The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'."
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// #Warnings
2+
//<Expects status="Error" span="(11,17)" id="FS0495">The object constructor 'MyClass' has no argument or settable return property 'Property'.</Expects>
3+
//<Expects>Maybe you want one of the following:</Expects>
4+
//<Expects>MyProperty</Expects>
5+
6+
type MyClass() =
7+
member val MyProperty = "" with get, set
8+
member val MyProperty2 = "" with get, set
9+
member val ABigProperty = "" with get, set
10+
11+
let c = MyClass(Property = "")
12+
13+
exit 0

tests/fsharpqa/Source/Warnings/env.lst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
SOURCE=ElseBranchHasWrongType.fs # ElseBranchHasWrongType.fs
88
SOURCE=MissingExpressionAfterLet.fs # MissingExpressionAfterLet.fs
99
SOURCE=AssignmentOnImmutable.fs # AssignmentOnImmutable.fs
10+
SOURCE=SuggestFieldsInCtor.fs # SuggestFieldsInCtor.fs
1011
SOURCE=RefCellInsteadOfNot.fs # RefCellInsteadOfNot.fs
1112
SOURCE=RefCellInsteadOfNot2.fs # RefCellInsteadOfNot2.fs
1213
SOURCE=UpcastInsteadOfDowncast.fs # UpcastInsteadOfDowncast.fs

0 commit comments

Comments
 (0)