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

Add SynMeasure.Paren (#13058)

上级 f5e74287
......@@ -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
......
......@@ -173,6 +173,8 @@ type SynMeasure =
| Anon of range: range
| Var of typar: SynTypar * range: range
| Paren of measure: SynMeasure * range: range
[<NoEquality; NoComparison; RequireQualifiedAccess>]
type SynRationalConst =
......
......@@ -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.
[<NoEquality; NoComparison; RequireQualifiedAccess>]
type SynRationalConst =
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -4454,3 +4454,30 @@ type A() =
assertRange (5, 5) (5, 6) rpr
| _ ->
Assert.Fail $"Could not get valid AST, got {ast}"
module Measures =
[<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}"
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册