(РЕДАКТИРОВАТЬ: 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.