Skip to content

Commit fba477a

Browse files
committed
2 parents 77b0790 + 9be1780 commit fba477a

File tree

3 files changed

+41
-27
lines changed

3 files changed

+41
-27
lines changed

src/fsharp/vs/Symbols.fs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,9 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
11271127
let nm = (match v with VRefNonLocal n -> n.ItemKey.PartialKey.LogicalName | _ -> "<local>")
11281128
invalidOp (sprintf "The value or member '%s' does not exist or is in an unresolved assembly." nm)
11291129

1130+
let mkMethSym minfo = FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
1131+
let mkEventSym einfo = FSharpMemberOrFunctionOrValue(cenv, E einfo, Item.Event einfo)
1132+
11301133
new (cenv, vref) = FSharpMemberFunctionOrValue(cenv, V vref, Item.Value vref)
11311134
new (cenv, minfo) = FSharpMemberFunctionOrValue(cenv, M minfo, Item.MethodGroup(minfo.LogicalName, [minfo]))
11321135

@@ -1209,25 +1212,19 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
12091212
member __.GetterMethod =
12101213
checkIsResolved()
12111214
match d with
1212-
| P m ->
1213-
let minfo = m.GetterMethod
1214-
FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
1215+
| P m -> mkMethSym m.GetterMethod
12151216
| E _ | M _ | V _ -> invalidOp "the value or member doesn't have an associated getter method"
12161217

12171218
member __.EventAddMethod =
12181219
checkIsResolved()
12191220
match d with
1220-
| E e ->
1221-
let minfo = e.GetAddMethod()
1222-
FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
1221+
| E e -> mkMethSym (e.GetAddMethod())
12231222
| P _ | M _ | V _ -> invalidOp "the value or member doesn't have an associated add method"
12241223

12251224
member __.EventRemoveMethod =
12261225
checkIsResolved()
12271226
match d with
1228-
| E e ->
1229-
let minfo = e.GetRemoveMethod()
1230-
FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
1227+
| E e -> mkMethSym (e.GetRemoveMethod())
12311228
| P _ | M _ | V _ -> invalidOp "the value or member doesn't have an associated remove method"
12321229

12331230
member __.EventDelegateType =
@@ -1256,12 +1253,8 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
12561253
member __.SetterMethod =
12571254
checkIsResolved()
12581255
match d with
1259-
| P m ->
1260-
let minfo = m.SetterMethod
1261-
FSharpMemberOrFunctionOrValue(cenv, M minfo, Item.MethodGroup (minfo.DisplayName,[minfo]))
1262-
| E _
1263-
| M _
1264-
| V _ -> invalidOp "the value or member doesn't have an associated setter method"
1256+
| P m -> mkMethSym m.SetterMethod
1257+
| E _ | M _ | V _ -> invalidOp "the value or member doesn't have an associated setter method"
12651258

12661259
member __.EnclosingEntity =
12671260
checkIsResolved()
@@ -1328,6 +1321,19 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
13281321
| E _ -> true
13291322
| _ -> false
13301323

1324+
member x.EventForFSharpProperty =
1325+
match d with
1326+
| P p when p.IsFSharpEventProperty ->
1327+
let minfos1 = GetImmediateIntrinsicMethInfosOfType (Some("add_"+p.PropertyName),AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 p.EnclosingType
1328+
let minfos2 = GetImmediateIntrinsicMethInfosOfType (Some("remove_"+p.PropertyName),AccessibleFromSomeFSharpCode) cenv.g cenv.amap range0 p.EnclosingType
1329+
match minfos1,minfos2 with
1330+
| [addMeth],[removeMeth] ->
1331+
match addMeth.ArbitraryValRef, removeMeth.ArbitraryValRef with
1332+
| Some addVal, Some removeVal -> Some (mkEventSym (FSEvent(cenv.g, p, addVal, removeVal)))
1333+
| _ -> None
1334+
| _ -> None
1335+
| _ -> None
1336+
13311337
member __.IsEventAddMethod =
13321338
if isUnresolved() then false else
13331339
match d with

src/fsharp/vs/Symbols.fsi

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,13 @@ and [<Class>] FSharpMemberOrFunctionOrValue =
697697
/// Indicates if this is an event member
698698
member IsEvent : bool
699699

700+
/// Gets the event symbol implied by the use of a property,
701+
/// for the case where the property is actually an F#-declared CLIEvent.
702+
///
703+
/// Uses of F#-declared events are considered to be properties as far as the language specification
704+
/// and this API are concerned.
705+
member EventForFSharpProperty : FSharpMemberOrFunctionOrValue option
706+
700707
/// Indicates if this is an abstract member?
701708
member IsDispatchSlot : bool
702709

tests/service/ProjectAnalysisTests.fs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ let attribsOfSymbol (s:FSharpSymbol) =
8080
if v.IsPropertyGetterMethod then yield "getter"
8181
if v.IsPropertySetterMethod then yield "setter"
8282
if v.IsEvent then yield "event"
83+
if v.EventForFSharpProperty.IsSome then yield "clievent"
8384
if v.IsEventAddMethod then yield "add"
8485
if v.IsEventRemoveMethod then yield "remove"
8586
if v.IsTypeFunction then yield "typefun"
@@ -1043,7 +1044,7 @@ let ``Test project3 all symbols in signature`` () =
10431044
("member set_InterfacePropertySet", ["slot"; "member"; "setter"]);
10441045
("property InterfacePropertySet", ["slot"; "member"; "prop"]);
10451046
("property InterfaceProperty", ["slot"; "member"; "prop"]);
1046-
("property InterfaceEvent", ["slot"; "member"; "prop"]);
1047+
("property InterfaceEvent", ["slot"; "member"; "prop"; "clievent"]);
10471048
("CFoo", ["class"]);
10481049
("member .ctor", ["member"; "ctor"]);
10491050
("member AbstractClassMethod", ["slot"; "member"]);
@@ -1054,7 +1055,7 @@ let ``Test project3 all symbols in signature`` () =
10541055
("member set_AbstractClassPropertySet", ["slot"; "member"; "setter"]);
10551056
("property AbstractClassPropertySet", ["slot"; "member"; "prop"]);
10561057
("property AbstractClassProperty", ["slot"; "member"; "prop"]);
1057-
("property AbstractClassEvent", ["slot"; "member"; "prop"]);
1058+
("property AbstractClassEvent", ["slot"; "member"; "prop"; "clievent"]);
10581059
("CBaseFoo", ["class"]); ("member .ctor", ["member"; "ctor"]);
10591060
("member BaseClassMethod", ["slot"; "member"]);
10601061
("member BaseClassMethod", ["member"; "overridemem"]);
@@ -1090,7 +1091,7 @@ let ``Test project3 all symbols in signature`` () =
10901091
("member set_AbstractClassPropertySet", ["member"; "setter"; "overridemem"]);
10911092
("property AbstractClassPropertySet", ["member"; "prop"; "overridemem"]);
10921093
("property AbstractClassProperty", ["member"; "prop"; "overridemem"]);
1093-
("property AbstractClassEvent", ["member"; "prop"; "overridemem"]);
1094+
("property AbstractClassEvent", ["member"; "prop"; "clievent"; "overridemem"]);
10941095
("CBaseFooImpl", ["class"]); ("member .ctor", ["member"; "ctor"]);
10951096
("member BaseClassMethod", ["member"; "overridemem"]);
10961097
("member add_BaseClassEvent", ["member"; "add"; "overridemem"]);
@@ -1100,7 +1101,7 @@ let ``Test project3 all symbols in signature`` () =
11001101
("member set_BaseClassPropertySet", ["member"; "setter"; "overridemem"]);
11011102
("property BaseClassPropertySet", ["member"; "prop"; "overridemem"]);
11021103
("property BaseClassProperty", ["member"; "prop"; "overridemem"]);
1103-
("property BaseClassEvent", ["member"; "prop"; "overridemem"])]
1104+
("property BaseClassEvent", ["member"; "prop"; "clievent"; "overridemem"])]
11041105

11051106
[<Test>]
11061107
let ``Test project3 all uses of all signature symbols`` () =
@@ -1171,9 +1172,9 @@ let ``Test project3 all uses of all signature symbols`` () =
11711172
("file1", ((76, 23), (76, 44)), [], ["slot"; "member"; "prop"]);
11721173
("file1", ((34, 20), (34, 37)), ["override"], ["slot"; "member"; "prop"])]);
11731174
("property InterfaceEvent",
1174-
[("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "prop"]);
1175-
("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "prop"]);
1176-
("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "prop"])]);
1175+
[("file1", ((8, 13), (8, 27)), ["defn"], ["slot"; "member"; "prop"; "clievent"]);
1176+
("file1", ((65, 20), (65, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"]);
1177+
("file1", ((38, 20), (38, 34)), ["override"], ["slot"; "member"; "prop"; "clievent"])]);
11771178
("CFoo",
11781179
[("file1", ((11, 5), (11, 9)), ["defn"], ["class"]);
11791180
("file1", ((41, 12), (41, 16)), ["type"], ["class"]);
@@ -1219,9 +1220,9 @@ let ``Test project3 all uses of all signature symbols`` () =
12191220
("file1", ((70, 22), (70, 43)), ["override"], ["slot"; "member"; "prop"]);
12201221
("file1", ((43, 18), (43, 39)), ["override"], ["slot"; "member"; "prop"])]);
12211222
("property AbstractClassEvent",
1222-
[("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "prop"]);
1223-
("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "prop"]);
1224-
("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "prop"])]);
1223+
[("file1", ((16, 13), (16, 31)), ["defn"], ["slot"; "member"; "prop"; "clievent"]);
1224+
("file1", ((74, 22), (74, 40)), ["override"], ["slot"; "member"; "prop"; "clievent"]);
1225+
("file1", ((47, 18), (47, 36)), ["override"], ["slot"; "member"; "prop"; "clievent"])]);
12251226
("CBaseFoo",
12261227
[("file1", ((18, 5), (18, 13)), ["defn"], ["class"]);
12271228
("file1", ((50, 12), (50, 20)), ["type"], ["class"]);
@@ -1317,7 +1318,7 @@ let ``Test project3 all uses of all signature symbols`` () =
13171318
("property AbstractClassProperty",
13181319
[("file1", ((43, 18), (43, 39)), ["defn"], ["member"; "prop"; "overridemem"])]);
13191320
("property AbstractClassEvent",
1320-
[("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "prop"; "overridemem"])]);
1321+
[("file1", ((47, 18), (47, 36)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])]);
13211322
("CBaseFooImpl", [("file1", ((49, 5), (49, 17)), ["defn"], ["class"])]);
13221323
("member .ctor", [("file1", ((49, 5), (49, 17)), ["defn"], ["member"; "ctor"])]);
13231324
("member BaseClassMethod",
@@ -1337,7 +1338,7 @@ let ``Test project3 all uses of all signature symbols`` () =
13371338
("property BaseClassProperty",
13381339
[("file1", ((52, 18), (52, 35)), ["defn"], ["member"; "prop"; "overridemem"])]);
13391340
("property BaseClassEvent",
1340-
[("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "prop"; "overridemem"])])]
1341+
[("file1", ((56, 18), (56, 32)), ["defn"], ["member"; "prop"; "clievent"; "overridemem"])])]
13411342
set allUsesOfAllSymbols - set expected |> shouldEqual Set.empty
13421343
set expected - set allUsesOfAllSymbols |> shouldEqual Set.empty
13431344
(set expected = set allUsesOfAllSymbols) |> shouldEqual true

0 commit comments

Comments
 (0)