未验证 提交 f37943d0 编写于 作者: F Florian Verdonck 提交者: GitHub

Don't wrap IdentTrivia ident in SynExpr.Paren. (#13449)

* Don't wrap IdentTrivia ident in SynExpr.Paren.

* Move SyntaxTree tests to separate files.
上级 96685dca
......@@ -5619,27 +5619,7 @@ identExpr:
| opName
{ let m = lhs parseState
let ident, trivia = $1
let mLparen, mRparen, trivia =
match trivia with
| IdentTrivia.OriginalNotation text ->
let mLparen = mkFileIndexRange m.FileIndex m.Start (mkPos m.StartLine (m.StartColumn + 1))
let mRparen = mkFileIndexRange m.FileIndex (mkPos m.EndLine (m.EndColumn - 1)) m.End
mLparen, mRparen, Some trivia
| IdentTrivia.OriginalNotationWithParen(lpr, text, rpr) ->
lpr, rpr, Some(IdentTrivia.OriginalNotation(text))
| IdentTrivia.HasParenthesis(lpr, rpr) ->
lpr, rpr, None
match trivia with
| None ->
SynExpr.Paren(SynExpr.Ident(ident), mLparen, Some mRparen, m)
| Some trivia ->
SynExpr.Paren(
SynExpr.LongIdent(false, SynLongIdent([ident], [], [Some trivia]), None, m),
mLparen,
Some mRparen,
m
) }
SynExpr.LongIdent(false, SynLongIdent([ident], [], [Some trivia]), None, m) }
topSeparator:
| SEMICOLON { }
......
......@@ -38,6 +38,75 @@
<Compile Include="..\service\Symbols.fs">
<Link>Symbols.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\TypeTests.fs">
<Link>SyntaxTree\TypeTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ExpressionTests.fs">
<Link>SyntaxTree\ExpressionTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\StringTests.fs">
<Link>SyntaxTree\StringTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ModuleOrNamespaceTests.fs">
<Link>SyntaxTree\ModuleOrNamespaceTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ModuleOrNamespaceSigTests.fs">
<Link>SyntaxTree\ModuleOrNamespaceSigTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\SignatureTypeTests.fs">
<Link>SyntaxTree\SignatureTypeTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\MeasureTests.fs">
<Link>SyntaxTree\MeasureTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\MatchClauseTests.fs">
<Link>SyntaxTree\MatchClauseTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\SourceIdentifierTests.fs">
<Link>SyntaxTree\SourceIdentifierTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\NestedModuleTests.fs">
<Link>SyntaxTree\NestedModuleTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\BindingTests.fs">
<Link>SyntaxTree\BindingTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ParsedHashDirectiveTests.fs">
<Link>SyntaxTree\ParsedHashDirectiveTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\LambdaTests.fs">
<Link>SyntaxTree\LambdaTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\IfThenElseTests.fs">
<Link>SyntaxTree\IfThenElseTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\UnionCaseTests.fs">
<Link>SyntaxTree\UnionCaseTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\EnumCaseTests.fs">
<Link>SyntaxTree\EnumCaseTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\PatternTests.fs">
<Link>SyntaxTree\PatternTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ExceptionTests.fs">
<Link>SyntaxTree\ExceptionTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\MemberFlagTests.fs">
<Link>SyntaxTree\MemberFlagTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ComputationExpressionTests.fs">
<Link>SyntaxTree\ComputationExpressionTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\ConditionalDirectiveTests.fs">
<Link>SyntaxTree\ConditionalDirectiveTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\CodeCommentTests.fs">
<Link>SyntaxTree\CodeCommentTests.fs</Link>
</Compile>
<Compile Include="..\service\SyntaxTreeTests\OperatorNameTests.fs">
<Link>SyntaxTree\OperatorNameTests.fs</Link>
</Compile>
<Compile Include="..\service\FileSystemTests.fs">
<Link>FileSystemTests.fs</Link>
</Compile>
......
......@@ -36,6 +36,75 @@
<Compile Include="..\..\tests\service\Symbols.fs">
<Link>CompilerService\Symbols.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\TypeTests.fs">
<Link>SyntaxTree\TypeTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ExpressionTests.fs">
<Link>SyntaxTree\ExpressionTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\StringTests.fs">
<Link>SyntaxTree\StringTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ModuleOrNamespaceTests.fs">
<Link>SyntaxTree\ModuleOrNamespaceTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ModuleOrNamespaceSigTests.fs">
<Link>SyntaxTree\ModuleOrNamespaceSigTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\SignatureTypeTests.fs">
<Link>SyntaxTree\SignatureTypeTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\MeasureTests.fs">
<Link>SyntaxTree\MeasureTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\MatchClauseTests.fs">
<Link>SyntaxTree\MatchClauseTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\SourceIdentifierTests.fs">
<Link>SyntaxTree\SourceIdentifierTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\NestedModuleTests.fs">
<Link>SyntaxTree\NestedModuleTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\BindingTests.fs">
<Link>SyntaxTree\BindingTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ParsedHashDirectiveTests.fs">
<Link>SyntaxTree\ParsedHashDirectiveTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\LambdaTests.fs">
<Link>SyntaxTree\LambdaTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\IfThenElseTests.fs">
<Link>SyntaxTree\IfThenElseTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\UnionCaseTests.fs">
<Link>SyntaxTree\UnionCaseTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\EnumCaseTests.fs">
<Link>SyntaxTree\EnumCaseTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\PatternTests.fs">
<Link>SyntaxTree\PatternTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ExceptionTests.fs">
<Link>SyntaxTree\ExceptionTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\MemberFlagTests.fs">
<Link>SyntaxTree\MemberFlagTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ComputationExpressionTests.fs">
<Link>SyntaxTree\ComputationExpressionTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\ConditionalDirectiveTests.fs">
<Link>SyntaxTree\ConditionalDirectiveTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\CodeCommentTests.fs">
<Link>SyntaxTree\CodeCommentTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\SyntaxTreeTests\OperatorNameTests.fs">
<Link>SyntaxTree\OperatorNameTests.fs</Link>
</Compile>
<Compile Include="..\..\tests\service\EditorTests.fs">
<Link>CompilerService\EditorTests.fs</Link>
</Compile>
......
此差异已折叠。
此差异已折叠。
module FSharp.Compiler.Service.Tests.SyntaxTreeTests.CodeCommentTestsTests
open FSharp.Compiler.Service.Tests.Common
open FSharp.Compiler.Syntax
open FSharp.Compiler.SyntaxTrivia
open NUnit.Framework
let private getCommentTrivia isSignatureFile source =
let ast = (if isSignatureFile then getParseResultsOfSignatureFile else getParseResults) source
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(trivia = { CodeComments = trivia }))
| ParsedInput.SigFile(ParsedSigFileInput(trivia = { CodeComments = trivia })) -> trivia
[<Test>]
let ``comment on single line`` () =
let trivia =
getCommentTrivia false """
// comment!
foo()
"""
match trivia with
| [ CommentTrivia.LineComment mComment ] ->
assertRange (2, 0) (2, 11) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``comment on single line, signature file`` () =
let trivia =
getCommentTrivia true """
namespace Meh
// comment!
foo()
"""
match trivia with
| [ CommentTrivia.LineComment mComment ] ->
assertRange (3, 0) (3, 11) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``comment after source code`` () =
let trivia =
getCommentTrivia false """
foo() // comment!
"""
match trivia with
| [ CommentTrivia.LineComment mComment ] ->
assertRange (2, 6) (2, 17) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``comment after source code, signature file`` () =
let trivia =
getCommentTrivia true """
namespace Meh
val foo : int // comment!
"""
match trivia with
| [ CommentTrivia.LineComment mComment ] ->
assertRange (4, 14) (4, 25) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``block comment in source code`` () =
let trivia =
getCommentTrivia false """
let a (* b *) c = c + 42
"""
match trivia with
| [ CommentTrivia.BlockComment mComment ] ->
assertRange (2, 6) (2, 13) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``block comment in source code, signature file`` () =
let trivia =
getCommentTrivia true """
namespace Meh
val a (* b *) : int
"""
match trivia with
| [ CommentTrivia.BlockComment mComment ] ->
assertRange (4, 6) (4, 13) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``comment at end of file`` () =
let trivia =
getCommentTrivia false "x // y"
match trivia with
| [ CommentTrivia.LineComment mComment ] ->
assertRange (1, 2) (1, 6) mComment
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``triple slash comment should not be captured`` () =
let trivia =
getCommentTrivia false """
/// Some great documentation comment
let x = 0
"""
match trivia with
| [] ->
Assert.Pass()
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``triple slash comment should be captured, if used in an invalid location`` () =
let trivia =
getCommentTrivia false """
/// Valid xml doc
let x =
/// Some great documentation comment
/// With a blank line in between
/// but on a while loop
while true do ()
a + 1
"""
match trivia with
| [ CommentTrivia.LineComment m1
CommentTrivia.LineComment m2
CommentTrivia.LineComment m3 ] ->
assertRange (4, 4) (4, 40) m1
assertRange (6, 4) (6, 36) m2
assertRange (7, 4) (7, 27) m3
| _ ->
Assert.Fail "Could not get valid AST"
\ No newline at end of file
module FSharp.Compiler.Service.Tests.SyntaxTreeTests.ComputationExpressionTestsTests
open FSharp.Compiler.Service.Tests.Common
open FSharp.Compiler.Syntax
open NUnit.Framework
[<Test>]
let ``SynExprAndBang range starts at and! and ends after expression`` () =
let ast =
getParseResults """
async {
let! bar = getBar ()
and! foo = getFoo ()
return bar
}
"""
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Expr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
SynExprAndBang(range = mAndBang)
]))))
])
])) ->
assertRange (5, 4) (5, 24) mAndBang
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``multiple SynExprAndBang have range that starts at and! and ends after expression`` () =
let ast =
getParseResults """
async {
let! bar = getBar ()
and! foo = getFoo () in
and! meh = getMeh ()
return bar
}
"""
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Expr (expr = SynExpr.App(argExpr = SynExpr.ComputationExpr(expr = SynExpr.LetOrUseBang(andBangs = [
SynExprAndBang(range = mAndBang1; trivia={ InKeyword = Some mIn })
SynExprAndBang(range = mAndBang2)
]))))
])
])) ->
assertRange (4, 4) (4, 24) mAndBang1
assertRange (4, 25) (4, 27) mIn
assertRange (5, 4) (5, 24) mAndBang2
| _ ->
Assert.Fail "Could not get valid AST"
\ No newline at end of file
module FSharp.Compiler.Service.Tests.SyntaxTreeTests.EnumCaseTestsTests
open FSharp.Compiler.Service.Tests.Common
open FSharp.Compiler.Syntax
open NUnit.Framework
[<Test>]
let ``single SynEnumCase has bar range`` () =
let ast = """
type Foo = | Bar = 1
"""
|> getParseResults
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Types ([
SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [
SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar; EqualsRange = mEquals })
])))
], _)
])
])) ->
assertRange (2, 11) (2, 12) mBar
assertRange (2, 17) (2, 18) mEquals
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``multiple SynEnumCases have bar range`` () =
let ast = """
type Foo =
| Bar = 1
| Bear = 2
"""
|> getParseResults
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Types ([
SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [
SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar1; EqualsRange = mEquals1 })
SynEnumCase.SynEnumCase (trivia = { BarRange = Some mBar2; EqualsRange = mEquals2 })
])))
], _)
])
])) ->
assertRange (3, 4) (3, 5) mBar1
assertRange (3, 10) (3, 11) mEquals1
assertRange (4, 4) (4, 5) mBar2
assertRange (4, 11) (4, 12) mEquals2
| _ ->
Assert.Fail "Could not get valid AST"
[<Test>]
let ``single SynEnumCase without bar`` () =
let ast = """
type Foo = Bar = 1
"""
|> getParseResults
match ast with
| ParsedInput.ImplFile(ParsedImplFileInput(modules = [
SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Types ([
SynTypeDefn.SynTypeDefn (typeRepr = SynTypeDefnRepr.Simple (simpleRepr = SynTypeDefnSimpleRepr.Enum(cases = [
SynEnumCase.SynEnumCase (trivia = { BarRange = None; EqualsRange = mEquals })
])))
], _)
])
])) ->
assertRange (2, 15) (2, 16) mEquals
| _ ->
Assert.Fail "Could not get valid AST"
\ No newline at end of file
module FSharp.Compiler.Service.Tests.SyntaxTreeTests.ExceptionTestsTests
open FSharp.Compiler.Service.Tests.Common
open FSharp.Compiler.Syntax
open NUnit.Framework
[<Test>]
let ``SynExceptionDefn should contains the range of the with keyword`` () =
let parseResults =
getParseResults
"""
namespace X
exception Foo with
member Meh () = ()
"""
match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace(decls = [
SynModuleDecl.Exception(
exnDefn=SynExceptionDefn(withKeyword = Some mWithKeyword)
)
]) ])) ->
assertRange (4, 14) (4, 18) mWithKeyword
| _ -> Assert.Fail "Could not get valid AST"
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
module FSharp.Compiler.Service.Tests.SyntaxTreeTests.MeasureTests
open FSharp.Compiler.Service.Tests.Common
open FSharp.Compiler.Syntax
open NUnit.Framework
[<Test>]
let ``Measure contains the range of the constant`` () =
let parseResults =
getParseResults
"""
let n = 1.0m<cm>
let m = 7.000<cm>
"""
match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Let(bindings = [ SynBinding.SynBinding(expr = SynExpr.Const(SynConst.Measure(constantRange = r1), _)) ])
SynModuleDecl.Let(bindings = [ SynBinding.SynBinding(expr = SynExpr.Const(SynConst.Measure(constantRange = r2), _)) ])
]) ])) ->
assertRange (2, 8) (2, 12) r1
assertRange (3, 8) (3, 13) r2
| _ -> Assert.Fail "Could not get valid AST"
[<Test>]
let ``SynMeasure.Paren has correct range`` () =
let parseResults =
getParseResults
"""
40u<hr / (staff weeks)>
"""
match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Expr(
expr = SynExpr.Const(SynConst.Measure(SynConst.UInt32 _, _, SynMeasure.Divide(
SynMeasure.Seq([ SynMeasure.Named([ hrIdent ], _) ], _),
SynMeasure.Seq([ SynMeasure.Paren(SynMeasure.Seq([
SynMeasure.Named([ staffIdent ], _)
SynMeasure.Named([ weeksIdent ], _)
], _) , mParen) ], _),
_)
), _))
]) ])) ->
Assert.AreEqual("hr", hrIdent.idText)
Assert.AreEqual("staff", staffIdent.idText)
Assert.AreEqual("weeks", weeksIdent.idText)
assertRange (2, 9) (2, 22) mParen
| _ -> Assert.Fail $"Could not get valid AST, got {parseResults}"
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册