dongyonglie5132
2015-05-12 16:10
浏览 189
已采纳

如何比较两个源代码文件/ ast树?

I'm generating some source code using the templates package( is there a better method? )and part of the testing I need to check if the output matches the expected source code.

  • I tried a string comparison but it fails due the extra spaces / new lines generated by the templates package. I've also tried format.Source with not success. ( FAIL)
  • I tried to parse the ast of the both sources (see bellow) but the ast doesn't match either even if the code is basically same except the new lines / spaces. (FAIL)

    package main

    import (
        "fmt"
        "go/parser"
        "go/token"
        "reflect"
    )
    
    func main() {
        stub1 := `package main
         func myfunc(s string) error {
            return nil  
        }`
        stub2 := `package main
    
         func myfunc(s string) error {
    
            return nil
    
        }`
        fset := token.NewFileSet()
        r1, err := parser.ParseFile(fset, "", stub1, parser.AllErrors)
        if err != nil {
            panic(err)
        }
        fset = token.NewFileSet()
        r2, err := parser.ParseFile(fset, "", stub2, parser.AllErrors)
        if err != nil {
            panic(err)
        }
        if !reflect.DeepEqual(r1, r2) {
            fmt.Printf("e %v, r %s, ", r1, r2)
        }
    }
    

Playground

图片转代码服务由CSDN问答提供 功能建议

我正在使用模板包(有更好的方法吗?),部分测试中,我需要检查输出是否与预期的源代码匹配。</ p> \ n

  • 我尝试了字符串比较,但是由于模板包生成了多余的空格/新行,所以它失败了。 我还尝试了 format.Source ,但没有成功。 (FAIL)</ li>
  • 我尝试解析两个源的ast(请参见下面的内容),但是ast也不匹配,即使代码基本相同,除了新行/空格 。 (失败)</ p>

    包主程序</ p>

     导入(
    “ fmt” 
    “ go / parser” 
    “ go / token  “ 
    ” reflect“ 
    )
     
    func main(){
     stub1:=`package main 
     func myfunc(s string)error {
     return nil 
    }`
     stub2:=`package  main 
     
     func myfunc(s string)error {
     
     return nil 
     
    }`
     fset:= token.NewFileSet()
     r1,err:= parser.ParseFile(fset,“”  ,stub1,parser.AllErrors)
    如果err!= nil {
     panic(err)
    } 
     fset = token.NewFileSet()
     r2,err:= parser.ParseFile(fset,“”,stub2  ,parser.AllErrors)
    如果err!= nil {
     panic(err)
    } 
    如果!reflect.DeepEqual(r1,r2){
     fmt.Printf(“ e%v,r%s,  “,r1,r2)
    } 
    } 
     </ code> </ pre> </ li> 
     </ ul> 
     
     

    游乐场 </ p> </ div>

2条回答 默认 最新

相关推荐 更多相似问题