Skip to content

Commit a4f7deb

Browse files
committed
fix: adjust line number via //line directive
1 parent 8179925 commit a4f7deb

File tree

6 files changed

+52
-22
lines changed

6 files changed

+52
-22
lines changed

tool/instrument/inst_func.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -260,15 +260,17 @@ func (rp *RuleProcessor) insertRaw(r *resource.InstFuncRule, decl *dst.FuncDecl)
260260
util.Assert(r.OnEnter != "" || r.OnExit != "", "sanity check")
261261
if r.OnEnter != "" {
262262
// Prepend raw code snippet to function body for onEnter
263-
onEnterSnippet, err := util.ParseAstFromSnippet(r.OnEnter)
263+
p := util.NewAstParser()
264+
onEnterSnippet, err := p.ParseSnippet(r.OnEnter)
264265
if err != nil {
265266
return err
266267
}
267268
decl.Body.List = append(onEnterSnippet, decl.Body.List...)
268269
}
269270
if r.OnExit != "" {
270271
// Use defer func(){ raw_code_snippet }() for onExit
271-
onExitSnippet, err := util.ParseAstFromSnippet(
272+
p := util.NewAstParser()
273+
onExitSnippet, err := p.ParseSnippet(
272274
fmt.Sprintf("defer func(){ %s }()", r.OnExit),
273275
)
274276
if err != nil {
@@ -301,8 +303,8 @@ func sortFuncRules(fnRules []*resource.InstFuncRule) []*resource.InstFuncRule {
301303

302304
func (rp *RuleProcessor) writeTrampoline(pkgName string) error {
303305
// Prepare trampoline code header
304-
code := "package " + pkgName
305-
trampoline, err := util.ParseAstFromSource(code)
306+
p := util.NewAstParser()
307+
trampoline, err := p.ParseSource("package " + pkgName)
306308
if err != nil {
307309
return err
308310
}

tool/instrument/optimize.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ func (rp *RuleProcessor) newCallContextImpl(tjump *TJump) (dst.Expr, error) {
150150
// One line please, otherwise debugging line number will be a nightmare
151151
tmpl := fmt.Sprintf("&CallContextImpl%s{Params:[]interface{}{},ReturnVals:[]interface{}{}}",
152152
rp.rule2Suffix[tjump.rule])
153-
astRoot, err := util.ParseAstFromSnippet(tmpl)
153+
p := util.NewAstParser()
154+
astRoot, err := p.ParseSnippet(tmpl)
154155
if err != nil {
155156
return nil, err
156157
}

tool/instrument/trampoline.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ var trampolineTemplate string
7171
func (rp *RuleProcessor) materializeTemplate() error {
7272
// Read trampoline template and materialize onEnter and onExit function
7373
// declarations based on that
74-
astRoot, err := util.ParseAstFromSource(trampolineTemplate)
74+
p := util.NewAstParser()
75+
astRoot, err := p.ParseSource(trampolineTemplate)
7576
if err != nil {
7677
return err
7778
}

tool/preprocess/preprocess.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"bufio"
1919
"embed"
2020
"fmt"
21+
"go/parser"
22+
"go/token"
2123
"os"
2224
"os/exec"
2325
"os/signal"
@@ -31,6 +33,7 @@ import (
3133
"github.com/alibaba/opentelemetry-go-auto-instrumentation/tool/errc"
3234
"github.com/alibaba/opentelemetry-go-auto-instrumentation/tool/resource"
3335
"github.com/alibaba/opentelemetry-go-auto-instrumentation/tool/util"
36+
"github.com/dave/dst"
3437
"golang.org/x/mod/modfile"
3538
"golang.org/x/tools/go/packages"
3639
)
@@ -536,7 +539,8 @@ func (dp *DepProcessor) addExplicitImport(importPaths ...string) (err error) {
536539
if !util.IsGoFile(file) {
537540
continue
538541
}
539-
astRoot, err := util.ParseAstFromFile(file)
542+
p := util.NewAstParser()
543+
astRoot, err := p.ParseFile(file, parser.ParseComments)
540544
if err != nil {
541545
return err
542546
}
@@ -549,6 +553,18 @@ func (dp *DepProcessor) addExplicitImport(importPaths ...string) (err error) {
549553
}
550554
}
551555

556+
for _, decl := range astRoot.Decls {
557+
decl, ok := decl.(*dst.GenDecl)
558+
if !ok {
559+
continue
560+
}
561+
if decl.Tok != token.IMPORT {
562+
continue
563+
}
564+
decl.Decs.Before = dst.EmptyLine
565+
decl.Decs.Start.Append("//wow")
566+
}
567+
552568
// Prepend import path to the file
553569
for _, importPath := range importPaths {
554570
util.AddImportForcely(astRoot, importPath)

tool/preprocess/setup.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ func (dp *DepProcessor) copyRule(path, target string,
171171
return err
172172
}
173173
text = util.RemoveGoBuildComment(text)
174-
astRoot, err := util.ParseAstFromSource(text)
174+
p := util.NewAstParser()
175+
astRoot, err := p.ParseSource(text)
175176
if err != nil {
176177
return err
177178
}

tool/util/ast.go

+23-14
Original file line numberDiff line numberDiff line change
@@ -394,31 +394,40 @@ func MatchStructDecl(decl dst.Decl, structType string) bool {
394394
// To solve this issue, we disable DST's automatic Import management
395395
// and use plain AST manipulation to add imports.
396396

397-
// ParseAstFromSnippet parses the AST from incomplete source code snippet.
398-
func ParseAstFromSnippet(codeSnippnet string) ([]dst.Stmt, error) {
399-
fset := token.NewFileSet()
397+
type AstParser struct {
398+
fset *token.FileSet
399+
}
400+
401+
func NewAstParser() *AstParser {
402+
return &AstParser{
403+
fset: token.NewFileSet(),
404+
}
405+
}
406+
407+
// ParseSnippet parses the AST from incomplete source code snippet.
408+
func (ap *AstParser) ParseSnippet(codeSnippnet string) ([]dst.Stmt, error) {
409+
Assert(codeSnippnet != "", "empty code snippet")
400410
snippet := "package main; func _() {" + codeSnippnet + "}"
401-
file, err := decorator.ParseFile(fset, "", snippet, 0)
411+
file, err := decorator.ParseFile(ap.fset, "", snippet, 0)
402412
if err != nil {
403413
return nil, errc.New(errc.ErrParseCode, err.Error())
404414
}
405415
return file.Decls[0].(*dst.FuncDecl).Body.List, nil
406416
}
407417

408-
// ParseAstFromSource parses the AST from complete source code.
409-
func ParseAstFromSource(source string) (*dst.File, error) {
418+
// ParseSource parses the AST from complete source code.
419+
func (ap *AstParser) ParseSource(source string) (*dst.File, error) {
410420
Assert(source != "", "empty source")
411-
dec := decorator.NewDecorator(token.NewFileSet())
421+
dec := decorator.NewDecorator(ap.fset)
412422
dstRoot, err := dec.Parse(source)
413423
if err != nil {
414424
return nil, errc.New(errc.ErrParseCode, err.Error())
415425
}
416426
return dstRoot, nil
417427
}
418428

419-
func parseAstMode(filePath string, mode parser.Mode) (*dst.File, error) {
429+
func (ap *AstParser) ParseFile(filePath string, mode parser.Mode) (*dst.File, error) {
420430
name := filepath.Base(filePath)
421-
fset := token.NewFileSet()
422431
file, err := os.Open(filePath)
423432
if err != nil {
424433
return nil, errc.New(errc.ErrOpenFile, err.Error())
@@ -429,11 +438,11 @@ func parseAstMode(filePath string, mode parser.Mode) (*dst.File, error) {
429438
LogFatal("failed to close file %s: %v", file.Name(), err)
430439
}
431440
}(file)
432-
astFile, err := parser.ParseFile(fset, name, file, mode)
441+
astFile, err := parser.ParseFile(ap.fset, name, file, mode)
433442
if err != nil {
434443
return nil, errc.New(errc.ErrParseCode, err.Error())
435444
}
436-
dec := decorator.NewDecorator(fset)
445+
dec := decorator.NewDecorator(ap.fset)
437446
dstFile, err := dec.DecorateFile(astFile)
438447
if err != nil {
439448
return nil, errc.New(errc.ErrParseCode, err.Error())
@@ -442,16 +451,16 @@ func parseAstMode(filePath string, mode parser.Mode) (*dst.File, error) {
442451
}
443452

444453
func ParseAstFromFileOnlyPackage(filePath string) (*dst.File, error) {
445-
return parseAstMode(filePath, parser.PackageClauseOnly)
454+
return NewAstParser().ParseFile(filePath, parser.PackageClauseOnly)
446455
}
447456

448457
func ParseAstFromFileFast(filePath string) (*dst.File, error) {
449-
return parseAstMode(filePath, parser.SkipObjectResolution)
458+
return NewAstParser().ParseFile(filePath, parser.SkipObjectResolution)
450459
}
451460

452461
// ParseAstFromFile parses the AST from complete source file.
453462
func ParseAstFromFile(filePath string) (*dst.File, error) {
454-
return parseAstMode(filePath, parser.ParseComments)
463+
return NewAstParser().ParseFile(filePath, parser.ParseComments)
455464
}
456465

457466
// WriteAstToFile writes the AST to source file.

0 commit comments

Comments
 (0)