All Projects → phpDocumentor → Typeresolver

phpDocumentor / Typeresolver

Licence: mit
A PSR-5 based resolver of Class names, Types and Structural Element Names

Programming Languages

PHP
23972 projects - #3 most used programming language
Makefile
30231 projects

Projects that are alternatives of or similar to Typeresolver

Localization Zh Cn Plugin
Chinese Localization for Jenkins
Stars: ✭ 65 (-99.25%)
Mutual labels:  hacktoberfest
Helloworld
HacktoberFest Hello World in every language ever. Just fork it and get started.
Stars: ✭ 66 (-99.24%)
Mutual labels:  hacktoberfest
Vue Storefront
The open-source frontend for any eCommerce. Built with a PWA and headless approach, using a modern JS stack. We have custom integrations with Magento, commercetools, Shopware and Shopify and total coverage is just a matter of time. The API approach also allows you to merge VSF with any third-party tool like CMS, payment gateways or analytics. Ne…
Stars: ✭ 9,111 (+4.58%)
Mutual labels:  hacktoberfest
Psscriptanalyzer
Download ScriptAnalyzer from PowerShellGallery
Stars: ✭ 1,137 (-86.95%)
Mutual labels:  hacktoberfest
Envoy Control
Envoy Control is a platform-agnostic, production-ready Control Plane for Service Mesh based on Envoy Proxy.
Stars: ✭ 66 (-99.24%)
Mutual labels:  hacktoberfest
Kmon
Linux Kernel Manager and Activity Monitor 🐧💻
Stars: ✭ 1,142 (-86.89%)
Mutual labels:  hacktoberfest
Interactivedynamics.jl
Fast, general-purpose interactive applications for dynamical systems
Stars: ✭ 66 (-99.24%)
Mutual labels:  hacktoberfest
Polybar
A fast and easy-to-use status bar
Stars: ✭ 9,604 (+10.24%)
Mutual labels:  hacktoberfest
Busy Beaver
The Chicago Python Community Engagement Slack bot
Stars: ✭ 66 (-99.24%)
Mutual labels:  hacktoberfest
Enhanced Github
🚀 Browser extension to display size of each file, download link and copy file contents directly to the clipboard
Stars: ✭ 1,146 (-86.85%)
Mutual labels:  hacktoberfest
Hacktoberfest2020
Make your first Pull Request and earn a free tee from GitHub!
Stars: ✭ 1,141 (-86.9%)
Mutual labels:  hacktoberfest
Puppet System
Manage Linux system resources and services from hiera configuration
Stars: ✭ 65 (-99.25%)
Mutual labels:  hacktoberfest
Nvim Treesitter
Nvim Treesitter configurations and abstraction layer
Stars: ✭ 1,129 (-87.04%)
Mutual labels:  hacktoberfest
Propresenter Api
Documenting RenewedVision's undocumented Remote Control protocol with examples
Stars: ✭ 65 (-99.25%)
Mutual labels:  hacktoberfest
Reflectioncommon
No description or website provided.
Stars: ✭ 8,627 (-0.98%)
Mutual labels:  hacktoberfest
One Line Wonders
OneLineWondersCode | 1000+ Commits | 278/300 One Liners | 200+ Forks | Actively maintained open-source collection of "one-line" programs performing various tasks in different languages
Stars: ✭ 65 (-99.25%)
Mutual labels:  hacktoberfest
Toonin
Technology that allows you to tune in to your friends and family in realtime using peer-to-peer sharing.
Stars: ✭ 67 (-99.23%)
Mutual labels:  hacktoberfest
Falcon
The no-nonsense REST API and microservices framework for Python developers, with a focus on reliability, correctness, and performance at scale.
Stars: ✭ 8,654 (-0.67%)
Mutual labels:  hacktoberfest
Ts Node
TypeScript execution and REPL for node.js
Stars: ✭ 9,571 (+9.86%)
Mutual labels:  hacktoberfest
Webmonkeys
Massively parallel GPU programming on JavaScript, simple and clean.
Stars: ✭ 1,147 (-86.83%)
Mutual labels:  hacktoberfest

License: MIT Coveralls Coverage Scrutinizer Code Coverage Scrutinizer Code Quality Packagist Version Packagist Version

TypeResolver and FqsenResolver

The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN).

PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, properties and class constants but also functions and global constants.

This package provides two Resolvers that are capable of

  1. Returning a series of Value Object for given expression while resolving any partial class names, and
  2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural Element names.

Installing

The easiest way to install this library is with Composer using the following command:

$ composer require phpdocumentor/type-resolver

Examples

Ready to dive in and don't want to read through all that text below? Just consult the examples folder and check which type of action that your want to accomplish.

On Types and Element Names

This component can be used in one of two ways

  1. To resolve a Type or
  2. To resolve a Fully Qualified Structural Element Name

The big difference between these two is in the number of things it can resolve.

The TypeResolver can resolve:

  • a php primitive or pseudo-primitive such as a string or void (@var string or @return void).

  • a composite such as an array of string (@var string[]).

  • a compound such as a string or integer (@var string|integer).

  • an array expression (@var (string|TypeResolver)[])

  • an object or interface such as the TypeResolver class (@var TypeResolver or @var \phpDocumentor\Reflection\TypeResolver)

    please note that if you want to pass partial class names that additional steps are necessary, see the chapter Resolving partial classes and FQSENs for more information.

Where the FqsenResolver can resolve:

  • Constant expressions (i.e. @see \MyNamespace\MY_CONSTANT)
  • Function expressions (i.e. @see \MyNamespace\myFunction())
  • Class expressions (i.e. @see \MyNamespace\MyClass)
  • Interface expressions (i.e. @see \MyNamespace\MyInterface)
  • Trait expressions (i.e. @see \MyNamespace\MyTrait)
  • Class constant expressions (i.e. @see \MyNamespace\MyClass::MY_CONSTANT)
  • Property expressions (i.e. @see \MyNamespace\MyClass::$myProperty)
  • Method expressions (i.e. @see \MyNamespace\MyClass::myMethod())

Resolving a type

In order to resolve a type you will have to instantiate the class \phpDocumentor\Reflection\TypeResolver and call its resolve method like this:

$typeResolver = new \phpDocumentor\Reflection\TypeResolver();
$type = $typeResolver->resolve('string|integer');

In this example you will receive a Value Object of class \phpDocumentor\Reflection\Types\Compound that has two elements, one of type \phpDocumentor\Reflection\Types\String_ and one of type \phpDocumentor\Reflection\Types\Integer.

The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional \phpDocumentor\Reflection\Types\Context class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply.

Resolving nullable types

Php 7.1 introduced nullable types e.g. ?string. Type resolver will resolve the original type without the nullable notation ? just like it would do without the ?. After that the type is wrapped in a \phpDocumentor\Reflection\Types\Nullable object. The Nullable type has a method to fetch the actual type.

Resolving an FQSEN

A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the \phpDocumentor\Reflection\FqsenResolver class' resolve method, like this:

$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()');

In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type \phpDocumentor\Reflection\Fqsen.

The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional \phpDocumentor\Reflection\Types\Context class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply.

Resolving partial Classes and Structural Element Names

Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names.

For example, you have this file:

namespace My\Example;

use phpDocumentor\Reflection\Types;

class Classy
{
    /**
     * @var Types\Context
     * @see Classy::otherFunction()
     */
    public function __construct($context) {}
    
    public function otherFunction(){}
}

Suppose that you would want to resolve (and expand) the type in the @var tag and the element name in the @see tag.

For the resolvers to know how to expand partial names you have to provide a bit of Context for them by instantiating a new class named \phpDocumentor\Reflection\Types\Context with the name of the namespace and the aliases that are in play.

Creating a Context

You can do this by manually creating a Context like this:

$context = new \phpDocumentor\Reflection\Types\Context(
    '\My\Example', 
    [ 'Types' => '\phpDocumentor\Reflection\Types']
);

Or by using the \phpDocumentor\Reflection\Types\ContextFactory to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs.

$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct'));

or

$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php'));

Using the Context

After you have obtained a Context it is just a matter of passing it along with the resolve method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names.

To obtain the resolved class name for the @var tag in the example above you can do:

$typeResolver = new \phpDocumentor\Reflection\TypeResolver();
$type = $typeResolver->resolve('Types\Context', $context);

When you do this you will receive an object of class \phpDocumentor\Reflection\Types\Object_ for which you can call the getFqsen method to receive a Value Object that represents the complete FQSEN. So that would be phpDocumentor\Reflection\Types\Context.

Why is the FQSEN wrapped in another object Object_?

The resolve method of the TypeResolver only returns object with the interface Type and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the object keyword) but does not refer to a specific element using an FQSEN.

Another example is on how to resolve the FQSEN of a method as can be seen with the @see tag in the example above. To resolve that you can do the following:

$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
$type = $fqsenResolver->resolve('Classy::otherFunction()', $context);

Because Classy is a Class in the current namespace its FQSEN will have the My\Example namespace and by calling the resolve method of the FQSEN Resolver you will receive an Fqsen object that refers to \My\Example\Classy::otherFunction().

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].