From 57ca8135f3f13c26ba9dc3c69f8e6948e9f8225a Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Mon, 30 May 2016 17:40:11 +0200 Subject: [PATCH] Improve error reporting: property setter in constructor expression - fixes #1112 --- src/fsharp/ConstraintSolver.fs | 16 ++++++++++++++-- src/fsharp/FSComp.txt | 1 + .../Source/Warnings/SuggestFieldsInCtor.fs | 13 +++++++++++++ tests/fsharpqa/Source/Warnings/env.lst | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/fsharpqa/Source/Warnings/SuggestFieldsInCtor.fs diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index c34e18d20cd..cf9ec954674 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -2010,10 +2010,22 @@ and ReportNoCandidatesError (csenv:ConstraintSolverEnv) (nUnnamedCallerArgs,nNam // One method, incorrect name/arg assignment | _,_,_,_,([],[cmeth]) -> - let msgNum,msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo amap m denv cmeth.Method) + let minfo = cmeth.Method + let msgNum,msgText = FSComp.SR.csRequiredSignatureIs(NicePrint.stringOfMethInfo amap m denv minfo) let msgNum,msgText,msgRange = match cmeth.UnassignedNamedArgs with - | CallerNamedArg(id,_) :: _ -> (msgNum,FSComp.SR.csMemberHasNoArgumentOrReturnProperty(methodName, id.idText, msgText),id.idRange) + | CallerNamedArg(id,_) :: _ -> + if minfo.IsConstructor then + let typ = minfo.DeclaringEntityRef + + let predictions = + typ.AllInstanceFieldsAsList + |> List.map (fun p -> p.Name.Replace("@","")) + |> ErrorResolutionHints.FilterPredictions id.idText + + msgNum,FSComp.SR.csCtorHasNoArgumentOrReturnProperty(methodName, id.idText, msgText, ErrorResolutionHints.FormatPredictions predictions),id.idRange + else + msgNum,FSComp.SR.csMemberHasNoArgumentOrReturnProperty(methodName, id.idText, msgText),id.idRange | [] -> (msgNum,msgText,m) ErrorD (Error ((msgNum,msgText),msgRange)) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 309f121046d..ed94c55145f 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -334,6 +334,7 @@ csGenericConstructRequiresPublicDefaultConstructor,"A generic construct requires 492,csMethodIsNotAStaticMethod,"%s is not a static method" 493,csMethodIsNotAnInstanceMethod,"%s is not an instance method" csMemberHasNoArgumentOrReturnProperty,"The member or object constructor '%s' has no argument or settable return property '%s'. %s." +csCtorHasNoArgumentOrReturnProperty,"The object constructor '%s' has no argument or settable return property '%s'. %s. %s" 495,csRequiredSignatureIs,"The required signature is %s" 496,csMemberSignatureMismatch,"The member or object constructor '%s' requires %d argument(s). The required signature is '%s'." 497,csMemberSignatureMismatch2,"The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'." diff --git a/tests/fsharpqa/Source/Warnings/SuggestFieldsInCtor.fs b/tests/fsharpqa/Source/Warnings/SuggestFieldsInCtor.fs new file mode 100644 index 00000000000..7d7e9860842 --- /dev/null +++ b/tests/fsharpqa/Source/Warnings/SuggestFieldsInCtor.fs @@ -0,0 +1,13 @@ +// #Warnings +//The object constructor 'MyClass' has no argument or settable return property 'Property'. +//Maybe you want one of the following: +//MyProperty + +type MyClass() = + member val MyProperty = "" with get, set + member val MyProperty2 = "" with get, set + member val ABigProperty = "" with get, set + +let c = MyClass(Property = "") + +exit 0 \ No newline at end of file diff --git a/tests/fsharpqa/Source/Warnings/env.lst b/tests/fsharpqa/Source/Warnings/env.lst index da119ba25d2..375d231c803 100644 --- a/tests/fsharpqa/Source/Warnings/env.lst +++ b/tests/fsharpqa/Source/Warnings/env.lst @@ -7,6 +7,7 @@ SOURCE=ElseBranchHasWrongType.fs # ElseBranchHasWrongType.fs SOURCE=MissingExpressionAfterLet.fs # MissingExpressionAfterLet.fs SOURCE=AssignmentOnImmutable.fs # AssignmentOnImmutable.fs + SOURCE=SuggestFieldsInCtor.fs # SuggestFieldsInCtor.fs SOURCE=RefCellInsteadOfNot.fs # RefCellInsteadOfNot.fs SOURCE=RefCellInsteadOfNot2.fs # RefCellInsteadOfNot2.fs SOURCE=UpcastInsteadOfDowncast.fs # UpcastInsteadOfDowncast.fs