как определить локальную переменную с тем же именем, что и ее родительский / контейнерный класс - PullRequest
2 голосов
/ 07 апреля 2011

Здравствуйте, я хочу разработать правило статического анализа кода, чтобы локальные переменные не скрывали имя во внешней области видимости.Можете ли вы помочь мне идентифицировать блоки if / вложенные классы, используя те же имена, что и во внешней области видимости, а также как избежать скрытия методов родительских методов-членов.

Пожалуйста, помогите мне создать алгоритм, чтобычто я могу разработать правило статического анализа кода.

1 Ответ

1 голос
/ 07 апреля 2011

(РЕДАКТИРОВАТЬ: OP изначально не понимал целевой язык)

Предполагая, что Java, используйте синтаксический анализатор Java, который создает AST.Реализуйте следующий алгоритм:

for all Java source files F of interest
    parse F
    for all nodes N of F
        if N is a "class declaration" for a class C
            for all methods M under N
                for all nodes m in M
                    if m is a declaration with name C
                       report "found " m " in " M " shadowing " C
                    endif
                endfor
           endfor
       endif
   endfor
endfor

Это немного неэффективно, поскольку может сканировать некоторые поддеревья более одного раза.

Пространства имен делают это более сложным для C # и C ++.Если вы хотите сделать это для этих языков, я думаю, вам понадобится полный анализатор вместе с разрешением имен (таблица символов).Нет гарантии, что метод объявлен «под» объявлением класса в этих языках, поэтому простой поиск по дереву не сработает.В этом случае вам придется добавить дополнительную проверку синтаксиса для объявления пространства имен и проверить, что пространство имен ссылается на объявленный класс, проверив таблицу символов.

Для C ++ вы можете использовать Clang или наш C ++ Front End .

Я не уверен, что вы можете использовать для этого в C #, так как вам нужна таблица символов.Возможно, Mono предлагает вам достаточный доступ, но я не думаю, что они обрабатывали C # 3.0 или 4.0.

...