Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Keep parsed lambda patterns and expression in syntax tree (#10166)
  • Loading branch information
auduchinok authored Sep 21, 2020
commit f4e6973f1ed35ab6486a98277f4230957c9903f5
2 changes: 1 addition & 1 deletion src/fsharp/MethodCalls.fs
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ type ArgumentAnalysis =
let InferLambdaArgsForLambdaPropagation origRhsExpr =
let rec loop e =
match e with
| SynExpr.Lambda (_, _, _, rest, _) -> 1 + loop rest
| SynExpr.Lambda (_, _, _, rest, _, _) -> 1 + loop rest
| SynExpr.MatchLambda _ -> 1
| _ -> 0
loop origRhsExpr
Expand Down
3 changes: 3 additions & 0 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -665,13 +665,16 @@ type SynExpr =

/// First bool indicates if lambda originates from a method. Patterns here are always "simple"
/// Second bool indicates if this is a "later" part of an iterated sequence of lambdas
/// parsedData keeps original parsed patterns and expression,
/// prior to transforming to "simple" patterns and iterated lambdas
///
/// F# syntax: fun pat -> expr
| Lambda of
fromMethod: bool *
inLambdaSeq: bool *
args: SynSimplePats *
body: SynExpr *
parsedData: (SynPat list * SynExpr) option *
range: range

/// F# syntax: function pat1 -> expr | ... | patN -> exprN
Expand Down
12 changes: 6 additions & 6 deletions src/fsharp/SyntaxTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ let rec SimplePatsOfPat synArgNameGenerator p =

let PushPatternToExpr synArgNameGenerator isMember pat (rhs: SynExpr) =
let nowPats, laterF = SimplePatsOfPat synArgNameGenerator pat
nowPats, SynExpr.Lambda (isMember, false, nowPats, appFunOpt laterF rhs, rhs.Range)
nowPats, SynExpr.Lambda (isMember, false, nowPats, appFunOpt laterF rhs, None, rhs.Range)

let private isSimplePattern pat =
let _nowPats, laterF = SimplePatsOfPat (SynArgNameGenerator()) pat
Expand Down Expand Up @@ -253,8 +253,8 @@ let PushCurriedPatternsToExpr synArgNameGenerator wholem isMember pats rhs =
match spatsl with
| [] -> rhs
| h :: t ->
let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember, true, spats, e, wholem)) t rhs
let expr = SynExpr.Lambda (isMember, false, h, expr, wholem)
let expr = List.foldBack (fun spats e -> SynExpr.Lambda (isMember, true, spats, e, None, wholem)) t rhs
let expr = SynExpr.Lambda (isMember, false, h, expr, Some (pats, rhs), wholem)
expr
spatsl, expr

Expand Down Expand Up @@ -330,7 +330,7 @@ let mkSynUnit m = SynExpr.Const (SynConst.Unit, m)
let mkSynUnitPat m = SynPat.Const(SynConst.Unit, m)

let mkSynDelay m e =
SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")], m), e, m)
SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynCompGenSimplePatVar (mkSynId m "unitVar")], m), e, None, m)

let mkSynAssign (l: SynExpr) (r: SynExpr) =
let m = unionRanges l.Range r.Range
Expand Down Expand Up @@ -498,7 +498,7 @@ module SynInfo =
let InferLambdaArgs origRhsExpr =
let rec loop e =
match e with
| SynExpr.Lambda (false, _, spats, rest, _) ->
| SynExpr.Lambda (false, _, spats, rest, _, _) ->
InferSynArgInfoFromSimplePats spats :: loop rest
| _ -> []
loop origRhsExpr
Expand Down Expand Up @@ -692,7 +692,7 @@ let rec synExprContainsError inpExpr =
| SynExpr.MatchLambda (_, _, cl, _, _) ->
walkMatchClauses cl

| SynExpr.Lambda (_, _, _, e, _) ->
| SynExpr.Lambda (_, _, _, e, _, _) ->
walkExpr e

| SynExpr.Match (_, e, cl, _) ->
Expand Down
12 changes: 6 additions & 6 deletions src/fsharp/TypeChecker.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2670,7 +2670,7 @@ module EventDeclarationNormalization =

match rhsExpr with
// Detect 'fun () -> e' which results from the compilation of a property getter
| SynExpr.Lambda (_, _, SynSimplePats.SimplePats([], _), trueRhsExpr, m) ->
| SynExpr.Lambda (_, _, SynSimplePats.SimplePats([], _), trueRhsExpr, _, m) ->
let rhsExpr = mkSynApp1 (SynExpr.DotGet (SynExpr.Paren (trueRhsExpr, range0, None, m), range0, LongIdentWithDots([ident(target, m)], []), m)) (SynExpr.Ident (ident(argName, m))) m

// reconstitute rhsExpr
Expand Down Expand Up @@ -6414,7 +6414,7 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) =
/// Check lambdas as a group, to catch duplicate names in patterns
and TcIteratedLambdas cenv isFirst (env: TcEnv) overallTy takenNames tpenv e =
match e with
| SynExpr.Lambda (isMember, isSubsequent, spats, bodyExpr, m) when isMember || isFirst || isSubsequent ->
| SynExpr.Lambda (isMember, isSubsequent, spats, bodyExpr, _, m) when isMember || isFirst || isSubsequent ->
let domainTy, resultTy = UnifyFunctionType None cenv env.DisplayEnv m overallTy
let vs, (tpenv, names, takenNames) = TcSimplePats cenv isMember CheckCxs domainTy env (tpenv, Map.empty, takenNames) spats
let envinner, _, vspecMap = MakeAndPublishSimpleValsForMergedScope cenv env m names
Expand Down Expand Up @@ -8241,7 +8241,7 @@ and TcComputationExpression cenv env overallTy mWhole (interpExpr: Expr) builder
Some (nm, Option.get (tryGetDataForCustomOperation nm), core, core.Range, optIntoInfo)
| _ -> None

let mkSynLambda p e m = SynExpr.Lambda (false, false, p, e, m)
let mkSynLambda p e m = SynExpr.Lambda (false, false, p, e, None, m)

let mkExprForVarSpace m (patvs: Val list) =
match patvs with
Expand Down Expand Up @@ -8940,7 +8940,7 @@ and TcComputationExpression cenv env overallTy mWhole (interpExpr: Expr) builder
// Check for the [<ProjectionParameter>] attribute on each argument position
let args = args |> List.mapi (fun i arg ->
if isCustomOperationProjectionParameter (i+1) nm then
SynExpr.Lambda (false, false, varSpaceSimplePat, arg, arg.Range.MakeSynthetic())
SynExpr.Lambda (false, false, varSpaceSimplePat, arg, None, arg.Range.MakeSynthetic())
else arg)
mkSynCall methInfo.DisplayName mClause (dataCompPrior :: args)
else
Expand Down Expand Up @@ -9180,7 +9180,7 @@ and TcComputationExpression cenv env overallTy mWhole (interpExpr: Expr) builder

let lambdaExpr =
let mBuilderVal = mBuilderVal.MakeSynthetic()
SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)], mBuilderVal), runExpr, mBuilderVal)
SynExpr.Lambda (false, false, SynSimplePats.SimplePats ([mkSynSimplePatVar false (mkSynId mBuilderVal builderValName)], mBuilderVal), runExpr, None, mBuilderVal)

let env =
match comp with
Expand Down Expand Up @@ -10574,7 +10574,7 @@ and GetNewInferenceTypeForMethodArg cenv env tpenv x =
match x with
| SynExprParen(a, _, _, _) -> GetNewInferenceTypeForMethodArg cenv env tpenv a
| SynExpr.AddressOf (true, a, _, m) -> mkByrefTyWithInference cenv.g (GetNewInferenceTypeForMethodArg cenv env tpenv a) (NewByRefKindInferenceType cenv.g m)
| SynExpr.Lambda (_, _, _, a, _) -> mkFunTy (NewInferenceType ()) (GetNewInferenceTypeForMethodArg cenv env tpenv a)
| SynExpr.Lambda (_, _, _, a, _, _) -> mkFunTy (NewInferenceType ()) (GetNewInferenceTypeForMethodArg cenv env tpenv a)
| SynExpr.Quote (_, raw, a, _, _) ->
if raw then mkRawQuotedExprTy cenv.g
else mkQuotedExprTy cenv.g (GetNewInferenceTypeForMethodArg cenv env tpenv a)
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceAssemblyContent.fs
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ module ParsedInput =
| SynExpr.Assert (e, _)
| SynExpr.Lazy (e, _)
| SynExpr.YieldOrReturnFrom (_, e, _) -> walkExpr e
| SynExpr.Lambda (_, _, pats, e, _) ->
| SynExpr.Lambda (_, _, pats, e, _, _) ->
walkSimplePats pats
walkExpr e
| SynExpr.New (_, t, e, _)
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@ module InterfaceStubGenerator =
walkExpr synExpr
| SynExpr.CompExpr (_, _, synExpr, _range) ->
walkExpr synExpr
| SynExpr.Lambda (_, _, _synSimplePats, synExpr, _range) ->
| SynExpr.Lambda (_, _, _synSimplePats, synExpr, _, _range) ->
walkExpr synExpr

| SynExpr.MatchLambda (_isExnMatch, _argm, synMatchClauseList, _spBind, _wholem) ->
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceParseTreeWalk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ module public AstTraversal =
else
traverseSynExpr synExpr

| SynExpr.Lambda (_, _, synSimplePats, synExpr, _range) ->
| SynExpr.Lambda (_, _, synSimplePats, synExpr, _, _range) ->
match synSimplePats with
| SynSimplePats.SimplePats(pats,_) ->
match visitor.VisitSimplePats(pats) with
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceStructure.fs
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ module Structure =
| SynExpr.While (_, _, e, r) ->
rcheck Scope.While Collapse.Below r r
parseExpr e
| SynExpr.Lambda (_, _, pats, e, r) ->
| SynExpr.Lambda (_, _, pats, e, _, r) ->
match pats with
| SynSimplePats.SimplePats (_, pr)
| SynSimplePats.Typed (_, _, pr) ->
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/service/ServiceUntypedParse.fs
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: ParsedInput option
yield! walkExprOpt false whenExpr
yield! walkExpr true e

| SynExpr.Lambda (_, _, _, e, _) ->
| SynExpr.Lambda (_, _, _, e, _, _) ->
yield! walkExpr true e

| SynExpr.Match (spBind, e, cl, _) ->
Expand Down Expand Up @@ -853,7 +853,7 @@ module UntypedParseImpl =
| SynExpr.ForEach (_, _, _, _, e1, e2, _) -> List.tryPick (walkExprWithKind parentKind) [e1; e2]
| SynExpr.ArrayOrListOfSeqExpr (_, e, _) -> walkExprWithKind parentKind e
| SynExpr.CompExpr (_, _, e, _) -> walkExprWithKind parentKind e
| SynExpr.Lambda (_, _, _, e, _) -> walkExprWithKind parentKind e
| SynExpr.Lambda (_, _, _, e, _, _) -> walkExprWithKind parentKind e
| SynExpr.MatchLambda (_, _, synMatchClauseList, _, _) ->
List.tryPick walkClause synMatchClauseList
| SynExpr.Match (_, e, synMatchClauseList, _) ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31673,6 +31673,8 @@ FSharp.Compiler.SyntaxTree+SynExpr+Lambda: SynExpr body
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: SynExpr get_body()
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: SynSimplePats args
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: SynSimplePats get_args()
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynPat],FSharp.Compiler.SyntaxTree+SynExpr]] parsedData
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynPat],FSharp.Compiler.SyntaxTree+SynExpr]] get_parsedData()
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: System.String ToString()
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: range Range
FSharp.Compiler.SyntaxTree+SynExpr+Lambda: range RangeOfFirstPortion
Expand Down Expand Up @@ -36769,7 +36771,7 @@ FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewInferredDowncast(SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewInferredUpcast(SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewInterpolatedString(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynInterpolatedStringPart], range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewJoinIn(SynExpr, range, SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewLambda(Boolean, Boolean, SynSimplePats, SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewLambda(Boolean, Boolean, SynSimplePats, SynExpr, Microsoft.FSharp.Core.FSharpOption`1[System.Tuple`2[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynPat],FSharp.Compiler.SyntaxTree+SynExpr]], range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewLazy(SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewLetOrUse(Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynBinding], SynExpr, range)
FSharp.Compiler.SyntaxTree+SynExpr: SynExpr NewLetOrUseBang(DebugPointForBinding, Boolean, Boolean, SynPat, SynExpr, Microsoft.FSharp.Collections.FSharpList`1[System.Tuple`6[FSharp.Compiler.SyntaxTree+DebugPointForBinding,System.Boolean,System.Boolean,FSharp.Compiler.SyntaxTree+SynPat,FSharp.Compiler.SyntaxTree+SynExpr,FSharp.Compiler.Range+range]], SynExpr, range)
Expand Down