Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 48 additions & 26 deletions src/Compiler/Driver/GraphChecking/FileContentMapping.fs
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,8 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
| SynExpr.Const _ -> continuation []
| SynExpr.Paren(expr = expr) -> visit expr continuation
| SynExpr.Quote(operator = operator; quotedExpr = quotedExpr) ->
visit operator (fun operatorNodes -> visit quotedExpr (fun quotedNodes -> operatorNodes @ quotedNodes |> continuation))
let continuations = List.map visit [ operator; quotedExpr ]
Continuation.concatenate continuations continuation
| SynExpr.Typed(expr, targetType, _) -> visit expr (fun nodes -> nodes @ visitSynType targetType |> continuation)
| SynExpr.Tuple(exprs = exprs) ->
let continuations: ((FileContentEntry list -> FileContentEntry list) -> FileContentEntry list) list =
Expand Down Expand Up @@ -408,20 +409,27 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
]
|> continuation
| SynExpr.While(whileExpr = whileExpr; doExpr = doExpr) ->
visit whileExpr (fun whileNodes -> visit doExpr (fun doNodes -> whileNodes @ doNodes |> continuation))
let continuations = List.map visit [ whileExpr; doExpr ]
Continuation.concatenate continuations continuation
| SynExpr.For(identBody = identBody; toBody = toBody; doBody = doBody) ->
let continuations = List.map visit [ identBody; toBody; doBody ]
Continuation.concatenate continuations continuation
| SynExpr.ForEach(pat = pat; enumExpr = enumExpr; bodyExpr = bodyExpr) ->
visit enumExpr (fun enumNodes ->
visit bodyExpr (fun bodyNodes -> [ yield! visitPat pat; yield! enumNodes; yield! bodyNodes ] |> continuation))
let continuations = List.map visit [ enumExpr; bodyExpr ]

let finalContinuation nodes =
[ yield! visitPat pat; yield! List.concat nodes ] |> continuation

Continuation.sequence continuations finalContinuation
| SynExpr.ArrayOrListComputed(expr = expr) -> visit expr continuation
| SynExpr.IndexRange(expr1 = expr1; expr2 = expr2) ->
match expr1, expr2 with
| None, None -> continuation []
| Some e, None
| None, Some e -> visit e continuation
| Some e1, Some e2 -> visit e1 (fun e1Nodes -> visit e2 (fun e2Nodes -> e1Nodes @ e2Nodes |> continuation))
| Some e1, Some e2 ->
let continuations = List.map visit [ e1; e2 ]
Continuation.concatenate continuations continuation
| SynExpr.IndexFromEnd(expr, _) -> visit expr continuation
| SynExpr.ComputationExpr(expr = expr) -> visit expr continuation
| SynExpr.Lambda(args = args; body = body) -> visit body (fun bodyNodes -> visitSynSimplePats args @ bodyNodes |> continuation)
Expand All @@ -434,18 +442,21 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
| SynExpr.Do(expr, _) -> visit expr continuation
| SynExpr.Assert(expr, _) -> visit expr continuation
| SynExpr.App(funcExpr = funcExpr; argExpr = argExpr) ->
visit funcExpr (fun funcNodes -> visit argExpr (fun argNodes -> funcNodes @ argNodes |> continuation))
let continuations = List.map visit [ funcExpr; argExpr ]
Continuation.concatenate continuations continuation
| SynExpr.TypeApp(expr = expr; typeArgs = typeArgs) ->
visit expr (fun exprNodes -> exprNodes @ List.collect visitSynType typeArgs |> continuation)
| SynExpr.LetOrUse({ Bindings = bindings; Body = body }) ->
visit body (fun nodes -> List.collect visitBinding bindings @ nodes |> continuation)
| SynExpr.TryWith(tryExpr = tryExpr; withCases = withCases) ->
visit tryExpr (fun nodes -> nodes @ List.collect visitSynMatchClause withCases |> continuation)
| SynExpr.TryFinally(tryExpr = tryExpr; finallyExpr = finallyExpr) ->
visit tryExpr (fun tNodes -> visit finallyExpr (fun fNodes -> tNodes @ fNodes |> continuation))
let continuations = List.map visit [ tryExpr; finallyExpr ]
Continuation.concatenate continuations continuation
| SynExpr.Lazy(expr, _) -> visit expr continuation
| SynExpr.Sequential(expr1 = expr1; expr2 = expr2) ->
visit expr1 (fun nodes1 -> visit expr2 (fun nodes2 -> nodes1 @ nodes2 |> continuation))
let continuations = List.map visit [ expr1; expr2 ]
Continuation.concatenate continuations continuation
| SynExpr.IfThenElse(ifExpr = ifExpr; thenExpr = thenExpr; elseExpr = elseExpr) ->
let continuations = List.map visit (ifExpr :: thenExpr :: Option.toList elseExpr)
Continuation.concatenate continuations continuation
Expand All @@ -456,10 +467,16 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
| SynExpr.DotGet(expr = expr; longDotId = longDotId) ->
visit expr (fun nodes -> visitSynLongIdent longDotId @ nodes |> continuation)
| SynExpr.DotSet(targetExpr, longDotId, rhsExpr, _) ->
visit targetExpr (fun tNodes ->
visit rhsExpr (fun rNodes ->
let continuations = List.map visit [ targetExpr; rhsExpr ]

let finalContinuation nodes =
match nodes with
| [ tNodes; rNodes ] ->
[ yield! tNodes; yield! visitSynLongIdent longDotId; yield! rNodes ]
|> continuation))
|> continuation
| _ -> List.concat nodes |> continuation

Continuation.sequence continuations finalContinuation
| SynExpr.Set(targetExpr, rhsExpr, _) ->
let continuations = List.map visit [ targetExpr; rhsExpr ]
Continuation.concatenate continuations continuation
Expand All @@ -470,10 +487,12 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
let continuations = List.map visit [ objectExpr; indexArgs; valueExpr ]
Continuation.concatenate continuations continuation
| SynExpr.NamedIndexedPropertySet(longDotId, expr1, expr2, _) ->
visit expr1 (fun nodes1 ->
visit expr2 (fun nodes2 ->
[ yield! visitSynLongIdent longDotId; yield! nodes1; yield! nodes2 ]
|> continuation))
let continuations = List.map visit [ expr1; expr2 ]

let finalContinuation nodes =
visitSynLongIdent longDotId @ List.concat nodes |> continuation

Continuation.sequence continuations finalContinuation
| SynExpr.DotNamedIndexedPropertySet(targetExpr, longDotId, argExpr, rhsExpr, _) ->
let continuations = List.map visit [ targetExpr; argExpr; rhsExpr ]

Expand Down Expand Up @@ -511,7 +530,8 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
|> continuation)
| SynExpr.DoBang(expr = expr) -> visit expr continuation
| SynExpr.WhileBang(whileExpr = whileExpr; doExpr = doExpr) ->
visit whileExpr (fun whileNodes -> visit doExpr (fun doNodes -> whileNodes @ doNodes |> continuation))
let continuations = List.map visit [ whileExpr; doExpr ]
Continuation.concatenate continuations continuation
| SynExpr.LibraryOnlyILAssembly(typeArgs = typeArgs; args = args; retTy = retTy) ->
let typeNodes = List.collect visitSynType (typeArgs @ retTy)
let continuations = List.map visit args
Expand All @@ -527,19 +547,21 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
| SynStaticOptimizationConstraint.WhenTyparTyconEqualsTycon(rhsType = t) -> Some t
| SynStaticOptimizationConstraint.WhenTyparIsStruct _ -> None)

visit expr (fun eNodes ->
visit optimizedExpr (fun oNodes ->
[
yield! List.collect visitSynType constraintTypes
yield! eNodes
yield! oNodes
]
|> continuation))
let continuations = List.map visit [ expr; optimizedExpr ]

let finalContinuation nodes =
List.collect visitSynType constraintTypes @ List.concat nodes |> continuation

Continuation.sequence continuations finalContinuation
| SynExpr.LibraryOnlyUnionCaseFieldGet(expr, longId, _, _) ->
visit expr (fun eNodes -> visitLongIdent longId @ eNodes |> continuation)
| SynExpr.LibraryOnlyUnionCaseFieldSet(expr, longId, _, rhsExpr, _) ->
visit expr (fun eNodes ->
visit rhsExpr (fun rhsNodes -> [ yield! visitLongIdent longId; yield! eNodes; yield! rhsNodes ] |> continuation))
let continuations = List.map visit [ expr; rhsExpr ]

let finalContinuation nodes =
visitLongIdent longId @ List.concat nodes |> continuation

Continuation.sequence continuations finalContinuation
| SynExpr.ArbitraryAfterError _ -> continuation []
| SynExpr.FromParseError _ -> continuation []
| SynExpr.DiscardAfterMissingQualificationAfterDot _ -> continuation []
Expand Down
Loading