Skip to content

Commit b3db637

Browse files
committed
Service updates
1 parent ee9397a commit b3db637

File tree

6 files changed

+66
-22
lines changed

6 files changed

+66
-22
lines changed

src/Compiler/Service/ServiceInterfaceStubGenerator.fs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,8 +904,16 @@ module InterfaceStubGenerator =
904904

905905
| SynExpr.TypeApp(synExpr, _, _synTypeList, _commas, _, _, _range) -> walkExpr synExpr
906906

907-
| SynExpr.LetOrUse(bindings = synBindingList; body = synExpr) ->
908-
Option.orElse (List.tryPick walkBinding synBindingList) (walkExpr synExpr)
907+
| SynExpr.LetOrUse(isComputed = isComputed; bindings = synBindingList; body = synExpr) ->
908+
if isComputed then
909+
[
910+
for SynBinding(expr = bindingExpr) in synBindingList do
911+
yield bindingExpr
912+
yield synExpr
913+
]
914+
|> List.tryPick walkExpr
915+
else
916+
Option.orElse (List.tryPick walkBinding synBindingList) (walkExpr synExpr)
909917

910918
| SynExpr.TryWith(tryExpr = synExpr) -> walkExpr synExpr
911919

src/Compiler/Service/ServiceParseTreeWalk.fs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -669,17 +669,27 @@ module SyntaxTraversal =
669669
]
670670
|> pick expr
671671

672-
| SynExpr.LetOrUse(isRecursive = isRecursive; bindings = synBindingList; body = synExpr; range = range) ->
673-
match visitor.VisitLetOrUse(path, isRecursive, traverseSynBinding path, synBindingList, range) with
674-
| None ->
672+
| SynExpr.LetOrUse(
673+
isRecursive = isRecursive; isComputed = isComputed; bindings = synBindingList; body = synExpr; range = range) ->
674+
if isComputed then
675675
[
676-
yield!
677-
synBindingList
678-
|> List.map (fun x -> dive x x.RangeOfBindingWithRhs (traverseSynBinding path))
676+
for SynBinding(headPat = pat; expr = bindingExpr) in synBindingList do
677+
yield dive pat pat.Range traversePat
678+
yield dive bindingExpr bindingExpr.Range traverseSynExpr
679679
yield dive synExpr synExpr.Range traverseSynExpr
680680
]
681681
|> pick expr
682-
| x -> x
682+
else
683+
match visitor.VisitLetOrUse(path, isRecursive, traverseSynBinding path, synBindingList, range) with
684+
| None ->
685+
[
686+
yield!
687+
synBindingList
688+
|> List.map (fun x -> dive x x.RangeOfBindingWithRhs (traverseSynBinding path))
689+
yield dive synExpr synExpr.Range traverseSynExpr
690+
]
691+
|> pick expr
692+
| x -> x
683693

684694
| SynExpr.IfThenElse(ifExpr = synExpr; thenExpr = synExpr2; elseExpr = synExprOpt) ->
685695
[

src/Compiler/Service/ServiceParsedInputOps.fs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -834,9 +834,17 @@ module ParsedInput =
834834
walkExprWithKind (Some EntityKind.Type) e
835835
|> Option.orElseWith (fun () -> List.tryPick walkType tys)
836836

837-
| SynExpr.LetOrUse(bindings = bindings; body = e) ->
838-
List.tryPick walkBinding bindings
839-
|> Option.orElseWith (fun () -> walkExprWithKind parentKind e)
837+
| SynExpr.LetOrUse(isComputed = isComputed; bindings = bindings; body = e) ->
838+
if isComputed then
839+
[
840+
for SynBinding(expr = bindingExpr) in bindings do
841+
yield bindingExpr
842+
yield e
843+
]
844+
|> List.tryPick (walkExprWithKind parentKind)
845+
else
846+
List.tryPick walkBinding bindings
847+
|> Option.orElseWith (fun () -> walkExprWithKind parentKind e)
840848

841849
| SynExpr.IfThenElse(ifExpr = e1; thenExpr = e2; elseExpr = e3) ->
842850
walkExprWithKind parentKind e1
@@ -2102,9 +2110,16 @@ module ParsedInput =
21022110
List.iter walkType tys
21032111
walkExpr e
21042112

2105-
| SynExpr.LetOrUse(bindings = bindings; body = e) ->
2106-
List.iter walkBinding bindings
2107-
walkExpr e
2113+
| SynExpr.LetOrUse(isComputed = isComputed; bindings = bindings; body = e) ->
2114+
if isComputed then
2115+
for SynBinding(headPat = pat; expr = bindingExpr) in bindings do
2116+
walkPat pat
2117+
walkExpr bindingExpr
2118+
2119+
walkExpr e
2120+
else
2121+
List.iter walkBinding bindings
2122+
walkExpr e
21082123

21092124
| SynExpr.TryWith(tryExpr = e; withCases = clauses) ->
21102125
List.iter walkClause clauses

src/Compiler/Service/ServiceStructure.fs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,21 @@ module Structure =
263263
rcheck Scope.For Collapse.Below r r
264264
parseExpr e
265265

266-
| SynExpr.LetOrUse(bindings = bindings; body = body) ->
267-
parseBindings bindings
268-
parseExpr body
266+
| SynExpr.LetOrUse(isComputed = isComputed; bindings = bindings; body = body) ->
267+
if isComputed then
268+
for SynBinding(headPat = pat; expr = expr) in bindings do
269+
// for `let!`, `use!` or `and!` the pattern begins at the end of the
270+
// keyword so that this scope can be used without adjustment if there is no `=`
271+
// on the same line. If there is an `=` the range will be adjusted during the
272+
// tooltip creation
273+
let r = Range.endToEnd pat.Range expr.Range
274+
rcheck Scope.LetOrUseBang Collapse.Below r r
275+
parseExpr expr
276+
277+
parseExpr body
278+
else
279+
parseBindings bindings
280+
parseExpr body
269281

270282
| SynExpr.Match(matchDebugPoint = seqPointAtBinding; clauses = clauses; range = r)
271283
| SynExpr.MatchBang(matchDebugPoint = seqPointAtBinding; clauses = clauses; range = r) ->

src/Compiler/Service/SynExpr.fs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,6 @@ module SynExpr =
444444
[<return: Struct>]
445445
let (|LetOrUse|_|) =
446446
dangling (function
447-
| SynExpr.LetOrUse _
448447
| SynExpr.LetOrUse _ as expr -> Some expr
449448
| _ -> None)
450449

src/Compiler/SyntaxTree/ParseHelpers.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,7 @@ let leadingKeywordIsAbstract =
10661066
| _ -> false
10671067

10681068
/// Unified helper for creating let/let!/use/use! expressions
1069-
/// Creates either SynExpr.LetOrUse or SynExpr.LetOrUseBang based on isBang parameter
1069+
/// Creates SynExpr.LetOrUse for all cases with appropriate flags
10701070
/// Handles all four cases: 'let', 'let!', 'use', and 'use!'
10711071
let mkLetExpression
10721072
(
@@ -1122,7 +1122,7 @@ let mkLetExpression
11221122
false,
11231123
isUse, // Pass through the isUse flag from binding info
11241124
true, // isFromSource is true for user-written code
1125-
true, // isComputed is true for bang let/let!
1125+
true, // isComputed is true for let!/use!
11261126
binding :: decls,
11271127
body,
11281128
mWhole,
@@ -1164,7 +1164,7 @@ let mkLetExpression
11641164
isRec,
11651165
isUse, // Pass through the isUse flag from binding info
11661166
true, // isFromSource is true for user-written code
1167-
false, // isComputed is false for non-bang let/let!
1167+
false, // isComputed is false for let/use
11681168
decls,
11691169
body,
11701170
mWhole',

0 commit comments

Comments
 (0)