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

Commita29abe3

Browse files
dsymeKevinRansom
authored andcommitted
Fix 1720 - Implicit module suffix is not added to rec modules (#3249)
* Fix 1720 - Implicit module suffix is not added to rec modules* Fix 1720 - Implicit module suffix is not added to rec modules* adjust fix
1 parent3b4f17e commita29abe3

File tree

5 files changed

+75
-45
lines changed

5 files changed

+75
-45
lines changed

‎src/fsharp/TypeChecker.fs‎

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14444,7 +14444,32 @@ module EstablishTypeDefinitionCores =
1444414444
| _ -> () ]
1444514445
|> set
1444614446

14447-
let TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial parent typeNames compInfo compDecls =
14447+
let TypeNamesInNonMutRecDecls defs =
14448+
[ for def in defs do
14449+
match def with
14450+
| SynModuleDecl.Types (typeSpecs,_) ->
14451+
for (TypeDefn(ComponentInfo(_,typars,_,ids,_,_,_,_),trepr,_,_)) in typeSpecs do
14452+
if isNil typars then
14453+
match trepr with
14454+
| SynTypeDefnRepr.ObjectModel(TyconAugmentation,_,_) -> ()
14455+
| _ -> yield (List.last ids).idText
14456+
| _ -> () ]
14457+
|> set
14458+
14459+
// Collect the type names so we can implicitly add the compilation suffix to module names
14460+
let TypeNamesInNonMutRecSigDecls defs =
14461+
[ for def in defs do
14462+
match def with
14463+
| SynModuleSigDecl.Types (typeSpecs,_) ->
14464+
for (TypeDefnSig(ComponentInfo(_,typars,_,ids,_,_,_,_),trepr,extraMembers,_)) in typeSpecs do
14465+
if isNil typars then
14466+
match trepr with
14467+
| SynTypeDefnSigRepr.Simple((SynTypeDefnSimpleRepr.None _),_) when not (isNil extraMembers) -> ()
14468+
| _ -> yield (List.last ids).idText
14469+
| _ -> () ]
14470+
|> set
14471+
14472+
let TcTyconDefnCore_Phase1A_BuildInitialModule cenv envInitial parent typeNames compInfo decls =
1444814473
let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo
1444914474
let id = ComputeModuleName longPath
1445014475
let modAttrs = TcAttributes cenv envInitial AttributeTargets.ModuleDecl attribs
@@ -14461,8 +14486,8 @@ module EstablishTypeDefinitionCores =
1446114486
let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind
1446214487
let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType modKind))
1446314488
let innerParent = Parent (mkLocalModRef mspec)
14464-
lettypeNames = TypeNamesInMutRecDeclscompDecls
14465-
MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent,typeNames, envForDecls)
14489+
letinnerTypeNames = TypeNamesInMutRecDeclsdecls
14490+
MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent,innerTypeNames, envForDecls)
1446614491

1446714492
/// Establish 'type <vis1> C < T1... TN > = <vis2> ...' including
1446814493
/// - computing the mangled name for C
@@ -15528,14 +15553,14 @@ module EstablishTypeDefinitionCores =
1552815553
| _ -> ())
1552915554

1553015555

15531-
let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parent inSig tpenv m scopem mutRecNSInfo (mutRecDefns:MutRecShapes<MutRecDefnsPhase1DataForTycon * 'MemberInfo, 'LetInfo, SynComponentInfo, _, _>) =
15556+
let TcMutRecDefns_Phase1 mkLetInfo cenv envInitial parenttypeNamesinSig tpenv m scopem mutRecNSInfo (mutRecDefns:MutRecShapes<MutRecDefnsPhase1DataForTycon * 'MemberInfo, 'LetInfo, SynComponentInfo, _, _>) =
1553215557

1553315558
// Phase1A - build Entity for type definitions, exception definitions and module definitions.
1553415559
// Also for abbreviations of any of these. Augmentations are skipped in this phase.
1553515560
let withEntities =
1553615561
mutRecDefns
1553715562
|> MutRecShapes.mapWithParent
15538-
(parent,TypeNamesInMutRecDecls mutRecDefns, envInitial)
15563+
(parent,typeNames, envInitial)
1553915564
// Build the initial entity for each module definition
1554015565
(fun (innerParent, typeNames, envForDecls) compInfo decls ->
1554115566
TcTyconDefnCore_Phase1A_BuildInitialModule cenv envForDecls innerParent typeNames compInfo decls)
@@ -16000,7 +16025,7 @@ module TcDeclarations =
1600016025
//-------------------------------------------------------------------------
1600116026

1600216027
/// Bind a collection of mutually recursive definitions in an implementation file
16003-
let TcMutRecDefinitions cenv envInitial parent tpenv m scopem mutRecNSInfo (mutRecDefns: MutRecDefnsInitialData) =
16028+
let TcMutRecDefinitions cenv envInitial parenttypeNamestpenv m scopem mutRecNSInfo (mutRecDefns: MutRecDefnsInitialData) =
1600416029

1600516030
// Split the definitions into "core representations" and "members". The code to process core representations
1600616031
// is shared between processing of signature files and implementation files.
@@ -16010,7 +16035,7 @@ module TcDeclarations =
1601016035
let tycons, envMutRecPrelim, mutRecDefnsAfterCore =
1601116036
EstablishTypeDefinitionCores.TcMutRecDefns_Phase1
1601216037
(fun containerInfo synBinds -> [ for synBind in synBinds -> RecDefnBindingInfo(containerInfo,NoNewSlots,ModuleOrMemberBinding,synBind) ])
16013-
cenv envInitial parent false tpenv m scopem mutRecNSInfo mutRecDefnsAfterSplit
16038+
cenv envInitial parenttypeNamesfalse tpenv m scopem mutRecNSInfo mutRecDefnsAfterSplit
1601416039

1601516040
// Package up the phase two information for processing members.
1601616041
let mutRecDefnsAfterPrep =
@@ -16151,9 +16176,9 @@ module TcDeclarations =
1615116176

1615216177

1615316178
/// Bind a collection of mutually recursive declarations in a signature file
16154-
let TcMutRecSignatureDecls cenv envInitial parent tpenv m scopem mutRecNSInfo (mutRecSigs:MutRecSigsInitialData) =
16179+
let TcMutRecSignatureDecls cenv envInitial parenttypeNamestpenv m scopem mutRecNSInfo (mutRecSigs:MutRecSigsInitialData) =
1615516180
let mutRecSigsAfterSplit = mutRecSigs |> MutRecShapes.mapTycons SplitTyconSignature
16156-
let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parent true tpenv m scopem mutRecNSInfo mutRecSigsAfterSplit
16181+
let _tycons, envMutRec, mutRecDefnsAfterCore = EstablishTypeDefinitionCores.TcMutRecDefns_Phase1 (fun containerInfo valDecl -> (containerInfo, valDecl)) cenv envInitial parenttypeNamestrue tpenv m scopem mutRecNSInfo mutRecSigsAfterSplit
1615716182

1615816183
// Updates the types of the modules to contain the contents so far, which now includes values and members
1615916184
MutRecBindingChecking.TcMutRecDefns_UpdateModuleContents mutRecNSInfo mutRecDefnsAfterCore
@@ -16192,7 +16217,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS
1619216217
| SynModuleSigDecl.Types (typeSpecs,m) ->
1619316218
let scopem = unionRanges m endm
1619416219
let mutRecDefns = typeSpecs |> List.map MutRecShape.Tycon
16195-
let env = TcDeclarations.TcMutRecSignatureDecls cenv env parent emptyUnscopedTyparEnv m scopem None mutRecDefns
16220+
let env = TcDeclarations.TcMutRecSignatureDecls cenv env parenttypeNamesemptyUnscopedTyparEnv m scopem None mutRecDefns
1619616221
return env
1619716222

1619816223
| SynModuleSigDecl.Open (mp,m) ->
@@ -16215,7 +16240,8 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS
1621516240
if isRec then
1621616241
// Treat 'module rec M = ...' as a single mutually recursive definition group 'module M = ...'
1621716242
let modDecl = SynModuleSigDecl.NestedModule(compInfo,false,mdefs,m)
16218-
return! TcSignatureElementsMutRec cenv parent endm None env [modDecl]
16243+
16244+
return! TcSignatureElementsMutRec cenv parent typeNames endm None env [modDecl]
1621916245
else
1622016246
let id = ComputeModuleName longPath
1622116247
let vis,_ = ComputeAccessAndCompPath env None im vis None parent
@@ -16325,32 +16351,21 @@ and TcSignatureElements cenv parent endm env xml mutRecNSInfo defs =
1632516351
if cenv.compilingCanonicalFslibModuleType then
1632616352
ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc())
1632716353

16354+
let typeNames = EstablishTypeDefinitionCores.TypeNamesInNonMutRecSigDecls defs
1632816355
match mutRecNSInfo with
1632916356
| Some _ ->
16330-
return! TcSignatureElementsMutRec cenv parent endm mutRecNSInfo env defs
16357+
return! TcSignatureElementsMutRec cenv parenttypeNamesendm mutRecNSInfo env defs
1633116358
| None ->
16332-
return! TcSignatureElementsNonMutRec cenv parent endm env defs
16359+
return! TcSignatureElementsNonMutRec cenv parenttypeNamesendm env defs
1633316360
}
1633416361

16335-
and TcSignatureElementsNonMutRec cenv parent endm env defs =
16362+
and TcSignatureElementsNonMutRec cenv parenttypeNamesendm env defs =
1633616363
eventually {
16337-
// Collect the type names so we can implicitly add the compilation suffix to module names
16338-
let typeNames =
16339-
[ for def in defs do
16340-
match def with
16341-
| SynModuleSigDecl.Types (typeSpecs,_) ->
16342-
for (TypeDefnSig(ComponentInfo(_,typars,_,ids,_,_,_,_),trepr,extraMembers,_)) in typeSpecs do
16343-
if isNil typars then
16344-
match trepr with
16345-
| SynTypeDefnSigRepr.Simple((SynTypeDefnSimpleRepr.None _),_) when not (isNil extraMembers) -> ()
16346-
| _ -> yield (List.last ids).idText
16347-
| _ -> () ]
16348-
|> set
1634916364

1635016365
return! Eventually.fold (TcSignatureElementNonMutRec cenv parent typeNames endm) env defs
1635116366
}
1635216367

16353-
and TcSignatureElementsMutRec cenv parent endm mutRecNSInfo envInitial (defs: SynModuleSigDecl list) =
16368+
and TcSignatureElementsMutRec cenv parenttypeNamesendm mutRecNSInfo envInitial (defs: SynModuleSigDecl list) =
1635416369
eventually {
1635516370
let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges
1635616371
let scopem = (defs, endm) ||> List.foldBack (fun h m -> unionRanges h.Range m)
@@ -16398,7 +16413,7 @@ and TcSignatureElementsMutRec cenv parent endm mutRecNSInfo envInitial (defs: Sy
1639816413

1639916414
|> fst
1640016415
loop (match parent with ParentNone -> true | Parent _ -> false) defs
16401-
return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parent emptyUnscopedTyparEnv m scopem mutRecNSInfo mutRecDefns
16416+
return TcDeclarations.TcMutRecSignatureDecls cenv envInitial parenttypeNamesemptyUnscopedTyparEnv m scopem mutRecNSInfo mutRecDefns
1640216417
}
1640316418

1640416419

@@ -16484,7 +16499,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem
1648416499
| SynModuleDecl.Types (typeDefs,m) ->
1648516500
let scopem = unionRanges m scopem
1648616501
let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon
16487-
let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent tpenv m scopem None mutRecDefns
16502+
let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv env parenttypeNamestpenv m scopem None mutRecDefns
1648816503
// Check the non-escaping condition as we build the expression on the way back up
1648916504
let exprfWithEscapeCheck e =
1649016505
TcMutRecDefnsEscapeCheck mutRecDefnsChecked env
@@ -16530,7 +16545,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem
1653016545
if isRec then
1653116546
assert (not isContinuingModule)
1653216547
let modDecl = SynModuleDecl.NestedModule(compInfo, false, mdefs, isContinuingModule, m)
16533-
return! TcModuleOrNamespaceElementsMutRec cenv parent m env None [modDecl]
16548+
return! TcModuleOrNamespaceElementsMutRec cenv parenttypeNamesm env None [modDecl]
1653416549
else
1653516550
let (ComponentInfo(attribs,_parms, _constraints,longPath,xml,_,vis,im)) = compInfo
1653616551
let id = ComputeModuleName longPath
@@ -16657,7 +16672,7 @@ and TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm (defsSoFar,
1665716672
}
1665816673

1665916674
/// The mutually recursive case for a sequence of declarations (and nested modules)
16660-
and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial mutRecNSInfo (defs: SynModuleDecl list) =
16675+
and TcModuleOrNamespaceElementsMutRec cenv parenttypeNamesendm envInitial mutRecNSInfo (defs: SynModuleDecl list) =
1666116676
eventually {
1666216677

1666316678
let m = match defs with [] -> endm | _ -> defs |> List.map (fun d -> d.Range) |> List.reduce unionRanges
@@ -16716,7 +16731,7 @@ and TcModuleOrNamespaceElementsMutRec cenv parent endm envInitial mutRecNSInfo (
1671616731
loop (match parent with ParentNone -> true | Parent _ -> false) [] defs
1671716732

1671816733
let tpenv = emptyUnscopedTyparEnv
16719-
let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parent tpenv m scopem mutRecNSInfo mutRecDefns
16734+
let mutRecDefnsChecked,envAfter = TcDeclarations.TcMutRecDefinitions cenv envInitial parenttypeNamestpenv m scopem mutRecNSInfo mutRecDefns
1672016735

1672116736
// Check the assembly attributes
1672216737
let attrs, _ = TcAttributesWithPossibleTargets false cenv envAfter AttributeTargets.Top synAttrs
@@ -16753,26 +16768,17 @@ and TcModuleOrNamespaceElements cenv parent endm env xml mutRecNSInfo defs =
1675316768
if cenv.compilingCanonicalFslibModuleType then
1675416769
ensureCcuHasModuleOrNamespaceAtPath cenv.topCcu env.ePath env.eCompPath (xml.ToXmlDoc())
1675516770

16771+
// Collect the type names so we can implicitly add the compilation suffix to module names
16772+
let typeNames = EstablishTypeDefinitionCores.TypeNamesInNonMutRecDecls defs
16773+
1675616774
match mutRecNSInfo with
1675716775
| Some _ ->
16758-
let! (exprf, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parent endm env mutRecNSInfo defs
16776+
let! (exprf, topAttrsNew), _, envAtEnd = TcModuleOrNamespaceElementsMutRec cenv parenttypeNamesendm env mutRecNSInfo defs
1675916777
// Apply the functions for each declaration to build the overall expression-builder
1676016778
let mexpr = TMDefs(exprf [])
1676116779
return (mexpr, topAttrsNew, envAtEnd)
1676216780

1676316781
| None ->
16764-
// Collect the type names so we can implicitly add the compilation suffix to module names
16765-
let typeNames =
16766-
[ for def in defs do
16767-
match def with
16768-
| SynModuleDecl.Types (typeSpecs,_) ->
16769-
for (TypeDefn(ComponentInfo(_,typars,_,ids,_,_,_,_),trepr,_,_)) in typeSpecs do
16770-
if isNil typars then
16771-
match trepr with
16772-
| SynTypeDefnRepr.ObjectModel(TyconAugmentation,_,_) -> ()
16773-
| _ -> yield (List.last ids).idText
16774-
| _ -> () ]
16775-
|> set
1677616782

1677716783
let! compiledDefs, envAtEnd = TcModuleOrNamespaceElementsNonMutRec cenv parent typeNames endm ([], env, env) defs
1677816784

‎tests/fsharp/tests.fs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,18 @@ module TypecheckTests =
16711671
#endif
16721672

16731673
#if!FSHARP_SUITE_DRIVES_CORECLR_TESTS
1674+
[<Test>]
1675+
let``sigs pos26``()=
1676+
letcfg= testConfig"typecheck/sigs"
1677+
fsc cfg"%s --target:exe -o:pos26.exe" cfg.fsc_flags["pos26.fsi";"pos26.fs"]
1678+
peverify cfg"pos26.exe"
1679+
1680+
[<Test>]
1681+
let``sigs pos25``()=
1682+
letcfg= testConfig"typecheck/sigs"
1683+
fsc cfg"%s --target:exe -o:pos25.exe" cfg.fsc_flags["pos25.fs"]
1684+
peverify cfg"pos25.exe"
1685+
16741686
[<Test>]
16751687
let``sigs pos24``()=
16761688
letcfg= testConfig"typecheck/sigs"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
modulePos25
2+
3+
typeR= R
4+
modulerecR=beginend
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespacePos26
2+
3+
typeR= R
4+
modulerecR=beginend
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespacePos26
2+
3+
typeR= R
4+
moduleR=beginend

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp