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,
|
||||
) {
|
||||
// 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
|
||||
|
@ -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 { }
|
||||
err := tree.Analyze(ast)
|
||||
if err != nil {
|
||||
test.Error("analyzer returned error:", err)
|
||||
test.Error("analyzer returned error:\n" + errors.Format(err))
|
||||
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) {
|
||||
testString (test,
|
||||
`%Index = type i64
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user