Skip to content

Commit 17edfda

Browse files
committed
Support negative integer, sometimes name type cannot be retrieved.
1 parent 1cc624e commit 17edfda

5 files changed

Lines changed: 42 additions & 18 deletions

File tree

parse/expression_parse.go

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ func parseBinaryExpression(expr *ast.BinaryExpr) *Expression {
5656
return res
5757
}
5858

59+
func parseUnaryExpression(expr *ast.UnaryExpr) *Expression {
60+
// Unary expression like:
61+
// -1
62+
op := expr.Op.String()
63+
inside := parseExpression(&expr.X)
64+
value := fmt.Sprintf("%s%s", op, inside)
65+
66+
res := &Expression{
67+
Type: ExpressionTypeDefault,
68+
Name: value,
69+
NameType: op,
70+
}
71+
return res
72+
}
73+
5974
func parseParenthesesExpression(expr *ast.ParenExpr) *Expression {
6075
// Parentheses expression like:
6176
// (1 + 2)
@@ -89,7 +104,7 @@ func parseCallExpression(expr *ast.CallExpr) *Expression {
89104
// append(array, 1)
90105
res := &Expression{
91106
Type: ExpressionTypeCall,
92-
Name: expr.Fun.(*ast.Ident).Name,
107+
Name: parseExpression(&expr.Fun).String(),
93108
}
94109

95110
res.Children = Expressions{}
@@ -154,34 +169,39 @@ func parseExpression(expr *ast.Expr) *Expression {
154169
return parseBinaryExpression(e3)
155170
}
156171

157-
e4, ok := (*expr).(*ast.ParenExpr)
172+
e4, ok := (*expr).(*ast.UnaryExpr)
173+
if ok {
174+
return parseUnaryExpression(e4)
175+
}
176+
177+
e5, ok := (*expr).(*ast.ParenExpr)
158178
if ok {
159-
return parseParenthesesExpression(e4)
179+
return parseParenthesesExpression(e5)
160180
}
161181

162-
e5, ok := (*expr).(*ast.CompositeLit)
182+
e6, ok := (*expr).(*ast.CompositeLit)
163183
if ok {
164-
return parseArrayExpression(e5)
184+
return parseArrayExpression(e6)
165185
}
166186

167-
e6, ok := (*expr).(*ast.CallExpr)
187+
e7, ok := (*expr).(*ast.CallExpr)
168188
if ok {
169-
return parseCallExpression(e6)
189+
return parseCallExpression(e7)
170190
}
171191

172-
e7, ok := (*expr).(*ast.IndexExpr)
192+
e8, ok := (*expr).(*ast.IndexExpr)
173193
if ok {
174-
return parseIndexExpression(e7)
194+
return parseIndexExpression(e8)
175195
}
176196

177-
e8, ok := (*expr).(*ast.StarExpr)
197+
e9, ok := (*expr).(*ast.StarExpr)
178198
if ok {
179-
return parseStarExpression(e8)
199+
return parseStarExpression(e9)
180200
}
181201

182-
e9, ok := (*expr).(*ast.SelectorExpr)
202+
e10, ok := (*expr).(*ast.SelectorExpr)
183203
if ok {
184-
return parseSelectorExpression(e9)
204+
return parseSelectorExpression(e10)
185205
}
186206

187207
panic("parseExpression(): unknown expression type")

parse/parse.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import (
1010
"log"
1111
)
1212

13-
func parseFile() {
13+
func parseFile(filename string) {
1414
fset := token.NewFileSet()
15-
node, err := parser.ParseFile(fset, "test.go", nil, parser.ParseComments)
15+
node, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
1616
if err != nil {
1717
log.Fatal(err)
1818
}

parse/parse_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import "testing"
77

88
func TestParseFile(t *testing.T) {
99
println()
10-
parseFile()
10+
parseFile("../detect/rule_single_point.go")
1111
println()
1212
}

parse/statement.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ func (stmt *Statement) String() string {
2424
if stmt.Name == ":=" {
2525
// Input: res := 0
2626
// Output: int res = 0
27-
res = fmt.Sprintf("%s %s = %s", stmt.Args[1].NameType, stmt.Args[0].Name, stmt.Args[1])
27+
nameType := stmt.Args[1].NameType
28+
if nameType == "" {
29+
nameType = "var"
30+
}
31+
res = fmt.Sprintf("%s %s = %s", nameType, stmt.Args[0].Name, stmt.Args[1])
2832
} else if stmt.Name == "=" {
2933
// Input: res = 5
3034
// Output: res = 5

parse/statement_parse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func parseAssignStatement(stmt *ast.AssignStmt, level int) *Statement {
3535

3636
s := &Statement{
3737
Level: level,
38-
Name: strings.ToLower(stmt.Tok.String()),
38+
Name: strings.ToLower(stmt.Tok.String()), // :=, =, ..
3939
Args: []*Expression{leftExpr, rightExpr},
4040
}
4141
return s

0 commit comments

Comments
 (0)