Ctags: C: Não é possível analisar a função após a linha da macro

Criado em 21 dez. 2014  ·  8Comentários  ·  Fonte: universal-ctags/ctags

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!!

Parser buenhancement

Comentários muito úteis

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

Todos 8 comentários

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
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

softinio picture softinio  ·  6Comentários

songouyang picture songouyang  ·  15Comentários

trevordmiller picture trevordmiller  ·  9Comentários

EvanCarroll picture EvanCarroll  ·  14Comentários

sparkcanon picture sparkcanon  ·  3Comentários