From de05aad83a39543c9d55a8707b86395af1415251 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 23 May 2023 21:58:32 +0200 Subject: [PATCH 1/6] Parser: unify binary expressions recovery --- src/Compiler/pars.fsy | 193 +++++++++++++++++++++++------------------- 1 file changed, 105 insertions(+), 88 deletions(-) diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 3d460406c80..4d7f77d6e73 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4024,151 +4024,168 @@ declExpr: | declExpr JOIN_IN declExpr { SynExpr.JoinIn($1, rhs parseState 2, $3, unionRanges $1.Range $3.Range) } + | declExpr JOIN_IN ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "in") + mkSynInfix mOp $1 "@in" (arbExpr ("declExprInfixJoinIn", mOp.EndRange)) } + | declExpr BAR_BAR declExpr { mkSynInfix (rhs parseState 2) $1 "||" $3 } + | declExpr BAR_BAR ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "||") + mkSynInfix mOp $1 "||" (arbExpr ("declExprInfixBarBar", mOp.EndRange)) } + | declExpr INFIX_BAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr INFIX_BAR_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixBarOp", mOp.EndRange)) } + | declExpr OR declExpr { mkSynInfix (rhs parseState 2) $1 "or" $3 } + | declExpr OR ends_coming_soon_or_recover + { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression "or") + mkSynInfix (rhs parseState 2) $1 "or" (arbExpr ("declExprInfixOr", (rhs parseState 3).StartRange)) } + | declExpr AMP declExpr { mkSynInfix (rhs parseState 2) $1 "&" $3 } + | declExpr AMP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&") + mkSynInfix mOp $1 "&" (arbExpr ("declExprInfixAmp", mOp.EndRange)) } + | declExpr AMP_AMP declExpr { mkSynInfix (rhs parseState 2) $1 "&&" $3 } + | declExpr AMP_AMP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "&&") + mkSynInfix mOp $1 "&&" (arbExpr ("declExprInfixAmpAmp", mOp.EndRange)) } + | declExpr INFIX_AMP_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr INFIX_AMP_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixAmpOp", (rhs parseState 3).StartRange)) } + | declExpr EQUALS declExpr { mkSynInfix (rhs parseState 2) $1 "=" $3 } + | declExpr EQUALS ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "=") + mkSynInfix mOp $1 "=" (arbExpr ("declExprInfixEquals", mOp.EndRange)) } + | declExpr INFIX_COMPARE_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr INFIX_COMPARE_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfix", mOp.EndRange)) } + | declExpr DOLLAR declExpr { mkSynInfix (rhs parseState 2) $1 "$" $3 } + | declExpr DOLLAR ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "$") + mkSynInfix mOp $1 "$" (arbExpr ("declExprInfixDollar", mOp.EndRange)) } + | declExpr LESS declExpr { mkSynInfix (rhs parseState 2) $1 "<" $3 } - | declExpr LESS recover - { if not $3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("<")) - exprFromParseError (mkSynInfix (rhs parseState 2) $1 "<" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } + | declExpr LESS ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "<") + mkSynInfix mOp $1 "<" (arbExpr ("declExprInfixLess", mOp.EndRange)) } | declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 } + | declExpr GREATER ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression ">") + mkSynInfix mOp $1 ">" (arbExpr ("declExprInfixGreater", mOp.EndRange)) } + | declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr INFIX_AT_HAT_OP ends_coming_soon_or_recover %prec infix_at_hat_op_binary + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfix", mOp.EndRange)) } + | declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr PERCENT_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPercent", mOp.EndRange)) } + | declExpr COLON_COLON declExpr - { let tupExpr = SynExpr.Tuple(false, [$1;$3], [rhs parseState 2], unionRanges $1.Range $3.Range) - let identExpr = mkSynOperator (rhs parseState 2) "::" - SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, unionRanges $1.Range $3.Range) } + { let mOp = rhs parseState 2 + let m = unionRanges $1.Range $3.Range + let tupExpr = SynExpr.Tuple(false, [$1; $3], [mOp], m) + let identExpr = mkSynOperator mOp "::" + SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) } + + | declExpr COLON_COLON ends_coming_soon_or_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 ("declExprInfixColonColon", mOp.EndRange))], [mOp], m) + SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, m) } | declExpr PLUS_MINUS_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr PLUS_MINUS_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixPlusMinus", mOp.EndRange)) } + | declExpr MINUS declExpr { mkSynInfix (rhs parseState 2) $1 "-" $3 } + | declExpr MINUS ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "-") + mkSynInfix mOp $1 "-" (arbExpr ("declExprInfixMinus", mOp.EndRange)) } + | declExpr STAR declExpr { mkSynInfix (rhs parseState 2) $1 "*" $3 } + | declExpr STAR ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression "*") + mkSynInfix mOp $1 "*" (arbExpr ("declExprInfixStar", mOp.EndRange)) } + | declExpr INFIX_STAR_DIV_MOD_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } + | declExpr INFIX_STAR_DIV_MOD_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarDivMod", mOp.EndRange)) } + | declExpr INFIX_STAR_STAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } - | declExpr JOIN_IN OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("in")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "@in" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr BAR_BAR OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("||")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "||" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr INFIX_BAR_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr OR OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("or")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "or" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr AMP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("&")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "&" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr AMP_AMP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("&&")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "&&" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr INFIX_AMP_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr EQUALS ends_coming_soon_or_recover - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("=")) - let mEquals = rhs parseState 2 - mkSynInfix mEquals $1 "=" (arbExpr ("declExprInfixEquals", mEquals.EndRange)) } - - | declExpr INFIX_COMPARE_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr DOLLAR OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("$")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "$" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr LESS OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("<")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "<" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr GREATER OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression(">")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 ">" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr INFIX_AT_HAT_OP OBLOCKEND_COMING_SOON %prec infix_at_hat_op_binary - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr PERCENT_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr COLON_COLON OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("::")) - let identExpr = mkSynOperator (rhs parseState 2) "::" - let tupExpr = SynExpr.Tuple(false, [$1;(arbExpr ("declExprInfix", (rhs parseState 3).StartRange))], [rhs parseState 2], unionRanges $1.Range (rhs parseState 3).StartRange) - SynExpr.App(ExprAtomicFlag.NonAtomic, true, identExpr, tupExpr, unionRanges $1.Range (rhs parseState 3).StartRange) } - - | declExpr PLUS_MINUS_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr MINUS OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("-")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "-" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr STAR OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("*")) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 "*" (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr INFIX_STAR_DIV_MOD_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } - - | declExpr INFIX_STAR_STAR_OP OBLOCKEND_COMING_SOON - { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) - exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr ("declExprInfix", (rhs parseState 3).StartRange))) } + | declExpr INFIX_STAR_STAR_OP ends_coming_soon_or_recover + { let mOp = rhs parseState 2 + reportParseErrorAt mOp (FSComp.SR.parsUnfinishedExpression $2) + mkSynInfix mOp $1 $2 (arbExpr ("declExprInfixStarStar", mOp.EndRange)) } | declExpr DOT_DOT declExpr { let wholem = rhs2 parseState 1 3 From fb22fcb400bf93b32f80243202b3c830a46dec75 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 23 May 2023 22:05:27 +0200 Subject: [PATCH 2/6] Add some tests --- .../SyntaxTree/Expression/Binary - Plus 01.fs | 3 ++ .../Expression/Binary - Plus 01.fs.bsl | 21 +++++++++++ .../SyntaxTree/Expression/Binary - Plus 02.fs | 3 ++ .../Expression/Binary - Plus 02.fs.bsl | 25 +++++++++++++ .../SyntaxTree/Expression/Binary - Plus 03.fs | 3 ++ .../Expression/Binary - Plus 03.fs.bsl | 29 +++++++++++++++ .../SyntaxTree/Expression/Binary - Plus 04.fs | 4 +++ .../Expression/Binary - Plus 04.fs.bsl | 36 +++++++++++++++++++ 8 files changed, 124 insertions(+) create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs.bsl create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs create mode 100644 tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs b/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs new file mode 100644 index 00000000000..de89a9f3a1b --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs @@ -0,0 +1,3 @@ +module Module + +a + b diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs.bsl new file mode 100644 index 00000000000..748e99e38be --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 01.fs.bsl @@ -0,0 +1,21 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Binary - Plus 01.fs", false, QualifiedNameOfFile Module, + [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_Addition], [], [Some (OriginalNotation "+")]), + None, (3,2--3,3)), Ident a, (3,0--3,3)), Ident b, + (3,0--3,5)), (3,0--3,5))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,5), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs b/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs new file mode 100644 index 00000000000..b1b740f0037 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs @@ -0,0 +1,3 @@ +module Module + +a + diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs.bsl new file mode 100644 index 00000000000..6f28e14086a --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 02.fs.bsl @@ -0,0 +1,25 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Binary - Plus 02.fs", false, QualifiedNameOfFile Module, + [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([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)), (3,0--3,3))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,3), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,0)-(4,0) parse warning Possible incorrect indentation: this token is offside of context started at position (3:1). Try indenting this token further or using standard formatting conventions. +(3,2)-(3,3) parse error Unexpected token '+' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs b/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs new file mode 100644 index 00000000000..0cbbb5bd6e5 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs @@ -0,0 +1,3 @@ +module Module + +M(a + ) diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs.bsl new file mode 100644 index 00000000000..95babc117f7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 03.fs.bsl @@ -0,0 +1,29 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Binary - Plus 03.fs", false, QualifiedNameOfFile Module, + [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (App + (Atomic, false, Ident M, + Paren + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_Addition], [], [Some (OriginalNotation "+")]), + None, (3,4--3,5)), Ident a, (3,2--3,5)), + ArbitraryAfterError + ("declExprInfixPlusMinus", (3,5--3,5)), (3,2--3,5)), + (3,1--3,2), Some (3,6--3,7), (3,1--3,7)), (3,0--3,7)), + (3,0--3,7))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,4)-(3,5) parse error Unexpected token '+' or incomplete expression diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs new file mode 100644 index 00000000000..3e57231ea1e --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs @@ -0,0 +1,4 @@ +module Module + +a + +|> () diff --git a/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl new file mode 100644 index 00000000000..8f5d5280bb7 --- /dev/null +++ b/tests/service/data/SyntaxTree/Expression/Binary - Plus 04.fs.bsl @@ -0,0 +1,36 @@ +ImplFile + (ParsedImplFileInput + ("/root/Expression/Binary - Plus 04.fs", false, QualifiedNameOfFile Module, + [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Expr + (App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([op_PipeRight], [], [Some (OriginalNotation "|>")]), + None, (4,0--4,2)), + App + (NonAtomic, false, + App + (NonAtomic, true, + LongIdent + (false, + SynLongIdent + ([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)), + (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, + (1,0--4,5), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(4,0)-(4,2) parse error Unexpected infix operator in expression +(3,2)-(3,3) parse error Unexpected token '+' or incomplete expression From ec4bba30d1f2630c9f3dabddc0cfbf59933fc483 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 24 May 2023 12:42:04 +0200 Subject: [PATCH 3/6] Try to update baselines --- .../LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs | 4 ++-- .../UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs index 58eec6d18dd..fceb3f0c858 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs @@ -4,8 +4,8 @@ // Since OCaml-style comments are now gone, this is going to be a negative test //Unexpected string literal in binding\. Expected incomplete structured construct at or before this point or other token\.$ //Incomplete value or function definition\. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword\.$ -//Incomplete structured construct at or before this point in implementation file$ - +//Unexpected token '*' or incomplete expression +//Unexpected symbol ')' in implementation file let y7a = (** This is a comment with "(***)" *) 1 (**) + 2" diff --git a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs index 489be541f65..fa5ec824b32 100644 --- a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs +++ b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs @@ -1,7 +1,8 @@ // #Regression #Conformance #UnitsOfMeasure // Regression test for FSHARP1.0:2662 // Make sure we can use ( and ) in Units of Measure -//Unexpected symbol '\)' in expression$ +//Unexpected symbol '\)' in binding$ +//Unexpected token '/' or incomplete expression [] type Kg [] type m From 6afe5abaddd39c65ecfe059289a93b9101ac8374 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 24 May 2023 16:11:06 +0200 Subject: [PATCH 4/6] More baseline updates --- .../LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs | 2 +- .../UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs | 2 +- .../Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs index fceb3f0c858..ba440896998 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs @@ -5,7 +5,7 @@ //Unexpected string literal in binding\. Expected incomplete structured construct at or before this point or other token\.$ //Incomplete value or function definition\. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword\.$ //Unexpected token '*' or incomplete expression -//Unexpected symbol ')' in implementation file +//Unexpected symbol '\)' in implementation file let y7a = (** This is a comment with "(***)" *) 1 (**) + 2" diff --git a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs index fa5ec824b32..96c439c0e30 100644 --- a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs +++ b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs @@ -2,7 +2,7 @@ // Regression test for FSHARP1.0:2662 // Make sure we can use ( and ) in Units of Measure //Unexpected symbol '\)' in binding$ -//Unexpected token '/' or incomplete expression +//Unexpected token '/' or incomplete expression [] type Kg [] type m diff --git a/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx b/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx index e0d3100b557..4e2fc46ae6d 100644 --- a/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx +++ b/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx @@ -4,7 +4,7 @@ //val ``+`` : bool = true //val ``\.\.`` : bool = true //val ``\.\. \.\.`` : bool = true -//val ``(+)`` : bool = true +//val ``(\+)`` : bool = true //val ``land`` : bool = true //val ``type`` : bool = true //val ``or`` : bool = true From 99acad57f54c8c34d4c06700767041d16abd26f8 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 24 May 2023 17:29:07 +0200 Subject: [PATCH 5/6] More baseline updates --- .../LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs | 2 +- .../UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs | 2 +- .../Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs index ba440896998..b66007e3e09 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs @@ -4,7 +4,7 @@ // Since OCaml-style comments are now gone, this is going to be a negative test //Unexpected string literal in binding\. Expected incomplete structured construct at or before this point or other token\.$ //Incomplete value or function definition\. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword\.$ -//Unexpected token '*' or incomplete expression +//Unexpected token '*' or incomplete expression //Unexpected symbol '\)' in implementation file let y7a = (** This is a comment with "(***)" *) 1 (**) + 2" diff --git a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs index 96c439c0e30..f274899099c 100644 --- a/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs +++ b/tests/fsharpqa/Source/Conformance/UnitsOfMeasure/Parenthesis/E_IncompleteParens02.fs @@ -1,7 +1,7 @@ // #Regression #Conformance #UnitsOfMeasure // Regression test for FSHARP1.0:2662 // Make sure we can use ( and ) in Units of Measure -//Unexpected symbol '\)' in binding$ +//Unexpected symbol '\)' in binding\. Expected incomplete structured construct at or before this point or other token\. //Unexpected token '/' or incomplete expression [] type Kg diff --git a/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx b/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx index 4e2fc46ae6d..e0d3100b557 100644 --- a/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx +++ b/tests/fsharpqa/Source/InteractiveSession/Misc/VerbatimIdentifier01.fsx @@ -4,7 +4,7 @@ //val ``+`` : bool = true //val ``\.\.`` : bool = true //val ``\.\. \.\.`` : bool = true -//val ``(\+)`` : bool = true +//val ``(+)`` : bool = true //val ``land`` : bool = true //val ``type`` : bool = true //val ``or`` : bool = true From 147302cc675da6d6d4e75b70a741a778f0e0c30a Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 24 May 2023 21:24:43 +0200 Subject: [PATCH 6/6] Another attemp --- .../LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs index b66007e3e09..e6a5da22510 100644 --- a/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs +++ b/tests/fsharpqa/Source/Conformance/LexicalAnalysis/Comments/E_ocamlstyle_nested007.fs @@ -4,7 +4,7 @@ // Since OCaml-style comments are now gone, this is going to be a negative test //Unexpected string literal in binding\. Expected incomplete structured construct at or before this point or other token\.$ //Incomplete value or function definition\. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword\.$ -//Unexpected token '*' or incomplete expression +//Unexpected token '\*' or incomplete expression //Unexpected symbol '\)' in implementation file let y7a = (** This is a comment with "(***)" *) 1 (**) + 2"