gnolang / tlin

Advanced Linter for Gno
MIT License
13 stars 1 forks source link

feat: Analyze Flow for Function #36

Closed notJoon closed 2 months ago

notJoon commented 2 months ago

Description

Example

Target Code

func highComplexity(x, y, z int) int {
    result := 0
    if x > y {
        if x > z {
            result = x
        } else {
            result = z
        }
    } else {
        if y > z {
            result = y
        } else {
            result = z
        }
    }

    for i := 0; i < result; i++ {
        if i%2 == 0 {
            result += i
        } else if i%3 == 0 {
            result += i * 2
        } else if i%5 == 0 {
            result += i * 3
        } else {
            result -= i
        }
    }

    switch {
    case result < 100:
        return result * 2
    case result < 1000:
        return result * 3
    case result < 10000:
        return result * 4
    default:
        return result
    }
}

Output:

~/lint tlin -cfg -func highComplexity testdata/complexity/high.gno
CFG for function highComplexity in file testdata/complexity/high.gno:
digraph mgraph {
mode="heir";
splines="ortho";

        "ENTRY" -> "assignment - line 4"
        "assignment - line 4" -> "if statement - line 5"
        "if statement - line 5" -> "if statement - line 6"
        "if statement - line 5" -> "if statement - line 12"
        "if statement - line 6" -> "assignment - line 7"
        "if statement - line 6" -> "assignment - line 9"
        "assignment - line 7" -> "assignment - line 19"
        "assignment - line 9" -> "assignment - line 19"
        "if statement - line 12" -> "assignment - line 13"
        "if statement - line 12" -> "assignment - line 15"
        "assignment - line 13" -> "assignment - line 19"
        "assignment - line 15" -> "assignment - line 19"
        "for loop - line 19" -> "if statement - line 20"
        "for loop - line 19" -> "switch statement - line 31"
        "assignment - line 19" -> "for loop - line 19"
        "increment statement - line 19" -> "for loop - line 19"
        "if statement - line 20" -> "assignment - line 21"
        "if statement - line 20" -> "if statement - line 22"
        "assignment - line 21" -> "increment statement - line 19"
        "if statement - line 22" -> "assignment - line 23"
        "if statement - line 22" -> "if statement - line 24"
        "assignment - line 23" -> "increment statement - line 19"
        "if statement - line 24" -> "assignment - line 25"
        "if statement - line 24" -> "assignment - line 27"
        "assignment - line 25" -> "increment statement - line 19"
        "assignment - line 27" -> "increment statement - line 19"
        "switch statement - line 31" -> "case clause - line 32"
        "switch statement - line 31" -> "case clause - line 34"
        "switch statement - line 31" -> "case clause - line 36"
        "switch statement - line 31" -> "case clause - line 38"
        "case clause - line 32" -> "return statement - line 33"
        "return statement - line 33" -> "EXIT"
        "case clause - line 34" -> "return statement - line 35"
        "return statement - line 35" -> "EXIT"
        "case clause - line 36" -> "return statement - line 37"
        "return statement - line 37" -> "EXIT"
        "case clause - line 38" -> "return statement - line 39"
        "return statement - line 39" -> "EXIT"
}

graphviz(1)