【问题标题】:What kind of encoding does posFlag requires?posFlag 需要什么样的编码?
【发布时间】:2015-01-18 07:51:26
【问题描述】:

如何将token.Position.String() 返回的/pathto/file.go:40:32 表单的位置编码为ParseQueryPos 所需的posFlag 参数,看起来像/pathto/file.go:#550。

为什么?

我正在使用Oracle 工具进行一些静态分析。我需要运行Oracle.Query,它需要*QueryPos 类型的参数。获得*QueryPos 的唯一方法是使用ParseQueryPos。

【问题讨论】:

  • github.com/golang/tools/blob/master/oracle/pos.go#L28 说 #550 是字节偏移量,所以看起来你需要遍历文件,计算前 39 行中的字节数(包括分隔它们的换行符),然后添加 31 (假设 file.go:1:1 是字节 0)。
  • 啊,还有token.Position.Offset,所以你不必做所有这些!

标签: go static-analysis


【解决方案1】:

ParseQueryPos 调用的The source to tools/pos.go 说

// parsePosFlag parses a string of the form "file:pos" or
// file:start,end" where pos, start, end match #%d and represent byte
// offsets, and returns its components.

如果您真的必须从line:column 字符串转换,您将查看文件内容并计算导致该行:列的字节数(包括换行符)。但由于您使用的是token.Position,看起来您可以从token.Position.Offset 获得所需的内容。

【讨论】:

  • 如果 Pos 是字节偏移量我想知道为什么我们有一个 Pos 类型而不只是使用偏移量。现在我找到了 File.Pos godoc.org/go/token#File.Pos
  • token.Position 和 oracle.QueryPos 每个都带有在各自上下文中有用的额外信息,这对我来说似乎有足够的理由。
  • 对我来说听起来很公平。知道如何从 file:line:column 中获取偏移量吗? oracle.Query.Describe[0] 提供了这样的功能,因此我无法再访问 token.Position.Offset。 [0] godoc.org/golang.org/x/tools/oracle/serial#Describe.Pos
  • 手动:打开文件,在新行上拆分,计算前行中的总字节数(即,如果字符串指定第 43 行,则为前 42 个字节;假设拆分去除换行符,则每行添加 1 个字节),添加列号减去 1,因为 :1:1 是字节 0 而不是 1。如果速度是一个问题(不太可能),您可以保留文件内容以便在首次使用后更快地计数。必须有一些更好的方法,也许值得挖掘一个可以给你一个偏移量的 API,但如果你必须这样做,它不会太难或代码太多。
  • 如果您发布了一个关于您尝试执行的整体任务的单独问题,那么熟悉这些软件包的人可能会提供帮助.这里的其他人可能比我更了解这些特定的包——我只是告诉你我能“盲目”地弄清楚什么。
猜你喜欢
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多