Tac say

只想做个程序演奏家

推荐下我修改的gen

gen是go的代码生成器, 提供类似于underscore的函数集.

尝试将gen用在项目上,发现不太方便,对源码做了如下两个修改, 修改后的代码在这里:

1. 支持条件编译

go提供了条件编译,根据GOOSGOARCH进行交叉编译,也可以利用build tags自定义条件编译

修改前可能碰到的问题是存在a_linux.goa_windows.go, 分别定义一个函数A的两个版本. 调用gen时会报错:A不可以重复定义

这个修改已经被merge回原分支

2. 对于import的其它包, 支持分析其源码

设想一个场景, 存在root/Aroot/B两个包, root/B import root/A

root/B上调用gen, gen会分析import关系, 找到并分析root/A

在修改之前, 由于gen只使用了types.Check, 默认只会使用gcimport,只分析root/A编译好的pkg(.a文件), 而不包括root/A的源码.

也就是说对于所有依赖, 必须都保证其跑过go install, 才能在下游模块使用gen. 这个并不方便

做的修改是使用go.tools/importer代替gcimporter, 既可以分析编译好的pkg, 又可以分析源码

不过这个修改的代价是分析的时间会比较长

这个修改尚未被原分支接受

3. types源码分析的一个问题

以下代码在分析源码时报错, 但编译时是通过的

c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGTTIN)

分析时报的错是

cannot pass argument c (variable of type chan os.Signal) to parameter of type chan<- os.Signal

目前无解, 但结论是用types包进行的源码分析结果和编译时的略有差异

Comments