Skip to content

Commit

Permalink
Boolean Syntax Factory
Browse files Browse the repository at this point in the history
Factory for bool nodes.
  • Loading branch information
iwillspeak committed Jun 22, 2024
1 parent 459a243 commit a30a395
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
19 changes: 19 additions & 0 deletions src/Feersum.CompilerServices/Syntax/Factories.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ open Feersum.CompilerServices.Syntax.Tree
open Firethorn.Green
open Firethorn.Red

/// Create a Numeric Value Constant
///
/// Emits a syntax tree representing a single number
let numVal n =
new Constant(
SyntaxNode.CreateRoot(
Expand All @@ -14,3 +17,19 @@ let numVal n =
)
)
)

/// Create a Boolean Value Constant
///
/// Emit a syntax tree reprsenting a single boolean value
let boolVal b =
let literal = if b then "#t" else "#f"

new Constant(
SyntaxNode.CreateRoot(
GreenNode.Create(
AstKind.CONSTANT |> SyntaxUtils.astToGreen,
[ GreenToken.Create(AstKind.BOOLEAN |> SyntaxUtils.astToGreen, literal)
|> GreenElement.Token ]
)
)
)
4 changes: 2 additions & 2 deletions src/Feersum.CompilerServices/Syntax/Tree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ module private Utils =
type AstItem internal (red: NodeOrToken<SyntaxNode, SyntaxToken>) =

/// Get the Syntax range of the item
member public _.SyntaxRange = red |> NodeOrToken.consolidate _.Range _.Range
member public _.SyntaxRange = red |> NodeOrToken.consolidate (_.Range) (_.Range)

member _.Text =
red
Expand All @@ -164,7 +164,7 @@ type AstItem internal (red: NodeOrToken<SyntaxNode, SyntaxToken>) =
_.Green.Text

override _.ToString() =
red |> NodeOrToken.consolidate _.ToString() _.ToString()
red |> NodeOrToken.consolidate (_.ToString()) (_.ToString())

// *********** TOKENS

Expand Down
34 changes: 29 additions & 5 deletions test/Feersum.Tests/SyntaxFactoriesTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,43 @@ open Feersum.CompilerServices.Syntax.Factories
open Xunit
open Feersum.CompilerServices.Syntax
open Feersum.CompilerServices.Syntax.Tree
open Firethorn.Red

let checkReparse (node: Expression) =
let reparsed = Parse.readExpr1 "testparse" node.Text
let node2 = reparsed.Root.Body.Value
Assert.Empty(reparsed.Diagnostics)
Assert.Equal(node2.RawNode.Kind, node.RawNode.Kind)
Assert.Equal(node2.SyntaxRange, node.SyntaxRange)
Assert.Equal(Debug.debugToStringRaw node2.RawNode, Debug.debugToStringRaw node.RawNode)

[<Fact>]
let ``number nodes`` () =
let node = numVal 123
let reparsed = Parse.readExpr1 "testparse" node.Text
let node2 = reparsed.Root.Body.Value

Assert.Equal("123", node.Text)

match node with
| Constant(Some(NumVal 123.0)) -> ()
| _ -> failwith "Node structure invalid"

Assert.Empty(reparsed.Diagnostics)
Assert.Equal(node2.RawNode.Kind, node.RawNode.Kind)
Assert.Equal(node2.SyntaxRange, node.SyntaxRange)
checkReparse node

[<Fact>]
let ``bool nodes`` () =
let tNode = boolVal true
let fNode = boolVal false

Assert.Equal("#t", tNode.Text)
Assert.Equal("#f", fNode.Text)

match tNode with
| Constant(Some(BoolVal true)) -> ()
| _ -> failwith "Node structure invalid"

match fNode with
| Constant(Some(BoolVal false)) -> ()
| _ -> failwith "Node structure invalid"

checkReparse tNode
checkReparse fNode

0 comments on commit a30a395

Please sign in to comment.