Разобрать AST и угадать, является ли метод асинхронным на основании его операторов и вызовов функций.

Я пытаюсь реализовать библиотеку, которая обеспечивает NodeVisitor (или некоторый другой вид цикла), который предоставляет набор функций, которые предполагаются как асинхронные (представьте, что они будут ссылками в nodejs), такие как mysql_query, fwrite, fopen и т. д., делает:

Создайте реестр (это то, что я уже сделал), который зацикливается в каждой функции / классе и:

  • Зарегистрируйте пространство имен, класс, метод или функцию метода / функции класса
  • Регистрирует все функции / методы классов, используемые этими функциями
  • Регистрирует все функции / методы класса, которые используют эту функцию.

а затем (об этом мой вопрос) зациклите AST и пометите каждый метод функции / класса как:

  • Синхронизация по умолчанию все методы помечены как синхронизированные, это происходит, когда все вызовы функций внутри синхронизированы, например, манипулирование текстом или массивом (str_replace, array_shift и т. д.)
  • Может асинхронно если в этом состоянии, он может быть переключен на синхронизацию или асинхронизацию вручную или с помощью самого кода во второй момент. Это включает функцию с вызовами методов для экземпляра неизвестного типа.
  • асинхронный если в этом состоянии, он не может быть возвращен обратно. Это означает, что метод / classmethod включает в себя вызовы функций / classmethods, которые строго определены как асинхронные от пользователя, или либо вызывают функцию, помеченную в реестре как асинхронную, самим кодом.

Мой вопрос: что было бы эффективным способом сделать цикл, чтобы назначить, если синхронизация, async o, возможно, для функции? Проблема в том, что состояние функции зависит от состояния другой функции, которое может быть даже в циклической зависимости, поэтому, если я изменю функцию на асинхронную, все функции, которые ее используют, должны быть заменены на асинхронные, а не только на первого родителя; все родители до корневой программы. Если возможно, я бы хотел избежать циклов while! 🙂

Спасибо за любую помощь!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …