Skip to content

Commit

Permalink
Add ClassEnd wiget + More tests
Browse files Browse the repository at this point in the history
  • Loading branch information
edgarfgp committed Jun 13, 2023
1 parent 086de2d commit 235aacc
Show file tree
Hide file tree
Showing 8 changed files with 549 additions and 123 deletions.
208 changes: 178 additions & 30 deletions src/Fabulous.AST.Tests/TypeDefinitions/Class.fs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ type Person =
)
)

AnonymousModule() { (Class("Person") { EscapeHatch(memberNode) }).parameters([]) }
AnonymousModule() { (Class("Person") { EscapeHatch(memberNode) }).implicitConstructorParameters([]) }
|> produces
"""
type Person () =
Expand Down Expand Up @@ -113,7 +113,10 @@ type Person () =
[ "name"; "lastName"; "age" ]
|> List.map(fun n -> SimplePatNode(None, false, SingleTextNode(n, Range.Zero), None, Range.Zero))

AnonymousModule() { (Class("Person") { EscapeHatch(memberNode) }).parameters(param) }
AnonymousModule() {
(Class("Person") { EscapeHatch(memberNode) })
.implicitConstructorParameters(param)
}
|> produces
"""
type Person (name, lastName, age) =
Expand Down Expand Up @@ -162,7 +165,10 @@ type Person (name, lastName, age) =
Range.Zero
))

AnonymousModule() { (Class("Person") { EscapeHatch(memberNode) }).parameters(param) }
AnonymousModule() {
(Class("Person") { EscapeHatch(memberNode) })
.implicitConstructorParameters(param)
}
|> produces
"""
type Person (name: string, lastName: string, ?age: int) =
Expand Down Expand Up @@ -200,7 +206,11 @@ type Person (name: string, lastName: string, ?age: int) =
let param =
SimplePatNode(None, false, SingleTextNode("name", Range.Zero), Some(Type.FromString("string")), Range.Zero)

AnonymousModule() { (Class("Person") { EscapeHatch(memberNode) }).isStruct().parameters([ param ]) }
AnonymousModule() {
(Class("Person") { EscapeHatch(memberNode) })
.isStruct()
.implicitConstructorParameters([ param ])
}
|> produces
"""
[<Struct>]
Expand Down Expand Up @@ -240,7 +250,7 @@ type Person (name: string) =
AnonymousModule() {
(Class("Person") { EscapeHatch(memberNode) })
.attributes([ "Sealed"; "AbstractClass" ])
.parameters([])
.implicitConstructorParameters([])
}
|> produces
"""
Expand All @@ -251,39 +261,177 @@ type Person () =
"""

[<Test>]
let ``Produces a class that implements an interface`` () =
let parameters =
[ (Type.FromString("int"), SingleTextNode.rightArrow)
(Type.FromString("int"), SingleTextNode.rightArrow) ]

let method =
MemberDefnAbstractSlotNode.Method(
"Add",
Type.Funs(TypeFunsNode(parameters, Type.FromString("int"), Range.Zero))
let ``Produces a generic class`` () =
let memberNode =
MemberDefn.Member(
BindingNode(
None,
None,
MultipleTextsNode([ SingleTextNode("member", Range.Zero) ], Range.Zero),
false,
None,
None,
Choice1Of2(
IdentListNode(
[ IdentifierOrDot.Ident(SingleTextNode("this", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode(".", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode("Name", Range.Zero)) ],
Range.Zero
)
),
None,
List.Empty,
None,
SingleTextNode("=", Range.Zero),
Expr.Constant(Constant.FromText(SingleTextNode("\"\"", Range.Zero))),
Range.Zero
)
)

let property = MemberDefnAbstractSlotNode.Property("Pi", Type.FromString("float"))
AnonymousModule() {
GenericClass("Person", [ "'a"; "'b" ]) { EscapeHatch(memberNode) }

}
|> produces
"""
type Person <'a, 'b> =
member this.Name = ""
let getSetProperty =
MemberDefnAbstractSlotNode.GetSet("Area", Type.FromString("float"))
"""

let interfaceWidget () =
Interface("MyInterface") {
EscapeHatch(method)
EscapeHatch(property)
EscapeHatch(getSetProperty)
}
[<Test>]
let ``Produces a generic class with a constructor`` () =
let memberNode =
MemberDefn.Member(
BindingNode(
None,
None,
MultipleTextsNode([ SingleTextNode("member", Range.Zero) ], Range.Zero),
false,
None,
None,
Choice1Of2(
IdentListNode(
[ IdentifierOrDot.Ident(SingleTextNode("this", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode(".", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode("Name", Range.Zero)) ],
Range.Zero
)
),
None,
List.Empty,
None,
SingleTextNode("=", Range.Zero),
Expr.Constant(Constant.FromText(SingleTextNode("\"\"", Range.Zero))),
Range.Zero
)
)

AnonymousModule() {
EmptyClass("MyClass").implements(interfaceWidget())
(GenericClass("Person", [ "'a"; "'b" ]) { EscapeHatch(memberNode) })
.implicitConstructorParameters([])

}
|> produces
"""
type MyClass =
interface MyInterface with
member this.Add(var0) (var1)= var0 + var1
member this.Area = 4.
member this.Area with set value = ()
member this.Pi = 3.14
type Person <'a, 'b>() =
member this.Name = ""
"""

[<Test>]
let ``Produces a struct generic class with a constructor`` () =
let memberNode =
MemberDefn.Member(
BindingNode(
None,
None,
MultipleTextsNode([ SingleTextNode("member", Range.Zero) ], Range.Zero),
false,
None,
None,
Choice1Of2(
IdentListNode(
[ IdentifierOrDot.Ident(SingleTextNode("this", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode(".", Range.Zero))
IdentifierOrDot.Ident(SingleTextNode("Name", Range.Zero)) ],
Range.Zero
)
),
None,
List.Empty,
None,
SingleTextNode("=", Range.Zero),
Expr.Constant(Constant.FromText(SingleTextNode("\"\"", Range.Zero))),
Range.Zero
)
)

AnonymousModule() {
(GenericClass("Person", [ "'a"; "'b" ]) { EscapeHatch(memberNode) })
.isStruct()
.implicitConstructorParameters([])

}
|> produces
"""
[<Struct>]
type Person <'a, 'b>() =
member this.Name = ""
"""

[<Test>]
let ``Produces a class end`` () =
AnonymousModule() { ClassEnd("MyClass") }
|> produces
"""
type MyClass =
class
end
"""

[<Test>]
let ``Produces a class end with constructor`` () =
AnonymousModule() { ClassEnd("MyClass").implicitConstructorParameters([]) }
|> produces
"""
type MyClass () =
class
end
"""

[<Test>]
let ``Produces a class end with constructor and attributes`` () =
AnonymousModule() {
ClassEnd("MyClass")
.attributes([ "Sealed"; "AbstractClass" ])
.implicitConstructorParameters([])
}
|> produces
"""
[<Sealed; AbstractClass>]
type MyClass () =
class
end
"""

[<Test>]
let ``Produces a class end with type params`` () =
AnonymousModule() { ClassEnd("MyClass", [ "'a"; "'b" ]) }
|> produces
"""
type MyClass <'a, 'b> =
class
end
"""

[<Test>]
let ``Produces a class end with constructor and type params`` () =
AnonymousModule() { ClassEnd("MyClass", [ "'a"; "'b" ]).implicitConstructorParameters([]) }
|> produces
"""
type MyClass <'a, 'b>() =
class
end
"""
2 changes: 2 additions & 0 deletions src/Fabulous.AST/Fabulous.AST.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
<Compile Include="Widgets\TypeDefinitions\Record.fs" />
<Compile Include="Widgets\TypeDefinitions\Interface.fs" />
<Compile Include="Widgets\TypeDefinitions\Class.fs" />
<Compile Include="Widgets\TypeDefinitions\GenericClass.fs" />
<Compile Include="Widgets\TypeDefinitions\ClassEnd.fs" />
<Compile Include="Widgets\TypeDefinitions\GenericInterface.fs" />
<Compile Include="Widgets\ControlFlow\IfThen.fs" />
<Compile Include="Widgets\ControlFlow\IfThenElif.fs" />
Expand Down
4 changes: 4 additions & 0 deletions src/Fabulous.AST/Widgets/Common.fs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ module Auxiliary =
let leftParenthesis = SingleTextNode.Create "("
let rightParenthesis = SingleTextNode.Create ")"
let ``abstract`` = SingleTextNode.Create "abstract"
let ``interface`` = SingleTextNode.Create "interface"
let ``class`` = SingleTextNode.Create "class"
let ``end`` = SingleTextNode.Create "end"
let ``with`` = SingleTextNode.Create "with"
let ``member`` = SingleTextNode.Create "member"
let rightArrow = SingleTextNode.Create "->"
let lefArrow = SingleTextNode.Create "<-"
Expand Down

0 comments on commit 235aacc

Please sign in to comment.