Merge pull request 'fix-chained-methods' (#32) from fix-chained-methods into main

Reviewed-on: sashakoshka/fspl#32
This commit is contained in:
Sasha Koshka 2024-02-11 02:35:37 +00:00
commit e8b8139b20
5 changed files with 92 additions and 5 deletions

View File

@ -131,11 +131,10 @@ func (this *Tree) analyzeMethodCall (
error,
) {
// get method
sourceExpr, err := this.analyzeExpression(nil, strict, call.Source)
source := sourceExpr.(*entity.Variable)
source, err := this.analyzeExpression(nil, strict, call.Source)
if err != nil { return nil, err }
method, err := this.analyzeMethodOrBehavior (
call.Position, source.Declaration.Type(), call.Name)
call.Position, source.Type(), call.Name)
if err != nil { return nil, err }
// extract signature

View File

@ -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]
`)
}

View File

@ -91,7 +91,7 @@ func testReader (test *testing.T, inputs ...io.Reader) {
tree := Tree { }
err := tree.Analyze(ast)
if err != nil {
test.Error("analyzer returned error:", err)
test.Error("analyzer returned error:\n" + errors.Format(err))
return
}
}

View File

@ -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) {
testString (test,
`%Index = type i64

View File

@ -17,7 +17,7 @@ func LogColumnsStyle (test *testing.T, style string, columns ...any) {
for index := range columns {
if index > 0 { formatString += " | " }
if index == len(columns) {
if index == len(columns) - 1 {
formatString += "%v"
} else {
formatString += "%-80v"