本文整理汇总了Golang中go/ast.Node.Pos方法的典型用法代码示例。如果您正苦于以下问题:Golang Node.Pos方法的具体用法?Golang Node.Pos怎么用?Golang Node.Pos使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类go/ast.Node
的用法示例。
在下文中一共展示了Node.Pos方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: findCalls
/*
* findCalls() parses the node passed in and, if it's a
* SelectorExpr (which any call to a function/method will be)
* populates the map passed in as the second argument.
* This is the function used for finder.find().
*
* Functions will have the package as the X node,
* whereas methods will have the object identifier as the
* X. We do not differentiate in this function (there
* really isn't a good way without access to the list of
* imports and identifiers, so that has to be done higher up
* the stack).
*/
func findCalls(n ast.Node, f *finder) bool {
switch x := n.(type) {
case *ast.File:
locfields := strings.Split(fset.Position(n.Pos()).String(), ":")
f.currentFile = locfields[0]
case *ast.SelectorExpr:
switch y := x.X.(type) {
case *ast.Ident:
locfields := strings.Split(fset.Position(y.NamePos).String(), ":")
ln, err := strconv.Atoi(locfields[1])
if err != nil {
ln = -1
}
f.dset.AddPackageCall(Call{
Qual: y.Name,
Sel: x.Sel.Name,
// Location: y.NamePos,
Line: ln,
}, f.currentFile, true)
default:
return true
} // END switch y :=
default:
return true
} // END switch x :=
return true
}
示例2: normalizeNodePos
// normalizeNodePos resets all position information of node and its descendants.
func normalizeNodePos(node ast.Node) {
ast.Inspect(node, func(node ast.Node) bool {
if node == nil {
return true
}
if node.Pos() == token.NoPos && node.End() == token.NoPos {
return true
}
pv := reflect.ValueOf(node)
if pv.Kind() != reflect.Ptr {
return true
}
v := pv.Elem()
if v.Kind() != reflect.Struct {
return true
}
for i := 0; i < v.NumField(); i++ {
f := v.Field(i)
ft := f.Type()
if f.CanSet() && ft.PkgPath() == "go/token" && ft.Name() == "Pos" && f.Int() != 0 {
f.SetInt(1)
}
}
return true
})
}
示例3: Visit
func (v *visitor) Visit(node ast.Node) ast.Visitor {
switch node := node.(type) {
case *ast.FuncDecl:
v.funcName = node.Name.Name
v.m = make(map[*ast.Object][]string)
case *ast.DeferStmt:
if sel, ok := node.Call.Fun.(*ast.SelectorExpr); ok {
if ident, ok := sel.X.(*ast.Ident); ok {
if selectors, ok := v.m[ident.Obj]; !ok {
v.m[ident.Obj] = []string{sel.Sel.Name}
} else {
found := false
for _, selname := range selectors {
if selname == sel.Sel.Name {
pos := v.fset.Position(node.Pos())
fmt.Printf("%s: %s:%d:%d: Repeating defer %s.%s() inside function %s\n",
v.pkgPath, pos.Filename, pos.Line, pos.Column,
ident.Name, selname, v.funcName)
found = true
exitStatus = 1
break
}
}
if !found {
v.m[ident.Obj] = append(selectors, sel.Sel.Name)
}
}
}
}
}
return v
}
示例4: Visit
func (visitor *astNodeVisitorForMultipleStatements) Visit(node ast.Node) (w ast.Visitor) {
if node != nil {
if visitor.context.fset.Position(node.Pos()).Line == visitor.context.selection.Begin.Line &&
visitor.context.fset.Position(node.Pos()).Column == visitor.context.selection.Begin.Column &&
!visitor.context.shouldRecord {
// fmt.Println("Starting with node at pos", visitor.context.fset.Position(node.Pos()), "and end", visitor.context.fset.Position(node.End()))
// ast.Print(visitor.context.fset, node)
// fmt.Println(node.Pos(), node)
// fmt.Println("Parent")
// ast.Print(visitor.context.fset, visitor.parentNode)
visitor.context.posParent = visitor.parentNode
visitor.context.shouldRecord = true
}
if visitor.context.shouldRecord && visitor.context.posParent == visitor.parentNode {
visitor.context.nodesToExtract = append(visitor.context.nodesToExtract, node)
}
if visitor.context.fset.Position(node.End()).Line == visitor.context.selection.End.Line &&
visitor.context.fset.Position(node.End()).Column == visitor.context.selection.End.Column {
// fmt.Println("Ending with node at pos", visitor.context.fset.Position(node.Pos()), "and end", visitor.context.fset.Position(node.End()))
// ast.Print(visitor.context.fset, node)
// fmt.Println("Parent")
// ast.Print(visitor.context.fset, visitor.parentNode)
visitor.context.endParent = visitor.parentNode
visitor.context.shouldRecord = false
return nil
}
}
return &astNodeVisitorForMultipleStatements{
parentNode: node,
context: visitor.context,
}
}
示例5: trim
func (lp *linePrinter) trim(n ast.Node) bool {
stmt, ok := n.(ast.Stmt)
if !ok {
return true
}
line := lp.fset.Position(n.Pos()).Line
if line != lp.line {
return false
}
switch stmt := stmt.(type) {
case *ast.IfStmt:
stmt.Body = lp.trimBlock(stmt.Body)
case *ast.SwitchStmt:
stmt.Body = lp.trimBlock(stmt.Body)
case *ast.TypeSwitchStmt:
stmt.Body = lp.trimBlock(stmt.Body)
case *ast.CaseClause:
stmt.Body = lp.trimList(stmt.Body)
case *ast.CommClause:
stmt.Body = lp.trimList(stmt.Body)
case *ast.BlockStmt:
stmt.List = lp.trimList(stmt.List)
}
return true
}
示例6: errorf
// The variadic arguments may start with link and category types,
// and must end with a format string and any arguments.
func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) {
if confidence < f.config.MinConfidence {
return
}
p := f.fset.Position(n.Pos())
problem := Problem{
File: f.filename,
Position: p,
Confidence: confidence,
LineText: srcLine(f.src, p),
}
argLoop:
for len(args) > 1 { // always leave at least the format string in args
switch v := args[0].(type) {
case link:
problem.Link = string(v)
case category:
problem.Category = string(v)
default:
break argLoop
}
args = args[1:]
}
problem.Text = fmt.Sprintf(args[0].(string), args[1:]...)
f.problems = append(f.problems, problem)
}
示例7: Visit
func (v *funcVisitor) Visit(n ast.Node) ast.Visitor {
switch n := n.(type) {
case *ast.FuncDecl:
// Function name is prepended with "T." if there is a receiver, where
// T is the type of the receiver, dereferenced if it is a pointer.
name := n.Name.Name
if n.Recv != nil {
field := n.Recv.List[0]
switch recv := field.Type.(type) {
case *ast.StarExpr:
name = recv.X.(*ast.Ident).Name + "." + name
case *ast.Ident:
name = recv.Name + "." + name
}
}
start, end := v.fset.Position(n.Pos()), v.fset.Position(n.End())
f := v.pkg.RegisterFunction(name, start.Filename, start.Offset, end.Offset)
v.state.functions = append(v.state.functions, f)
sv := &stmtVisitor{v.state}
if n.Body != nil {
sv.VisitStmt(n.Body)
}
// TODO function coverage (insert "function.Enter", "function.Leave").
// TODO come up with naming scheme for function literals.
// case *ast.FuncLit:
}
return v
}
示例8: printNode
func (f *File) printNode(node, ident ast.Node, url string) {
if !f.doPrint {
f.found = true
return
}
fmt.Printf("%s%s%s", url, f.sourcePos(f.fset.Position(ident.Pos())), f.docs(node))
}
示例9: posLink_urlFunc
func posLink_urlFunc(node ast.Node, fset *token.FileSet) string {
var relpath string
var line int
var low, high int // selection
if p := node.Pos(); p.IsValid() {
pos := fset.Position(p)
relpath = pos.Filename
line = pos.Line
low = pos.Offset
}
if p := node.End(); p.IsValid() {
high = fset.Position(p).Offset
}
var buf bytes.Buffer
template.HTMLEscape(&buf, []byte(relpath))
// selection ranges are of form "s=low:high"
if low < high {
fmt.Fprintf(&buf, "?s=%d:%d", low, high) // no need for URL escaping
// if we have a selection, position the page
// such that the selection is a bit below the top
line -= 10
if line < 1 {
line = 1
}
}
// line id's in html-printed source are of the
// form "L%d" where %d stands for the line number
if line > 0 {
fmt.Fprintf(&buf, "#L%d", line) // no need for URL escaping
}
return buf.String()
}
示例10: getSourceString
func getSourceString(node ast.Node, fset *token.FileSet) string {
p1 := fset.Position(node.Pos())
p2 := fset.Position(node.End())
b := getFileBytes(p1.Filename)
return string(b[p1.Offset:p2.Offset])
}
示例11: errorf
// The variadic arguments may start with link and category types,
// and must end with a format string and any arguments.
// It returns the new Problem.
func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) *Problem {
pos := f.fset.Position(n.Pos())
if pos.Filename == "" {
pos.Filename = f.filename
}
return f.pkg.errorfAt(pos, confidence, args...)
}
示例12: Visit
func (this DepthWalker) Visit(node ast.Node) ast.Visitor {
if node == nil {
return this + 1
}
buffer := ""
for i := 0; i < int(this); i++ {
buffer += " "
}
fmt.Printf("%sPos: %d %s\n", buffer, node.Pos(), AllSources.Position(node.Pos()))
fmt.Printf("%sEnd: %d %s\n", buffer, node.End(), AllSources.Position(node.End()))
fmt.Printf("%s%T\n", buffer, node)
fmt.Printf("%s%v\n", buffer, node)
if e, ok := node.(ast.Expr); ok {
obj, typ := types.ExprType(e, LocalImporter)
fmt.Printf("%s%v\n", buffer, obj)
fmt.Printf("%s%v\n", buffer, typ)
}
fmt.Println()
switch n := node.(type) {
}
return this + 1
}
示例13: definePkg
func (a *stmtCompiler) definePkg(ident ast.Node, id, path string) *PkgIdent {
v, prev := a.block.DefinePackage(id, path, ident.Pos())
if prev != nil {
a.diagAt(ident.Pos(), "%s redeclared as imported package name\n\tprevious declaration at %s", id, a.fset.Position(prev.Pos()))
return nil
}
return v
}
示例14: defineImplicit
// Used for implicit objects created by some ImportSpecs and CaseClauses.
func (r *resolver) defineImplicit(b *Block, n ast.Node, name string) {
obj := r.info.Implicits[n]
if obj == nil {
logf("%s: internal error: not an implicit definition: %T\n",
r.fset.Position(n.Pos()), n)
}
r.defineObject(b, name, obj)
}
示例15: newIssueRangeFromNode
func (f *gofile) newIssueRangeFromNode(n ast.Node) *issueRange {
s := f.Fset().Position(n.Pos())
e := f.Fset().Position(n.End())
return &issueRange{
s,
e,
}
}