Skip to content

Commit 3fa3682

Browse files
committed
[NameResolution] Fix accessibility and type-matching for pattern-based extension lookups (CE, Dispose, etc.)
1 parent 358d088 commit 3fa3682

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

src/Compiler/Checking/NameResolution.fs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ let SelectMethInfosFromExtMembers (infoReader: InfoReader) optFilter apparentTy
727727
]
728728

729729
/// Query the available extension methods of a type (including extension methods for inherited types)
730-
let ExtensionMethInfosOfTypeInScope (collectionSettings: ResultCollectionSettings) (infoReader: InfoReader) (nenv: NameResolutionEnv) optFilter isInstanceFilter m ty =
730+
let ExtensionMethInfosOfTypeInScope (collectionSettings: ResultCollectionSettings) (infoReader: InfoReader) (nenv: NameResolutionEnv) ad optFilter isInstanceFilter m ty =
731731
let extMemsDangling = SelectMethInfosFromExtMembers infoReader optFilter ty m nenv.eUnindexedExtensionMembers
732732
if collectionSettings = ResultCollectionSettings.AtMostOneResult && not (isNil extMemsDangling) then
733733
extMemsDangling
@@ -743,6 +743,27 @@ let ExtensionMethInfosOfTypeInScope (collectionSettings: ResultCollectionSetting
743743
| _ -> [])
744744
extMemsDangling @ extMemsFromHierarchy
745745
|> List.filter (fun minfo ->
746+
let g = infoReader.g
747+
let amap = infoReader.amap
748+
749+
let isAccesible = AccessibilityLogic.IsMethInfoAccessible amap m ad minfo
750+
751+
let isThisArgEq =
752+
match minfo.GetObjArgTypes(amap, m, []) with
753+
| thisTy :: _ ->
754+
let t1 = stripTyEqnsWrtErasure EraseNone g thisTy
755+
let t2 = stripTyEqnsWrtErasure EraseNone g ty
756+
757+
match t1, t2 with
758+
| TType_app (tc1, _, _), TType_app (tc2, _, _) ->
759+
tyconRefEq g tc1 tc2
760+
| _ ->
761+
false
762+
| _ ->
763+
false
764+
765+
isAccesible &&
766+
isThisArgEq &&
746767
match isInstanceFilter with
747768
| LookupIsInstance.Ambivalent -> true
748769
| LookupIsInstance.Yes -> minfo.IsInstance
@@ -754,7 +775,7 @@ let AllMethInfosOfTypeInScope collectionSettings infoReader nenv optFilter ad fi
754775
if collectionSettings = ResultCollectionSettings.AtMostOneResult && not (isNil intrinsic) then
755776
intrinsic
756777
else
757-
intrinsic @ ExtensionMethInfosOfTypeInScope collectionSettings infoReader nenv optFilter LookupIsInstance.Ambivalent m ty
778+
intrinsic @ ExtensionMethInfosOfTypeInScope collectionSettings infoReader nenv ad optFilter LookupIsInstance.Ambivalent m ty
758779

759780
//-------------------------------------------------------------------------
760781
// Helpers to do with building environments
@@ -1184,7 +1205,7 @@ let rec AddStaticContentOfTypeToNameEnv (g:TcGlobals) (amap: Import.ImportMap) a
11841205
[|
11851206
// Extension methods
11861207
yield!
1187-
ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults infoReader nenv None LookupIsInstance.No m ty
1208+
ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults infoReader nenv ad None LookupIsInstance.No m ty
11881209
|> ChooseMethInfosForNameEnv g m ty
11891210

11901211
// Extension properties
@@ -2827,7 +2848,7 @@ let rec ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind (resInf
28272848
| _ ->
28282849
// lookup in-scope extension methods
28292850
// to keep in sync with the same expression in `| Some(MethodItem msets) when isLookupExpr` below
2830-
match ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv optFilter isInstanceFilter m ty with
2851+
match ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv ad optFilter isInstanceFilter m ty with
28312852
| [] -> success [resInfo, x, rest]
28322853
| methods ->
28332854
let extensionMethods = Item.MakeMethGroup(nm, methods)
@@ -2841,7 +2862,7 @@ let rec ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind (resInf
28412862
let minfos = msets |> ExcludeHiddenOfMethInfos g ncenv.amap m
28422863

28432864
// fold the available extension members into the overload resolution
2844-
let extensionMethInfos = ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv optFilter isInstanceFilter m ty
2865+
let extensionMethInfos = ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv ad optFilter isInstanceFilter m ty
28452866

28462867
success [resInfo, Item.MakeMethGroup (nm, minfos@extensionMethInfos), rest]
28472868

@@ -2860,7 +2881,7 @@ let rec ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind (resInf
28602881

28612882
if not (isNil pinfos) && isLookUpExpr then OneResult(success (resInfo, Item.Property (nm, pinfos, None), rest)) else
28622883

2863-
let minfos = ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv optFilter isInstanceFilter m ty
2884+
let minfos = ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv ad optFilter isInstanceFilter m ty
28642885

28652886
if not (isNil minfos) && isLookUpExpr then
28662887
success [resInfo, Item.MakeMethGroup (nm, minfos), rest]
@@ -2898,7 +2919,7 @@ let rec ResolveLongIdentInTypePrim (ncenv: NameResolver) nenv lookupKind (resInf
28982919
for p in ExtensionPropInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv None LookupIsInstance.Ambivalent ad m ty do
28992920
addToBuffer p.PropertyName
29002921

2901-
for m in ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv None LookupIsInstance.Ambivalent m ty do
2922+
for m in ExtensionMethInfosOfTypeInScope ResultCollectionSettings.AllResults ncenv.InfoReader nenv ad None LookupIsInstance.Ambivalent m ty do
29022923
addToBuffer m.DisplayName
29032924

29042925
for p in GetIntrinsicPropInfosOfType ncenv.InfoReader None ad AllowMultiIntfInstantiations.No findFlag m ty do

0 commit comments

Comments
 (0)