如何调试为什么ctags找不到特定的函数声明?

问题描述 投票:0回答:1

我使用

ctags
为 TypeScript 项目生成标签文件。

$ ctags --version
Universal Ctags 6.0.0, 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: Feb  1 2023, 00:00:00
  URL: https://ctags.io/
  Output version: 0.0
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +json, +interactive, +sandbox, +yaml, +packcc, +optscript

但它没有找到嵌套函数声明。对于 JavaScript,它确实找到它们(相同的文件,除了文件类型扩展名)。

以防万一,这是我的最小可重现案例(

bar
功能不匹配):

'use strict';
foo();

function foo() {
  for (const i of [0, 1, 2,]) {
    bar(i);
  }

  function bar(ind: number) {
    console.log(ind);
  }
}

我应该看哪里?我正在阅读文档,但它似乎相当庞大。

typescript ctags universal-ctags
1个回答
0
投票

在问题中我指出,嵌套函数的 JavaScript 文件标签可以工作。但事实证明这有点夸张。

如果有js文件:

'use strict';
foo();
bar();

function foo() {
  for (const i of [0, 1, 2,]) {
    bar(i);
  }

  function bar(ind) {
    console.log(ind);
  }
}

function bar() {
  return '123';
}

并尝试在第一次调用

bar()
时使用标签,它会转到错误的声明,那是因为 ctags 有
tag_name
ex_cmd
的概念(通常是用于搜索文件中位置的正则表达式)。在本例中,有 2 个
bar
标签。尽管 ex 命令不同,并且在这种情况下应该正确找到 2 个声明(假设缩进级别不同,当然通常情况并非如此),但名称始终相同(我只是看不到一种方法区分两个具有相同名称的函数的名称)。所以没有办法(至少这是一件非常重要的事情)正确地进入实际的声明。

但实际上,这并不是一个大问题,因为此类嵌套函数通常在文件中距离不远,因此最好使用文本编辑器的默认功能进行搜索。

对于非嵌套声明

ctags
似乎开箱即用效果很好。

所以目前我决定不去理会这个问题,也不尝试让它与 TypeScript 一起工作,因为无论如何它都不会完美地工作(正如我所解释的,它不适用于 JavaScript)。 尝试查找嵌套函数时只需使用文本搜索。

© www.soinside.com 2019 - 2024. All rights reserved.