Regarding the ABNF grammar, there are few things that need to be decided.
(1) Priority / interaction with union and array "operators". I would strongly
recommend disallowing union and intersection on the same "level" and always
require brackets to explicitly declare the intention. For consistency with
union types, array and intersection should be allowed on the same level with
array having higher priority. This matches behavior used by PHPStan and can be
achieved for example with the following grammar
type = atomic [union / intersection]
union = 1*("|" atomic)
intersection = 1*("&" atomic)
atomic = identifier [array] / "(" type ")" [array]
array = 1*("[]")
identifier = keyword / class-name
keyword = "array" / "bool" / ...
class-name = ["\"] label *("\" label)
label = label-head *label-tail
label-head = ALPHA / "_" / %x80-FF
label-tail = ALPHA / DIGIT / "_" / %x80-FF
(2) Allowing horizontal whitespaces around operators. With more complex types
it makes sense to allow horizontal whitespaces around operators. It complicates
the grammar a bit, but it makes complex types a lot readable. It may be better
the post allowing horizontal whitespaces as a standalone PR independent of
intersection types.
Regards,
Jan Tvrdík
---------- Původní e-mail ----------
Od: Chuck Burgess <[email protected]>
Komu: [email protected]
Datum: 21. 10. 2018 3:22:06
Předmět: Re: [PSR-5] Intersection Types
Yes, parentheses would be required for controlling order of precedence.
In your example, I would expect:
* @param (CacheInterface&ResetableInterface)|ResetableCacheInterface $cache
CRB
On Sat, Oct 20, 2018, 17:43 AzJezz <[email protected]> wrote:
Hi,
i find it quite confusing myself, here's a use case mixing `&` and `|`.
```php
<?php
namespace App\Foo;
class Bar {
/**
* in this example `Bar` constructor accepts an object that implement
* ( `CacheInterface` and `ResetableInterface` ) or `ResetableCacheInterface`
*
* should the doc block be formatted this way :
*
* @param object&CacheInterface&ResetableInterface|ResetableCacheInterface
$cache
*
* or maybe like this ?
*
* @param object&ResetableCacheInterface|ResetableInterface&CacheInterface
$cache
*
* or maybe we can use parentheses ? ¯\_(ツ)_/¯
*
* @param object & ( ResetableCacheInterface | ( ResetableInterface &
CacheInterface ) ) $cache
*/
public function __construct($cache) {
// initialize cache property
}
}
```
On Sat, Oct 20, 2018 at 11:53 AM Johannes Schmitt <[email protected]> wrote:
Hi there,
generally, I think the addition of `&` is a great idea.
One thing regarding the grammar specifically, right now you would support
mixing `|` with `&` like `A|B&C`. I'm not sure if mixing would be desirable (I
don't have use-case for this at this point). Also the grammar currently
requires `|` to be before `&`- so something like `A&B|C` would not be supported
- I'm not sure if this is intentional? Maybe it's best to only either support
`|` or `&`, but not allow to mix them for the moment?
Thanks,
Johannes
On Fri, Oct 19, 2018 at 2:50 PM Chuck Burgess <[email protected]> wrote:
Hello everyone,
There is a new PR [1] from a contributor, asking for an Intersection Type
Operator. This appears to simply use `&` akin to how `|` is used for Union
Types.
Neither Unions nor Intersections are (yet) in the language itself, but
`string|null` Union Typing in Tags has been in wide usage for a while now. In
looking over RFCs on attempts to get these two Type Operators into the
language, it seems likely to me that the Operators chosen will be `|` and `&`
if they do ever get in. As such, I'm personally good with the choice of `&`
for Intersection Operator for Typing in Tags.
Please keep discussion on this request on this ML thread.
Chuck Burgess, Editor
[1] -- https://github.com/php-fig/fig-standards/pull/1104
--
You received this message because you are subscribed to the Google Groups "PHP
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/php-fig/9f5897a1-b771-4352-8cba-9851bddcb9ce%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "PHP
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/php-fig/CANdv-DeCnvpSgfQC9WP_kq9yz%3DFq4O8tfQok_o%2BoGR4QNyg1Ww%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "PHP
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/php-fig/CAMshokcbDnAkcMqAqm%3DeTG52oUFgXXz%2B5emTckN0iib1tj%2BEbQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "PHP
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/php-fig/CANsgjnuPwyOhEGg5c2AWv%3D%2BABSjGrVVcuvrzZS-O7YTWibDUeQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "PHP
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/php-fig/oUD.4Yfat.1b7d2ieLu8x.1Rp8%7DO%40seznam.cz.
For more options, visit https://groups.google.com/d/optout.