Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0b2381f

Browse files
xepaulforki
authored andcommitted
Experiment to support assigning values to extension properties at initialization
1 parentca40a40 commit0b2381f

File tree

7 files changed

+89
-12
lines changed

7 files changed

+89
-12
lines changed

‎src/fsharp/csolve.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1204,7 +1204,7 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep
12041204
letcallerArgs= argtys|> List.map(fun argty-> CallerArg(argty,m,false,dummyExpr))
12051205
letminst= FreshenMethInfo m minfo
12061206
letobjtys= minfo.GetObjArgTypes(amap, m, minst)
1207-
CalledMeth<Expr>(csenv.InfoReader,false,FreshenMethInfo,m,AccessibleFromEverywhere,minfo,minst,minst,None,objtys,[(callerArgs,[])],false,false))
1207+
CalledMeth<Expr>(csenv.InfoReader,None,false,FreshenMethInfo,m,AccessibleFromEverywhere,minfo,minst,minst,None,objtys,[(callerArgs,[])],false,false))
12081208

12091209
letmethOverloadResult,errors=
12101210
CollectThenUndo(fun trace-> ResolveOverloading csenv(WithTrace(trace)) nm ndeeptrue(0,0) AccessibleFromEverywhere calledMethGroupfalse(Some rty))

‎src/fsharp/nameres.fsi‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@ val internal CallExprHasTypeSink : TcResultsSink -> range * NameResolutio
206206
/// Get all the available properties of a type(both intrinsic and extension)
207207
val internal AllPropInfosOfTypeInScope: InfoReader-> NameResolutionEnv-> string option* AccessorDomain-> FindMemberFlag-> range-> TType-> PropInfo list
208208

209+
/// Get all the available properties of a type(only extension)
210+
val internal ExtensionPropInfosOfTypeInScope: InfoReader-> NameResolutionEnv-> string option* AccessorDomain-> range-> TType-> PropInfo list
211+
209212
/// Get the available methods of a type(both declared and inherited)
210213
val internal AllMethInfosOfTypeInScope: InfoReader-> NameResolutionEnv-> string option* AccessorDomain-> FindMemberFlag-> range-> TType-> MethInfo list
211214

‎src/fsharp/tc.fs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8741,7 +8741,7 @@ and TcMethodApplication
87418741
| Some tyargs -> minfo.AdjustUserTypeInstForFSharpStyleIndexedExtensionMembers(tyargs)
87428742
| None -> minst
87438743
let allArgs = List.zip unnamedCurriedCallerArgs namedCurriedCallerArgs
8744-
CalledMeth<SynExpr>(cenv.infoReader,checkingAttributeCall, FreshenMethInfo, mMethExpr,ad,minfo,minst,callerTyArgs,pinfoOpt,callerObjArgTys,allArgs,usesParamArrayConversion,true)
8744+
CalledMeth<SynExpr>(cenv.infoReader,Some(env.NameEnv),checkingAttributeCall, FreshenMethInfo, mMethExpr,ad,minfo,minst,callerTyArgs,pinfoOpt,callerObjArgTys,allArgs,usesParamArrayConversion,true)
87458745

87468746
let preArgumentTypeCheckingCalledMethGroup =
87478747
[ for (minfo,pinfoOpt) in candidateMethsAndProps do
@@ -8834,7 +8834,7 @@ and TcMethodApplication
88348834
| Some tyargs -> minfo.AdjustUserTypeInstForFSharpStyleIndexedExtensionMembers(tyargs)
88358835
| None -> minst
88368836
let callerArgs = List.zip unnamedCurriedCallerArgs namedCurriedCallerArgs
8837-
CalledMeth<Expr>(cenv.infoReader,checkingAttributeCall,FreshenMethInfo, mMethExpr,ad,minfo,minst,callerTyArgs,pinfoOpt,callerObjArgTys,callerArgs,usesParamArrayConversion,true))
8837+
CalledMeth<Expr>(cenv.infoReader,Some(env.NameEnv),checkingAttributeCall,FreshenMethInfo, mMethExpr,ad,minfo,minst,callerTyArgs,pinfoOpt,callerObjArgTys,callerArgs,usesParamArrayConversion,true))
88388838

88398839
let callerArgCounts = (unnamedCurriedCallerArgs.Length, namedCurriedCallerArgs.Length)
88408840
let csenv = MakeConstraintSolverEnv cenv.css mMethExpr denv

‎src/fsharp/typrelns.fs‎

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,6 +1630,7 @@ let MakeCalledArgs amap m (minfo:MethInfo) minst =
16301630
/// and returns a CalledMeth object for further analysis.
16311631
typeCalledMeth<'T>
16321632
(infoReader:InfoReader,
1633+
nameEnv: Microsoft.FSharp.Compiler.Nameres.NameResolutionEnv option,
16331634
isCheckingAttributeCall,
16341635
freshenMethInfo,// afunctionto help generate fresh type variables the property setters methodsin generic classes
16351636
m,
@@ -1726,15 +1727,25 @@ type CalledMeth<'T>
17261727
letpminst= freshenMethInfo m pminfo
17271728
Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e))
17281729
|_->
1729-
match infoReader.GetILFieldInfosOfType(Some(nm),ad,m,returnedObjTy)with
1730-
| finfo::_->
1731-
Choice1Of2(AssignedItemSetter(id,AssignedILFieldSetter(finfo), e))
1732-
|_->
1733-
match infoReader.TryFindRecdOrClassFieldInfoOfType(nm,m,returnedObjTy)with
1734-
| Some rfinfo->
1735-
Choice1Of2(AssignedItemSetter(id,AssignedRecdFieldSetter(rfinfo), e))
1736-
| None->
1737-
Choice2Of2(arg))
1730+
letepinfos=match nameEnvwith
1731+
| Some(ne)-> Microsoft.FSharp.Compiler.Nameres.ExtensionPropInfosOfTypeInScope infoReader ne(Some(nm), ad) m returnedObjTy
1732+
|_->[]
1733+
match epinfoswith// need to hide ?
1734+
|[pinfo]when pinfo.HasSetter&&not pinfo.IsIndexer->
1735+
letpminfo= pinfo.SetterMethod
1736+
letpminst= freshenMethInfo m pminfo
1737+
Choice1Of2(AssignedItemSetter(id,AssignedPropSetter(pinfo,pminfo, pminst), e))
1738+
|_->
1739+
1740+
match infoReader.GetILFieldInfosOfType(Some(nm),ad,m,returnedObjTy)with
1741+
| finfo::_->
1742+
Choice1Of2(AssignedItemSetter(id,AssignedILFieldSetter(finfo), e))
1743+
|_->
1744+
match infoReader.TryFindRecdOrClassFieldInfoOfType(nm,m,returnedObjTy)with
1745+
| Some rfinfo->
1746+
Choice1Of2(AssignedItemSetter(id,AssignedRecdFieldSetter(rfinfo), e))
1747+
| None->
1748+
Choice2Of2(arg))
17381749

17391750
letnames= namedCallerArgs|> List.map(fun(CallerNamedArg(nm,_))-> nm.idText)
17401751

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// #Regression #Conformance #DeclarationElements #MemberDefinitions #NamedArguments
2+
#light
3+
4+
// FSB 1368, named arguments implicitly using property setters for generic class do not typecheck correctly
5+
6+
moduleGenericClass=
7+
typeS<'a,'b>=
8+
class
9+
val mutablex:'a
10+
val mutabley:'b
11+
memberobj.Xwith set(v)= obj.x<- v
12+
memberobj.Ywith set(v)= obj.y<- v
13+
new(a,b)={ x=a; y=b}
14+
end
15+
typeS<'a,'b>with
16+
memberx.XProxywith set v= x.X<- v
17+
memberx.YProxywith set v= x.Y<- v
18+
19+
// Standard construction
20+
letx1= S<int,string>(1,"1", XProxy=2, YProxy="2")
21+
if x1.x<>2then exit1
22+
if x1.y<>"2"then exit1
23+
exit0
24+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// #Regression #Conformance #DeclarationElements #MemberDefinitions #NamedArguments
2+
#light
3+
4+
// FSB 1368, named arguments implicitly using property setters for generic class do not typecheck correctly
5+
6+
moduleGenericInheritedClass2=
7+
typeR=
8+
class
9+
val mutablew:System.Collections.Generic.List<int>
10+
memberobj.Wwith set(v)= obj.w<- v
11+
new()={ w=new System.Collections.Generic.List<int>()}
12+
end
13+
14+
typeS=
15+
class
16+
inherit R
17+
val mutablex:int
18+
val mutabley:string
19+
memberobj.Xwith set(v)= obj.x<- v
20+
memberobj.Ywith set(v)= obj.y<- v
21+
new(a,b)={inherit R(); x=a; y=b}
22+
end
23+
moduleGenericInheritedClassExt2=
24+
typeGenericInheritedClass2.Swith
25+
memberx.Awith set v= x.X<- v+1
26+
memberx.Bwith set v= x.Y<- v+"1"
27+
typeGenericInheritedClass2.Rwith
28+
memberx.Cwith set v= v|> Seq.iter x.w.Add
29+
30+
// Standard construction
31+
letx1= GenericInheritedClass2.S(1,"1",A=2, B="2",C=[3])
32+
33+
if x1.x<>3then exit1
34+
if x1.y<>"21"then exit1
35+
if x1.w.Count<>1then exit1
36+
exit0
37+

‎tests/fsharpqa/Source/Conformance/DeclarationElements/MemberDefinitions/NamedArguments/env.lst‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
SOURCE=refLibsHaveNamedParams.fs# refLibsHaveNamedParams.fs
99
SOURCE=E_NumParamMismatch01.fs# E_NumParamMismatch01.fs
1010
SOURCE=PropertySetterAfterConstruction01.fs# PropertySetterAfterConstruction01.fs
11+
SOURCE=PropertySetterAfterConstruction01NamedExtensions.fs# PropertySetterAfterConstruction01NamedExtensions.fs
12+
SOURCE=PropertySetterAfterConstruction01NamedExtensionsInheritance.fs# PropertySetterAfterConstruction01NamedExtensionsInheritance.fs
1113
SOURCE=PropertySetterAfterConstruction02.fs# PropertySetterAfterConstruction02.fs
1214
SOURCE=E_MisspeltParam01.fs# E_MisspeltParam01.fs
1315

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp