Как найти все операторы присваивания, где строковый литерал присваивается переменной в Java, используя antlr или javaparser? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь найти жестко заданные операторы присваивания строк в Java.Я пытаюсь использовать antlr или javaparser, но не понимаю, как найти операторы присваивания?

Javaparser, кажется, хороший путь.В нем есть поддержка объявлений и т. Д. Я пытаюсь найти объявления переменных и т. Д., Но не операторы присваивания.Как я могу использовать это, чтобы найти оператор присваивания, где строковый литерал назначен переменной.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вот подход, который я использовал.

  • Создайте визуальный AST для образца файла Java, например, с жестко закодированным выражением, которое вы ищете. JavaParser может выводить файлы DOT (например, запись в блоге ), и это отличный способ обнаружить узлы в интересующем вас AST.
  • Из своей визуализации я увидел, что интересующие меня узлы были VariableDeclarator с инициализатором, поэтому я последовал примеру использования VoidVisitorAdapter и переопределил соответствующий visit метод. Хорошая IDE (IntelliJ) помогла мне с остальными:

    public void visit(VariableDeclarator variableDeclarator, Void arg) {
        super.visit(variableDeclarator, arg);
        variableDeclarator.getInitializer().ifPresent(expression -> {
            expression.ifStringLiteralExpr(stringLiteralExpr -> {/* do something */})
    }
    
0 голосов
/ 25 января 2019

Я бы попробовал создать слушателя; прослушайте оператор assignment (строка 1196 в Java8.g4), переписав соответствующий метод, например ::

    public override void ExitAssignment(Java8Parser.AssignmentContext context);  // C#

Проверьте context прошло ли
assignmentOperator - это то, что может применяться к строкам (=, +=)
• и если expression разрешает что-то вроде CharacterLiteral или StringLiteral

Вы получаете информацию через методы context.assignmentOperator() и context.expression().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...