Merge pull request #267 from smowton/smowton/feature/print-ast-label-package-node

PrintAst: Label File nodes' package-name children, and ensure that child comes before all declarations
This commit is contained in:
Chris Smowton 2020-07-24 13:30:12 +01:00 коммит произвёл GitHub
Родитель b4e15fb17a 454993fe64
Коммит 75d69efb15
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
6 изменённых файлов: 117 добавлений и 76 удалений

Просмотреть файл

@ -194,6 +194,47 @@ class FileNode extends BaseAstNode {
result = getSortOrder().toString()
}
/**
* Gets a child of this node, renumbering `packageNode`, our parent's
* `oldPackageIndex`th child, as the first child and moving others accordingly.
*/
private BaseAstNode getChildPackageFirst(
int childIndex, BaseAstNode packageNode, int oldPackageIndex
) {
super.getChild(oldPackageIndex) = packageNode and
(
childIndex = 0 and result = packageNode
or
result =
rank[childIndex](BaseAstNode node, int i |
node = super.getChild(i) and i != oldPackageIndex
|
node order by i
)
)
}
/**
* Gets a child of this node, moving the package-name expression to the front
* of the list if one exists.
*/
override BaseAstNode getChild(int childIndex) {
if exists(ast.getPackageNameExpr())
then result = getChildPackageFirst(childIndex, TAstNode(ast.getPackageNameExpr()), _)
else result = super.getChild(childIndex)
}
/**
* Gets the label for the edge from this node to the specified child. The package name
* expression is named 'package'; others are numbered as per our parent's implementation
* of this method.
*/
override string getChildEdgeLabel(int childIndex) {
if getChild(childIndex) = TAstNode(ast.getPackageNameExpr())
then result = "package"
else result = super.getChildEdgeLabel(childIndex)
}
/**
* Gets the string representation of this File. Note explicitly using a relative path
* like this rather than absolute as per default for the File class is a workaround for

Просмотреть файл

@ -4,30 +4,31 @@ go.mod:
# 3| 1: [GoModGoLine] go.mod go line
input.go:
# 0| [File] library-tests/semmle/go/PrintAst/input.go
# 5| 0: [CommentGroup] comment group
# 1| package: [Ident] main
# 5| 1: [CommentGroup] comment group
# 5| 0: [SlashSlashComment] comment
# 7| 1: [CommentGroup] comment group
# 7| 2: [CommentGroup] comment group
# 7| 0: [SlashSlashComment] comment
# 9| 2: [DocComment] comment group
# 9| 3: [DocComment] comment group
# 9| 0: [SlashSlashComment] comment
# 17| 3: [CommentGroup] comment group
# 17| 4: [CommentGroup] comment group
# 17| 0: [SlashSlashComment] comment
# 45| 4: [DocComment] comment group
# 45| 5: [DocComment] comment group
# 45| 0: [SlashSlashComment] comment
# 64| 5: [DocComment] comment group
# 64| 6: [DocComment] comment group
# 64| 0: [SlashSlashComment] comment
# 74| 6: [DocComment] comment group
# 74| 7: [DocComment] comment group
# 74| 0: [SlashSlashComment] comment
# 111| 7: [DocComment] comment group
# 111| 8: [DocComment] comment group
# 111| 0: [SlashSlashComment] comment
# 127| 8: [DocComment] comment group
# 127| 9: [DocComment] comment group
# 127| 0: [SlashSlashComment] comment
# 132| 9: [DocComment] comment group
# 132| 10: [DocComment] comment group
# 132| 0: [SlashSlashComment] comment
# 3| 10: [ImportDecl] import declaration
# 3| 11: [ImportDecl] import declaration
# 3| 0: [ImportSpec] import specifier
# 3| 0: [StringLit] "fmt"
# 10| 11: [FuncDecl] function declaration
# 10| 12: [FuncDecl] function declaration
# 10| 0: [FunctionName, Ident] test5
# 10| Type = func(bool)
# 10| 1: [FuncTypeExpr] function type
@ -152,7 +153,7 @@ input.go:
# 40| 1: [BlockStmt] block statement
# 41| 0: [GotoStmt] goto statement
# 41| 0: [Ident, LabelName] outer
# 46| 12: [FuncDecl] function declaration
# 46| 13: [FuncDecl] function declaration
# 46| 0: [FunctionName, Ident] test6
# 46| Type = func(chan int, chan float32)
# 46| 1: [FuncTypeExpr] function type
@ -262,7 +263,7 @@ input.go:
# 58| Value = [IntLit] 42
# 61| 3: [SelectStmt] select statement
# 61| 0: [BlockStmt] block statement
# 65| 13: [FuncDecl] function declaration
# 65| 14: [FuncDecl] function declaration
# 65| 0: [FunctionName, Ident] test7
# 65| Type = func(int) int
# 65| 1: [FuncTypeExpr] function type
@ -327,7 +328,7 @@ input.go:
# 71| 0: [IntLit] 42
# 71| Type = int
# 71| Value = [IntLit] 42
# 75| 14: [FuncDecl] function declaration
# 75| 15: [FuncDecl] function declaration
# 75| 0: [FunctionName, Ident] test8
# 75| Type = func(int)
# 75| 1: [FuncTypeExpr] function type
@ -447,7 +448,7 @@ input.go:
# 107| 0: [ConstantName, Ident] true
# 107| Type = bool
# 107| Value = [ConstantName, Ident] true
# 112| 15: [FuncDecl] function declaration
# 112| 16: [FuncDecl] function declaration
# 112| 0: [FunctionName, Ident] test9
# 112| Type = func(interface { })
# 112| 1: [FuncTypeExpr] function type
@ -518,7 +519,7 @@ input.go:
# 123| 1: [ConstantName, Ident] false
# 123| Type = bool
# 123| Value = [ConstantName, Ident] false
# 128| 16: [FuncDecl] function declaration
# 128| 17: [FuncDecl] function declaration
# 128| 0: [FunctionName, Ident] test10
# 128| Type = func(func() )
# 128| 1: [FuncTypeExpr] function type
@ -533,7 +534,7 @@ input.go:
# 129| Type = ()
# 129| 0: [Ident, VariableName] f
# 129| Type = func()
# 133| 17: [FuncDecl] function declaration
# 133| 18: [FuncDecl] function declaration
# 133| 0: [FunctionName, Ident] test11
# 133| Type = func([]int)
# 133| 1: [FuncTypeExpr] function type
@ -595,25 +596,25 @@ input.go:
# 145| 0: [Ident, VariableName] xs
# 145| Type = []int
# 145| 1: [BlockStmt] block statement
# 1| 18: [Ident] main
other.go:
# 0| [File] library-tests/semmle/go/PrintAst/other.go
# 3| 0: [FuncDecl] function declaration
# 1| package: [Ident] main
# 3| 1: [FuncDecl] function declaration
# 3| 0: [FunctionName, Ident] main
# 3| Type = func()
# 3| 1: [FuncTypeExpr] function type
# 3| 2: [BlockStmt] block statement
# 5| 1: [FuncDecl] function declaration
# 5| 2: [FuncDecl] function declaration
# 5| 0: [FunctionName, Ident] f
# 5| Type = func()
# 5| 1: [FuncTypeExpr] function type
# 5| 2: [BlockStmt] block statement
# 6| 2: [FuncDecl] function declaration
# 6| 3: [FuncDecl] function declaration
# 6| 0: [FunctionName, Ident] g
# 6| Type = func()
# 6| 1: [FuncTypeExpr] function type
# 6| 2: [BlockStmt] block statement
# 8| 3: [FuncDecl] function declaration
# 8| 4: [FuncDecl] function declaration
# 8| 0: [FunctionName, Ident] hasNested
# 8| Type = func()
# 8| 1: [FuncTypeExpr] function type
@ -638,7 +639,7 @@ other.go:
# 11| Type = int
# 11| 0: [Ident, VariableName] myNested
# 11| Type = func() int
# 15| 4: [VarDecl] variable declaration
# 15| 5: [VarDecl] variable declaration
# 15| 0: [ValueSpec] value declaration specifier
# 15| 0: [Ident, VariableName] x
# 15| Type = int
@ -647,4 +648,3 @@ other.go:
# 15| 2: [IntLit] 0
# 15| Type = int
# 15| Value = [IntLit] 0
# 1| 5: [Ident] main

Просмотреть файл

@ -4,10 +4,11 @@ go.mod:
# 3| 1: [GoModGoLine] go.mod go line
input.go:
# 0| [File] library-tests/semmle/go/PrintAst/input.go
# 3| 10: [ImportDecl] import declaration
# 1| package: [Ident] main
# 3| 1: [ImportDecl] import declaration
# 3| 0: [ImportSpec] import specifier
# 3| 0: [StringLit] "fmt"
# 10| 11: [FuncDecl] function declaration
# 10| 2: [FuncDecl] function declaration
# 10| 0: [FunctionName, Ident] test5
# 10| Type = func(bool)
# 10| 1: [FuncTypeExpr] function type
@ -132,7 +133,7 @@ input.go:
# 40| 1: [BlockStmt] block statement
# 41| 0: [GotoStmt] goto statement
# 41| 0: [Ident, LabelName] outer
# 46| 12: [FuncDecl] function declaration
# 46| 3: [FuncDecl] function declaration
# 46| 0: [FunctionName, Ident] test6
# 46| Type = func(chan int, chan float32)
# 46| 1: [FuncTypeExpr] function type
@ -242,7 +243,7 @@ input.go:
# 58| Value = [IntLit] 42
# 61| 3: [SelectStmt] select statement
# 61| 0: [BlockStmt] block statement
# 65| 13: [FuncDecl] function declaration
# 65| 4: [FuncDecl] function declaration
# 65| 0: [FunctionName, Ident] test7
# 65| Type = func(int) int
# 65| 1: [FuncTypeExpr] function type
@ -307,7 +308,7 @@ input.go:
# 71| 0: [IntLit] 42
# 71| Type = int
# 71| Value = [IntLit] 42
# 75| 14: [FuncDecl] function declaration
# 75| 5: [FuncDecl] function declaration
# 75| 0: [FunctionName, Ident] test8
# 75| Type = func(int)
# 75| 1: [FuncTypeExpr] function type
@ -427,7 +428,7 @@ input.go:
# 107| 0: [ConstantName, Ident] true
# 107| Type = bool
# 107| Value = [ConstantName, Ident] true
# 112| 15: [FuncDecl] function declaration
# 112| 6: [FuncDecl] function declaration
# 112| 0: [FunctionName, Ident] test9
# 112| Type = func(interface { })
# 112| 1: [FuncTypeExpr] function type
@ -498,7 +499,7 @@ input.go:
# 123| 1: [ConstantName, Ident] false
# 123| Type = bool
# 123| Value = [ConstantName, Ident] false
# 128| 16: [FuncDecl] function declaration
# 128| 7: [FuncDecl] function declaration
# 128| 0: [FunctionName, Ident] test10
# 128| Type = func(func() )
# 128| 1: [FuncTypeExpr] function type
@ -513,7 +514,7 @@ input.go:
# 129| Type = ()
# 129| 0: [Ident, VariableName] f
# 129| Type = func()
# 133| 17: [FuncDecl] function declaration
# 133| 8: [FuncDecl] function declaration
# 133| 0: [FunctionName, Ident] test11
# 133| Type = func([]int)
# 133| 1: [FuncTypeExpr] function type
@ -575,25 +576,25 @@ input.go:
# 145| 0: [Ident, VariableName] xs
# 145| Type = []int
# 145| 1: [BlockStmt] block statement
# 1| 18: [Ident] main
other.go:
# 0| [File] library-tests/semmle/go/PrintAst/other.go
# 3| 0: [FuncDecl] function declaration
# 1| package: [Ident] main
# 3| 1: [FuncDecl] function declaration
# 3| 0: [FunctionName, Ident] main
# 3| Type = func()
# 3| 1: [FuncTypeExpr] function type
# 3| 2: [BlockStmt] block statement
# 5| 1: [FuncDecl] function declaration
# 5| 2: [FuncDecl] function declaration
# 5| 0: [FunctionName, Ident] f
# 5| Type = func()
# 5| 1: [FuncTypeExpr] function type
# 5| 2: [BlockStmt] block statement
# 6| 2: [FuncDecl] function declaration
# 6| 3: [FuncDecl] function declaration
# 6| 0: [FunctionName, Ident] g
# 6| Type = func()
# 6| 1: [FuncTypeExpr] function type
# 6| 2: [BlockStmt] block statement
# 8| 3: [FuncDecl] function declaration
# 8| 4: [FuncDecl] function declaration
# 8| 0: [FunctionName, Ident] hasNested
# 8| Type = func()
# 8| 1: [FuncTypeExpr] function type
@ -618,7 +619,7 @@ other.go:
# 11| Type = int
# 11| 0: [Ident, VariableName] myNested
# 11| Type = func() int
# 15| 4: [VarDecl] variable declaration
# 15| 5: [VarDecl] variable declaration
# 15| 0: [ValueSpec] value declaration specifier
# 15| 0: [Ident, VariableName] x
# 15| Type = int
@ -627,4 +628,3 @@ other.go:
# 15| 2: [IntLit] 0
# 15| Type = int
# 15| Value = [IntLit] 0
# 1| 5: [Ident] main

Просмотреть файл

@ -4,33 +4,34 @@ go.mod:
# 3| 1: [GoModGoLine] go.mod go line
input.go:
# 0| [File] library-tests/semmle/go/PrintAst/input.go
# 5| 0: [CommentGroup] comment group
# 1| package: [Ident] main
# 5| 1: [CommentGroup] comment group
# 5| 0: [SlashSlashComment] comment
# 7| 1: [CommentGroup] comment group
# 7| 2: [CommentGroup] comment group
# 7| 0: [SlashSlashComment] comment
# 9| 2: [DocComment] comment group
# 9| 3: [DocComment] comment group
# 9| 0: [SlashSlashComment] comment
# 17| 3: [CommentGroup] comment group
# 17| 4: [CommentGroup] comment group
# 17| 0: [SlashSlashComment] comment
# 45| 4: [DocComment] comment group
# 45| 5: [DocComment] comment group
# 45| 0: [SlashSlashComment] comment
# 64| 5: [DocComment] comment group
# 64| 6: [DocComment] comment group
# 64| 0: [SlashSlashComment] comment
# 74| 6: [DocComment] comment group
# 74| 7: [DocComment] comment group
# 74| 0: [SlashSlashComment] comment
# 111| 7: [DocComment] comment group
# 111| 8: [DocComment] comment group
# 111| 0: [SlashSlashComment] comment
# 127| 8: [DocComment] comment group
# 127| 9: [DocComment] comment group
# 127| 0: [SlashSlashComment] comment
# 132| 9: [DocComment] comment group
# 132| 10: [DocComment] comment group
# 132| 0: [SlashSlashComment] comment
# 3| 10: [ImportDecl] import declaration
# 3| 11: [ImportDecl] import declaration
# 3| 0: [ImportSpec] import specifier
# 3| 0: [StringLit] "fmt"
# 1| 18: [Ident] main
other.go:
# 0| [File] library-tests/semmle/go/PrintAst/other.go
# 8| 3: [FuncDecl] function declaration
# 1| package: [Ident] main
# 8| 1: [FuncDecl] function declaration
# 8| 0: [FunctionName, Ident] hasNested
# 8| Type = func()
# 8| 1: [FuncTypeExpr] function type
@ -55,7 +56,7 @@ other.go:
# 11| Type = int
# 11| 0: [Ident, VariableName] myNested
# 11| Type = func() int
# 15| 4: [VarDecl] variable declaration
# 15| 2: [VarDecl] variable declaration
# 15| 0: [ValueSpec] value declaration specifier
# 15| 0: [Ident, VariableName] x
# 15| Type = int
@ -64,4 +65,3 @@ other.go:
# 15| 2: [IntLit] 0
# 15| Type = int
# 15| Value = [IntLit] 0
# 1| 5: [Ident] main

Просмотреть файл

@ -1,21 +1,22 @@
other.go:
# 0| [File] library-tests/semmle/go/PrintAst/other.go
# 3| 0: [FuncDecl] function declaration
# 1| package: [Ident] main
# 3| 1: [FuncDecl] function declaration
# 3| 0: [FunctionName, Ident] main
# 3| Type = func()
# 3| 1: [FuncTypeExpr] function type
# 3| 2: [BlockStmt] block statement
# 5| 1: [FuncDecl] function declaration
# 5| 2: [FuncDecl] function declaration
# 5| 0: [FunctionName, Ident] f
# 5| Type = func()
# 5| 1: [FuncTypeExpr] function type
# 5| 2: [BlockStmt] block statement
# 6| 2: [FuncDecl] function declaration
# 6| 3: [FuncDecl] function declaration
# 6| 0: [FunctionName, Ident] g
# 6| Type = func()
# 6| 1: [FuncTypeExpr] function type
# 6| 2: [BlockStmt] block statement
# 8| 3: [FuncDecl] function declaration
# 8| 4: [FuncDecl] function declaration
# 8| 0: [FunctionName, Ident] hasNested
# 8| Type = func()
# 8| 1: [FuncTypeExpr] function type
@ -40,7 +41,7 @@ other.go:
# 11| Type = int
# 11| 0: [Ident, VariableName] myNested
# 11| Type = func() int
# 15| 4: [VarDecl] variable declaration
# 15| 5: [VarDecl] variable declaration
# 15| 0: [ValueSpec] value declaration specifier
# 15| 0: [Ident, VariableName] x
# 15| Type = int
@ -49,4 +50,3 @@ other.go:
# 15| 2: [IntLit] 0
# 15| Type = int
# 15| Value = [IntLit] 0
# 1| 5: [Ident] main

Просмотреть файл

@ -4,38 +4,39 @@ go.mod:
# 3| 1: [GoModGoLine] go.mod go line
input.go:
# 0| [File] library-tests/semmle/go/PrintAst/input.go
# 5| 0: [CommentGroup] comment group
# 1| package: [Ident] main
# 5| 1: [CommentGroup] comment group
# 5| 0: [SlashSlashComment] comment
# 7| 1: [CommentGroup] comment group
# 7| 2: [CommentGroup] comment group
# 7| 0: [SlashSlashComment] comment
# 9| 2: [DocComment] comment group
# 9| 3: [DocComment] comment group
# 9| 0: [SlashSlashComment] comment
# 17| 3: [CommentGroup] comment group
# 17| 4: [CommentGroup] comment group
# 17| 0: [SlashSlashComment] comment
# 45| 4: [DocComment] comment group
# 45| 5: [DocComment] comment group
# 45| 0: [SlashSlashComment] comment
# 64| 5: [DocComment] comment group
# 64| 6: [DocComment] comment group
# 64| 0: [SlashSlashComment] comment
# 74| 6: [DocComment] comment group
# 74| 7: [DocComment] comment group
# 74| 0: [SlashSlashComment] comment
# 111| 7: [DocComment] comment group
# 111| 8: [DocComment] comment group
# 111| 0: [SlashSlashComment] comment
# 127| 8: [DocComment] comment group
# 127| 9: [DocComment] comment group
# 127| 0: [SlashSlashComment] comment
# 132| 9: [DocComment] comment group
# 132| 10: [DocComment] comment group
# 132| 0: [SlashSlashComment] comment
# 3| 10: [ImportDecl] import declaration
# 3| 11: [ImportDecl] import declaration
# 3| 0: [ImportSpec] import specifier
# 3| 0: [StringLit] "fmt"
# 1| 18: [Ident] main
other.go:
# 0| [File] library-tests/semmle/go/PrintAst/other.go
# 6| 2: [FuncDecl] function declaration
# 1| package: [Ident] main
# 6| 1: [FuncDecl] function declaration
# 6| 0: [FunctionName, Ident] g
# 6| Type = func()
# 6| 1: [FuncTypeExpr] function type
# 6| 2: [BlockStmt] block statement
# 15| 4: [VarDecl] variable declaration
# 15| 2: [VarDecl] variable declaration
# 15| 0: [ValueSpec] value declaration specifier
# 15| 0: [Ident, VariableName] x
# 15| Type = int
@ -44,4 +45,3 @@ other.go:
# 15| 2: [IntLit] 0
# 15| Type = int
# 15| Value = [IntLit] 0
# 1| 5: [Ident] main