You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Universal Ctags处理React/JSX项目时部分函数未被写入TAGS文件的问题求助

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

火山引擎 最新活动