facebook / facebook/hhvm

Generics that resolve to `this` fail the type checker

オープン
#4,529 コメント 4 件 リアクション 0 件 担当者 0 名 GitHub で見る
hack
主要言語
C++
スター
18.7k
フォーク
3.1k
平均マージ
1時間 47分
マージ済み PR(30日)
2

説明

I have this caching method that uses a closure to do the caching. The current class instance is passed as the 1st argument to the closure. I'm trying to type check this through generics and am encountering this error.

```
/vagrant/src/Titon/Common/Cacheable.hh:56:44,48: Invalid argument (Typing[4110])
/vagrant/src/Titon/Common/Cacheable.hh:49:52,52: This is a value of generic type T
/vagrant/src/Titon/Common/Cacheable.hh:56:44,48: It is incompatible with an object of type Titon\Common\Cacheable
/vagrant/src/Titon/Common/Cacheable.hh:56:44,48: Considering the constraint on the type 'this'
```

And the method in question. https://github.com/titon/framework/blob/master/src/Titon/Common/Cacheable.hh#L49

If I remove the generics, then I get this error. (It also causes all classes that implement the method to throw errors).

```
/vagrant/src/Titon/Common/Cacheable.hh:56:18,49: Too many arguments (Typing[4105])
/vagrant/src/Titon/Common/Cacheable.hh:49:39,57: Definition is here
```

If I use a variadic callback type annotation `(function(...): mixed)`, then I get this error (in all the implementing classes).

```
/vagrant/src/Titon/View/EngineView.hh:57:73,80: Invalid argument (Typing[4039])
/vagrant/src/Titon/Common/Cacheable.hh:49:39,60: Number of arguments doesn't match
/vagrant/src/Titon/View/EngineView.hh:57:73,80: Because of this definition
```

So... is there a way to do this? Or is this a bug?

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。