Merge pull request 'fix-chained-methods' (#32) from fix-chained-methods into main
Reviewed-on: sashakoshka/fspl#32
This commit is contained in:
commit
e8b8139b20
@ -131,11 +131,10 @@ func (this *Tree) analyzeMethodCall (
|
|||||||
error,
|
error,
|
||||||
) {
|
) {
|
||||||
// get method
|
// get method
|
||||||
sourceExpr, err := this.analyzeExpression(nil, strict, call.Source)
|
source, err := this.analyzeExpression(nil, strict, call.Source)
|
||||||
source := sourceExpr.(*entity.Variable)
|
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
method, err := this.analyzeMethodOrBehavior (
|
method, err := this.analyzeMethodOrBehavior (
|
||||||
call.Position, source.Declaration.Type(), call.Name)
|
call.Position, source.Type(), call.Name)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
// extract signature
|
// extract signature
|
||||||
|
@ -53,3 +53,17 @@ StringHolder.[setString string:String] = {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMethodChained (test *testing.T) {
|
||||||
|
testString (test,
|
||||||
|
`
|
||||||
|
Number: Int
|
||||||
|
|
||||||
|
Number.[add x:Number]:Number = [+ [.this] x]
|
||||||
|
Number.[sub x:Number]:Number = [- [.this] x]
|
||||||
|
Number.[mul x:Number]:Number = [* [.this] x]
|
||||||
|
Number.[div x:Number]:Number = [/ [.this] x]
|
||||||
|
|
||||||
|
[main]: Number = [~Number 5].[add 8].[mul 3]
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
@ -91,7 +91,7 @@ func testReader (test *testing.T, inputs ...io.Reader) {
|
|||||||
tree := Tree { }
|
tree := Tree { }
|
||||||
err := tree.Analyze(ast)
|
err := tree.Analyze(ast)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
test.Error("analyzer returned error:", err)
|
test.Error("analyzer returned error:\n" + errors.Format(err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,80 @@ Number.[number]: Int = [.this]
|
|||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMethodChained (test *testing.T) {
|
||||||
|
testString (test,
|
||||||
|
`%Number = type i64
|
||||||
|
define %Number @main() {
|
||||||
|
0:
|
||||||
|
%1 = alloca i64
|
||||||
|
store i64 5, ptr %1
|
||||||
|
%2 = call %Number @Number.add(ptr %1, i64 8)
|
||||||
|
%3 = alloca %Number
|
||||||
|
store %Number %2, ptr %3
|
||||||
|
%4 = call %Number @Number.mul(ptr %3, i64 3)
|
||||||
|
ret %Number %4
|
||||||
|
}
|
||||||
|
define %Number @Number.mul(ptr %this, %Number %x) {
|
||||||
|
0:
|
||||||
|
%1 = alloca ptr
|
||||||
|
store ptr %this, ptr %1
|
||||||
|
%2 = alloca %Number
|
||||||
|
store %Number %x, ptr %2
|
||||||
|
%3 = load ptr, ptr %1
|
||||||
|
%4 = load %Number, ptr %3
|
||||||
|
%5 = load %Number, ptr %2
|
||||||
|
%6 = mul %Number %4, %5
|
||||||
|
ret %Number %6
|
||||||
|
}
|
||||||
|
define %Number @Number.add(ptr %this, %Number %x) {
|
||||||
|
0:
|
||||||
|
%1 = alloca ptr
|
||||||
|
store ptr %this, ptr %1
|
||||||
|
%2 = alloca %Number
|
||||||
|
store %Number %x, ptr %2
|
||||||
|
%3 = load ptr, ptr %1
|
||||||
|
%4 = load %Number, ptr %3
|
||||||
|
%5 = load %Number, ptr %2
|
||||||
|
%6 = add %Number %4, %5
|
||||||
|
ret %Number %6
|
||||||
|
}
|
||||||
|
define %Number @Number.div(ptr %this, %Number %x) {
|
||||||
|
0:
|
||||||
|
%1 = alloca ptr
|
||||||
|
store ptr %this, ptr %1
|
||||||
|
%2 = alloca %Number
|
||||||
|
store %Number %x, ptr %2
|
||||||
|
%3 = load ptr, ptr %1
|
||||||
|
%4 = load %Number, ptr %3
|
||||||
|
%5 = load %Number, ptr %2
|
||||||
|
%6 = sdiv %Number %4, %5
|
||||||
|
ret %Number %6
|
||||||
|
}
|
||||||
|
define %Number @Number.sub(ptr %this, %Number %x) {
|
||||||
|
0:
|
||||||
|
%1 = alloca ptr
|
||||||
|
store ptr %this, ptr %1
|
||||||
|
%2 = alloca %Number
|
||||||
|
store %Number %x, ptr %2
|
||||||
|
%3 = load ptr, ptr %1
|
||||||
|
%4 = load %Number, ptr %3
|
||||||
|
%5 = load %Number, ptr %2
|
||||||
|
%6 = sub %Number %4, %5
|
||||||
|
ret %Number %6
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
Number: Int
|
||||||
|
|
||||||
|
Number.[add x:Number]:Number = [+ [.this] x]
|
||||||
|
Number.[sub x:Number]:Number = [- [.this] x]
|
||||||
|
Number.[mul x:Number]:Number = [* [.this] x]
|
||||||
|
Number.[div x:Number]:Number = [/ [.this] x]
|
||||||
|
|
||||||
|
[main]: Number = [~Number 5].[add 8].[mul 3]
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|
||||||
func TestMethodGreeter (test *testing.T) {
|
func TestMethodGreeter (test *testing.T) {
|
||||||
testString (test,
|
testString (test,
|
||||||
`%Index = type i64
|
`%Index = type i64
|
||||||
|
@ -17,7 +17,7 @@ func LogColumnsStyle (test *testing.T, style string, columns ...any) {
|
|||||||
for index := range columns {
|
for index := range columns {
|
||||||
if index > 0 { formatString += " | " }
|
if index > 0 { formatString += " | " }
|
||||||
|
|
||||||
if index == len(columns) {
|
if index == len(columns) - 1 {
|
||||||
formatString += "%v"
|
formatString += "%v"
|
||||||
} else {
|
} else {
|
||||||
formatString += "%-80v"
|
formatString += "%-80v"
|
||||||
|
Loading…
Reference in New Issue
Block a user