Skip to content

Commit 75ff212

Browse files
committed
Merge pull request #282 from 7sharp9/updateOnEvaluation
Update OnEvaluation event to have FSharpSymbolUse information available
2 parents c9af67f + e585a5e commit 75ff212

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

src/fsharp/fsi/fsi.fs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,11 @@ type internal FsiValuePrinterMode =
149149
| PrintExpr
150150
| PrintDecl
151151

152-
type EvaluationEventArgs(name : string, displaycontext : FSharpDisplayContext, range : range, fsivalue : FsiValue) =
152+
type EvaluationEventArgs(name : string, fsivalue : FsiValue, symbolUse : FSharpSymbolUse) =
153153
inherit EventArgs()
154154
member x.Name = name
155-
member x.DisplayContext = displaycontext
156-
member x.Range = range
157155
member x.FsiValue = fsivalue
156+
member x.SymbolUse = symbolUse
158157

159158
[<AbstractClass>]
160159
type public FsiEvaluationSessionHostConfig () =
@@ -226,8 +225,8 @@ type public FsiEvaluationSessionHostConfig () =
226225

227226
/// Hook for listening for evaluation bindings
228227
member x.OnEvaluation = evaluationEvent.Publish
229-
member internal x.TriggerEvaluation (name, context, range, value) =
230-
evaluationEvent.Trigger (EvaluationEventArgs (name, context, range, value) )
228+
member internal x.TriggerEvaluation (name, value, symbolUse) =
229+
evaluationEvent.Trigger (EvaluationEventArgs (name, value, symbolUse) )
231230

232231
/// Used to print value signatures along with their values, according to the current
233232
/// set of pretty printers installed in the system, and default printing rules.
@@ -1120,23 +1119,23 @@ type internal FsiDynamicCompiler
11201119

11211120
let filteredByVal =
11221121
allNames
1123-
|> List.choose (function
1122+
|> List.choose (fun i ->
1123+
match i with
11241124
| Nameres.Item.Value vref -> Some (vref, i)
11251125
| _ -> None)
11261126

11271127
let actualValues =
1128-
filteredByVal|> List.choose (fun (vref, _) ->
1128+
filteredByVal |> List.choose (fun (vref, i) ->
11291129
let optValue = newState.ilxGenerator.LookupGeneratedValue(valuePrinter.GetEvaluationContext(newState.emEnv), vref.Deref)
11301130
match optValue with
11311131
| Some (res, typ) ->
1132-
//let symbol = FSharpSymbol.Create(newState.tcGlobals, newState.tcState.Ccu, newState.tcImports, i)
1133-
let displayEnv = newState.tcState.TcEnvFromImpls.DisplayEnv
1134-
let displayContext = FSharpDisplayContext(fun _ -> displayEnv)
1135-
Some(vref.DisplayName,displayContext,vref.Range,FsiValue(res, typ, FSharpType(tcGlobals, newState.tcState.Ccu, newState.tcImports, vref.Type)))
1132+
let symbol = FSharpSymbol.Create(newState.tcGlobals, newState.tcState.Ccu, newState.tcImports, i)
1133+
let symbolUse = FSharpSymbolUse(tcGlobals, newState.tcState.TcEnvFromImpls.DisplayEnv, symbol, ItemOccurence.Binding, vref.Range)
1134+
Some(vref.DisplayName,FsiValue(res, typ, FSharpType(tcGlobals, newState.tcState.Ccu, newState.tcImports, vref.Type)), symbolUse)
11361135
| None -> None )
11371136

1138-
for (name, displayContext, range, fsiValue) in actualValues do
1139-
fsiConfig.TriggerEvaluation (name, displayContext, range, fsiValue)
1137+
for (name, fsiValue, symbolUse) in actualValues do
1138+
fsiConfig.TriggerEvaluation (name, fsiValue, symbolUse)
11401139

11411140
newState
11421141

src/fsharp/fsi/fsi.fsi

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ type EvaluationEventArgs =
3030
inherit System.EventArgs
3131
//new : unit -> CompilerOutputStream
3232
member Name : string
33-
member DisplayContext : Microsoft.FSharp.Compiler.SourceCodeServices.FSharpDisplayContext
34-
member Range : Microsoft.FSharp.Compiler.Range.range
3533
member FsiValue : FsiValue
34+
member SymbolUse : FSharpSymbolUse
3635

3736
[<AbstractClass>]
3837
type public FsiEvaluationSessionHostConfig =

src/fsharp/vs/service.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ type FSharpProjectContext =
100100
/// Represents the use of an F# symbol from F# source code
101101
[<Sealed>]
102102
type FSharpSymbolUse =
103+
// For internal use only
104+
internal new : g:Env.TcGlobals * denv: Tastops.DisplayEnv * symbol:FSharpSymbol * itemOcc:Nameres.ItemOccurence * range: range -> FSharpSymbolUse
105+
103106
/// The symbol referenced
104107
member Symbol : FSharpSymbol
105108

tests/service/FsiTests.fs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,32 @@ let ``Disposing interactive session (collectible)``() =
222222
printfn "iteration %d" i
223223
createSession i
224224

225+
[<Test>]
226+
let ``interactive session events``() =
227+
228+
let defaultArgs = [|"fsi.exe";"--noninteractive";"--nologo";"--gui-"|]
229+
let sbOut = StringBuilder()
230+
use inStream = new StringReader("")
231+
use outStream = new StringWriter(sbOut)
232+
let sbErr = StringBuilder("")
233+
use errStream = new StringWriter(sbErr)
234+
235+
let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration()
236+
let evals = ResizeArray()
237+
use evaluator = fsiConfig.OnEvaluation.Subscribe (fun eval -> evals.Add (eval.FsiValue, eval.Name, eval.SymbolUse))
238+
239+
use session = FsiEvaluationSession.Create(fsiConfig, defaultArgs, inStream, outStream, errStream, collectible=true)
240+
session.EvalInteraction "let x = 42"
241+
242+
let value, name, symbol = evals.[0]
243+
// name should be x
244+
// value should be 42
245+
// symbol type should be a FSharpMemberOrFunctionOrValue and display name "x"
246+
name |> should equal "x"
247+
value.ReflectionValue |> should equal 42
248+
symbol.Symbol.GetType() |> should equal typeof<FSharpMemberOrFunctionOrValue>
249+
symbol.Symbol.DisplayName |> should equal "x"
250+
225251

226252
let RunManually() =
227253
``EvalExpression test 1``()
@@ -240,6 +266,7 @@ let RunManually() =
240266
``Bad arguments to session creation 1``()
241267
``Bad arguments to session creation 2``()
242268
``EvalScript accepts paths verbatim``()
269+
``interactive session events``()
243270
``Disposing interactive session (collectible)``()
244271

245272
//#endif

0 commit comments

Comments
 (0)