Skip to content
This repository was archived by the owner on Sep 1, 2023. It is now read-only.

Commit 3aa45a5

Browse files
committed
Remove vec-like and dict-like PHP array support
- remove dict_like_array() - remove vec_like_array() - use darray()/varray() instead of casts - make UntypedArray return a varray_or_darray(mixed) instead of array Treating `array` and `varray_or_darray` as interchangeable raises notices on 4.58; this makes the modified types required - might as well remove the old ones too while we're here, as they should go eventually.
1 parent 9807a0a commit 3aa45a5

9 files changed

+38
-101
lines changed

src/TypeSpec.hack

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ function darray<Tk as arraykey, Tv>(
6363
TypeSpec<Tk> $tsk,
6464
TypeSpec<Tv> $tsv,
6565
): TypeSpec<darray<Tk, Tv>> {
66-
return new __Private\DictLikeArraySpec('darray', $tsk, $tsv);
66+
return new __Private\DarraySpec($tsk, $tsv);
6767
}
6868

6969
function dict<Tk as arraykey, Tv>(
@@ -73,13 +73,6 @@ function dict<Tk as arraykey, Tv>(
7373
return new __Private\DictSpec($tsk, $tsv);
7474
}
7575

76-
function dict_like_array<Tk as arraykey, Tv>(
77-
TypeSpec<Tk> $tsk,
78-
TypeSpec<Tv> $tsv,
79-
): TypeSpec<array<Tk, Tv>> {
80-
return new __Private\DictLikeArraySpec('array', $tsk, $tsv);
81-
}
82-
8376
function enum<
8477
Tinner as arraykey,
8578
T as /* HH_IGNORE_ERROR[2053] */ \HH\BuiltinEnum<Tinner>,
@@ -164,17 +157,13 @@ function untyped_array(): TypeSpec<array> {
164157
}
165158

166159
function varray<Tv>(TypeSpec<Tv> $tsv): TypeSpec<varray<Tv>> {
167-
return new __Private\VecLikeArraySpec('varray', $tsv);
160+
return new __Private\VarraySpec($tsv);
168161
}
169162

170163
function vec<Tv>(TypeSpec<Tv> $inner): TypeSpec<vec<Tv>> {
171164
return new __Private\VecSpec($inner);
172165
}
173166

174-
function vec_like_array<Tv>(TypeSpec<Tv> $tsv): TypeSpec<array<Tv>> {
175-
return new __Private\VecLikeArraySpec('array', $tsv);
176-
}
177-
178167
function vector<Tv>(TypeSpec<Tv> $inner): TypeSpec<Vector<Tv>> {
179168
return new __Private\VectorSpec(Vector::class, $inner);
180169
}

src/TypeSpec/__Private/DictLikeArraySpec.hack renamed to src/TypeSpec/__Private/DarraySpec.hack

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,63 +15,60 @@ use type Facebook\TypeSpec\TypeSpec;
1515

1616
use namespace HH\Lib\{Dict, Str};
1717

18-
final class DictLikeArraySpec<Tk as arraykey, Tv>
19-
extends TypeSpec<array<Tk, Tv>> {
18+
final class DarraySpec<Tk as arraykey, Tv>
19+
extends TypeSpec<darray<Tk, Tv>> {
2020

2121
public function __construct(
22-
private string $name,
2322
private TypeSpec<Tk> $tsk,
2423
private TypeSpec<Tv> $tsv,
2524
) {
2625
}
2726

2827
<<__Override>>
29-
public function coerceType(mixed $value): array<Tk, Tv> {
28+
public function coerceType(mixed $value): darray<Tk, Tv> {
3029
if (!$value is KeyedTraversable<_, _>) {
3130
throw TypeCoercionException::withValue(
3231
$this->getTrace(),
33-
$this->name.'<Tk, Tv>',
32+
'darray<Tk, Tv>',
3433
$value,
3534
);
3635
}
3736

38-
$kt = $this->getTrace()->withFrame($this->name.'<Tk, _>');
39-
$vt = $this->getTrace()->withFrame($this->name.'<_, Tv>');
37+
$kt = $this->getTrace()->withFrame('darray<Tk, _>');
38+
$vt = $this->getTrace()->withFrame('darray<_, Tv>');
4039

4140
return Dict\pull_with_key(
4241
$value,
4342
($_k, $v) ==> $this->tsv->withTrace($vt)->coerceType($v),
4443
($k, $_v) ==> $this->tsk->withTrace($kt)->coerceType($k),
45-
)
46-
|> /* HH_IGNORE_ERROR[4007] PHP array cast */ (array)$$;
44+
) |> darray($$);
4745
}
4846

4947
<<__Override>>
50-
public function assertType(mixed $value): array<Tk, Tv> {
48+
public function assertType(mixed $value): darray<Tk, Tv> {
5149
if (!\is_array($value)) {
5250
throw IncorrectTypeException::withValue(
5351
$this->getTrace(),
54-
$this->name.'<Tk, Tv>',
52+
$this->toString(),
5553
$value,
5654
);
5755
}
5856

59-
$kt = $this->getTrace()->withFrame($this->name.'<Tk, _>');
60-
$vt = $this->getTrace()->withFrame($this->name.'<_, Tv>');
57+
$kt = $this->getTrace()->withFrame('darray<Tk, _>');
58+
$vt = $this->getTrace()->withFrame('darray<_, Tv>');
6159

6260
return Dict\pull_with_key(
6361
$value,
6462
($_k, $v) ==> $this->tsv->withTrace($vt)->assertType($v),
6563
($k, $_v) ==> $this->tsk->withTrace($kt)->assertType($k),
6664
)
67-
|> /* HH_IGNORE_ERROR[4007] PHP array cast */ (array)$$;
65+
|> darray($$);
6866
}
6967

7068
<<__Override>>
7169
public function toString(): string {
7270
return Str\format(
73-
'%s<%s, %s>',
74-
$this->name,
71+
'darray<%s, %s>',
7572
$this->tsk->toString(),
7673
$this->tsv->toString(),
7774
);

src/TypeSpec/__Private/TupleSpec.hack

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ final class TupleSpec extends TypeSpec<BogusTuple> {
8080
/* HH_IGNORE_ERROR[4110] */
8181
return $tuple;
8282
}
83-
/* HH_IGNORE_ERROR[4007] */
84-
return (array)$tuple;
83+
/* HH_IGNORE_ERROR[4110] */
84+
return varray($tuple);
8585
}
8686

8787
<<__Override>>

src/TypeSpec/__Private/UntypedArraySpec.hack

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ namespace Facebook\TypeSpec\__Private;
1313
use type Facebook\TypeAssert\{IncorrectTypeException, TypeCoercionException};
1414
use type Facebook\TypeSpec\TypeSpec;
1515

16-
/* HH_IGNORE_ERROR[4045] array without generics */
17-
final class UntypedArraySpec extends TypeSpec<array> {
16+
final class UntypedArraySpec extends TypeSpec<varray_or_darray<mixed>> {
1817

1918
<<__Override>>
20-
/* HH_IGNORE_ERROR[4045] array without generics */
21-
public function coerceType(mixed $value): array {
19+
public function coerceType(mixed $value): varray_or_darray<mixed> {
2220
if (!$value is KeyedTraversable<_, _>) {
2321
throw
2422
TypeCoercionException::withValue($this->getTrace(), 'array', $value);
@@ -32,18 +30,20 @@ final class UntypedArraySpec extends TypeSpec<array> {
3230
}
3331

3432
<<__Override>>
35-
/* HH_IGNORE_ERROR[4045] array without generics */
36-
public function assertType(mixed $value): array {
33+
public function assertType(mixed $value): varray_or_darray<mixed> {
3734
if (!\is_array($value)) {
3835
throw
3936
IncorrectTypeException::withValue($this->getTrace(), 'array', $value);
4037
}
4138

42-
return $value;
39+
if (varray($value) === $value) {
40+
return varray($value);
41+
}
42+
return darray($value);
4343
}
4444

4545
<<__Override>>
4646
public function toString(): string {
47-
return 'array';
47+
return 'varray_or_darray<mixed>';
4848
}
4949
}

src/TypeSpec/__Private/VecLikeArraySpec.hack renamed to src/TypeSpec/__Private/VarraySpec.hack

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@ use type Facebook\TypeAssert\{IncorrectTypeException, TypeCoercionException};
1414
use type Facebook\TypeSpec\TypeSpec;
1515
use namespace HH\Lib\Vec;
1616

17-
final class VecLikeArraySpec<T> extends TypeSpec<array<T>> {
17+
final class VarraySpec<T> extends TypeSpec<varray<T>> {
1818
public function __construct(
19-
private string $name,
2019
private TypeSpec<T> $inner,
2120
) {
2221
}
2322

2423
<<__Override>>
25-
public function coerceType(mixed $value): array<T> {
24+
public function coerceType(mixed $value): varray<T> {
2625
if (!$value is Traversable<_>) {
2726
throw TypeCoercionException::withValue(
2827
$this->getTrace(),
29-
$this->name.'<T>',
28+
'varray<T>',
3029
$value,
3130
);
3231
}
@@ -36,11 +35,11 @@ final class VecLikeArraySpec<T> extends TypeSpec<array<T>> {
3635
}
3736

3837
<<__Override>>
39-
public function assertType(mixed $value): array<T> {
38+
public function assertType(mixed $value): varray<T> {
4039
if (!\is_array($value)) {
4140
throw IncorrectTypeException::withValue(
4241
$this->getTrace(),
43-
$this->name.'<T>',
42+
'varray<T>',
4443
$value,
4544
);
4645
}
@@ -67,15 +66,15 @@ final class VecLikeArraySpec<T> extends TypeSpec<array<T>> {
6766
}
6867
return $this
6968
->inner
70-
->withTrace($this->getTrace()->withFrame($this->name.'['.$i.']'))
69+
->withTrace($this->getTrace()->withFrame('varray['.$i.']'))
7170
->assertType($inner);
7271
},
7372
)
74-
|> \array_values($$);
73+
|> varray($$);
7574
}
7675

7776
<<__Override>>
7877
public function toString(): string {
79-
return $this->name.'<'.$this->inner->toString().'>';
78+
return 'varray<'.$this->inner->toString().'>';
8079
}
8180
}

src/TypeSpec/__Private/from_type_structure.hack

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,10 @@ function from_type_structure<T>(TypeStructure<T> $ts): TypeSpec<T> {
7575
return new UntypedArraySpec();
7676
case 1:
7777
/* HH_IGNORE_ERROR[4110] */
78-
return new VecLikeArraySpec('array', from_type_structure($generics[0]));
78+
return new VarraySpec(from_type_structure($generics[0]));
7979
case 2:
8080
/* HH_IGNORE_ERROR[4110] */
81-
return new DictLikeArraySpec(
82-
'array',
81+
return new DarraySpec(
8382
from_type_structure($generics[0]),
8483
from_type_structure($generics[1]),
8584
);

tests/DArraySpecTest.hack

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ namespace Facebook\TypeAssert;
1212

1313
use namespace Facebook\TypeSpec;
1414
use type Facebook\TypeSpec\TypeSpec;
15-
use function Facebook\FBExpect\expect;
1615

1716
final class DArraySpecTest extends TypeSpecTest<darray<arraykey, mixed>> {
1817
<<__Override>>
@@ -57,34 +56,6 @@ final class DArraySpecTest extends TypeSpecTest<darray<arraykey, mixed>> {
5756
TypeSpec\darray(TypeSpec\int(), TypeSpec\string()),
5857
'darray<int, string>',
5958
),
60-
tuple(
61-
TypeSpec\dict_like_array(TypeSpec\string(), TypeSpec\int()),
62-
'array<string, int>',
63-
),
64-
tuple(
65-
TypeSpec\dict_like_array(TypeSpec\int(), TypeSpec\string()),
66-
'array<int, string>',
67-
),
68-
6959
];
7060
}
71-
72-
public function testDictLikeArrayIsDArray(): void {
73-
$dict_like_array = (
74-
(): array<string, int> ==> TypeSpec\dict_like_array(
75-
TypeSpec\string(),
76-
TypeSpec\int(),
77-
)->assertType(darray['foo' => 123])
78-
)();
79-
expect($dict_like_array)->toEqual(darray['foo' => 123]);
80-
$darray_asserted = (
81-
(): darray<string, int> ==> TypeSpec\darray(
82-
TypeSpec\string(),
83-
TypeSpec\int(),
84-
)->assertType($dict_like_array)
85-
)();
86-
expect($darray_asserted)->toEqual($dict_like_array);
87-
$darray_verbatim = ((): darray<string, int> ==> $dict_like_array)();
88-
expect($darray_verbatim)->toEqual($dict_like_array);
89-
}
9061
}

tests/TypeStructureTest.hack

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,19 +297,19 @@ final class TypeStructureTest extends \Facebook\HackTest\HackTest {
297297
type_structure(TypeConstants::class, 'TStringArray'),
298298
/* HHAST_IGNORE_ERROR[NoPHPArrayLiterals] */
299299
array(123),
300-
vec['array[0]'],
300+
vec['varray[0]'],
301301
),
302302
'int keys in array<string, string>' => tuple(
303303
type_structure(TypeConstants::class, 'TStringStringArray'),
304304
/* HHAST_IGNORE_ERROR[NoPHPArrayLiterals] */
305305
array(123 => 'bar', 123 => 'derp'),
306-
vec['array<Tk, _>'],
306+
vec['darray<Tk, _>'],
307307
),
308308
'int values in array<string, string>' => tuple(
309309
type_structure(TypeConstants::class, 'TStringStringArray'),
310310
/* HHAST_IGNORE_ERROR[NoPHPArrayLiterals] */
311311
array('foo' => 123, 'bar' => 456),
312-
vec['array<_, Tv>'],
312+
vec['darray<_, Tv>'],
313313
),
314314
'0 as ?string' => tuple(
315315
type_structure(TypeConstants::class, 'TNullableString'),

tests/VArraySpecTest.hack

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ namespace Facebook\TypeAssert;
1212

1313
use namespace Facebook\TypeSpec;
1414
use type Facebook\TypeSpec\TypeSpec;
15-
use function Facebook\FBExpect\expect;
1615

1716
final class VArraySpecTest extends TypeSpecTest<varray<mixed>> {
1817
<<__Override>>
@@ -51,23 +50,6 @@ final class VArraySpecTest extends TypeSpecTest<varray<mixed>> {
5150
return vec[
5251
tuple(TypeSpec\varray(TypeSpec\string()), 'varray<string>'),
5352
tuple(TypeSpec\varray(TypeSpec\int()), 'varray<int>'),
54-
tuple(TypeSpec\vec_like_array(TypeSpec\string()), 'array<string>'),
55-
tuple(TypeSpec\vec_like_array(TypeSpec\int()), 'array<int>'),
5653
];
5754
}
58-
59-
public function testVecLikeArrayIsVArray(): void {
60-
$vec_like_array = (
61-
(): array<int> ==>
62-
TypeSpec\vec_like_array(TypeSpec\int())->assertType(varray[123])
63-
)();
64-
expect($vec_like_array)->toEqual(varray[123]);
65-
$varray_asserted = (
66-
(): varray<int> ==>
67-
TypeSpec\varray(TypeSpec\int())->assertType($vec_like_array)
68-
)();
69-
expect($varray_asserted)->toEqual($vec_like_array);
70-
$varray_verbatim = ((): varray<int> ==> $vec_like_array)();
71-
expect($varray_verbatim)->toEqual($vec_like_array);
72-
}
7355
}

0 commit comments

Comments
 (0)