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.

### PluginV2.php

TODO: Reintroduce PluginV2 and its capabilities to Phan 2.0 in terms of PluginV3 to make migration easier.

This is deprecated, and should only be used if the plugin needs to continue to support Phan 1.x.

### PluginV3.php

Introduced in Phan 2.0

Plugins must extend this class
(And at least one of the interfaces corresponding to plugin capabilities in 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
