diff --git a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md index 3e2c18a6ef0..79544367cbe 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md +++ b/docs/release-notes/.FSharp.Compiler.Service/11.0.100.md @@ -53,6 +53,8 @@ * Fix parallel compilation of scripts ([PR #19649](https://github.com/dotnet/fsharp/pull/19649)) * Fix parser recovery, name resolution, and code completion for unfinished enum patterns ([PR #19708](https://github.com/dotnet/fsharp/pull/19708)) * Parser: fix unexpected diagnostics in debug builds, improve error messages ([PR #19730](https://github.com/dotnet/fsharp/pull/19730)) +* Parser: recover on unfinished if and binary expressions +([PR #19724](https://github.com/dotnet/fsharp/pull/19724)) ### Added diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 99870fe2b9a..bfeb413d3ca 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -241,7 +241,7 @@ let parse_error_rich = Some(fun (ctxt: ParseErrorContext<_>) -> /* start with lowest */ -%nonassoc prec_atompat_pathop_error +%nonassoc prec_recover /* the lowest precedence to use as the last chance recovery */ %nonassoc prec_args_error /* less than RPAREN */ %nonassoc prec_atomexpr_lparen_error /* less than RPAREN */ @@ -4335,6 +4335,16 @@ declExpr: let trivia = { IfKeyword = mIf; IsElif = false; ThenKeyword = mThen; ElseKeyword = None; IfToThenRange = m } SynExpr.IfThenElse($2, arbExpr ("if1", mThen), None, spIfToThen, true, m, trivia) } + | IF declExpr %prec prec_recover + { let mIf = rhs parseState 1 + errorR (Error(FSComp.SR.parsIncompleteIf (), mIf)) + let ifExpr = $2 + let mThen = ifExpr.Range.EndRange + let m = unionRanges mIf mThen + let spIfToThen = DebugPointAtBinding.Yes m + let trivia = { IfKeyword = mIf; IsElif = false; ThenKeyword = mThen; ElseKeyword = None; IfToThenRange = m } + SynExpr.IfThenElse($2, arbExpr ("if4", mThen), None, spIfToThen, true, m, trivia) } + | IF recover %prec expr_if { errorR (Error(FSComp.SR.parsIncompleteIf (), rhs parseState 1)) let m = rhs parseState 1 @@ -4674,6 +4684,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "in") mkSynInfix mOp $1 "@in" (arbExpr ("declExprInfixJoinIn", mOp.EndRange)) } + | declExpr JOIN_IN %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "in") + mkSynInfix mOp $1 "@in" (arbExpr ("declExprInfixJoinIn2", mOp.EndRange)) } + | declExpr BAR_BAR declExpr { mkSynInfix (rhs parseState 2) $1 "||" $3 } @@ -4682,6 +4697,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "||") mkSynInfix mOp $1 "||" (arbExpr ("declExprInfixBarBar", mOp.EndRange)) } + | declExpr BAR_BAR %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "||") + mkSynInfix mOp $1 "||" (arbExpr ("declExprInfixBarBar2", mOp.EndRange)) } + | declExpr INFIX_BAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4690,6 +4710,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixBarOp", mOp.EndRange)) } + | declExpr INFIX_BAR_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixBarOp2", mOp.EndRange)) } + | declExpr AMP_AMP declExpr { mkSynInfix (rhs parseState 2) $1 "&&" $3 } @@ -4698,6 +4723,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&&") mkSynInfix mOp $1 "&&" (arbExpr ("declExprInfixAmpAmp", mOp.EndRange)) } + | declExpr AMP_AMP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&&") + mkSynInfix mOp $1 "&&" (arbExpr ("declExprInfixAmpAmp2", mOp.EndRange)) } + | declExpr INFIX_AMP_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4706,6 +4736,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixAmpOp", (rhs parseState 3).StartRange)) } + | declExpr INFIX_AMP_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixAmpOp2", (rhs parseState 3).StartRange)) } + | declExpr EQUALS declExpr { mkSynInfix (rhs parseState 2) $1 "=" $3 } @@ -4714,6 +4749,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "=") mkSynInfix mOp $1 "=" (arbExpr ("declExprInfixEquals", mOp.EndRange)) } + | declExpr EQUALS %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "=") + mkSynInfix mOp $1 "=" (arbExpr ("declExprInfixEquals2", mOp.EndRange)) } + | declExpr INFIX_COMPARE_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4722,6 +4762,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfix", mOp.EndRange)) } + | declExpr INFIX_COMPARE_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfix2", mOp.EndRange)) } + | declExpr DOLLAR declExpr { mkSynInfix (rhs parseState 2) $1 "$" $3 } @@ -4730,6 +4775,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "$") mkSynInfix mOp $1 "$" (arbExpr ("declExprInfixDollar", mOp.EndRange)) } + | declExpr DOLLAR %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "$") + mkSynInfix mOp $1 "$" (arbExpr ("declExprInfixDollar2", mOp.EndRange)) } + | declExpr LESS declExpr { mkSynInfix (rhs parseState 2) $1 "<" $3 } @@ -4738,6 +4788,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "<") mkSynInfix mOp $1 "<" (arbExpr ("declExprInfixLess", mOp.EndRange)) } + | declExpr LESS %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "<") + mkSynInfix mOp $1 "<" (arbExpr ("declExprInfixLess2", mOp.EndRange)) } + | declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 } @@ -4746,6 +4801,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression ">") mkSynInfix mOp $1 ">" (arbExpr ("declExprInfixGreater", mOp.EndRange)) } + | declExpr GREATER %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression ">") + mkSynInfix mOp $1 ">" (arbExpr ("declExprInfixGreater2", mOp.EndRange)) } + | declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4762,6 +4822,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPercent", mOp.EndRange)) } + | declExpr PERCENT_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPercent2", mOp.EndRange)) } + | declExpr COLON_COLON declExpr { let mOp = rhs parseState 2 let m = unionRanges $1.Range $3.Range @@ -4777,6 +4842,14 @@ declExpr: let tupExpr = SynExpr.Tuple(false, [$1; (arbExpr ("declExprInfixColonColon", mOp.EndRange))], [mOp], m) SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) } + | declExpr COLON_COLON %prec prec_recover + { let mOp = rhs parseState 2 + let m = unionRanges $1.Range mOp + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "::") + let identExpr = mkSynOperator mOp "::" + let tupExpr = SynExpr.Tuple(false, [$1; (arbExpr ("declExprInfixColonColon2", mOp.EndRange))], [mOp], m) + SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) } + | declExpr PLUS_MINUS_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4785,6 +4858,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPlusMinus", mOp.EndRange)) } + | declExpr PLUS_MINUS_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPlusMinus2", mOp.EndRange)) } + | declExpr MINUS declExpr { mkSynInfix (rhs parseState 2) $1 "-" $3 } @@ -4793,6 +4871,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "-") mkSynInfix mOp $1 "-" (arbExpr ("declExprInfixMinus", mOp.EndRange)) } + | declExpr MINUS %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "-") + mkSynInfix mOp $1 "-" (arbExpr ("declExprInfixMinus2", mOp.EndRange)) } + | declExpr STAR declExpr { mkSynInfix (rhs parseState 2) $1 "*" $3 } @@ -4801,6 +4884,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "*") mkSynInfix mOp $1 "*" (arbExpr ("declExprInfixStar", mOp.EndRange)) } + | declExpr STAR %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "*") + mkSynInfix mOp $1 "*" (arbExpr ("declExprInfixStar2", mOp.EndRange)) } + | declExpr INFIX_STAR_DIV_MOD_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4809,6 +4897,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarDivMod", mOp.EndRange)) } + | declExpr INFIX_STAR_DIV_MOD_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarDivMod2", mOp.EndRange)) } + | declExpr INFIX_STAR_STAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -4817,6 +4910,11 @@ declExpr: reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarStar", mOp.EndRange)) } + | declExpr INFIX_STAR_STAR_OP %prec prec_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarStar2", mOp.EndRange)) } + | declExpr DOT_DOT declExpr { let wholem = rhs2 parseState 1 3 let mOperator = rhs parseState 2 @@ -6935,7 +7033,7 @@ pathOp: { let ident, trivia = $1 SynLongIdent([ident], [], [Some trivia]) } - | ident DOT %prec prec_atompat_pathop_error + | ident DOT %prec prec_recover { let mDot = rhs parseState 2 reportParseErrorAt mDot.EndRange (FSComp.SR.parsIdentifierExpected()) SynLongIdent([$1], [mDot], [None]) } diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs index 8153a9e44bc..9dc910ba249 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/LexicalFiltering/OffsideExceptions/OffsideExceptions.fs @@ -242,27 +242,9 @@ module A """ |> typecheck |> shouldFail - |> withResults [ - { Error = Error 10 - Range = { StartLine = 5 - StartColumn = 1 - EndLine = 5 - EndColumn = 3 } - Message = - "Incomplete structured construct at or before this point in expression" }; - { Error = Error 589 - Range = { StartLine = 3 - StartColumn = 13 - EndLine = 3 - EndColumn = 15 } - Message = - "Incomplete conditional. Expected 'if then ' or 'if then else '." }; - { Error = Error 10 - Range = { StartLine = 5 - StartColumn = 31 - EndLine = 5 - EndColumn = 33 } - Message = "Unexpected infix operator in implementation file" } + |> withDiagnostics [ + Error 589, Line 3, Col 13, Line 3, Col 15, "Incomplete conditional. Expected 'if then ' or 'if then else '." + Error 10, Line 5, Col 31, Line 5, Col 33, "Unexpected infix operator in implementation file" ] |> ignore diff --git a/tests/fsharp/typecheck/sigs/neg29.bsl b/tests/fsharp/typecheck/sigs/neg29.bsl index 5f75bb8cdb0..424491fab2f 100644 --- a/tests/fsharp/typecheck/sigs/neg29.bsl +++ b/tests/fsharp/typecheck/sigs/neg29.bsl @@ -1,8 +1,8 @@ neg29.fs(5,19,6,16): parse error FS0010: Incomplete structured construct at or before this point in type name. Expected '>' or other token. -neg29.fs(6,19,6,20): parse error FS0010: Unexpected symbol '(' in expression - neg29.fs(6,18,6,19): parse error FS3156: Unexpected token '>' or incomplete expression +neg29.fs(6,19,6,20): parse error FS0010: Unexpected symbol '(' in definition. Expected incomplete structured construct at or before this point or other token. + neg29.fs(9,1,9,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Eq 05.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Eq 05.fs.bsl index 43fc5bc8157..08d0d9b96b4 100644 --- a/tests/service/data/SyntaxTree/Expression/Binary - Eq 05.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Binary - Eq 05.fs.bsl @@ -21,7 +21,7 @@ ImplFile [Some (OriginalNotation "=")]), None, (3,4--3,5)), Ident a, (3,2--3,5)), ArbitraryAfterError - ("declExprInfixEquals", (3,5--3,5)), (3,2--3,5)); + ("declExprInfixEquals2", (3,5--3,5)), (3,2--3,5)); App (NonAtomic, false, App @@ -41,5 +41,4 @@ ImplFile WarnDirectives = [] CodeComments = [] }, set [])) -(3,5)-(3,6) parse error Unexpected symbol ',' in expression (3,4)-(3,5) parse error Unexpected token '=' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Eq 06.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Eq 06.fs.bsl index 930c655f57a..e7caca2dc43 100644 --- a/tests/service/data/SyntaxTree/Expression/Binary - Eq 06.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Binary - Eq 06.fs.bsl @@ -32,7 +32,7 @@ ImplFile [Some (OriginalNotation "=")]), None, (3,11--3,12)), Ident b, (3,9--3,12)), ArbitraryAfterError - ("declExprInfixEquals", (3,12--3,12)), (3,9--3,12)); + ("declExprInfixEquals2", (3,12--3,12)), (3,9--3,12)); App (NonAtomic, false, App @@ -52,5 +52,4 @@ ImplFile WarnDirectives = [] CodeComments = [] }, set [])) -(3,12)-(3,13) parse error Unexpected symbol ',' in expression (3,11)-(3,12) parse error Unexpected token '=' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl index 6ed4a9524f4..d47ef4241e1 100644 --- a/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl @@ -24,7 +24,7 @@ ImplFile ([op_Addition], [], [Some (OriginalNotation "+")]), None, (3,2--3,3)), Ident a, (3,0--3,3)), ArbitraryAfterError - ("declExprInfixPlusMinus", (3,3--3,3)), (3,0--3,3)), + ("declExprInfixPlusMinus2", (3,3--3,3)), (3,0--3,3)), (3,0--4,2)), Const (Unit, (4,3--4,5)), (3,0--4,5)), (3,0--4,5))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, @@ -33,5 +33,4 @@ ImplFile WarnDirectives = [] CodeComments = [] }, set [])) -(4,0)-(4,2) parse error Unexpected infix operator in expression (3,2)-(3,3) parse error Unexpected token '+' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Expression/If 03.fs.bsl b/tests/service/data/SyntaxTree/Expression/If 03.fs.bsl index ae9e6a4ec23..bc1c36dc638 100644 --- a/tests/service/data/SyntaxTree/Expression/If 03.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/If 03.fs.bsl @@ -6,7 +6,7 @@ ImplFile [Expr (IfThenElse (Const (Bool true, (3,3--3,7)), - ArbitraryAfterError ("if1", (3,7--3,7)), None, Yes (3,0--3,7), + ArbitraryAfterError ("if4", (3,7--3,7)), None, Yes (3,0--3,7), true, (3,0--3,7), { IfKeyword = (3,0--3,2) IsElif = false ThenKeyword = (3,7--3,7) @@ -19,5 +19,4 @@ ImplFile WarnDirectives = [] CodeComments = [] }, set [])) -(3,8)-(5,0) parse error Incomplete structured construct at or before this point in expression (3,0)-(3,2) parse error Incomplete conditional. Expected 'if then ' or 'if then else '. diff --git a/tests/service/data/SyntaxTree/Expression/If 11.fs b/tests/service/data/SyntaxTree/Expression/If 11.fs new file mode 100644 index 00000000000..b544f2cf903 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 11.fs @@ -0,0 +1,6 @@ +module Module + +do + if true && + + () diff --git a/tests/service/data/SyntaxTree/Expression/If 11.fs.bsl b/tests/service/data/SyntaxTree/Expression/If 11.fs.bsl new file mode 100644 index 00000000000..905054b3f44 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 11.fs.bsl @@ -0,0 +1,42 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/If 11.fs", false, QualifiedNameOfFile Module, [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (Do + (Sequential + (SuppressNeither, true, + IfThenElse + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_BooleanAnd], [], + [Some (OriginalNotation "&&")]), None, + (4,12--4,14)), Const (Bool true, (4,7--4,11)), + (4,7--4,14)), + ArbitraryAfterError + ("declExprInfixAmpAmp2", (4,14--4,14)), (4,7--4,14)), + ArbitraryAfterError ("if4", (4,14--4,14)), None, + Yes (4,4--4,14), true, (4,4--4,14), + { IfKeyword = (4,4--4,6) + IsElif = false + ThenKeyword = (4,14--4,14) + ElseKeyword = None + IfToThenRange = (4,4--4,14) }), + Const (Unit, (6,4--6,6)), (4,4--6,6), + { SeparatorRange = None }), (3,0--6,6)), (3,0--6,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + WarnDirectives = [] + CodeComments = [] }, set [])) + +(6,4)-(6,5) parse error Unexpected syntax or possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this further. +To continue using non-conforming indentation, pass the '--strict-indentation-' flag to the compiler, or set the language version to F# 7. +(4,12)-(4,14) parse error Unexpected token '&&' or incomplete expression +(4,4)-(4,6) parse error Incomplete conditional. Expected 'if then ' or 'if then else '. diff --git a/tests/service/data/SyntaxTree/Expression/If 12.fs b/tests/service/data/SyntaxTree/Expression/If 12.fs new file mode 100644 index 00000000000..05db19e2d79 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 12.fs @@ -0,0 +1,6 @@ +module Module + +do + if true && + +() diff --git a/tests/service/data/SyntaxTree/Expression/If 12.fs.bsl b/tests/service/data/SyntaxTree/Expression/If 12.fs.bsl new file mode 100644 index 00000000000..42d610056cb --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 12.fs.bsl @@ -0,0 +1,38 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/If 12.fs", false, QualifiedNameOfFile Module, [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (Do + (IfThenElse + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_BooleanAnd], [], + [Some (OriginalNotation "&&")]), None, + (4,12--4,14)), Const (Bool true, (4,7--4,11)), + (4,7--4,14)), + ArbitraryAfterError ("declExprInfixAmpAmp", (4,14--4,14)), + (4,7--4,14)), ArbitraryAfterError ("if4", (4,14--4,14)), + None, Yes (4,4--4,14), true, (4,4--4,14), + { IfKeyword = (4,4--4,6) + IsElif = false + ThenKeyword = (4,14--4,14) + ElseKeyword = None + IfToThenRange = (4,4--4,14) }), (3,0--4,14)), (3,0--4,14)); + Expr (Const (Unit, (6,0--6,2)), (6,0--6,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + WarnDirectives = [] + CodeComments = [] }, set [])) + +(6,0)-(6,1) parse error Unexpected syntax or possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this further. +To continue using non-conforming indentation, pass the '--strict-indentation-' flag to the compiler, or set the language version to F# 7. +(4,12)-(4,14) parse error Unexpected token '&&' or incomplete expression +(4,4)-(4,6) parse error Incomplete conditional. Expected 'if then ' or 'if then else '. diff --git a/tests/service/data/SyntaxTree/Expression/If 13.fs b/tests/service/data/SyntaxTree/Expression/If 13.fs new file mode 100644 index 00000000000..d3a2478d255 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 13.fs @@ -0,0 +1,6 @@ +module Module + +do + if true = + + () diff --git a/tests/service/data/SyntaxTree/Expression/If 13.fs.bsl b/tests/service/data/SyntaxTree/Expression/If 13.fs.bsl new file mode 100644 index 00000000000..9f77ead8868 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 13.fs.bsl @@ -0,0 +1,40 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/If 13.fs", false, QualifiedNameOfFile Module, [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (Do + (Sequential + (SuppressNeither, true, + IfThenElse + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_Equality], [], + [Some (OriginalNotation "=")]), None, + (4,12--4,13)), Const (Bool true, (4,7--4,11)), + (4,7--4,13)), + ArbitraryAfterError + ("declExprInfixEquals2", (4,13--4,13)), (4,7--4,13)), + ArbitraryAfterError ("if4", (4,13--4,13)), None, + Yes (4,4--4,13), true, (4,4--4,13), + { IfKeyword = (4,4--4,6) + IsElif = false + ThenKeyword = (4,13--4,13) + ElseKeyword = None + IfToThenRange = (4,4--4,13) }), + Const (Unit, (6,4--6,6)), (4,4--6,6), + { SeparatorRange = None }), (3,0--6,6)), (3,0--6,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + WarnDirectives = [] + CodeComments = [] }, set [])) + +(4,12)-(4,13) parse error Unexpected token '=' or incomplete expression +(4,4)-(4,6) parse error Incomplete conditional. Expected 'if then ' or 'if then else '. diff --git a/tests/service/data/SyntaxTree/Expression/If 14.fs b/tests/service/data/SyntaxTree/Expression/If 14.fs new file mode 100644 index 00000000000..f6405fe9c68 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 14.fs @@ -0,0 +1,6 @@ +module Module + +do + if true == + + () diff --git a/tests/service/data/SyntaxTree/Expression/If 14.fs.bsl b/tests/service/data/SyntaxTree/Expression/If 14.fs.bsl new file mode 100644 index 00000000000..6a79bb6b7ae --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/If 14.fs.bsl @@ -0,0 +1,42 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/If 14.fs", false, QualifiedNameOfFile Module, [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (Do + (Sequential + (SuppressNeither, true, + IfThenElse + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_EqualsEquals], [], + [Some (OriginalNotation "==")]), None, + (4,12--4,14)), Const (Bool true, (4,7--4,11)), + (4,7--4,14)), + ArbitraryAfterError ("declExprInfix2", (4,14--4,14)), + (4,7--4,14)), + ArbitraryAfterError ("if4", (4,14--4,14)), None, + Yes (4,4--4,14), true, (4,4--4,14), + { IfKeyword = (4,4--4,6) + IsElif = false + ThenKeyword = (4,14--4,14) + ElseKeyword = None + IfToThenRange = (4,4--4,14) }), + Const (Unit, (6,4--6,6)), (4,4--6,6), + { SeparatorRange = None }), (3,0--6,6)), (3,0--6,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + WarnDirectives = [] + CodeComments = [] }, set [])) + +(6,4)-(6,5) parse error Unexpected syntax or possible incorrect indentation: this token is offside of context started at position (4:5). Try indenting this further. +To continue using non-conforming indentation, pass the '--strict-indentation-' flag to the compiler, or set the language version to F# 7. +(4,12)-(4,14) parse error Unexpected token '==' or incomplete expression +(4,4)-(4,6) parse error Incomplete conditional. Expected 'if then ' or 'if then else '.