src/Phan/README.md
Layout of src/Phan
==================
Also see https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan
Folders
-------
### Analysis
Classes that analyze ASTS. They may do one or more of the following things:
- Emit issues.
- Update Phan's internal state.
- Compute inferences about a given block of code, and update Phan's state for that block (e.g. ConditionVisitor)
- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#parsing-and-analysis
### AST
Classes that work with ASTs
- Classes
- ContextNode, which gets information about an AST in it's Context
- Base classes for the different types of visitors
### Daemon
Classes used when Phan is running in the background and receiving requests ("daemon mode"). Also see `LanguageServer/`
- Classes for requests and responses the Phan-specific protocol (i.e. used by `phan_client`)
- Logic for forking off workers to analyze the `CodeBase`, then to receive the analysis results.
### Debug
Utilities for developers working on Phan to debug it.
### Exception
Exception classes used by Phan's implementation.
### Language
Contains data structures for representations of PHP code bases, and methods acting on those data structures.
- E.g. `Context`, `Element`, `FQSEN`, `Internal`, `Scope`, `Type`
- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#core-concepts
### LanguageServer
Contains an implementation of the [Language Server Protocol](https://github.com/Microsoft/language-server-protocol), which is a common protocol supported in various IDEs.
Also see `Daemon/`
- Classes that get received and sent over JSON RPC2
- Logic for forking off workers to analyze the `CodeBase`, then to receive the analysis results.
### Library
Contains reusable data structures that aren't specific to analyzing PHP. (Map, Set, Option, Tuple, Hasher, etc.)
### Output
This contains implementation details for printing out Phan issues.
This includes formatters (text, JSON, pylint, etc.) as well as how Phan would colorize issues.
### Parse
This contains implementation details for Phan's initial parse phase.
In the parse phase, all code is parsed in order to build maps from FQSENs to elements.
- See https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan#parsing-and-analysis
### Plugin
This contains implementation details for working with the set of plugins loaded by the user (ConfigPluginSet).
`Plugin/Internal` also contains plugins Phan loads automatically (e.g. for improving analysis of `array_map`, `call_user_func`, etc.)
### PluginV3
This contains the current implementation (v3) of the plugin system.
`*Capability.php` contains capabilities that PluginV3 instances can extend.
See https://github.com/phan/phan/wiki/Writing-Plugins-for-Phan for more information on plugin development.
Files
-----
### Analysis.php
This class is the entry point into the static analyzer.
### BlockAnalysisVisitor.php
Analyze blocks of code.
- Uses `\Phan\Analysis\PreOrderAnalysisVisitor` for pre-order analysis of a node (E.g. entering a function to analyze)
- Recursively analyzes child nodes
- Uses `\Phan\Analysis\PostOrderAnalysisVisitor` for post-order analysis of a node (E.g. analyzing a statement with the updated Context and emitting issues)
- If there is more than one possible child context, merges state from them (variable types)
### Bootstrap.php
Sets up error handlers, PHP configuration, and the composer autoloader.
### CLI.php
Contains methods for parsing CLI arguments to Phan,
outputting to the CLI,
as well as helper methods to retrieve files/folders for the analyzed project.
### CodeBase.php
A CodeBase represents the known state of a code base we're analyzing.
It maps FQSENs to the representation of the object for both scanned code and internal PHP elements.
See [Developer's Guide to Phan](https://github.com/phan/phan/wiki/Developer%27s-Guide-To-Phan)
### Config.php
Program configuration. The configuration data is overridden by the analyzed project's `.phan/config.php` as well as CLI options.
### Daemon.php
Implementation of daemon mode. (Daemon for `phan_client`).
Also see `LanguageServer/`
### Debug.php
Mostly utilities for printing representations of AST nodes.
Also see `Debug/`
### ForkPool.php
Contains the ForkPool used for running multiple analysis workers(i.e. `--processes N`)
### IssueInstance.php
Contains an emitted issue with issue details (file, line, format string arguments, etc.)
### Issue.php
Contains the list of built in issue types, as well as common information (Severity, issue names, format strings, remediation difficulty, etc.)
### Memoize.php
A utility trait to memoize (cache) the result of instance methods and static methods.
### Ordering.php
This determines the order in which files will be analyzed.
(Affected by `consistent_hashing_file_order` and `randomize_file_order`.
By default, files are analyzed in the same order as `.phan/config.php`)
### Phan.php
This executes the parse, method/function, then the analysis phases.
This is the entry point of Phan's implementation.
Implementations such as `./phan` or the code climate integration call into this.
### Plugin.php
Deprecated version of plugin system, use PluginV3 instead.
### PluginV3.php
Introduced in Phan 2.0
Plugins must extend this class
(And at least one of the interfaces corresponding to plugin capabilities in the PluginV3 folder)
and return an instance of themselves.
### Prep.php
Part of a separate tool for scanning a code base. Not commonly used.
### Profile.php
For development only: Utility for profiling Phan runs. Used if the `profiler_enabled` config setting is true.
### Util.php