本文整理汇总了Golang中go/ast.File.Decls方法的典型用法代码示例。如果您正苦于以下问题:Golang File.Decls方法的具体用法?Golang File.Decls怎么用?Golang File.Decls使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类go/ast.File
的用法示例。
在下文中一共展示了File.Decls方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: insertIntVar
func insertIntVar(file *ast.File, name string, value int) {
var before, after []ast.Decl
if len(file.Decls) > 0 {
hasImport := false
if genDecl, ok := file.Decls[0].(*ast.GenDecl); ok {
hasImport = genDecl.Tok == token.IMPORT
}
if hasImport {
before, after = []ast.Decl{file.Decls[0]}, file.Decls[1:]
} else {
after = file.Decls
}
}
file.Decls = append(before,
&ast.GenDecl{
Tok: token.VAR,
Specs: []ast.Spec{
&ast.ValueSpec{
Names: []*ast.Ident{ast.NewIdent(name)},
Type: ast.NewIdent("int"),
Values: []ast.Expr{
&ast.BasicLit{
Kind: token.INT,
Value: fmt.Sprintf("%d", value),
},
},
},
},
},
)
file.Decls = append(file.Decls, after...)
}
示例2: InstrumentFunctionsAndInterfaces
func InstrumentFunctionsAndInterfaces(f *ast.File) bool {
addMock4goImport := false
ast.Inspect(f, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.FuncDecl:
if instrumentFunction(x) {
addMock4goImport = true
}
if x.Recv != nil {
// fieldList := x.Recv.List[0]
// name := fieldList.Names[0]
// with receiver
} else {
// without receiver
}
case *ast.GenDecl:
if x.Tok == token.TYPE {
typeSpec := x.Specs[0].(*ast.TypeSpec)
if interfaceType, ok := typeSpec.Type.(*ast.InterfaceType); ok {
if interfaceType.Incomplete {
// TODO: what should we do here
panic("incomplete interface type")
}
decls := instrumentInterface(typeSpec.Name.Name, interfaceType)
addMock4goImport = true
f.Decls = append(f.Decls, decls...)
}
}
}
return true
})
return addMock4goImport
}
示例3: removeImport
func removeImport(file *ast.File, ipath string) {
var j int
for j < len(file.Decls) {
gen, ok := file.Decls[j].(*ast.GenDecl)
if !ok || gen.Tok != token.IMPORT {
j++
continue
}
var i int
for i < len(gen.Specs) {
impspec := gen.Specs[i].(*ast.ImportSpec)
if importPath(impspec) != ipath {
i++
continue
}
// If we found a match, pop the spec from gen.Specs
gen.Specs[i] = gen.Specs[len(gen.Specs)-1]
gen.Specs = gen.Specs[:len(gen.Specs)-1]
}
if len(gen.Specs) > 0 {
j++
continue
}
// Remove entire import decl if no imports left in it
file.Decls[j] = file.Decls[len(file.Decls)-1]
file.Decls = file.Decls[:len(file.Decls)-1]
}
}
示例4: transformRegisterPkgValues
func transformRegisterPkgValues(file *ast.File, typeNames []string) {
// Create init function declaration
fdecl := &ast.FuncDecl{
Doc: nil,
Recv: nil,
Name: &ast.Ident{Name: "init"},
Type: &ast.FuncType{},
Body: &ast.BlockStmt{},
}
file.Decls = append(file.Decls, fdecl)
// Add type registrations to fdecl.Body.List
for _, name := range typeNames {
stmt := &ast.ExprStmt{
X: &ast.CallExpr{
Fun: &ast.SelectorExpr{
X: &ast.Ident{Name: "circuit"}, // Refers to import circuit/use/circuit
Sel: &ast.Ident{Name: "RegisterValue"},
},
Args: []ast.Expr{
&ast.CompositeLit{
Type: &ast.Ident{Name: name},
},
},
},
}
fdecl.Body.List = append(fdecl.Body.List, stmt)
}
}
示例5: sortDecls
func sortDecls(merged *ast.File) {
var sortedDecls []ast.Decl
for _, decl := range merged.Decls {
if x, ok := decl.(*ast.GenDecl); ok && x.Tok == token.PACKAGE {
sortedDecls = append(sortedDecls, decl)
}
}
/*for _, decl := range merged.Decls {
if x, ok := decl.(*ast.GenDecl); ok && x.Tok == token.IMPORT {
sortedDecls = append(sortedDecls, decl)
goon.DumpExpr(decl)
}
}*/
var specs []ast.Spec
for _, importSpec := range merged.Imports {
if importSpec.Name != nil && importSpec.Name.Name == "." {
continue
}
importSpec.EndPos = 0
specs = append(specs, importSpec)
}
sortedDecls = append(sortedDecls, &ast.GenDecl{
Tok: token.IMPORT,
Lparen: (token.Pos)(1), // Needs to be non-zero to be considered as a group.
Specs: specs,
})
//goon.DumpExpr(sortedDecls[len(sortedDecls)-1])
for _, decl := range merged.Decls {
if x, ok := decl.(*ast.GenDecl); ok && (x.Tok == token.IMPORT || x.Tok == token.PACKAGE) {
continue
}
sortedDecls = append(sortedDecls, decl)
}
merged.Decls = sortedDecls
}
示例6: addImport
// addImport adds the import path to the file f, if absent.
func addImport(f *ast.File, path string) {
if imports(f, path) {
return
}
newImport := &ast.ImportSpec{
Path: &ast.BasicLit{
Kind: token.STRING,
Value: strconv.Quote(path),
},
}
var impdecl *ast.GenDecl
// Find an import decl to add to.
for _, decl := range f.Decls {
gen, ok := decl.(*ast.GenDecl)
if ok && gen.Tok == token.IMPORT {
impdecl = gen
break
}
}
// No import decl found. Add one.
if impdecl == nil {
impdecl = &ast.GenDecl{
Tok: token.IMPORT,
}
f.Decls = append(f.Decls, nil)
copy(f.Decls[1:], f.Decls)
f.Decls[0] = impdecl
}
// Ensure the import decl has parentheses, if needed.
if len(impdecl.Specs) > 0 && !impdecl.Lparen.IsValid() {
impdecl.Lparen = impdecl.Pos()
}
// Assume the import paths are alphabetically ordered.
// If they are not, the result is ugly, but legal.
insertAt := len(impdecl.Specs) // default to end of specs
for i, spec := range impdecl.Specs {
impspec := spec.(*ast.ImportSpec)
if importPath(impspec) > path {
insertAt = i
break
}
}
impdecl.Specs = append(impdecl.Specs, nil)
copy(impdecl.Specs[insertAt+1:], impdecl.Specs[insertAt:])
impdecl.Specs[insertAt] = newImport
f.Imports = append(f.Imports, newImport)
}
示例7: mergeASTFile
func mergeASTFile(dst, src *ast.File) *ast.File {
if dst == nil {
return src
}
if dst.Doc != nil {
dst.Doc = src.Doc
}
dst.Decls = append(dst.Decls, src.Decls...)
return dst
}
示例8: fileExports
// fileExports removes unexported declarations from src in place.
//
func (r *reader) fileExports(src *ast.File) {
j := 0
for _, d := range src.Decls {
if r.filterDecl(d) {
src.Decls[j] = d
j++
}
}
src.Decls = src.Decls[0:j]
}
示例9: removeEmptyDeclGroups
func removeEmptyDeclGroups(f *ast.File) {
i := 0
for _, d := range f.Decls {
if g, ok := d.(*ast.GenDecl); !ok || !isEmpty(f, g) {
f.Decls[i] = d
i++
}
}
f.Decls = f.Decls[:i]
}
示例10: Inline
// Inline replaces each instance of identifier k with v.Ident in ast.File f,
// for k, v := range m.
// For all inlines that were triggeres it also adds imports from v.Imports to f.
// In addition, it removes top level type declarations of the form
// type k ...
// for all k in m.
//
// Every k in m should be a valid identifier.
// Every v.Ident should be a valid expression.
func Inline(fset *token.FileSet, f *ast.File, m map[string]Target) error {
// Build the inline map.
im := map[string]reflect.Value{}
for k, v := range m {
expr, err := parser.ParseExpr(k)
if err != nil {
return fmt.Errorf("failed to parse `%s`: %s", k, err)
}
if _, ok := expr.(*ast.Ident); !ok {
return fmt.Errorf("expected identifier, got %s which is %T", k, expr)
}
expr, err = parser.ParseExpr(v.Ident)
if err != nil {
return fmt.Errorf("failed to parse `%s`: %s", v.Ident, err)
}
s := v.Ident
if _, ok := expr.(*ast.StarExpr); ok {
s = fmt.Sprintf("(%s)", s)
}
im[k] = reflect.ValueOf(ast.Ident{Name: s})
}
// Filter `type XXX ...` declarations out if we are inlining XXX.
cmap := ast.NewCommentMap(fset, f, f.Comments)
to := 0
for _, d := range f.Decls {
skip := false
if t, ok := d.(*ast.GenDecl); ok {
for _, s := range t.Specs {
ts, ok := s.(*ast.TypeSpec)
if !ok {
continue
}
if _, ok = im[ts.Name.String()]; ok {
skip = true
}
}
}
if !skip {
f.Decls[to] = d
to++
}
}
if to != len(f.Decls) {
f.Decls = f.Decls[:to]
// Remove comments for the declarations that were filtered out.
f.Comments = cmap.Filter(f).Comments()
}
// Add imports for the inlines that were triggered.
for k := range inline(im, f) {
for _, imp := range m[k].Imports {
astutil.AddImport(fset, f, imp)
}
}
return nil
}
示例11: extractMultipleStatementsAsFunc
func extractMultipleStatementsAsFunc(
astFile *ast.File,
fileSet *token.FileSet,
stmtsToExtract []ast.Node,
parentNode ast.Node,
extractedFuncName string) {
params := varIdentsUsedIn(stmtsToExtract)
varsDeclaredWithinStmtsToExtract := varIdentsDeclaredWithin(stmtsToExtract)
util.MapStringAstIdentRemoveKeys(params, namesOf(varsDeclaredWithinStmtsToExtract))
util.MapStringAstIdentRemoveKeys(params, namesOf(globalVarIdents(astFile)))
allStmts := stmtsFromBlockStmt(parentNode)
indexOfExtractedStmt := indexOf(stmtsToExtract[0].(ast.Stmt), *allStmts)
varsUsedAfterwards := overlappingVarsIdentsUsedIn((*allStmts)[indexOfExtractedStmt+len(stmtsToExtract):], varsDeclaredWithinStmtsToExtract)
newStmt := funcCallStmt(varsUsedAfterwards, extractedFuncName, params, (*allStmts)[indexOfExtractedStmt].Pos())
replaceStmtsWithFuncCallStmt(newStmt,
allStmts,
indexOfExtractedStmt, len(stmtsToExtract))
areaRemoved := areaRemoved(fileSet, (stmtsToExtract)[0].Pos(), (stmtsToExtract)[len(stmtsToExtract)-1].End())
lineLengths := lineLengthsFrom(fileSet)
lineNum, numLinesToCut, newLineLength := replacementModifications(fileSet, (stmtsToExtract)[0].Pos(), (stmtsToExtract)[len(stmtsToExtract)-1].End(), newStmt.End(), lineLengths, areaRemoved)
shiftPosesAfterPos(astFile, newStmt, (stmtsToExtract)[len(stmtsToExtract)-1].End(), newStmt.End()-stmtsToExtract[len(stmtsToExtract)-1].End())
multipleStmtFuncDecl := CopyNode(multipleStmtFuncDeclWith(
extractedFuncName,
fieldsFrom(params),
stmtsFromNodes(stmtsToExtract),
exprsFrom(varsUsedAfterwards),
)).(*ast.FuncDecl)
var moveOffset token.Pos
RecalcPoses(multipleStmtFuncDecl, astFile.End()+2, &moveOffset, 0)
astFile.Decls = append(astFile.Decls, multipleStmtFuncDecl)
areaToBeAppended := insertionModificationsForStmts(astFile, multipleStmtFuncDecl, areaRemoved, exprsFrom(varsUsedAfterwards))
lineLengths = append(
lineLengths[:lineNum+1],
lineLengths[lineNum+1+numLinesToCut:]...)
lineLengths[lineNum] = newLineLength
lineLengths = append(lineLengths, areaToBeAppended...)
newFileSet := token.NewFileSet()
newFileSet.AddFile(fileSet.File(1).Name(), 1, int(astFile.End()))
newFileSet.File(1).SetLines(ConvertLineLengthsToLineOffsets(lineLengths))
*fileSet = *newFileSet
moveComments(astFile, moveOffset /*, needs a range to restict which comments to move*/)
}
示例12: deleteImport
// deleteImport deletes the import path from the file f, if present.
func deleteImport(f *ast.File, path string) (deleted bool) {
oldImport := importSpec(f, path)
// Find the import node that imports path, if any.
for i, decl := range f.Decls {
gen, ok := decl.(*ast.GenDecl)
if !ok || gen.Tok != token.IMPORT {
continue
}
for j, spec := range gen.Specs {
impspec := spec.(*ast.ImportSpec)
if oldImport != impspec {
continue
}
// We found an import spec that imports path.
// Delete it.
deleted = true
copy(gen.Specs[j:], gen.Specs[j+1:])
gen.Specs = gen.Specs[:len(gen.Specs)-1]
// If this was the last import spec in this decl,
// delete the decl, too.
if len(gen.Specs) == 0 {
copy(f.Decls[i:], f.Decls[i+1:])
f.Decls = f.Decls[:len(f.Decls)-1]
} else if len(gen.Specs) == 1 {
gen.Lparen = token.NoPos // drop parens
}
if j > 0 {
// We deleted an entry but now there will be
// a blank line-sized hole where the import was.
// Close the hole by making the previous
// import appear to "end" where this one did.
gen.Specs[j-1].(*ast.ImportSpec).EndPos = impspec.End()
}
break
}
}
// Delete it from f.Imports.
for i, imp := range f.Imports {
if imp == oldImport {
copy(f.Imports[i:], f.Imports[i+1:])
f.Imports = f.Imports[:len(f.Imports)-1]
break
}
}
return
}
示例13: deleteMainFunc
func (b *builder) deleteMainFunc(f *ast.File) {
var decls []ast.Decl
for _, d := range f.Decls {
fun, ok := d.(*ast.FuncDecl)
if !ok {
decls = append(decls, d)
continue
}
if fun.Name.Name != "main" {
decls = append(decls, fun)
}
}
f.Decls = decls
}
示例14: AddMock4goImport
func AddMock4goImport(f *ast.File) {
importSpec := &ast.ImportSpec{
Name: makeIdent("mock4go"),
Path: &ast.BasicLit{
Kind: token.STRING,
Value: fmt.Sprintf("%#v", Mock4goImport),
},
}
importDecl := &ast.GenDecl{
Tok: token.IMPORT, Specs: []ast.Spec{importSpec},
}
f.Decls = append([]ast.Decl{importDecl}, f.Decls...)
}
示例15: addImport
func addImport(file *ast.File, pkg string) {
decl := &ast.GenDecl{
Tok: token.IMPORT,
}
file.Decls = append(file.Decls, nil)
copy(file.Decls[1:], file.Decls[:])
file.Decls[0] = decl
spec := &ast.ImportSpec{
Path: &ast.BasicLit{
Kind: token.STRING,
Value: pkg,
},
}
decl.Specs = append(decl.Specs, spec)
file.Imports = append(file.Imports, spec)
}