Skip to content

Commit

Permalink
Don't check the unfinished expression before dot as the whole express…
Browse files Browse the repository at this point in the history
…ion (#14718)

* Don't check the unfinished expression before dot as the whole expression

* More recovery

* tmp

* Fix record field completion

* Fantomas

* Update surface area

* Fix parsing

* Space

* Fantomas

* Fix tests, add tests for record fields

* Another record field test
  • Loading branch information
auduchinok authored Feb 16, 2023
1 parent 2ca2f09 commit 91af626
Show file tree
Hide file tree
Showing 40 changed files with 294 additions and 72 deletions.
51 changes: 16 additions & 35 deletions src/Compiler/Checking/CheckExpressions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4935,9 +4935,9 @@ and ConvSynPatToSynExpr synPat =
| SynPat.LongIdent (longDotId=SynLongIdent(longId, dotms, trivia) as synLongId; argPats=args; accessibility=None; range=m) ->
let args = match args with SynArgPats.Pats args -> args | _ -> failwith "impossible: active patterns can be used only with SynConstructorArgs.Pats"
let e =
if dotms.Length = longId.Length then
if not dotms.IsEmpty && dotms.Length = longId.Length then
let e = SynExpr.LongIdent (false, SynLongIdent(longId, List.truncate (dotms.Length - 1) dotms, trivia), None, m)
SynExpr.DiscardAfterMissingQualificationAfterDot (e, unionRanges e.Range (List.last dotms))
SynExpr.DiscardAfterMissingQualificationAfterDot (e, List.last dotms, unionRanges e.Range (List.last dotms))
else SynExpr.LongIdent (false, synLongId, None, m)
List.fold (fun f x -> mkSynApp1 f (ConvSynPatToSynExpr x) m) e args

Expand Down Expand Up @@ -5231,7 +5231,7 @@ and TcExprThen (cenv: cenv) overallTy env tpenv isArg synExpr delayed =
// etc.
| SynExpr.DotGet (expr1, _, SynLongIdent(longId, _, _), _) ->
TcNonControlFlowExpr env <| fun env ->
TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.RangeWithoutAnyExtraDot)) :: delayed)
TcExprThen cenv overallTy env tpenv false expr1 ((DelayedDotLookup (longId, synExpr.Range)) :: delayed)

// expr1.[expr2]
// expr1.[e21, ..., e2n]
Expand Down Expand Up @@ -5602,7 +5602,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE
//SolveTypeAsError cenv env.DisplayEnv m overallTy
mkDefault(m, overallTy.Commit), tpenv

| SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, m) ->
| SynExpr.DiscardAfterMissingQualificationAfterDot (expr1, _, m) ->
let _, _, tpenv = suppressErrorReporting (fun () -> TcExprOfUnknownTypeThen cenv env tpenv expr1 [DelayedDot])
mkDefault(m, overallTy.Commit), tpenv

Expand Down Expand Up @@ -6007,45 +6007,26 @@ and TcExprStaticOptimization (cenv: cenv) overallTy env tpenv (constraints, synE
/// synExpr1.longId <- synExpr2
and TcExprDotSet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2, mStmt) =
let (SynLongIdent(longId, _, _)) = synLongId

if synLongId.ThereIsAnExtraDotAtTheEnd then
// just drop rhs on the floor
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup)]
else
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup); MakeDelayedSet(synExpr2, mStmt)]
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup); MakeDelayedSet(synExpr2, mStmt)]

/// synExpr1.longId(synExpr2) <- expr3, very rarely used named property setters
and TcExprDotNamedIndexedPropertySet (cenv: cenv) overallTy env tpenv (synExpr1, synLongId, synExpr2, expr3, mStmt) =
let (SynLongIdent(longId, _, _)) = synLongId
if synLongId.ThereIsAnExtraDotAtTheEnd then
// just drop rhs on the floor
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1 [DelayedDotLookup(longId, mExprAndDotLookup)]
else
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1
[ DelayedDotLookup(longId, mExprAndDotLookup);
DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr2, mStmt)
MakeDelayedSet(expr3, mStmt)]
let mExprAndDotLookup = unionRanges synExpr1.Range (rangeOfLid longId)
TcExprThen cenv overallTy env tpenv false synExpr1
[ DelayedDotLookup(longId, mExprAndDotLookup);
DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr2, mStmt)
MakeDelayedSet(expr3, mStmt)]

and TcExprLongIdentSet (cenv: cenv) overallTy env tpenv (synLongId, synExpr2, m) =
if synLongId.ThereIsAnExtraDotAtTheEnd then
// just drop rhs on the floor
TcLongIdentThen cenv overallTy env tpenv synLongId [ ]
else
TcLongIdentThen cenv overallTy env tpenv synLongId [ MakeDelayedSet(synExpr2, m) ]
TcLongIdentThen cenv overallTy env tpenv synLongId [ MakeDelayedSet(synExpr2, m) ]

// Type.Items(synExpr1) <- synExpr2
and TcExprNamedIndexPropertySet (cenv: cenv) overallTy env tpenv (synLongId, synExpr1, synExpr2, mStmt) =
if synLongId.ThereIsAnExtraDotAtTheEnd then
// just drop rhs on the floor
TcLongIdentThen cenv overallTy env tpenv synLongId [ ]
else
TcLongIdentThen cenv overallTy env tpenv synLongId
[ DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr1, mStmt)
MakeDelayedSet(synExpr2, mStmt) ]
TcLongIdentThen cenv overallTy env tpenv synLongId
[ DelayedApp(ExprAtomicFlag.Atomic, false, None, synExpr1, mStmt)
MakeDelayedSet(synExpr2, mStmt) ]

and TcExprTraitCall (cenv: cenv) overallTy env tpenv (synTypes, synMemberSig, arg, m) =
let g = cenv.g
Expand Down Expand Up @@ -8018,7 +7999,7 @@ and TcNameOfExpr (cenv: cenv) env tpenv (synArg: SynExpr) =
// expr.ID allowed
| SynExpr.DotGet (hd, _, SynLongIdent(longId, _, _), _) ->
let result = defaultArg resultOpt (List.last longId)
check overallTyOpt (Some result) hd ((DelayedDotLookup (longId, expr.RangeWithoutAnyExtraDot)) :: delayed)
check overallTyOpt (Some result) hd ((DelayedDotLookup (longId, expr.Range)) :: delayed)

// "(expr)" allowed with no subsequent qualifications
| SynExpr.Paren(expr, _, _, _) when delayed.IsEmpty && overallTyOpt.IsNone ->
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/FSharpParseFileResults.fs
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
| SynExpr.ArrayOrListComputed (_, e, _)
| SynExpr.Typed (e, _, _)
| SynExpr.FromParseError (e, _)
| SynExpr.DiscardAfterMissingQualificationAfterDot (e, _)
| SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, _)
| SynExpr.Do (e, _)
| SynExpr.Assert (e, _)
| SynExpr.Fixed (e, _)
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -969,7 +969,7 @@ module InterfaceStubGenerator =
| SynExpr.ArbitraryAfterError (_debugStr, _range) -> None

| SynExpr.FromParseError (synExpr, _range)
| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _range) -> walkExpr synExpr
| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _range) -> walkExpr synExpr

| _ -> None

Expand Down
5 changes: 2 additions & 3 deletions src/Compiler/Service/ServiceParseTreeWalk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -547,8 +547,7 @@ module SyntaxTraversal =

let ok =
match isPartOfArrayOrList, synExpr with
| false, SynExpr.Ident ident -> visitor.VisitRecordField(path, None, Some(SynLongIdent([ ident ], [], [ None ])))
| false, SynExpr.LongIdent (false, lidwd, _, _) -> visitor.VisitRecordField(path, None, Some lidwd)
| false, LongOrSingleIdent (_, lid, _, _) -> visitor.VisitRecordField(path, None, Some lid)
| _ -> None

if ok.IsSome then ok else traverseSynExpr synExpr
Expand Down Expand Up @@ -783,7 +782,7 @@ module SyntaxTraversal =

| SynExpr.FromParseError (synExpr, _range) -> traverseSynExpr synExpr

| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _range) -> traverseSynExpr synExpr
| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _range) -> traverseSynExpr synExpr

visitor.VisitExpr(origPath, traverseSynExpr origPath, defaultTraverse, expr)

Expand Down
6 changes: 3 additions & 3 deletions src/Compiler/Service/ServiceParsedInputOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ module ParsedInput =
Some(unionRanges synExpr.Range r)

// get this for e.g. "bar()."
| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _) ->
| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, _, _) ->
if SyntaxTraversal.rangeContainsPosLeftEdgeInclusive synExpr.Range pos then
traverseSynExpr synExpr
else
Expand Down Expand Up @@ -466,7 +466,7 @@ module ParsedInput =

if not (rangeContainsPos expr.Range pos) then
match expr with
| SynExpr.DiscardAfterMissingQualificationAfterDot (e, _m) ->
| SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, _m) ->
// This happens with e.g. "f(x) . $" when you bring up a completion list a few spaces after a dot. The cursor is not 'in the parse tree',
// but the dive algorithm will dive down into this node, and this is the one case where we do want to give a result despite the cursor
// not properly being in a node.
Expand Down Expand Up @@ -540,7 +540,7 @@ module ParsedInput =
// the cursor is left of the dot
None

| SynExpr.DiscardAfterMissingQualificationAfterDot (e, m) ->
| SynExpr.DiscardAfterMissingQualificationAfterDot (e, _, m) ->
match traverseSynExpr e with
| None ->
if posEq m.End pos then
Expand Down
10 changes: 2 additions & 8 deletions src/Compiler/SyntaxTree/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ type SynExpr =

| FromParseError of expr: SynExpr * range: range

| DiscardAfterMissingQualificationAfterDot of expr: SynExpr * range: range
| DiscardAfterMissingQualificationAfterDot of expr: SynExpr * dotRange: range * range: range

| Fixed of expr: SynExpr * range: range

Expand Down Expand Up @@ -787,13 +787,7 @@ type SynExpr =

member e.RangeWithoutAnyExtraDot =
match e with
| SynExpr.DotGet (expr, _, lidwd, m) ->
if lidwd.ThereIsAnExtraDotAtTheEnd then
unionRanges expr.Range lidwd.RangeWithoutAnyExtraDot
else
m
| SynExpr.LongIdent (_, lidwd, _, _) -> lidwd.RangeWithoutAnyExtraDot
| SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _) -> expr.Range
| SynExpr.DiscardAfterMissingQualificationAfterDot (expr, _, _) -> expr.Range
| _ -> e.Range

member e.RangeOfFirstPortion =
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/SyntaxTree/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -905,7 +905,7 @@ type SynExpr =
| FromParseError of expr: SynExpr * range: range

/// Inserted for error recovery when there is "expr." and missing tokens or error recovery after the dot
| DiscardAfterMissingQualificationAfterDot of expr: SynExpr * range: range
| DiscardAfterMissingQualificationAfterDot of expr: SynExpr * dotRange: range * range: range

/// 'use x = fixed expr'
| Fixed of expr: SynExpr * range: range
Expand Down
18 changes: 10 additions & 8 deletions src/Compiler/SyntaxTree/SyntaxTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ let (|LongOrSingleIdent|_|) inp =
match inp with
| SynExpr.LongIdent (isOpt, lidwd, altId, _m) -> Some(isOpt, lidwd, altId, lidwd.RangeWithoutAnyExtraDot)
| SynExpr.Ident id -> Some(false, SynLongIdent([ id ], [], [ None ]), None, id.idRange)

| SynExpr.DiscardAfterMissingQualificationAfterDot (synExpr, dotRange, _) ->
match synExpr with
| SynExpr.Ident ident -> Some(false, SynLongIdent([ ident ], [ dotRange ], [ None ]), None, ident.idRange)
| SynExpr.LongIdent (false, SynLongIdent (idents, dotRanges, trivia), _, range) ->
Some(false, SynLongIdent(idents, dotRanges @ [ dotRange ], trivia), None, range)
| _ -> None

| _ -> None

let (|SingleIdent|_|) inp =
Expand Down Expand Up @@ -463,14 +471,8 @@ let mkSynDot mDot m l (SynIdent (r, rTrivia)) =
SynExpr.DotGet(e, dm, SynLongIdent(lid @ [ r ], dots @ [ mDot ], trivia @ [ rTrivia ]), m)
| expr -> SynExpr.DotGet(expr, mDot, SynLongIdent([ r ], [], [ rTrivia ]), m)

let mkSynDotMissing mDot m l =
match l with
| SynExpr.LongIdent (isOpt, SynLongIdent (lid, dots, trivia), None, _) ->
// REVIEW: MEMORY PERFORMANCE: This list operation is memory intensive (we create a lot of these list nodes)
SynExpr.LongIdent(isOpt, SynLongIdent(lid, dots @ [ mDot ], trivia), None, m)
| SynExpr.Ident id -> SynExpr.LongIdent(false, SynLongIdent([ id ], [ mDot ], [ None ]), None, m)
| SynExpr.DotGet (e, dm, SynLongIdent (lid, dots, trivia), _) -> SynExpr.DotGet(e, dm, SynLongIdent(lid, dots @ [ mDot ], trivia), m) // REVIEW: MEMORY PERFORMANCE: This is memory intensive (we create a lot of these list nodes)
| expr -> SynExpr.DiscardAfterMissingQualificationAfterDot(expr, m)
let mkSynDotMissing (mDot: range) (m: range) (expr: SynExpr) =
SynExpr.DiscardAfterMissingQualificationAfterDot(expr, mDot, unionRanges mDot m)

let mkSynFunMatchLambdas synArgNameGenerator isMember wholem ps arrow e =
let _, e = PushCurriedPatternsToExpr synArgNameGenerator wholem isMember ps arrow e
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/SyntaxTree/SyntaxTreeOps.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ val mkSynAssign: l: SynExpr -> r: SynExpr -> SynExpr

val mkSynDot: mDot: range -> m: range -> l: SynExpr -> r: SynIdent -> SynExpr

val mkSynDotMissing: mDot: range -> m: range -> l: SynExpr -> SynExpr
val mkSynDotMissing: mDot: range -> m: range -> expr: SynExpr -> SynExpr

val mkSynFunMatchLambdas:
synArgNameGenerator: SynArgNameGenerator ->
Expand Down
8 changes: 4 additions & 4 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -4386,12 +4386,12 @@ atomicExprQualification:
reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot())
let fixedLhsm = mkRange mLhs.FileName mLhs.Start mDot.End // previous mLhs is wrong after 'recover'
mkSynDotMissing mDot fixedLhsm e) }
| recover
{ (fun e mLhs mDot ->
reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot())
| recover
{ (fun e mLhs mDot ->
reportParseErrorAt mDot (FSComp.SR.parsMissingQualificationAfterDot())
let fixedLhsm = mkRange mLhs.FileName mLhs.Start mDot.End // previous mLhs is wrong after 'recover'
// Include 'e' in the returned expression but throw it away
SynExpr.DiscardAfterMissingQualificationAfterDot (e, fixedLhsm)) }
mkSynDotMissing mDot fixedLhsm e) }
| LPAREN COLON_COLON rparen DOT INT32
{ (fun e mLhs mDot ->
if parseState.LexBuffer.ReportLibraryOnlyFeatures then libraryOnlyError(lhs parseState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6218,6 +6218,8 @@ FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr get_in
FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr innerExpr
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr expr
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr get_expr()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range dotRange
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_dotRange()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_range()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range range
FSharp.Compiler.Syntax.SynExpr+Do: FSharp.Compiler.Syntax.SynExpr expr
Expand Down Expand Up @@ -6912,7 +6914,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAssert(FSharp.
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewComputationExpr(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6218,6 +6218,8 @@ FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr get_in
FSharp.Compiler.Syntax.SynExpr+DebugPoint: FSharp.Compiler.Syntax.SynExpr innerExpr
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr expr
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Syntax.SynExpr get_expr()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range dotRange
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_dotRange()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range get_range()
FSharp.Compiler.Syntax.SynExpr+DiscardAfterMissingQualificationAfterDot: FSharp.Compiler.Text.Range range
FSharp.Compiler.Syntax.SynExpr+Do: FSharp.Compiler.Syntax.SynExpr expr
Expand Down Expand Up @@ -6912,7 +6914,7 @@ FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewAssert(FSharp.
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewComputationExpr(Boolean, FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewConst(FSharp.Compiler.Syntax.SynConst, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDebugPoint(FSharp.Compiler.Syntax.DebugPointAtLeafExpr, Boolean, FSharp.Compiler.Syntax.SynExpr)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDiscardAfterMissingQualificationAfterDot(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDo(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDoBang(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExpr: FSharp.Compiler.Syntax.SynExpr NewDotGet(FSharp.Compiler.Syntax.SynExpr, FSharp.Compiler.Text.Range, FSharp.Compiler.Syntax.SynLongIdent, FSharp.Compiler.Text.Range)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{| A = 1 |}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
ImplFile
(ParsedImplFileInput
("/root/Expression/Record - Anon - Field 01.fs", false,
QualifiedNameOfFile Record - Anon - Field 01, [], [],
[SynModuleOrNamespace
([Record - Anon - Field 01], false, AnonModule,
[Expr
(AnonRecd
(false, None,
[(A, Some (1,5--1,6), Const (Int32 1, (1,7--1,8)))],
(1,0--1,11), { OpeningBraceRange = (1,0--1,2) }), (1,0--1,11))],
PreXmlDocEmpty, [], None, (1,0--1,11), { LeadingKeyword = None })],
(true, false), { ConditionalDirectives = []
CodeComments = [] }, set []))
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{| A = |}
Loading

0 comments on commit 91af626

Please sign in to comment.