Skip to content

Commit 1a3f1e8

Browse files
forkidsyme
authored andcommitted
try to minimize intermediate NameRes environments (#4440)
1 parent bbf07fb commit 1a3f1e8

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

src/fsharp/TypeChecker.fs

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -388,20 +388,20 @@ let addInternalsAccessibility env (ccu:CcuThunk) =
388388
eAccessRights = computeAccessRights env.eAccessPath eInternalsVisibleCompPaths env.eFamilyType // update this computed field
389389
eInternalsVisibleCompPaths = compPath :: env.eInternalsVisibleCompPaths }
390390

391-
let ModifyNameResEnv f env = { env with eNameResEnv = f env.eNameResEnv }
392-
393391
let AddLocalValPrimitive (v:Val) env =
394-
let env = ModifyNameResEnv (fun nenv -> AddValRefToNameEnv nenv (mkLocalValRef v)) env
395-
{ env with eUngeneralizableItems = addFreeItemOfTy v.Type env.eUngeneralizableItems }
392+
{ env with
393+
eNameResEnv = AddValRefToNameEnv env.eNameResEnv (mkLocalValRef v)
394+
eUngeneralizableItems = addFreeItemOfTy v.Type env.eUngeneralizableItems }
396395

397396

398397
let AddLocalValMap tcSink scopem (vals:Val NameMap) env =
399398
let env =
400399
if vals.IsEmpty then
401400
env
402401
else
403-
let env = ModifyNameResEnv (AddValMapToNameEnv vals) env
404-
{ env with eUngeneralizableItems = NameMap.foldBackRange (typeOfVal >> addFreeItemOfTy) vals env.eUngeneralizableItems }
402+
{ env with
403+
eNameResEnv = AddValMapToNameEnv vals env.eNameResEnv
404+
eUngeneralizableItems = NameMap.foldBackRange (typeOfVal >> addFreeItemOfTy) vals env.eUngeneralizableItems }
405405
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
406406
env
407407

@@ -410,27 +410,29 @@ let AddLocalVals tcSink scopem (vals:Val list) env =
410410
if isNil vals then
411411
env
412412
else
413-
let env = ModifyNameResEnv (AddValListToNameEnv vals) env
414-
{ env with eUngeneralizableItems = List.foldBack (typeOfVal >> addFreeItemOfTy) vals env.eUngeneralizableItems }
413+
{ env with
414+
eNameResEnv = AddValListToNameEnv vals env.eNameResEnv
415+
eUngeneralizableItems = List.foldBack (typeOfVal >> addFreeItemOfTy) vals env.eUngeneralizableItems }
415416
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
416417
env
417418

418-
let AddLocalVal tcSink scopem v env =
419-
let env = ModifyNameResEnv (fun nenv -> AddValRefToNameEnv nenv (mkLocalValRef v)) env
420-
let env = {env with eUngeneralizableItems = addFreeItemOfTy v.Type env.eUngeneralizableItems }
419+
let AddLocalVal tcSink scopem v env =
420+
let env = { env with
421+
eNameResEnv = AddValRefToNameEnv env.eNameResEnv (mkLocalValRef v)
422+
eUngeneralizableItems = addFreeItemOfTy v.Type env.eUngeneralizableItems }
421423
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
422424
env
423425

424426
let AddLocalExnDefnAndReport tcSink scopem env (exnc:Tycon) =
425-
let env = ModifyNameResEnv (fun nenv -> AddExceptionDeclsToNameEnv BulkAdd.No nenv (mkLocalEntityRef exnc)) env
427+
let env = { env with eNameResEnv = AddExceptionDeclsToNameEnv BulkAdd.No env.eNameResEnv (mkLocalEntityRef exnc) }
426428
(* Also make VisualStudio think there is an identifier in scope at the range of the identifier text of its binding location *)
427429
CallEnvSink tcSink (exnc.Range, env.NameEnv, env.eAccessRights)
428430
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
429431
env
430432

431433
let AddLocalTyconRefs ownDefinition g amap m tcrefs env =
432434
if isNil tcrefs then env else
433-
env |> ModifyNameResEnv (fun nenv -> AddTyconRefsToNameEnv BulkAdd.No ownDefinition g amap m false nenv tcrefs)
435+
{ env with eNameResEnv = AddTyconRefsToNameEnv BulkAdd.No ownDefinition g amap m false env.eNameResEnv tcrefs }
434436

435437
let AddLocalTycons g amap m (tycons: Tycon list) env =
436438
if isNil tycons then env else
@@ -448,14 +450,14 @@ let AddLocalTyconsAndReport tcSink scopem g amap m tycons env =
448450
let OpenModulesOrNamespaces tcSink g amap scopem root env mvvs openDeclaration =
449451
let env =
450452
if isNil mvvs then env else
451-
ModifyNameResEnv (fun nenv -> AddModulesAndNamespacesContentsToNameEnv g amap env.eAccessRights scopem root nenv mvvs) env
453+
{ env with eNameResEnv = AddModulesAndNamespacesContentsToNameEnv g amap env.eAccessRights scopem root env.eNameResEnv mvvs }
452454
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
453455
CallOpenDeclarationSink tcSink openDeclaration
454456
env
455457

456458
let AddRootModuleOrNamespaceRefs g amap m env modrefs =
457459
if isNil modrefs then env else
458-
ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights nenv modrefs) env
460+
{ env with eNameResEnv = AddModuleOrNamespaceRefsToNameEnv g amap m true env.eAccessRights env.eNameResEnv modrefs }
459461

460462
let AddNonLocalCcu g amap scopem env assemblyName (ccu:CcuThunk, internalsVisibleToAttributes) =
461463

@@ -476,7 +478,7 @@ let AddNonLocalCcu g amap scopem env assemblyName (ccu:CcuThunk, internalsVisib
476478
let env = AddRootModuleOrNamespaceRefs g amap scopem env modrefs
477479
let env =
478480
if isNil tcrefs then env else
479-
ModifyNameResEnv (fun nenv -> AddTyconRefsToNameEnv BulkAdd.Yes false g amap scopem true nenv tcrefs) env
481+
{ env with eNameResEnv = AddTyconRefsToNameEnv BulkAdd.Yes false g amap scopem true env.eNameResEnv tcrefs }
480482
//CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
481483
env
482484

@@ -486,25 +488,26 @@ let AddLocalRootModuleOrNamespace tcSink g amap scopem env (mtyp:ModuleOrNamespa
486488
// Compute the top-rooted type definitions
487489
let tcrefs = mtyp.TypeAndExceptionDefinitions |> List.map mkLocalTyconRef
488490
let env = AddRootModuleOrNamespaceRefs g amap scopem env modrefs
489-
let env =
490-
if isNil tcrefs then env else
491-
ModifyNameResEnv (fun nenv -> AddTyconRefsToNameEnv BulkAdd.No false g amap scopem true nenv tcrefs) env
492-
let env = { env with eUngeneralizableItems = addFreeItemOfModuleTy mtyp env.eUngeneralizableItems }
491+
let env = { env with
492+
eNameResEnv = if isNil tcrefs then env.eNameResEnv else AddTyconRefsToNameEnv BulkAdd.No false g amap scopem true env.eNameResEnv tcrefs
493+
eUngeneralizableItems = addFreeItemOfModuleTy mtyp env.eUngeneralizableItems }
493494
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
494495
env
495496

496497
let AddModuleAbbreviationAndReport tcSink scopem id modrefs env =
497498
let env =
498499
if isNil modrefs then env else
499-
ModifyNameResEnv (fun nenv -> AddModuleAbbrevToNameEnv id nenv modrefs) env
500+
{ env with eNameResEnv = AddModuleAbbrevToNameEnv id env.eNameResEnv modrefs }
501+
500502
CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights)
501503
let item = Item.ModuleOrNamespaces modrefs
502504
CallNameResolutionSink tcSink (id.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)
503505
env
504506

505507
let AddLocalSubModule g amap m env (modul:ModuleOrNamespace) =
506-
let env = ModifyNameResEnv (fun nenv -> AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights nenv (mkLocalModRef modul)) env
507-
let env = { env with eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems }
508+
let env = { env with
509+
eNameResEnv = AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights env.eNameResEnv (mkLocalModRef modul)
510+
eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems }
508511
env
509512

510513
let AddLocalSubModuleAndReport tcSink scopem g amap m env (modul:ModuleOrNamespace) =
@@ -518,7 +521,7 @@ let RegisterDeclaredTypars typars env =
518521

519522
let AddDeclaredTypars check typars env =
520523
if isNil typars then env else
521-
let env = ModifyNameResEnv (fun nenv -> AddDeclaredTyparsToNameEnv check nenv typars) env
524+
let env = { env with eNameResEnv = AddDeclaredTyparsToNameEnv check env.eNameResEnv typars }
522525
RegisterDeclaredTypars typars env
523526

524527
/// Compilation environment for typechecking a single file in an assembly. Contains the
@@ -7245,8 +7248,12 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv
72457248
/// for all custom operations. This adds them to the completion lists and prevents them being used as values inside
72467249
/// the query.
72477250
let env =
7248-
env |> ModifyNameResEnv (fun nenv -> (nenv, customOperationMethods) ||> Seq.fold (fun nenv (nm, _, _, _, _, _, _, _, methInfo) ->
7249-
AddFakeNameToNameEnv nm nenv (Item.CustomOperation (nm, (fun () -> customOpUsageText (ident (nm, mBuilderVal))), Some methInfo))))
7251+
if List.isEmpty customOperationMethods then env else
7252+
{ env with
7253+
eNameResEnv =
7254+
(env.eNameResEnv, customOperationMethods)
7255+
||> Seq.fold (fun nenv (nm, _, _, _, _, _, _, _, methInfo) ->
7256+
AddFakeNameToNameEnv nm nenv (Item.CustomOperation (nm, (fun () -> customOpUsageText (ident (nm, mBuilderVal))), Some methInfo))) }
72507257

72517258
// Environment is needed for completions
72527259
CallEnvSink cenv.tcSink (comp.Range, env.NameEnv, ad)
@@ -10411,7 +10418,7 @@ and TcNormalizedBinding declKind (cenv:cenv) env tpenv overallTy safeThisValOpt
1041110418
let item = Item.ActivePatternResult(apinfo, cenv.g.unit_ty, i, tagRange)
1041210419
CallNameResolutionSink cenv.tcSink (tagRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Binding, env.DisplayEnv, env.eAccessRights))
1041310420

10414-
ModifyNameResEnv (fun nenv -> AddActivePatternResultTagsToNameEnv apinfo nenv ty m) envinner
10421+
{ envinner with eNameResEnv = AddActivePatternResultTagsToNameEnv apinfo envinner.eNameResEnv ty m }
1041510422
| None ->
1041610423
envinner
1041710424

0 commit comments

Comments
 (0)