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

Commit6453d1b

Browse files
forkiKevinRansom
authored andcommitted
Restructure NameResolution (dotnet#4471)
1 parent1d2c78e commit6453d1b

File tree

6 files changed

+798
-764
lines changed

6 files changed

+798
-764
lines changed

‎src/fsharp/NameResolution.fs‎

Lines changed: 748 additions & 743 deletions
Large diffs are not rendered by default.

‎src/fsharp/NameResolution.fsi‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,13 +451,13 @@ type ResultCollectionSettings =
451451
| AtMostOneResult
452452

453453
/// Resolve a long identifier to a namespace or module.
454-
valinternalResolveLongIndentAsModuleOrNamespace:TcResultsSink->ResultCollectionSettings->Import.ImportMap->range->FullyQualifiedFlag->NameResolutionEnv->AccessorDomain->Ident list->isOpenDecl:bool->ResultOrException<(int* ModuleOrNamespaceRef* ModuleOrNamespaceType)list>
454+
valinternalResolveLongIndentAsModuleOrNamespace:TcResultsSink->ResultCollectionSettings->Import.ImportMap->range->bool->FullyQualifiedFlag->NameResolutionEnv->AccessorDomain->Ident->Ident list->isOpenDecl:bool->ResultOrException<(int* ModuleOrNamespaceRef* ModuleOrNamespaceType)list>
455455

456456
/// Resolve a long identifier to an object constructor.
457457
valinternalResolveObjectConstructor:NameResolver->DisplayEnv->range->AccessorDomain->TType->ResultOrException<Item>
458458

459459
/// Resolve a long identifier using type-qualified name resolution.
460-
valinternalResolveLongIdentInType:TcResultsSink->NameResolver->NameResolutionEnv->LookupKind->range->AccessorDomain->Identlist->FindMemberFlag->TypeNameResolutionInfo->TType->Item* Ident list
460+
valinternalResolveLongIdentInType:TcResultsSink->NameResolver->NameResolutionEnv->LookupKind->range->AccessorDomain->Ident->FindMemberFlag->TypeNameResolutionInfo->TType->Item* Ident list
461461

462462
/// Resolve a long identifier when used in a pattern.
463463
val internal ResolvePatternLongIdent: TcResultsSink-> NameResolver-> WarnOnUpperFlag-> bool-> range-> AccessorDomain-> NameResolutionEnv-> TypeNameResolutionInfo-> Ident list-> Item

‎src/fsharp/TypeChecker.fs‎

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -697,13 +697,16 @@ let ImplicitlyOpenOwnNamespace tcSink g amap scopem enclosingNamespacePath env =
697697
| Some(_, rest) -> rest
698698
| None -> enclosingNamespacePath
699699

700-
let ad = env.eAccessRights
701-
match ResolveLongIndentAsModuleOrNamespace tcSink ResultCollectionSettings.AllResults amap scopem OpenQualified env.eNameResEnv ad enclosingNamespacePathToOpen true with
702-
| Result modrefs ->
703-
let modrefs = List.map p23 modrefs
704-
let openDecl = OpenDeclaration.Create (enclosingNamespacePathToOpen, modrefs, scopem, true)
705-
OpenModulesOrNamespaces tcSink g amap scopem false env modrefs openDecl
706-
| Exception _ -> env
700+
match enclosingNamespacePathToOpen with
701+
| id::rest ->
702+
let ad = env.eAccessRights
703+
match ResolveLongIndentAsModuleOrNamespace tcSink ResultCollectionSettings.AllResults amap scopem true OpenQualified env.eNameResEnv ad id rest true with
704+
| Result modrefs ->
705+
let modrefs = List.map p23 modrefs
706+
let openDecl = OpenDeclaration.Create (enclosingNamespacePathToOpen, modrefs, scopem, true)
707+
OpenModulesOrNamespaces tcSink g amap scopem false env modrefs openDecl
708+
| Exception _ -> env
709+
| _ -> env
707710

708711

709712
//-------------------------------------------------------------------------
@@ -6805,7 +6808,7 @@ and TcConstExpr cenv overallTy env m tpenv c =
68056808
let expr =
68066809
let modName = "NumericLiteral" + suffix
68076810
let ad = env.eAccessRights
6808-
match ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AtMostOneResult cenv.amap m OpenQualified env.eNameResEnv ad[ident (modName, m)] false with
6811+
match ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AtMostOneResult cenv.amap mtrueOpenQualified env.eNameResEnv ad(ident (modName, m)) [] false with
68096812
| Result []
68106813
| Exception _ -> error(Error(FSComp.SR.tcNumericLiteralRequiresModule(modName), m))
68116814
| Result ((_, mref, _) :: _) ->
@@ -10632,13 +10635,13 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) =
1063210635
attributeAssignedNamedItems |> List.map (fun (CallerNamedArg(id, CallerArg(argtyv, m, isOpt, callerArgExpr))) ->
1063310636
if isOpt then error(Error(FSComp.SR.tcOptionalArgumentsCannotBeUsedInCustomAttribute(), m))
1063410637
let m = callerArgExpr.Range
10635-
let setterItem, _ = ResolveLongIdentInType cenv.tcSink cenv.nameResolver env.NameEnv LookupKind.Expr m ad[id] IgnoreOverrides TypeNameResolutionInfo.Default ty
10638+
let setterItem, _ = ResolveLongIdentInType cenv.tcSink cenv.nameResolver env.NameEnv LookupKind.Expr m adid IgnoreOverrides TypeNameResolutionInfo.Default ty
1063610639
let nm, isProp, argty =
1063710640
match setterItem with
1063810641
| Item.Property (_, [pinfo]) ->
1063910642
if not pinfo.HasSetter then
1064010643
errorR(Error(FSComp.SR.tcPropertyCannotBeSet0(), m))
10641-
id.idText, true, pinfo.GetPropertyType(cenv.amap, m)
10644+
id.idText, true, pinfo.GetPropertyType(cenv.amap, m)
1064210645
| Item.ILField finfo ->
1064310646
CheckILFieldInfoAccessible cenv.g cenv.amap m ad finfo
1064410647
CheckILFieldAttributes cenv.g finfo m
@@ -12081,10 +12084,13 @@ let TcTyconMemberSpecs cenv env containerInfo declKind tpenv (augSpfn: SynMember
1208112084

1208212085
let TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap (longId : Ident list) =
1208312086
let ad = env.eAccessRights
12084-
let m = longId |> List.map (fun id -> id.idRange) |> List.reduce unionRanges
12085-
match ResolveLongIndentAsModuleOrNamespace tcSink ResultCollectionSettings.AllResults amap m OpenQualified env.eNameResEnv ad longId true with
12086-
| Result res -> Result res
12087-
| Exception err -> raze err
12087+
match longId with
12088+
| [] -> Result []
12089+
| id::rest ->
12090+
let m = longId |> List.map (fun id -> id.idRange) |> List.reduce unionRanges
12091+
match ResolveLongIndentAsModuleOrNamespace tcSink ResultCollectionSettings.AllResults amap m true OpenQualified env.eNameResEnv ad id rest true with
12092+
| Result res -> Result res
12093+
| Exception err -> raze err
1208812094

1208912095
let TcOpenDecl tcSink (g:TcGlobals) amap m scopem env (longId : Ident list) =
1209012096
let modrefs = ForceRaise (TcModuleOrNamespaceLidAndPermitAutoResolve tcSink env amap longId)
@@ -13581,12 +13587,17 @@ module MutRecBindingChecking =
1358113587
/// Check a "module X = A.B.C" module abbreviation declaration
1358213588
let TcModuleAbbrevDecl (cenv:cenv) scopem env (id, p, m) =
1358313589
let ad = env.eAccessRights
13584-
let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AllResults cenv.amap m OpenQualified env.eNameResEnv ad p false)
13585-
let modrefs = mvvs |> List.map p23
13586-
if not (List.isEmpty modrefs) && modrefs |> List.forall (fun modref -> modref.IsNamespace) then
13590+
let resolved =
13591+
match p with
13592+
| [] -> Result []
13593+
| id::rest -> ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AllResults cenv.amap m true OpenQualified env.eNameResEnv ad id rest false
13594+
let mvvs = ForceRaise resolved
13595+
if isNil mvvs then env else
13596+
let modrefs = mvvs |> List.map p23
13597+
if not (isNil modrefs) && modrefs |> List.forall (fun modref -> modref.IsNamespace) then
1358713598
errorR(Error(FSComp.SR.tcModuleAbbreviationForNamespace(fullDisplayTextOfModRef (List.head modrefs)), m))
1358813599
let modrefs = modrefs |> List.filter (fun mvv -> not mvv.IsNamespace)
13589-
ifList.isEmpty modrefs then env else
13600+
ifisNil modrefs then env else
1359013601
modrefs |> List.iter (fun modref -> CheckEntityAttributes cenv.g modref m |> CommitOperationResult)
1359113602
let env = AddModuleAbbreviationAndReport cenv.tcSink scopem id modrefs env
1359213603
env
@@ -16364,7 +16375,11 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS
1636416375

1636516376
| SynModuleSigDecl.ModuleAbbrev (id, p, m) ->
1636616377
let ad = env.eAccessRights
16367-
let mvvs = ForceRaise (ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AllResults cenv.amap m OpenQualified env.eNameResEnv ad p false)
16378+
let resolved =
16379+
match p with
16380+
| [] -> Result []
16381+
| id::rest -> ResolveLongIndentAsModuleOrNamespace cenv.tcSink ResultCollectionSettings.AllResults cenv.amap m true OpenQualified env.eNameResEnv ad id rest false
16382+
let mvvs = ForceRaise resolved
1636816383
let scopem = unionRanges m endm
1636916384
let unfilteredModrefs = mvvs |> List.map p23
1637016385

‎src/fsharp/pars.fsy‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,6 +3631,13 @@ atomicExprQualification:
36313631
| identOrOp
36323632
{ let idm = rhs parseState 1
36333633
(fun e lhsm dotm -> mkSynDot dotm lhsm e $1) }
3634+
3635+
| GLOBAL
3636+
{ (fun e lhsm dotm ->
3637+
reportParseErrorAt (rhs parseState 3) (FSComp.SR.nrGlobalUsedOnlyAsFirstName())
3638+
let fixedLhsm = mkRange lhsm.FileName lhsm.Start dotm.End // previous lhsm is wrong after 'recover'
3639+
mkSynDotMissing dotm fixedLhsm e) }
3640+
36343641
| /* empty */
36353642
{ (fun e lhsm dotm ->
36363643
reportParseErrorAt dotm (FSComp.SR.parsMissingQualificationAfterDot())
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// #ErrorMessages #NameResolution
2+
//<Expects status="error" span="(4,36)" id="FS1126">'global' may only be used as the first name in a qualified path</Expects>
3+
4+
letx=global.System.String.Empty.global.System.String.Empty
5+
6+
exit0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
SOURCE=E_RecordFieldProposal.fs# E_RecordFieldProposal
2+
SOURCE=E_GlobalQualifierAfterDot.fs# E_GlobalQualifierAfterDot
23
SOURCE=E_FieldNotInRecord.fs# E_FieldNotInRecord

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp