Universal Ctags处理React/JSX项目时部分函数未被写入TAGS文件的问题求助
我一直在用Emacs开发React/JSX项目,刚开始项目规模小,etags漏标一些变量名也没太当回事。可现在项目已经涨到1万行代码了,好用的标签系统就变得特别重要,于是我就试了Universal Ctags:
% ctags --version Universal Ctags 6.0.0(caeb22af), Copyright (C) 2015-2022 Universal Ctags Team Universal Ctags is derived from Exuberant Ctags. Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert Compiled: Jul 19 2023, 23:18:38 URL: https://ctags.io/ Output version: 0.0 Optional compiled features: +wildcards, +regex, +gnulib_fnmatch, +gnulib_regex, +iconv, +option-directory, +xpath, +json, +interactive, +yaml, +case-insensitive-filenames, +packcc, +optscript, +pcre2
我用的命令行是:ctags -e -R --languages=javascript --exclude=node_modules --exclude=build
结果发现好多函数都没出现在生成的TAGS文件里。我提炼出了最简化的复现代码片段:
const Comp1 = () => { const x = (arg) => console.log(arg) x(4) return(<Comp2 text={<p>Some Text</p>}/>) } const Comp2 = (props) => { return ( props.text ) }
把这段代码存成test.js,然后执行命令:
ctags -e --languages=javascript --exclude=node_modules --exclude=build --quiet test.js
生成的TAGS文件里(我把控制字符替换成了可打印字符),能明显看到Comp2函数缺失了:
test.js,81 const Comp1 = () => {^?Comp1^A1,0 const x = (arg) => console.log(arg)^?x^A2,24
但只要做个简单修改——删掉x(4)这一行,代码变成这样:
const Comp1 = () => { const x = (arg) => console.log(arg) return(<Comp2 text={<p>Some Text</p>}/>) } const Comp2 = (props) => { return ( props.text ) }
这时生成的TAGS文件里就会包含Comp2了:
test.js,122 const Comp1 = () => {^?Comp1^A1,0 const x = (arg) => console.log(arg)^?x^A2,24 const Comp2 = (props) => {^?Comp2^A7,139
另外,如果把return语句里的JSX代码去掉,Comp2也能正常出现在TAGS文件中。
我猜应该是JSX代码把Universal Ctags的JavaScript解析器搞懵了,希望能找到解决办法——比如有没有针对JSX的正则解析器可以用,或者其他可行的绕过方案?
备注:内容来源于stack exchange,提问作者Percy




