Static AST analysis of migration source. Never compiles or executes user code: Ecto's DSL macros call the private, repo-bound Ecto.Migration.Runner, so interception would mean replicating private API. Cost: dynamically-generated operations are invisible — they are emitted as %Unknown{}, never silence.
Summary
Functions
@spec parse_dir(Path.t()) :: {:ok, [Cerbero.Migration.t()]} | {:error, term()}
@spec parse_file(Path.t()) :: {:ok, Cerbero.Migration.t()} | {:error, term()}
@spec parse_string(String.t(), Path.t()) :: {:ok, Cerbero.Migration.t()} | {:error, term()}