Olá,
Eu encontrei um bug na análise de C usando ctags (também está em exuberant-ctags).
O problema é o seguinte:
#include <stdio.h>
#define PRAGMA(x) _Pragma(#x)
PRAGMA(bar)
int foo() {
int a = 1;
printf("a = %d\n", a);
}
void main(void) {
foo();
}
A saída do arquivo ctags não tinha uma função foo()
como abaixo.
PRAGMA f.c /^#define PRAGMA(/;" d file:
PRAGMA f.c /^PRAGMA(bar)$/;" f
main f.c /^void main(void) {$/;" f
Obrigado!!
Obrigado por relatar.
Importante, mas consertar isso não é fácil.
Nota particular: temos que registrar a definição da macro em diretivaDefine de get.c
camada de cortiça que estou trabalhando em um galho pode ser usada. O fluxo de entrada deve ser hackeado.
Eu tenho que verificar o fluxo de entrada baseado na memória do Geany.
@masatake
Você progrediu nisso?
A sua filial está disponível em algum lugar?
Não. Eu não faço nada sobre este assunto.
Talvez você possa usar ctags -I 'PRAGMA+'
para pular a parte da expansão da macro.
Nota privada: Temos que registrar a definição da macro em diretivaDefine da camada de cortiça get.c
Isso não será suficiente para resolver todo o uso de macro, porque muitos podem vir de cabeçalhos incluídos e se expandir para coisas estranhas, portanto, sem um pré-processador C completo, ele nunca será perfeito. Então, eu me pergunto se faz sentido adicionar toda a complexidade necessária para rastrear a expansão da macro, se isso nunca for suficiente.
@ b4n , eu concordo.
Não sei o truque, mas a nova análise resolve isso.
Eu obtive:
PRAGMA /tmp/enum.c /^#define PRAGMA(/;" d file:
foo /tmp/enum.c /^int foo() {$/;" f
main /tmp/enum.c /^void main(void) {$/;" f
Comentários muito úteis
Não sei o truque, mas a nova análise resolve isso.
Eu obtive: