Skip to content

Commit 3b43d7e

Browse files
committed
Improve type inference for UntypedBuilder
1 parent 6c0934b commit 3b43d7e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1939
-934
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ lint:
1919
docker run -v `pwd`:/app -it slack/hack-json-schema ./vendor/bin/hhast-lint
2020

2121
format:
22-
docker run -v `pwd`:/app -it slack/hack-json-schema find {src,tests} -type f -name "*.hack" -o -name "*.php" -exec hackfmt -i {} \;
22+
docker run -v `pwd`:/app -it slack/hack-json-schema find {src,tests} -type f \( -name "*.hack" -o -name "*.php" \) -exec hackfmt -i {} \;
2323

2424
typecheck:
2525
docker run -v `pwd`:/app -it slack/hack-json-schema /bin/bash -c './vendor/bin/hh-autoload && hh_server --check .'

src/Codegen/Codegen.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ public function build(): this {
263263
$this->file->addBeforeType(
264264
$this->getHackCodegenFactory()->codegenType($this->getType())->setType($this->builder->getType()),
265265
);
266+
Typing\TypeSystem::registerAlias($this->getType(), $this->builder->getTypeInfo());
266267
}
267268

268269
$this->class = $this->class
@@ -329,6 +330,10 @@ public function isArrayKeyType(): bool {
329330
return $this->builder->isArrayKeyType();
330331
}
331332

333+
public function getTypeInfo(): Typing\Type {
334+
return $this->builder->getTypeInfo();
335+
}
336+
332337
public function setSuffix(string $_suffix): void {
333338
}
334339
}

src/Codegen/Constraints/ArrayBuilder.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,4 +268,18 @@ private function determineHackArrayType(): void {
268268
$this->hackArrayType = HackArrayType::KEYSET;
269269
}
270270
}
271+
272+
<<__Override>>
273+
public function getTypeInfo(): Typing\Type {
274+
if ($this->singleItemSchemaBuilder) {
275+
$inner = $this->singleItemSchemaBuilder->getTypeInfo();
276+
} else {
277+
$inner = Typing\TypeSystem::mixed();
278+
}
279+
if ($this->hackArrayType === HackArrayType::KEYSET) {
280+
return Typing\TypeSystem::keyset($inner);
281+
} else {
282+
return Typing\TypeSystem::vec($inner);
283+
}
284+
}
271285
}

src/Codegen/Constraints/BooleanBuilder.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ protected function getCheckMethod(): CodegenMethod {
5151
->setReturnType($this->getType());
5252
}
5353

54+
<<__Override>>
55+
public function getTypeInfo(): Typing\Type {
56+
return Typing\TypeSystem::bool();
57+
}
5458
}

src/Codegen/Constraints/IBuilder.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ public function getType(): string;
88
public function isArrayKeyType(): bool;
99
public function build(): this;
1010
public function setSuffix(string $suffix): void;
11+
public function getTypeInfo(): Typing\Type;
1112
}

src/Codegen/Constraints/NullBuilder.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,8 @@ public function getType(): string {
4444
return 'null';
4545
}
4646

47+
<<__Override>>
48+
public function getTypeInfo(): Typing\Type {
49+
return Typing\TypeSystem::null();
50+
}
4751
}

src/Codegen/Constraints/NumberBuilder.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,15 @@ public function getType(): string {
120120
return 'num';
121121
}
122122

123+
<<__Override>>
124+
public function getTypeInfo(): Typing\Type {
125+
if ($this->getType() === 'int') {
126+
return Typing\TypeSystem::int();
127+
} else if ($this->getType() === 'num') {
128+
return Typing\TypeSystem::num();
129+
} else {
130+
// TODO: Handle hackEnum
131+
return Typing\TypeSystem::mixed();
132+
}
133+
}
123134
}

src/Codegen/Constraints/ObjectBuilder.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ public function build(): this {
109109

110110
// Generate a type based on the specified properties
111111
$type = $this->codegenType($property_classes, $pattern_properties_classes);
112+
// TODO: Register objects as shapes or dicts
113+
Typing\TypeSystem::registerAlias($this->getType(), Typing\TypeSystem::nonnull());
112114
$this->ctx->getFile()->addBeforeType($type);
113115
return $this;
114116
}
@@ -560,4 +562,8 @@ private function codegenType(
560562
}
561563
}
562564

565+
<<__Override>>
566+
public function getTypeInfo(): Typing\Type {
567+
return Typing\TypeSystem::alias($this->getType());
568+
}
563569
}

src/Codegen/Constraints/SchemaBuilder.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ public function getResolvedContext(): Context {
172172
return $this->resolvedContext;
173173
}
174174

175+
public function getTypeInfo(): Typing\Type {
176+
return $this->builder->getTypeInfo();
177+
}
178+
175179
public function setSuffix(string $suffix): void {
176180
$this->builder->setSuffix($suffix);
177181
}

src/Codegen/Constraints/StringBuilder.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,13 @@ public function getType(): string {
151151

152152
return 'string';
153153
}
154+
155+
<<__Override>>
156+
public function getTypeInfo(): Typing\Type {
157+
if ($this->getType() === 'string') {
158+
return Typing\TypeSystem::string();
159+
}
160+
// TODO: Type resolution for hackEnum
161+
return Typing\TypeSystem::nonnull();
162+
}
154163
}

0 commit comments

Comments
 (0)