From f6e856cb160900c9a050115d98c5579baf02d541 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Wed, 4 May 2022 17:02:59 +0200 Subject: [PATCH] Add SynMeasure.Paren (#13058) --- src/fsharp/CheckExpressions.fs | 1 + src/fsharp/SyntaxTree.fs | 2 ++ src/fsharp/SyntaxTree.fsi | 3 +++ src/fsharp/pars.fsy | 3 ++- src/fsharp/service/ServiceParsedInputOps.fs | 1 + ...erService.SurfaceArea.netstandard.expected | 9 +++++++ tests/service/Symbols.fs | 27 +++++++++++++++++++ 7 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/fsharp/CheckExpressions.fs b/src/fsharp/CheckExpressions.fs index c2b823a4d..7b1165b33 100644 --- a/src/fsharp/CheckExpressions.fs +++ b/src/fsharp/CheckExpressions.fs @@ -836,6 +836,7 @@ let TcConst (cenv: cenv) (overallTy: TType) m env c = | SynMeasure.Seq(mss, _) -> ProdMeasures (List.map tcMeasure mss) | SynMeasure.Anon _ -> error(Error(FSComp.SR.tcUnexpectedMeasureAnon(), m)) | SynMeasure.Var(_, m) -> error(Error(FSComp.SR.tcNonZeroConstantCannotHaveGenericUnit(), m)) + | SynMeasure.Paren(measure, _) -> tcMeasure measure let unif expected = UnifyTypes cenv env m overallTy expected diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 94e09bb06..dc5577249 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -173,6 +173,8 @@ type SynMeasure = | Anon of range: range | Var of typar: SynTypar * range: range + + | Paren of measure: SynMeasure * range: range [] type SynRationalConst = diff --git a/src/fsharp/SyntaxTree.fsi b/src/fsharp/SyntaxTree.fsi index f8ff099dc..354584e69 100644 --- a/src/fsharp/SyntaxTree.fsi +++ b/src/fsharp/SyntaxTree.fsi @@ -207,6 +207,9 @@ type SynMeasure = /// A variable unit of measure | Var of typar: SynTypar * range: range + /// A parenthesized measure + | Paren of measure: SynMeasure * range: range + /// Represents an unchecked syntax tree of F# unit of measure exponents. [] type SynRationalConst = diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index da012dbd7..3e689dd97 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -5528,7 +5528,8 @@ measureTypeAtom: { SynMeasure.Var($1, lhs parseState) } | LPAREN measureTypeExpr rparen - { $2 } + { let mParen = rhs2 parseState 1 3 + SynMeasure.Paren($2, mParen) } measureTypePower: | measureTypeAtom diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index 4d170c88e..edee5e1a8 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -1459,6 +1459,7 @@ module ParsedInput = | SynMeasure.Divide (m1, m2, _) -> walkMeasure m1; walkMeasure m2 | SynMeasure.Named (longIdent, _) -> addLongIdent longIdent | SynMeasure.Seq (ms, _) -> List.iter walkMeasure ms + | SynMeasure.Paren(m, _) | SynMeasure.Power (m, _, _) -> walkMeasure m | SynMeasure.Var (ty, _) -> walkTypar ty | SynMeasure.One diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index 7ef51af19..a51e83005 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -7244,6 +7244,10 @@ FSharp.Compiler.Syntax.SynMeasure+Named: FSharp.Compiler.Text.Range get_range() FSharp.Compiler.Syntax.SynMeasure+Named: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynMeasure+Named: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] get_longId() FSharp.Compiler.Syntax.SynMeasure+Named: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident] longId +FSharp.Compiler.Syntax.SynMeasure+Paren: FSharp.Compiler.Syntax.SynMeasure get_measure() +FSharp.Compiler.Syntax.SynMeasure+Paren: FSharp.Compiler.Syntax.SynMeasure measure +FSharp.Compiler.Syntax.SynMeasure+Paren: FSharp.Compiler.Text.Range get_range() +FSharp.Compiler.Syntax.SynMeasure+Paren: FSharp.Compiler.Text.Range range FSharp.Compiler.Syntax.SynMeasure+Power: FSharp.Compiler.Syntax.SynMeasure get_measure() FSharp.Compiler.Syntax.SynMeasure+Power: FSharp.Compiler.Syntax.SynMeasure measure FSharp.Compiler.Syntax.SynMeasure+Power: FSharp.Compiler.Syntax.SynRationalConst get_power() @@ -7264,6 +7268,7 @@ FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Anon FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Divide FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Named FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 One +FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Paren FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Power FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Product FSharp.Compiler.Syntax.SynMeasure+Tags: Int32 Seq @@ -7276,6 +7281,7 @@ FSharp.Compiler.Syntax.SynMeasure: Boolean IsAnon FSharp.Compiler.Syntax.SynMeasure: Boolean IsDivide FSharp.Compiler.Syntax.SynMeasure: Boolean IsNamed FSharp.Compiler.Syntax.SynMeasure: Boolean IsOne +FSharp.Compiler.Syntax.SynMeasure: Boolean IsParen FSharp.Compiler.Syntax.SynMeasure: Boolean IsPower FSharp.Compiler.Syntax.SynMeasure: Boolean IsProduct FSharp.Compiler.Syntax.SynMeasure: Boolean IsSeq @@ -7284,6 +7290,7 @@ FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsAnon() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsDivide() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsNamed() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsOne() +FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsParen() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsPower() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsProduct() FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsSeq() @@ -7291,6 +7298,7 @@ FSharp.Compiler.Syntax.SynMeasure: Boolean get_IsVar() FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewAnon(FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewDivide(FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewNamed(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewParen(FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewPower(FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Syntax.SynRationalConst, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewProduct(FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Syntax.SynMeasure, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure NewSeq(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMeasure], FSharp.Compiler.Text.Range) @@ -7300,6 +7308,7 @@ FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure get_One() FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Anon FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Divide FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Named +FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Paren FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Power FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Product FSharp.Compiler.Syntax.SynMeasure: FSharp.Compiler.Syntax.SynMeasure+Seq diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 73647f74a..1eb0a68f6 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -4454,3 +4454,30 @@ type A() = assertRange (5, 5) (5, 6) rpr | _ -> Assert.Fail $"Could not get valid AST, got {ast}" + +module Measures = + [] + let ``SynMeasure.Paren has correct range`` () = + let parseResults = + getParseResults + """ +40u
+""" + + 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}" -- GitLab