diff --git a/tests/diff/addClassInOtherFile/b/A.hack b/tests/diff/addClassInOtherFile/b/A.hack index 37bdd222..151119ab 100644 --- a/tests/diff/addClassInOtherFile/b/A.hack +++ b/tests/diff/addClassInOtherFile/b/A.hack @@ -1 +1 @@ -class A {} \ No newline at end of file +final class A {} \ No newline at end of file diff --git a/tests/diff/addTrait/a/input.hack b/tests/diff/addTrait/a/input.hack index 1cec600b..c04d4440 100644 --- a/tests/diff/addTrait/a/input.hack +++ b/tests/diff/addTrait/a/input.hack @@ -2,7 +2,7 @@ trait T { public function foo(): void {} } -class C { +final class C { } function foo(C $c) { diff --git a/tests/diff/addTrait/b/input.hack b/tests/diff/addTrait/b/input.hack index 6f74b8c5..3b9cd1fb 100644 --- a/tests/diff/addTrait/b/input.hack +++ b/tests/diff/addTrait/b/input.hack @@ -2,7 +2,7 @@ trait T { public function foo(): void {} } -class C { +final class C { use T; } diff --git a/tests/diff/changeAliasedShapeType/a/input.hack b/tests/diff/changeAliasedShapeType/a/input.hack index 12c733f9..48c2c73b 100644 --- a/tests/diff/changeAliasedShapeType/a/input.hack +++ b/tests/diff/changeAliasedShapeType/a/input.hack @@ -3,7 +3,7 @@ function main(): void { A::takes_bar(shape('a' => foo_t::A)); } -class A { +final class A { public static function takes_bar(bar_t $b) { if ($b['a'] == foo_t::A) {} } diff --git a/tests/diff/changeAliasedShapeType/b/input.hack b/tests/diff/changeAliasedShapeType/b/input.hack index 12c733f9..48c2c73b 100644 --- a/tests/diff/changeAliasedShapeType/b/input.hack +++ b/tests/diff/changeAliasedShapeType/b/input.hack @@ -3,7 +3,7 @@ function main(): void { A::takes_bar(shape('a' => foo_t::A)); } -class A { +final class A { public static function takes_bar(bar_t $b) { if ($b['a'] == foo_t::A) {} } diff --git a/tests/diff/changeAliasedShapeType/c/input.hack b/tests/diff/changeAliasedShapeType/c/input.hack index 34b1d34a..0bb36b7b 100644 --- a/tests/diff/changeAliasedShapeType/c/input.hack +++ b/tests/diff/changeAliasedShapeType/c/input.hack @@ -3,7 +3,7 @@ function main(): void { A::takes_bar(shape('a' => Foo::A)); } -class A { +final class A { public static function takes_bar(bar_t $b) { if ($b['a'] == Foo::A) {} } diff --git a/tests/diff/changePrivateMethodBehaviour/a/input.hack b/tests/diff/changePrivateMethodBehaviour/a/input.hack index 64eea582..57a5483b 100644 --- a/tests/diff/changePrivateMethodBehaviour/a/input.hack +++ b/tests/diff/changePrivateMethodBehaviour/a/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): void { $this->bar(); } diff --git a/tests/diff/changePrivateMethodBehaviour/b/input.hack b/tests/diff/changePrivateMethodBehaviour/b/input.hack index 646bc667..7afbadcf 100644 --- a/tests/diff/changePrivateMethodBehaviour/b/input.hack +++ b/tests/diff/changePrivateMethodBehaviour/b/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): void { $this->bar(); } diff --git a/tests/diff/classConstTypeChanged/a/input.hack b/tests/diff/classConstTypeChanged/a/input.hack index 4f135fa7..d4242a89 100644 --- a/tests/diff/classConstTypeChanged/a/input.hack +++ b/tests/diff/classConstTypeChanged/a/input.hack @@ -2,7 +2,7 @@ abstract class A { abstract const type T; } -class B extends A { +final class B extends A { const type T = vec; public function bar(): void {} diff --git a/tests/diff/classConstTypeChanged/b/input.hack b/tests/diff/classConstTypeChanged/b/input.hack index dc19bbf0..3490231b 100644 --- a/tests/diff/classConstTypeChanged/b/input.hack +++ b/tests/diff/classConstTypeChanged/b/input.hack @@ -2,7 +2,7 @@ abstract class A { abstract const type T; } -class B extends A { +final class B extends A { const type T = vec; public function bar(): void {} diff --git a/tests/diff/commentOutClassInOtherFile/a/A.hack b/tests/diff/commentOutClassInOtherFile/a/A.hack index be74c4fd..89cd4eb6 100644 --- a/tests/diff/commentOutClassInOtherFile/a/A.hack +++ b/tests/diff/commentOutClassInOtherFile/a/A.hack @@ -1 +1 @@ -class A extends Exception {} \ No newline at end of file +final class A extends Exception {} \ No newline at end of file diff --git a/tests/diff/commentOutClassInOtherFile/a/input.hack b/tests/diff/commentOutClassInOtherFile/a/input.hack index e2bf2d92..37171387 100644 --- a/tests/diff/commentOutClassInOtherFile/a/input.hack +++ b/tests/diff/commentOutClassInOtherFile/a/input.hack @@ -12,7 +12,7 @@ function bar(): void { echo A::class; } -class B { +final class B { public function baz(): void { echo A::class; } diff --git a/tests/diff/commentOutClassInOtherFile/b/input.hack b/tests/diff/commentOutClassInOtherFile/b/input.hack index e2bf2d92..37171387 100644 --- a/tests/diff/commentOutClassInOtherFile/b/input.hack +++ b/tests/diff/commentOutClassInOtherFile/b/input.hack @@ -12,7 +12,7 @@ function bar(): void { echo A::class; } -class B { +final class B { public function baz(): void { echo A::class; } diff --git a/tests/diff/extendedRefLost/a/input.hack b/tests/diff/extendedRefLost/a/input.hack index 466ba591..85f533d6 100644 --- a/tests/diff/extendedRefLost/a/input.hack +++ b/tests/diff/extendedRefLost/a/input.hack @@ -1,6 +1,6 @@ abstract class A {} -class B extends A {} +final class B extends A {} function foo(): void {} diff --git a/tests/diff/extendedRefLost/b/input.hack b/tests/diff/extendedRefLost/b/input.hack index cbf73a0c..7520ad3f 100644 --- a/tests/diff/extendedRefLost/b/input.hack +++ b/tests/diff/extendedRefLost/b/input.hack @@ -1,6 +1,6 @@ abstract class A {} -class B {} +final class B {} function foo(): void {} diff --git a/tests/diff/methodUsedThroughTrait/a/input.hack b/tests/diff/methodUsedThroughTrait/a/input.hack index 9580d680..18a36459 100644 --- a/tests/diff/methodUsedThroughTrait/a/input.hack +++ b/tests/diff/methodUsedThroughTrait/a/input.hack @@ -7,7 +7,7 @@ trait ParentTrait { public function doThing(): void {} } -class ConcreteClass extends ParentClass { +final class ConcreteClass extends ParentClass { use ParentTrait; } diff --git a/tests/diff/methodUsedThroughTrait/b/input.hack b/tests/diff/methodUsedThroughTrait/b/input.hack index 9580d680..18a36459 100644 --- a/tests/diff/methodUsedThroughTrait/b/input.hack +++ b/tests/diff/methodUsedThroughTrait/b/input.hack @@ -7,7 +7,7 @@ trait ParentTrait { public function doThing(): void {} } -class ConcreteClass extends ParentClass { +final class ConcreteClass extends ParentClass { use ParentTrait; } diff --git a/tests/diff/methodWithErrorSuppressed/a/input.hack b/tests/diff/methodWithErrorSuppressed/a/input.hack index b1c52353..44199743 100644 --- a/tests/diff/methodWithErrorSuppressed/a/input.hack +++ b/tests/diff/methodWithErrorSuppressed/a/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(vec $vecs): void { echo "a"; if ($vecs is nonnull) {} diff --git a/tests/diff/methodWithErrorSuppressed/b/input.hack b/tests/diff/methodWithErrorSuppressed/b/input.hack index 082150c2..59f2e07b 100644 --- a/tests/diff/methodWithErrorSuppressed/b/input.hack +++ b/tests/diff/methodWithErrorSuppressed/b/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(vec $vecs): void { echo "a"; /* HAKANA_FIXME[RedundantNonnullTypeComparison] */ diff --git a/tests/diff/removeClassInOtherFile/a/A.hack b/tests/diff/removeClassInOtherFile/a/A.hack index 37bdd222..151119ab 100644 --- a/tests/diff/removeClassInOtherFile/a/A.hack +++ b/tests/diff/removeClassInOtherFile/a/A.hack @@ -1 +1 @@ -class A {} \ No newline at end of file +final class A {} \ No newline at end of file diff --git a/tests/diff/removeParentMethod/a/input.hack b/tests/diff/removeParentMethod/a/input.hack index 1e2c7868..4e264acd 100644 --- a/tests/diff/removeParentMethod/a/input.hack +++ b/tests/diff/removeParentMethod/a/input.hack @@ -1,4 +1,4 @@ -class B extends A { +final class B extends A { public function bar(): void { $this->foo(); } diff --git a/tests/diff/removeParentMethod/a/parent.hack b/tests/diff/removeParentMethod/a/parent.hack index 53870a6a..91ae3d1e 100644 --- a/tests/diff/removeParentMethod/a/parent.hack +++ b/tests/diff/removeParentMethod/a/parent.hack @@ -1,3 +1,3 @@ -class A { +abstract class A { public function foo(): void {} } diff --git a/tests/diff/removeParentMethod/b/input.hack b/tests/diff/removeParentMethod/b/input.hack index 1e2c7868..4e264acd 100644 --- a/tests/diff/removeParentMethod/b/input.hack +++ b/tests/diff/removeParentMethod/b/input.hack @@ -1,4 +1,4 @@ -class B extends A { +final class B extends A { public function bar(): void { $this->foo(); } diff --git a/tests/diff/removeParentMethod/b/parent.hack b/tests/diff/removeParentMethod/b/parent.hack index a446ec58..a636f70e 100644 --- a/tests/diff/removeParentMethod/b/parent.hack +++ b/tests/diff/removeParentMethod/b/parent.hack @@ -1,3 +1,3 @@ -class A { +abstract class A { } diff --git a/tests/diff/removeTrait/a/input.hack b/tests/diff/removeTrait/a/input.hack index 1c76a59e..8a0dbbf0 100644 --- a/tests/diff/removeTrait/a/input.hack +++ b/tests/diff/removeTrait/a/input.hack @@ -2,7 +2,7 @@ trait T { public function foo(): void {} } -class C { +final class C { use T; } diff --git a/tests/diff/removeTrait/b/input.hack b/tests/diff/removeTrait/b/input.hack index b8121ab1..322e51a6 100644 --- a/tests/diff/removeTrait/b/input.hack +++ b/tests/diff/removeTrait/b/input.hack @@ -2,7 +2,7 @@ trait T { public function foo(): void {} } -class C { +final class C { } function foo(C $c) { diff --git a/tests/diff/replaceImplementationAndUse/a/input.hack b/tests/diff/replaceImplementationAndUse/a/input.hack index d0e9ecba..ab968ee9 100644 --- a/tests/diff/replaceImplementationAndUse/a/input.hack +++ b/tests/diff/replaceImplementationAndUse/a/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private function __construct(private int $i) {} public static function gen(): A { diff --git a/tests/diff/replaceImplementationAndUse/b/input.hack b/tests/diff/replaceImplementationAndUse/b/input.hack index 0e9ef9e7..8ea8540b 100644 --- a/tests/diff/replaceImplementationAndUse/b/input.hack +++ b/tests/diff/replaceImplementationAndUse/b/input.hack @@ -1 +1 @@ -class A { } \ No newline at end of file +final class A { } \ No newline at end of file diff --git a/tests/diff/replaceImplementationAndUseWithExtends/a/input.hack b/tests/diff/replaceImplementationAndUseWithExtends/a/input.hack index 22127f1a..59425b49 100644 --- a/tests/diff/replaceImplementationAndUseWithExtends/a/input.hack +++ b/tests/diff/replaceImplementationAndUseWithExtends/a/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private function __construct(private int $i) {} public function returnSelf() : A { @@ -6,7 +6,7 @@ class A { } } -class B extends A { +final class B extends A { public function returnSelf(): A { return parent::returnSelf(); } diff --git a/tests/diff/replaceImplementationAndUseWithExtends/b/input.hack b/tests/diff/replaceImplementationAndUseWithExtends/b/input.hack index 0e9ef9e7..8ea8540b 100644 --- a/tests/diff/replaceImplementationAndUseWithExtends/b/input.hack +++ b/tests/diff/replaceImplementationAndUseWithExtends/b/input.hack @@ -1 +1 @@ -class A { } \ No newline at end of file +final class A { } \ No newline at end of file diff --git a/tests/diff/uncommentClassInOtherFile/a/input.hack b/tests/diff/uncommentClassInOtherFile/a/input.hack index 663a5a74..68ae1bc0 100644 --- a/tests/diff/uncommentClassInOtherFile/a/input.hack +++ b/tests/diff/uncommentClassInOtherFile/a/input.hack @@ -11,7 +11,7 @@ function bar(): void { echo A::class; } -class B { +final class B { public function baz(): void { echo A::class; } diff --git a/tests/diff/uncommentClassInOtherFile/b/A.hack b/tests/diff/uncommentClassInOtherFile/b/A.hack index be74c4fd..89cd4eb6 100644 --- a/tests/diff/uncommentClassInOtherFile/b/A.hack +++ b/tests/diff/uncommentClassInOtherFile/b/A.hack @@ -1 +1 @@ -class A extends Exception {} \ No newline at end of file +final class A extends Exception {} \ No newline at end of file diff --git a/tests/diff/uncommentClassInOtherFile/b/input.hack b/tests/diff/uncommentClassInOtherFile/b/input.hack index 663a5a74..68ae1bc0 100644 --- a/tests/diff/uncommentClassInOtherFile/b/input.hack +++ b/tests/diff/uncommentClassInOtherFile/b/input.hack @@ -11,7 +11,7 @@ function bar(): void { echo A::class; } -class B { +final class B { public function baz(): void { echo A::class; } diff --git a/tests/diff/unusedFunctionRemovedWholeFile/a/input.hack b/tests/diff/unusedFunctionRemovedWholeFile/a/input.hack index 1dfb87dd..921cd290 100644 --- a/tests/diff/unusedFunctionRemovedWholeFile/a/input.hack +++ b/tests/diff/unusedFunctionRemovedWholeFile/a/input.hack @@ -3,4 +3,4 @@ function main(): void { new B(); } -class B {} \ No newline at end of file +final class B {} \ No newline at end of file diff --git a/tests/diff/unusedFunctionRemovedWholeFile/b/input.hack b/tests/diff/unusedFunctionRemovedWholeFile/b/input.hack index 93a00c8d..75bf6cc4 100644 --- a/tests/diff/unusedFunctionRemovedWholeFile/b/input.hack +++ b/tests/diff/unusedFunctionRemovedWholeFile/b/input.hack @@ -2,4 +2,4 @@ function main(): void { } -class B {} \ No newline at end of file +final class B {} \ No newline at end of file diff --git a/tests/fix/UnusedClass/removeUnusedClass/input.hack b/tests/fix/UnusedClass/removeUnusedClass/input.hack index ac9a6b55..cf9d1089 100644 --- a/tests/fix/UnusedClass/removeUnusedClass/input.hack +++ b/tests/fix/UnusedClass/removeUnusedClass/input.hack @@ -1,10 +1,10 @@ // This is my class // it is not used -class A { +final class A { // some stuff } -class B {} +final class B {} <<__EntryPoint>> function foo(): void { diff --git a/tests/fix/UnusedClass/removeUnusedClass/output.txt b/tests/fix/UnusedClass/removeUnusedClass/output.txt index f28bcb05..d04c50bd 100644 --- a/tests/fix/UnusedClass/removeUnusedClass/output.txt +++ b/tests/fix/UnusedClass/removeUnusedClass/output.txt @@ -1,6 +1,6 @@ -class B {} +final class B {} <<__EntryPoint>> function foo(): void { diff --git a/tests/fix/UnusedPrivateMethod/simple/input.hack b/tests/fix/UnusedPrivateMethod/simple/input.hack index 741da13d..7b986362 100644 --- a/tests/fix/UnusedPrivateMethod/simple/input.hack +++ b/tests/fix/UnusedPrivateMethod/simple/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { /** cool doc */ private function bar(): void {} } diff --git a/tests/fix/UnusedPrivateMethod/simple/output.txt b/tests/fix/UnusedPrivateMethod/simple/output.txt index 0db9166c..822fe840 100644 --- a/tests/fix/UnusedPrivateMethod/simple/output.txt +++ b/tests/fix/UnusedPrivateMethod/simple/output.txt @@ -1,4 +1,4 @@ -class Foo { +final class Foo { } <<__EntryPoint>> diff --git a/tests/inference/Arg/callMapClassOptionalArg/input.hack b/tests/inference/Arg/callMapClassOptionalArg/input.hack index c3842afb..c38d4113 100644 --- a/tests/inference/Arg/callMapClassOptionalArg/input.hack +++ b/tests/inference/Arg/callMapClassOptionalArg/input.hack @@ -1,3 +1,3 @@ -class Hello {} +final class Hello {} $m = new ReflectionMethod(Hello::class, "goodbye"); $m->invoke(null, "cool"); \ No newline at end of file diff --git a/tests/inference/ArrayAccess/arrayAccessAfterPassByref/input.hack b/tests/inference/ArrayAccess/arrayAccessAfterPassByref/input.hack index 1b3c0d1b..d91b2892 100644 --- a/tests/inference/ArrayAccess/arrayAccessAfterPassByref/input.hack +++ b/tests/inference/ArrayAccess/arrayAccessAfterPassByref/input.hack @@ -1,4 +1,4 @@ -class Arr { +final class Arr { public static function pull(inout dict $a, string $b, mixed $c = null): mixed { return $a[$b] ?? $c; } diff --git a/tests/inference/ArrayAccess/instanceOfIntOffset/input.hack b/tests/inference/ArrayAccess/instanceOfIntOffset/input.hack index 0f9a5547..1df8e406 100644 --- a/tests/inference/ArrayAccess/instanceOfIntOffset/input.hack +++ b/tests/inference/ArrayAccess/instanceOfIntOffset/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): void { } } function bar (vec $a): void { diff --git a/tests/inference/ArrayAccess/instanceOfStringOffset/input.hack b/tests/inference/ArrayAccess/instanceOfStringOffset/input.hack index 50d54b71..ef670083 100644 --- a/tests/inference/ArrayAccess/instanceOfStringOffset/input.hack +++ b/tests/inference/ArrayAccess/instanceOfStringOffset/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): void { } } function bar (dict $a): void { diff --git a/tests/inference/ArrayAssignment/ArrayDimOffsetStringable/input.hack b/tests/inference/ArrayAssignment/ArrayDimOffsetStringable/input.hack index a561bd09..638e31af 100644 --- a/tests/inference/ArrayAssignment/ArrayDimOffsetStringable/input.hack +++ b/tests/inference/ArrayAssignment/ArrayDimOffsetStringable/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __toString(){return "";} } diff --git a/tests/inference/ArrayAssignment/checkEmptinessAfterConditionalArrayAdjustment/input.hack b/tests/inference/ArrayAssignment/checkEmptinessAfterConditionalArrayAdjustment/input.hack index 69973648..dea95b18 100644 --- a/tests/inference/ArrayAssignment/checkEmptinessAfterConditionalArrayAdjustment/input.hack +++ b/tests/inference/ArrayAssignment/checkEmptinessAfterConditionalArrayAdjustment/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public dict $arr = dict[]; public function foo() : void { diff --git a/tests/inference/ArrayAssignment/listPropertyAssignmentAfterIsset/input.hack b/tests/inference/ArrayAssignment/listPropertyAssignmentAfterIsset/input.hack index cdf77578..ea4c11ba 100644 --- a/tests/inference/ArrayAssignment/listPropertyAssignmentAfterIsset/input.hack +++ b/tests/inference/ArrayAssignment/listPropertyAssignmentAfterIsset/input.hack @@ -1,4 +1,4 @@ -class Collection { +final class Collection { private vec $list = dict[]; public function override(int $offset): void { diff --git a/tests/inference/ArrayFunctionCall/arrayFilterIgnoreNullable/input.hack b/tests/inference/ArrayFunctionCall/arrayFilterIgnoreNullable/input.hack index 185f26b5..0bb21d9b 100644 --- a/tests/inference/ArrayFunctionCall/arrayFilterIgnoreNullable/input.hack +++ b/tests/inference/ArrayFunctionCall/arrayFilterIgnoreNullable/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getRows() : vec { return vec[new A(), null]; } diff --git a/tests/inference/ArrayFunctionCall/keepClassStringInOffsetThroughArrayMerge/input.hack b/tests/inference/ArrayFunctionCall/keepClassStringInOffsetThroughArrayMerge/input.hack index eb78105f..17a38ed1 100644 --- a/tests/inference/ArrayFunctionCall/keepClassStringInOffsetThroughArrayMerge/input.hack +++ b/tests/inference/ArrayFunctionCall/keepClassStringInOffsetThroughArrayMerge/input.hack @@ -1,5 +1,5 @@ -class A { +final class A { private dict, string> $a; public function __construct() { diff --git a/tests/inference/Async/awaitNullable/input.hack b/tests/inference/Async/awaitNullable/input.hack index 1795c726..57507afc 100644 --- a/tests/inference/Async/awaitNullable/input.hack +++ b/tests/inference/Async/awaitNullable/input.hack @@ -1,10 +1,10 @@ -class A { +final class A { public async function bar(): Awaitable { return "a"; } } -class Boo { +final class Boo { public static async function getA(): Awaitable { return new A(); } diff --git a/tests/inference/Async/awaitWithPropertyAssertions/input.hack b/tests/inference/Async/awaitWithPropertyAssertions/input.hack index 01301157..6a0ad23f 100644 --- a/tests/inference/Async/awaitWithPropertyAssertions/input.hack +++ b/tests/inference/Async/awaitWithPropertyAssertions/input.hack @@ -1,4 +1,4 @@ -class B { +final class B { public function bar(): ?string { return "a"; } diff --git a/tests/inference/Attribute/allowsClassStringFromDifferentNamespace/input.hack b/tests/inference/Attribute/allowsClassStringFromDifferentNamespace/input.hack index cb0b7e54..a8fbcf61 100644 --- a/tests/inference/Attribute/allowsClassStringFromDifferentNamespace/input.hack +++ b/tests/inference/Attribute/allowsClassStringFromDifferentNamespace/input.hack @@ -2,7 +2,7 @@ namespace NamespaceOne { use Attribute; - class FooAttribute implements HH\ClassAttribute + final class FooAttribute implements HH\ClassAttribute { public function __construct(private classname $className) {} @@ -10,7 +10,7 @@ namespace NamespaceOne { interface FoobarInterface {} - class Bar implements FoobarInterface {} + final class Bar implements FoobarInterface {} } namespace NamespaceTwo { @@ -18,6 +18,6 @@ namespace NamespaceTwo { use NamespaceOne\Bar as ZZ; <> - class Baz {} + final class Baz {} } \ No newline at end of file diff --git a/tests/inference/Attribute/allowsRepeatableFlag/input.hack b/tests/inference/Attribute/allowsRepeatableFlag/input.hack index e3b11716..db70b0c4 100644 --- a/tests/inference/Attribute/allowsRepeatableFlag/input.hack +++ b/tests/inference/Attribute/allowsRepeatableFlag/input.hack @@ -1,3 +1,3 @@ <> // results in int(127) -class A {} +final class A {} \ No newline at end of file diff --git a/tests/inference/Attribute/classAndPropertyAttributesExists/input.hack b/tests/inference/Attribute/classAndPropertyAttributesExists/input.hack index ea433488..d568fd13 100644 --- a/tests/inference/Attribute/classAndPropertyAttributesExists/input.hack +++ b/tests/inference/Attribute/classAndPropertyAttributesExists/input.hack @@ -1,15 +1,15 @@ namespace Foo; -class Table implements HH\ClassAttribute { +final class Table implements HH\ClassAttribute { public function __construct(public string $name) {} } -class Column implements HH\PropertyAttribute { +final class Column implements HH\PropertyAttribute { public function __construct(public string $name) {} } <> -class Video { +final class Video { <> public string $id = ""; @@ -18,7 +18,7 @@ class Video { } <> -class User { +final class User { public function __construct( <> public string $id, diff --git a/tests/inference/Attribute/convertKeyedArray/input.hack b/tests/inference/Attribute/convertKeyedArray/input.hack index 2186e40a..550ad37e 100644 --- a/tests/inference/Attribute/convertKeyedArray/input.hack +++ b/tests/inference/Attribute/convertKeyedArray/input.hack @@ -1,5 +1,5 @@ -class Route implements HH\ClassAttribute { +final class Route implements HH\ClassAttribute { public function __construct(private vec $methods = vec[]) {} } <> -class HealthController {} \ No newline at end of file +final class HealthController {} \ No newline at end of file diff --git a/tests/inference/Attribute/functionAttributeExists/input.hack b/tests/inference/Attribute/functionAttributeExists/input.hack index 88833790..952645a9 100644 --- a/tests/inference/Attribute/functionAttributeExists/input.hack +++ b/tests/inference/Attribute/functionAttributeExists/input.hack @@ -1,6 +1,6 @@ namespace { <> - class Deprecated {} + final class Deprecated {} } namespace Foo\Bar { diff --git a/tests/inference/Attribute/paramAttributeExists/input.hack b/tests/inference/Attribute/paramAttributeExists/input.hack index d4fb2d5a..fb44a236 100644 --- a/tests/inference/Attribute/paramAttributeExists/input.hack +++ b/tests/inference/Attribute/paramAttributeExists/input.hack @@ -1,5 +1,5 @@ namespace { - class Deprecated implements HH\ClassAttribute {} + final class Deprecated implements HH\ClassAttribute {} } namespace Foo\Bar { diff --git a/tests/inference/Class/extendException/input.hack b/tests/inference/Class/extendException/input.hack index 201dc0a2..23f33395 100644 --- a/tests/inference/Class/extendException/input.hack +++ b/tests/inference/Class/extendException/input.hack @@ -1,3 +1,3 @@ -class ME extends Exception { +final class ME extends Exception { protected $message = "hello"; } \ No newline at end of file diff --git a/tests/inference/Class/lessSpecificReturnStatement/input.hack b/tests/inference/Class/lessSpecificReturnStatement/input.hack index cec97352..9e7a1117 100644 --- a/tests/inference/Class/lessSpecificReturnStatement/input.hack +++ b/tests/inference/Class/lessSpecificReturnStatement/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A {} +abstract class A {} +final class B extends A {} function foo(A $a): B { return $a; diff --git a/tests/inference/Class/missingParentWithFunction/input.hack b/tests/inference/Class/missingParentWithFunction/input.hack index 3fbe5bee..9cf83b60 100644 --- a/tests/inference/Class/missingParentWithFunction/input.hack +++ b/tests/inference/Class/missingParentWithFunction/input.hack @@ -1,3 +1,3 @@ -class B extends C { +final class B extends C { public function fooA() { } } \ No newline at end of file diff --git a/tests/inference/Class/namespacedAliasedClassCall/input.hack b/tests/inference/Class/namespacedAliasedClassCall/input.hack index 45399fae..9f7da78d 100644 --- a/tests/inference/Class/namespacedAliasedClassCall/input.hack +++ b/tests/inference/Class/namespacedAliasedClassCall/input.hack @@ -1,5 +1,5 @@ namespace Aye { - class Foo {} + final class Foo {} } namespace Bee { use Aye as A; diff --git a/tests/inference/Class/overrideProtectedAccessLevelToPublic/input.hack b/tests/inference/Class/overrideProtectedAccessLevelToPublic/input.hack index 9f6dca7b..bbced263 100644 --- a/tests/inference/Class/overrideProtectedAccessLevelToPublic/input.hack +++ b/tests/inference/Class/overrideProtectedAccessLevelToPublic/input.hack @@ -1,7 +1,7 @@ -class A { +abstract class A { protected function fooFoo(): void {} } -class B extends A { +final class B extends A { public function fooFoo(): void {} } \ No newline at end of file diff --git a/tests/inference/Class/returnStringAfterIsACheckWithClassConst/input.hack b/tests/inference/Class/returnStringAfterIsACheckWithClassConst/input.hack index b9be1ed2..1320c6d9 100644 --- a/tests/inference/Class/returnStringAfterIsACheckWithClassConst/input.hack +++ b/tests/inference/Class/returnStringAfterIsACheckWithClassConst/input.hack @@ -1,4 +1,4 @@ -class Foo{} +final class Foo{} function bar(string $maybeBaz) : string { if (!is_a($maybeBaz, Foo::class, true)) { throw new Exception("not Foo"); diff --git a/tests/inference/Class/simpleInterface/input.hack b/tests/inference/Class/simpleInterface/input.hack index 30915b16..a65518c6 100644 --- a/tests/inference/Class/simpleInterface/input.hack +++ b/tests/inference/Class/simpleInterface/input.hack @@ -1,6 +1,6 @@ interface I {} -class A implements I {} +final class A implements I {} function takesI(KeyedContainer $i): void {} diff --git a/tests/inference/ClassLikeString/allowComparisonToStaticClassString/input.hack b/tests/inference/ClassLikeString/allowComparisonToStaticClassString/input.hack index 4c7a7020..14d7a6e7 100644 --- a/tests/inference/ClassLikeString/allowComparisonToStaticClassString/input.hack +++ b/tests/inference/ClassLikeString/allowComparisonToStaticClassString/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { const CLASSES = dict["foobar" => B::class]; public function foo(): bool { @@ -6,4 +6,4 @@ class A { } } -class B extends A {} \ No newline at end of file +final class B extends A {} \ No newline at end of file diff --git a/tests/inference/ClassLikeString/allowTraitClassComparison/input.hack b/tests/inference/ClassLikeString/allowTraitClassComparison/input.hack index 934de06b..27444f05 100644 --- a/tests/inference/ClassLikeString/allowTraitClassComparison/input.hack +++ b/tests/inference/ClassLikeString/allowTraitClassComparison/input.hack @@ -5,10 +5,10 @@ trait T { } } -class A { +final class A { use T; } -class B { +final class B { use T; } \ No newline at end of file diff --git a/tests/inference/ClassLikeString/arrayEquivalence/input.hack b/tests/inference/ClassLikeString/arrayEquivalence/input.hack index 00bf9485..a7be1496 100644 --- a/tests/inference/ClassLikeString/arrayEquivalence/input.hack +++ b/tests/inference/ClassLikeString/arrayEquivalence/input.hack @@ -1,5 +1,5 @@ -class A {} -class B {} +final class A {} +final class B {} $foo = vec[ A::class, diff --git a/tests/inference/ClassLikeString/compareGetClassToLiteralClass/input.hack b/tests/inference/ClassLikeString/compareGetClassToLiteralClass/input.hack index 34f03730..8d619a85 100644 --- a/tests/inference/ClassLikeString/compareGetClassToLiteralClass/input.hack +++ b/tests/inference/ClassLikeString/compareGetClassToLiteralClass/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A {} +abstract class A {} +final class B extends A {} function foo(A $a): void { if (get_class($a) === A::class) {} diff --git a/tests/inference/ClassLikeString/noCrashWhenClassExists/input.hack b/tests/inference/ClassLikeString/noCrashWhenClassExists/input.hack index 6403ef1f..3a7a2e31 100644 --- a/tests/inference/ClassLikeString/noCrashWhenClassExists/input.hack +++ b/tests/inference/ClassLikeString/noCrashWhenClassExists/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} if (class_exists(A::class)) { new \RuntimeException(); diff --git a/tests/inference/ClassLikeString/noCrashWhenClassExistsNegated/input.hack b/tests/inference/ClassLikeString/noCrashWhenClassExistsNegated/input.hack index 5cb10798..2a1c36de 100644 --- a/tests/inference/ClassLikeString/noCrashWhenClassExistsNegated/input.hack +++ b/tests/inference/ClassLikeString/noCrashWhenClassExistsNegated/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} if (!class_exists(A::class)) { new \RuntimeException(); diff --git a/tests/inference/ClassLikeString/refineStringToClassString/input.hack b/tests/inference/ClassLikeString/refineStringToClassString/input.hack index 81c6375f..105c486d 100644 --- a/tests/inference/ClassLikeString/refineStringToClassString/input.hack +++ b/tests/inference/ClassLikeString/refineStringToClassString/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(string $s) : ?A { if ($s !== A::class) { diff --git a/tests/inference/ClassLoadOrder/constSandwich/input.hack b/tests/inference/ClassLoadOrder/constSandwich/input.hack index c46835a5..122f293b 100644 --- a/tests/inference/ClassLoadOrder/constSandwich/input.hack +++ b/tests/inference/ClassLoadOrder/constSandwich/input.hack @@ -1,3 +1,3 @@ -class A { const B = 42;} +final class A { const B = 42;} $a = A::B; -class C {} \ No newline at end of file +final class C {} \ No newline at end of file diff --git a/tests/inference/ClassLoadOrder/referenceToClassInMethod/input.hack b/tests/inference/ClassLoadOrder/referenceToClassInMethod/input.hack index 29050388..bfa79b5c 100644 --- a/tests/inference/ClassLoadOrder/referenceToClassInMethod/input.hack +++ b/tests/inference/ClassLoadOrder/referenceToClassInMethod/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function b(A $b): void { $b->b(new A()); } diff --git a/tests/inference/ClassLoadOrder/referenceToSubclassInMethod/input.hack b/tests/inference/ClassLoadOrder/referenceToSubclassInMethod/input.hack index 2306d0af..10cf2e78 100644 --- a/tests/inference/ClassLoadOrder/referenceToSubclassInMethod/input.hack +++ b/tests/inference/ClassLoadOrder/referenceToSubclassInMethod/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { public function b(B $b): void { } @@ -8,7 +8,7 @@ class A { } } -class B extends A { +final class B extends A { public function d(): void { $this->c(); } diff --git a/tests/inference/ClassLoadOrder/singleFileInheritance/input.hack b/tests/inference/ClassLoadOrder/singleFileInheritance/input.hack index 743e7580..be6105af 100644 --- a/tests/inference/ClassLoadOrder/singleFileInheritance/input.hack +++ b/tests/inference/ClassLoadOrder/singleFileInheritance/input.hack @@ -1,6 +1,6 @@ -class A extends B {} +final class A extends B {} -class B { +abstract class B { public function fooFoo(): void { $a = new A(); $a->barBar(); diff --git a/tests/inference/ClassScope/accessiblePrivateMethodFromSubclass/input.hack b/tests/inference/ClassScope/accessiblePrivateMethodFromSubclass/input.hack index e19b9694..446440af 100644 --- a/tests/inference/ClassScope/accessiblePrivateMethodFromSubclass/input.hack +++ b/tests/inference/ClassScope/accessiblePrivateMethodFromSubclass/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private function fooFoo(): void { } diff --git a/tests/inference/ClassScope/accessibleProtectedMethodFromOtherSubclass/input.hack b/tests/inference/ClassScope/accessibleProtectedMethodFromOtherSubclass/input.hack index 9ac00fc5..4b47cbb5 100644 --- a/tests/inference/ClassScope/accessibleProtectedMethodFromOtherSubclass/input.hack +++ b/tests/inference/ClassScope/accessibleProtectedMethodFromOtherSubclass/input.hack @@ -1,11 +1,11 @@ -class A { +abstract class A { protected function fooFoo(): void { } } -class B extends A { } +final class B extends A { } -class C extends A { +final class C extends A { public function doFoo(): void { (new B())->fooFoo(); } diff --git a/tests/inference/ClassScope/accessibleProtectedMethodFromSubclass/input.hack b/tests/inference/ClassScope/accessibleProtectedMethodFromSubclass/input.hack index eafdcd98..fc9663f3 100644 --- a/tests/inference/ClassScope/accessibleProtectedMethodFromSubclass/input.hack +++ b/tests/inference/ClassScope/accessibleProtectedMethodFromSubclass/input.hack @@ -1,9 +1,9 @@ -class A { +abstract class A { protected function fooFoo(): void { } } -class B extends A { +final class B extends A { public function doFoo(): void { $this->fooFoo(); } diff --git a/tests/inference/ClassScope/allowMethodCallToProtectedFromParent/input.hack b/tests/inference/ClassScope/allowMethodCallToProtectedFromParent/input.hack index 74fbdadc..d430ce2e 100644 --- a/tests/inference/ClassScope/allowMethodCallToProtectedFromParent/input.hack +++ b/tests/inference/ClassScope/allowMethodCallToProtectedFromParent/input.hack @@ -1,10 +1,10 @@ -class A { +abstract class A { public function __construct() { B::foo(); } } -class B extends A { +final class B extends A { protected static function foo(): void { echo "here"; } diff --git a/tests/inference/Clone/cloneCorrect/input.hack b/tests/inference/Clone/cloneCorrect/input.hack index 4ff621cf..2c36181c 100644 --- a/tests/inference/Clone/cloneCorrect/input.hack +++ b/tests/inference/Clone/cloneCorrect/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(A $a) : A { return clone $a; } diff --git a/tests/inference/Clone/cloneCorrectWithPublicMethod/input.hack b/tests/inference/Clone/cloneCorrectWithPublicMethod/input.hack index b1e5a9c2..59b638b6 100644 --- a/tests/inference/Clone/cloneCorrectWithPublicMethod/input.hack +++ b/tests/inference/Clone/cloneCorrectWithPublicMethod/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __clone() {} } function foo(A $a) : A { diff --git a/tests/inference/Clone/clonePrivateInternally/input.hack b/tests/inference/Clone/clonePrivateInternally/input.hack index c8437d8a..a755a122 100644 --- a/tests/inference/Clone/clonePrivateInternally/input.hack +++ b/tests/inference/Clone/clonePrivateInternally/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private function __clone() {} public function foo(): A { return clone $this; diff --git a/tests/inference/ConstValues/classConstants/input.hack b/tests/inference/ConstValues/classConstants/input.hack index 2a368af3..b82b6c16 100644 --- a/tests/inference/ConstValues/classConstants/input.hack +++ b/tests/inference/ConstValues/classConstants/input.hack @@ -1,11 +1,11 @@ namespace NS { use OtherNS\C as E; - class A {} + abstract class A {} - class C extends A {} + final class C extends A {} - class D extends A {}; + final class D extends A {}; function foo(classname $s) : void {} @@ -19,5 +19,5 @@ namespace NS { } namespace OtherNS { - class C extends \NS\A {} + final class C extends \NS\A {} } \ No newline at end of file diff --git a/tests/inference/Constant/allowChecksAfterDefined/input.hack b/tests/inference/Constant/allowChecksAfterDefined/input.hack index 26471028..23e75715 100644 --- a/tests/inference/Constant/allowChecksAfterDefined/input.hack +++ b/tests/inference/Constant/allowChecksAfterDefined/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const STRING = "x"; public static function bar(string $s) : bool { diff --git a/tests/inference/Constant/classConstantPreciseType/input.hack b/tests/inference/Constant/classConstantPreciseType/input.hack index abcb7f9e..5b2f5e5b 100644 --- a/tests/inference/Constant/classConstantPreciseType/input.hack +++ b/tests/inference/Constant/classConstantPreciseType/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const string C = 'bar'; } diff --git a/tests/inference/Constant/evenMoreOutOfOrderConstants/input.hack b/tests/inference/Constant/evenMoreOutOfOrderConstants/input.hack index 9f906181..61f380e4 100644 --- a/tests/inference/Constant/evenMoreOutOfOrderConstants/input.hack +++ b/tests/inference/Constant/evenMoreOutOfOrderConstants/input.hack @@ -1,13 +1,13 @@ -class A { +abstract class A { const X = self::Y; const Y = 3; } -class C extends B { +final class C extends B { } const Z = C::X; -class B extends A { +abstract class B extends A { const Z = self::X; } \ No newline at end of file diff --git a/tests/inference/Constant/getClassConstantValue/input.hack b/tests/inference/Constant/getClassConstantValue/input.hack index a2eef9e0..ee4fd403 100644 --- a/tests/inference/Constant/getClassConstantValue/input.hack +++ b/tests/inference/Constant/getClassConstantValue/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const B = vec[0, 1, 2]; } diff --git a/tests/inference/Constant/magicConstRef/input.hack b/tests/inference/Constant/magicConstRef/input.hack index 0ea06143..8e50b313 100644 --- a/tests/inference/Constant/magicConstRef/input.hack +++ b/tests/inference/Constant/magicConstRef/input.hack @@ -1,6 +1,6 @@ use namespace HH\Lib\{Dict, Vec}; -class Codegen { +final class Codegen { const string FOO = 'foo'; public static function forPath(string $foo): this {} public function bar(): void {} diff --git a/tests/inference/Constant/onlyMatchingConstantOffset/input.hack b/tests/inference/Constant/onlyMatchingConstantOffset/input.hack index cc442408..93f657b1 100644 --- a/tests/inference/Constant/onlyMatchingConstantOffset/input.hack +++ b/tests/inference/Constant/onlyMatchingConstantOffset/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const KEYS = vec["one", "two", "three"]; const ARR = dict[ "one" => 1, diff --git a/tests/inference/Constant/protectedClassConstantAccessibilitySameNameInChild/input.hack b/tests/inference/Constant/protectedClassConstantAccessibilitySameNameInChild/input.hack index 2c55b47f..5504d360 100644 --- a/tests/inference/Constant/protectedClassConstantAccessibilitySameNameInChild/input.hack +++ b/tests/inference/Constant/protectedClassConstantAccessibilitySameNameInChild/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { const A = 1; public static function test(): void { @@ -6,7 +6,7 @@ class A { } } -class B extends A { +final class B extends A { const A = 2; } diff --git a/tests/inference/Constant/stringArrayOffset/input.hack b/tests/inference/Constant/stringArrayOffset/input.hack index 44bda610..a8b6bada 100644 --- a/tests/inference/Constant/stringArrayOffset/input.hack +++ b/tests/inference/Constant/stringArrayOffset/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const C = dict[ "a" => 1, "b" => 2, diff --git a/tests/inference/Enum/casesReferenceClassConstants/input.hack b/tests/inference/Enum/casesReferenceClassConstants/input.hack index 784cf5d6..f8f28889 100644 --- a/tests/inference/Enum/casesReferenceClassConstants/input.hack +++ b/tests/inference/Enum/casesReferenceClassConstants/input.hack @@ -1,4 +1,4 @@ -class SomeClass { +final class SomeClass { const string A = 'a'; const string B = 'b'; const string C = 'c'; diff --git a/tests/inference/EnumClass/getValues/input.hack b/tests/inference/EnumClass/getValues/input.hack index 67e029ca..df80bf5e 100644 --- a/tests/inference/EnumClass/getValues/input.hack +++ b/tests/inference/EnumClass/getValues/input.hack @@ -3,14 +3,14 @@ interface IHasName { public function name(): string; } -class HasName implements IHasName { +final class HasName implements IHasName { public function __construct(private string $name)[] {} public function name(): string { return $this->name; } } -class ConstName implements IHasName { +final class ConstName implements IHasName { public function name(): string { return "bar"; } diff --git a/tests/inference/EnumClass/inheritance/input.hack b/tests/inference/EnumClass/inheritance/input.hack index d51cd67c..3ada3a8b 100644 --- a/tests/inference/EnumClass/inheritance/input.hack +++ b/tests/inference/EnumClass/inheritance/input.hack @@ -3,14 +3,14 @@ interface IHasName { public function name(): string; } -class HasName implements IHasName { +final class HasName implements IHasName { public function __construct(private string $name)[] {} public function name(): string { return $this->name; } } -class ConstName implements IHasName { +final class ConstName implements IHasName { public function name(): string { return "bar"; } diff --git a/tests/inference/FunctionCall/SKIPPED-getClassNewInstance/input.hack b/tests/inference/FunctionCall/SKIPPED-getClassNewInstance/input.hack index 62f458b4..be333528 100644 --- a/tests/inference/FunctionCall/SKIPPED-getClassNewInstance/input.hack +++ b/tests/inference/FunctionCall/SKIPPED-getClassNewInstance/input.hack @@ -1,7 +1,7 @@ interface I {} -class C implements I {} +final class C implements I {} -class Props { +final class Props { public vec> $arr = vec[]; } diff --git a/tests/inference/FunctionCall/SKIPPED-getClassVariable/input.hack b/tests/inference/FunctionCall/SKIPPED-getClassVariable/input.hack index 872d40c3..da230939 100644 --- a/tests/inference/FunctionCall/SKIPPED-getClassVariable/input.hack +++ b/tests/inference/FunctionCall/SKIPPED-getClassVariable/input.hack @@ -1,11 +1,11 @@ interface I {} -class C implements I {} +final class C implements I {} function foo(): void { $c_instance = new C(); (new Props())->arr[] = get_class($c_instance); } -class Props { +final class Props { public vec> $arr = vec[]; } diff --git a/tests/inference/FunctionCall/builtinFunctioninvalidArgumentWithDeclareStrictTypesInClass/input.hack b/tests/inference/FunctionCall/builtinFunctioninvalidArgumentWithDeclareStrictTypesInClass/input.hack index 0d928f37..f4360655 100644 --- a/tests/inference/FunctionCall/builtinFunctioninvalidArgumentWithDeclareStrictTypesInClass/input.hack +++ b/tests/inference/FunctionCall/builtinFunctioninvalidArgumentWithDeclareStrictTypesInClass/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo() : void { $s = substr(5, 4); } diff --git a/tests/inference/FunctionCall/countOnPureObjectIsPure/input.hack b/tests/inference/FunctionCall/countOnPureObjectIsPure/input.hack index 3c722184..e64441f5 100644 --- a/tests/inference/FunctionCall/countOnPureObjectIsPure/input.hack +++ b/tests/inference/FunctionCall/countOnPureObjectIsPure/input.hack @@ -1,4 +1,4 @@ -class PureCountable implements \Countable { +final class PureCountable implements \Countable { public function count()[]: int { return 1; } } function example(PureCountable $x)[] : int { diff --git a/tests/inference/FunctionCall/noNamespaceClash/input.hack b/tests/inference/FunctionCall/noNamespaceClash/input.hack index 171b69cc..2664107f 100644 --- a/tests/inference/FunctionCall/noNamespaceClash/input.hack +++ b/tests/inference/FunctionCall/noNamespaceClash/input.hack @@ -3,7 +3,7 @@ namespace FunctionNamespace { } namespace ClassNamespace { - class Foo {} + final class Foo {} } namespace { diff --git a/tests/inference/FunctionCall/possiblyUndefinedArrayDestructurationOnOptionalArg/input.hack b/tests/inference/FunctionCall/possiblyUndefinedArrayDestructurationOnOptionalArg/input.hack index aac7bff5..332a8a18 100644 --- a/tests/inference/FunctionCall/possiblyUndefinedArrayDestructurationOnOptionalArg/input.hack +++ b/tests/inference/FunctionCall/possiblyUndefinedArrayDestructurationOnOptionalArg/input.hack @@ -1,4 +1,4 @@ -class A +final class A { } diff --git a/tests/inference/FunctionCall/typeCoercion/input.hack b/tests/inference/FunctionCall/typeCoercion/input.hack index bd6fa5ce..942ea2e6 100644 --- a/tests/inference/FunctionCall/typeCoercion/input.hack +++ b/tests/inference/FunctionCall/typeCoercion/input.hack @@ -1,5 +1,7 @@ -class A {} -class B extends A{} +abstract class A {} +final class B extends A{} function fooFoo(B $b): void {} -fooFoo(new A()); \ No newline at end of file +function bar(A $a): void { + fooFoo($a); +} \ No newline at end of file diff --git a/tests/inference/FunctionCall/typedArrayWithDefault/input.hack b/tests/inference/FunctionCall/typedArrayWithDefault/input.hack index 090fc7c0..169bcbb1 100644 --- a/tests/inference/FunctionCall/typedArrayWithDefault/input.hack +++ b/tests/inference/FunctionCall/typedArrayWithDefault/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function fooFoo(dict $a = dict[]): void { diff --git a/tests/inference/FunctionCall/validCallables/input.hack b/tests/inference/FunctionCall/validCallables/input.hack index 90de0559..1dae326e 100644 --- a/tests/inference/FunctionCall/validCallables/input.hack +++ b/tests/inference/FunctionCall/validCallables/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public static function b() : void {} } diff --git a/tests/inference/Generics/Class/InvalidPropertyAssignment/input.hack b/tests/inference/Generics/Class/InvalidPropertyAssignment/input.hack index de5e33a8..04a13211 100644 --- a/tests/inference/Generics/Class/InvalidPropertyAssignment/input.hack +++ b/tests/inference/Generics/Class/InvalidPropertyAssignment/input.hack @@ -1,5 +1,5 @@ { +final class Inv { public function __construct(public T $item) { } } diff --git a/tests/inference/Generics/Class/assertOnTemplatedProperty/input.hack b/tests/inference/Generics/Class/assertOnTemplatedProperty/input.hack index 7f73db06..18616c58 100644 --- a/tests/inference/Generics/Class/assertOnTemplatedProperty/input.hack +++ b/tests/inference/Generics/Class/assertOnTemplatedProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(private T $t) {} public function foo() { diff --git a/tests/inference/Generics/Class/changePropertyTypeOfTemplate/input.hack b/tests/inference/Generics/Class/changePropertyTypeOfTemplate/input.hack index 01b3c2ef..5fe79320 100644 --- a/tests/inference/Generics/Class/changePropertyTypeOfTemplate/input.hack +++ b/tests/inference/Generics/Class/changePropertyTypeOfTemplate/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public int $x = 0; } diff --git a/tests/inference/Generics/Class/classFunctionGenericNested/input.hack b/tests/inference/Generics/Class/classFunctionGenericNested/input.hack index e3c7a6c3..cfd6e536 100644 --- a/tests/inference/Generics/Class/classFunctionGenericNested/input.hack +++ b/tests/inference/Generics/Class/classFunctionGenericNested/input.hack @@ -1,6 +1,6 @@ abstract class A {} -class B { +final class B { public static function coerce( vec $items, ): vec { diff --git a/tests/inference/Generics/Class/classInstanceHasClosureType/input.hack b/tests/inference/Generics/Class/classInstanceHasClosureType/input.hack index 8a431455..2da834da 100644 --- a/tests/inference/Generics/Class/classInstanceHasClosureType/input.hack +++ b/tests/inference/Generics/Class/classInstanceHasClosureType/input.hack @@ -1,5 +1,5 @@ -class A {} -class AChild extends A { +abstract class A {} +final class AChild extends A { public function foo(): string { return "cool"; } diff --git a/tests/inference/Generics/Class/classTypeConstant/input.hack b/tests/inference/Generics/Class/classTypeConstant/input.hack index 2661ef6b..cf39fae2 100644 --- a/tests/inference/Generics/Class/classTypeConstant/input.hack +++ b/tests/inference/Generics/Class/classTypeConstant/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { const type TConstructorShape = shape( ?'a' => ?string, ?'b' => ?int, diff --git a/tests/inference/Generics/Class/newWithPlaceholderType/input.hack b/tests/inference/Generics/Class/newWithPlaceholderType/input.hack index 055a3604..8a184264 100644 --- a/tests/inference/Generics/Class/newWithPlaceholderType/input.hack +++ b/tests/inference/Generics/Class/newWithPlaceholderType/input.hack @@ -1,4 +1,4 @@ -class MyCollection { +final class MyCollection { public function __construct(public vec $members) { $this->members = $members; } diff --git a/tests/inference/Generics/Class/newWithoutType/input.hack b/tests/inference/Generics/Class/newWithoutType/input.hack index 396e821e..5555db1a 100644 --- a/tests/inference/Generics/Class/newWithoutType/input.hack +++ b/tests/inference/Generics/Class/newWithoutType/input.hack @@ -1,4 +1,4 @@ -class MyCollection { +final class MyCollection { public function __construct(public vec $members) { $this->members = $members; } diff --git a/tests/inference/Generics/Class/newWithoutTypeSendingToMixed/input.hack b/tests/inference/Generics/Class/newWithoutTypeSendingToMixed/input.hack index dc8389bc..4923f7e1 100644 --- a/tests/inference/Generics/Class/newWithoutTypeSendingToMixed/input.hack +++ b/tests/inference/Generics/Class/newWithoutTypeSendingToMixed/input.hack @@ -1,4 +1,4 @@ -class MyCollection { +final class MyCollection { public function __construct(public vec $members) { $this->members = $members; } diff --git a/tests/inference/Generics/Class/skipped-mapPositionGenericsParam/input.hack b/tests/inference/Generics/Class/skipped-mapPositionGenericsParam/input.hack index ac9b968b..5cfea7d6 100644 --- a/tests/inference/Generics/Class/skipped-mapPositionGenericsParam/input.hack +++ b/tests/inference/Generics/Class/skipped-mapPositionGenericsParam/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(private (function(T): string) $fn) {} } diff --git a/tests/inference/Generics/Class/skipped-mapPositionGenericsReturn/input.hack b/tests/inference/Generics/Class/skipped-mapPositionGenericsReturn/input.hack index ca19ca45..2a9725c4 100644 --- a/tests/inference/Generics/Class/skipped-mapPositionGenericsReturn/input.hack +++ b/tests/inference/Generics/Class/skipped-mapPositionGenericsReturn/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(private (function(T): string) $fn) {} } diff --git a/tests/inference/Generics/ClassExtends/classStringExtends/input.hack b/tests/inference/Generics/ClassExtends/classStringExtends/input.hack index cca1d0ca..44c12a3c 100644 --- a/tests/inference/Generics/ClassExtends/classStringExtends/input.hack +++ b/tests/inference/Generics/ClassExtends/classStringExtends/input.hack @@ -8,4 +8,4 @@ final class GlassMaker extends Maker { abstract class MakerEvent {} -class GlassMakerEvent extends MakerEvent {} \ No newline at end of file +final class GlassMakerEvent extends MakerEvent {} \ No newline at end of file diff --git a/tests/inference/Generics/ClassExtends/constructorCheckInChildClassArrayType/input.hack b/tests/inference/Generics/ClassExtends/constructorCheckInChildClassArrayType/input.hack index b99a1044..81bb1e07 100644 --- a/tests/inference/Generics/ClassExtends/constructorCheckInChildClassArrayType/input.hack +++ b/tests/inference/Generics/ClassExtends/constructorCheckInChildClassArrayType/input.hack @@ -17,6 +17,6 @@ abstract class C } } -class Impl implements I {} +final class Impl implements I {} -class Test extends C {} \ No newline at end of file +final class Test extends C {} \ No newline at end of file diff --git a/tests/inference/Generics/ClassExtends/extendsArrayIterator/input.hack b/tests/inference/Generics/ClassExtends/extendsArrayIterator/input.hack index 2f540f2a..22a91bc8 100644 --- a/tests/inference/Generics/ClassExtends/extendsArrayIterator/input.hack +++ b/tests/inference/Generics/ClassExtends/extendsArrayIterator/input.hack @@ -1,6 +1,6 @@ -class User {} +final class User {} -class Users extends ArrayIterator +final class Users extends ArrayIterator { public function __construct(User ...$users) { parent::__construct($users); diff --git a/tests/inference/Generics/ClassExtends/extendsClassWithTypeAlias/input.hack b/tests/inference/Generics/ClassExtends/extendsClassWithTypeAlias/input.hack index 100a77e7..4691e8c6 100644 --- a/tests/inference/Generics/ClassExtends/extendsClassWithTypeAlias/input.hack +++ b/tests/inference/Generics/ClassExtends/extendsClassWithTypeAlias/input.hack @@ -2,7 +2,7 @@ interface Foo {} type MyString = string; -class MyFoo implements Foo {} +final class MyFoo implements Foo {} function takesFoo(Foo $foo): void {} diff --git a/tests/inference/Generics/ClassExtends/extendsCovariantly/input.hack b/tests/inference/Generics/ClassExtends/extendsCovariantly/input.hack index 122d1789..f1bdc376 100644 --- a/tests/inference/Generics/ClassExtends/extendsCovariantly/input.hack +++ b/tests/inference/Generics/ClassExtends/extendsCovariantly/input.hack @@ -2,7 +2,7 @@ abstract class SomeParent<+T> { public function __construct(public T $t) {} } -class SomeChild<+T> extends SomeParent {} +final class SomeChild<+T> extends SomeParent {} function foo( vec string)> $vec, diff --git a/tests/inference/Generics/ClassExtends/extendsShape/input.hack b/tests/inference/Generics/ClassExtends/extendsShape/input.hack index 222baea9..1024457f 100644 --- a/tests/inference/Generics/ClassExtends/extendsShape/input.hack +++ b/tests/inference/Generics/ClassExtends/extendsShape/input.hack @@ -1,12 +1,12 @@ type foo = shape('a' => int, ...); type foo_extended = shape('a' => int, 'b' => int, ...); -class Maker { +abstract class Maker { public function __construct(T $args) {} } -class ExtendedMaker extends Maker {} -class FurtherExtendedMaker extends ExtendedMaker {} +abstract class ExtendedMaker extends Maker {} +final class FurtherExtendedMaker extends ExtendedMaker {} function bar(): void { new FurtherExtendedMaker(shape('a' => 5, 'b' => 6)); diff --git a/tests/inference/Generics/ClassExtends/extendsWithMixed/input.hack b/tests/inference/Generics/ClassExtends/extendsWithMixed/input.hack index ae60a749..86eeef97 100644 --- a/tests/inference/Generics/ClassExtends/extendsWithMixed/input.hack +++ b/tests/inference/Generics/ClassExtends/extendsWithMixed/input.hack @@ -2,7 +2,7 @@ abstract class SomeParent { public function __construct(public T $t) {} } -class SomeChild extends SomeParent {} +final class SomeChild extends SomeParent {} function foo($m): SomeParent { return new SomeChild($m); diff --git a/tests/inference/Generics/ClassExtends/iterateOverSelfImplementedIterator/input.hack b/tests/inference/Generics/ClassExtends/iterateOverSelfImplementedIterator/input.hack index bea175fd..cc358c10 100644 --- a/tests/inference/Generics/ClassExtends/iterateOverSelfImplementedIterator/input.hack +++ b/tests/inference/Generics/ClassExtends/iterateOverSelfImplementedIterator/input.hack @@ -1,7 +1,7 @@ -class O {} -class Foo extends O {} +abstract class O {} +final class Foo extends O {} -class FooCollection extends Iterator { +final class FooCollection extends Iterator { private function iterate() : void { foreach ($this as $foo) {} } diff --git a/tests/inference/Generics/ClassExtends/refineGenericWithInstanceof/input.hack b/tests/inference/Generics/ClassExtends/refineGenericWithInstanceof/input.hack index cfb28dc9..5784957f 100644 --- a/tests/inference/Generics/ClassExtends/refineGenericWithInstanceof/input.hack +++ b/tests/inference/Generics/ClassExtends/refineGenericWithInstanceof/input.hack @@ -1,6 +1,6 @@ interface Maybe {} -class Some implements Maybe { +final class Some implements Maybe { public function __construct(private T $value) {} public function extract(): T { diff --git a/tests/inference/Generics/ClassExtends/templateCountOnExtendedAndImplemented/input.hack b/tests/inference/Generics/ClassExtends/templateCountOnExtendedAndImplemented/input.hack index 1f901dd2..246065bd 100644 --- a/tests/inference/Generics/ClassExtends/templateCountOnExtendedAndImplemented/input.hack +++ b/tests/inference/Generics/ClassExtends/templateCountOnExtendedAndImplemented/input.hack @@ -1,7 +1,7 @@ interface Selectable {} -class Repository implements Selectable {} +abstract class Repository implements Selectable {} interface SomeEntity {} -class SomeRepository extends Repository {} \ No newline at end of file +final class SomeRepository extends Repository {} \ No newline at end of file diff --git a/tests/inference/Generics/ClassExtends/traitImplementsGeneric/input.hack b/tests/inference/Generics/ClassExtends/traitImplementsGeneric/input.hack index 4f5d39d1..5f9bf6ed 100644 --- a/tests/inference/Generics/ClassExtends/traitImplementsGeneric/input.hack +++ b/tests/inference/Generics/ClassExtends/traitImplementsGeneric/input.hack @@ -6,7 +6,7 @@ interface I { trait MyTrait implements I { } -class C {} +final class C {} abstract class Base { public function getVec(): vec { @@ -14,7 +14,7 @@ abstract class Base { } } -class Concrete extends Base { +final class Concrete extends Base { use MyTrait; public function takesVec(vec $v): void {} diff --git a/tests/inference/Generics/Classname/classnameProperty/input.hack b/tests/inference/Generics/Classname/classnameProperty/input.hack index 579a08f0..23d5c6ee 100644 --- a/tests/inference/Generics/Classname/classnameProperty/input.hack +++ b/tests/inference/Generics/Classname/classnameProperty/input.hack @@ -4,7 +4,7 @@ final class Reesource { ) {} } -class A {} +final class A {} function expectsResourceA(Reesource $_res): void {} diff --git a/tests/inference/Generics/Function/asNullable/input.hack b/tests/inference/Generics/Function/asNullable/input.hack index 8a709f3f..eb74e00d 100644 --- a/tests/inference/Generics/Function/asNullable/input.hack +++ b/tests/inference/Generics/Function/asNullable/input.hack @@ -1,5 +1,5 @@ abstract class Node {} -class FooNode extends Node {} +final class FooNode extends Node {} function foo(T $t): FooNode { return $t as FooNode; diff --git a/tests/inference/Generics/Function/staticMethod/input.hack b/tests/inference/Generics/Function/staticMethod/input.hack index 0a6a1ba4..c477f2ee 100644 --- a/tests/inference/Generics/Function/staticMethod/input.hack +++ b/tests/inference/Generics/Function/staticMethod/input.hack @@ -1,9 +1,9 @@ -class A {} -class B extends A { +abstract class A {} +final class B extends A { public function bar(): void {} } -class Config { +final class Config { public static function get(): T { throw new \Exception("bad"); } diff --git a/tests/inference/Generics/NestedGenerics/extendClassAndThrow/input.hack b/tests/inference/Generics/NestedGenerics/extendClassAndThrow/input.hack index 47f450da..c2f7d229 100644 --- a/tests/inference/Generics/NestedGenerics/extendClassAndThrow/input.hack +++ b/tests/inference/Generics/NestedGenerics/extendClassAndThrow/input.hack @@ -1,4 +1,4 @@ -class ExpectObj extends Assert { +abstract class ExpectObj extends Assert { public function __construct(private T $var) {} public function toThrow( diff --git a/tests/inference/Generics/NestedGenerics/nestedTemplateExtends/input.hack b/tests/inference/Generics/NestedGenerics/nestedTemplateExtends/input.hack index eaf89f85..f88b38ef 100644 --- a/tests/inference/Generics/NestedGenerics/nestedTemplateExtends/input.hack +++ b/tests/inference/Generics/NestedGenerics/nestedTemplateExtends/input.hack @@ -6,11 +6,11 @@ abstract class BaseModel {} abstract class BaseRepository> {} -class StudentViewData implements IBaseViewData {} -class TeacherViewData implements IBaseViewData {} +final class StudentViewData implements IBaseViewData {} +final class TeacherViewData implements IBaseViewData {} -class StudentModel extends BaseModel {} -class TeacherModel extends BaseModel {} +final class StudentModel extends BaseModel {} +final class TeacherModel extends BaseModel {} -class StudentRepository extends BaseRepository {} -class TeacherRepository extends BaseRepository{} \ No newline at end of file +final class StudentRepository extends BaseRepository {} +final class TeacherRepository extends BaseRepository{} \ No newline at end of file diff --git a/tests/inference/Generics/NestedGenerics/whereConstraint/input.hack b/tests/inference/Generics/NestedGenerics/whereConstraint/input.hack index 274ab05a..c96939a6 100644 --- a/tests/inference/Generics/NestedGenerics/whereConstraint/input.hack +++ b/tests/inference/Generics/NestedGenerics/whereConstraint/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public T $t) {} public function getNonnull(): Tu where T = ?Tu { if ($this->t is null) { diff --git a/tests/inference/Generics/Reified/coerceReifiedAs/input.hack b/tests/inference/Generics/Reified/coerceReifiedAs/input.hack index 8429a367..4cfcf5f6 100644 --- a/tests/inference/Generics/Reified/coerceReifiedAs/input.hack +++ b/tests/inference/Generics/Reified/coerceReifiedAs/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function coerce<<<__Enforceable>> reify T as A>(A $a): T { $a as T; diff --git a/tests/inference/Generics/Reified/coerceReifiedNullableAs/input.hack b/tests/inference/Generics/Reified/coerceReifiedNullableAs/input.hack index 3c5fc63c..966216ea 100644 --- a/tests/inference/Generics/Reified/coerceReifiedNullableAs/input.hack +++ b/tests/inference/Generics/Reified/coerceReifiedNullableAs/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function coerce<<<__Enforceable>> reify T as A>(A $a): T { $b = $a ?as T; diff --git a/tests/inference/Generics/Reified/simpleEnforceable/input.hack b/tests/inference/Generics/Reified/simpleEnforceable/input.hack index b5101118..63ee7482 100644 --- a/tests/inference/Generics/Reified/simpleEnforceable/input.hack +++ b/tests/inference/Generics/Reified/simpleEnforceable/input.hack @@ -1,5 +1,5 @@ interface ConfigSection {} -class WhoIsCoolConfig extends ConfigSection { +final class WhoIsCoolConfig extends ConfigSection { public function __construct(private string $name = "Matt") {} public function getName(): string { @@ -7,7 +7,7 @@ class WhoIsCoolConfig extends ConfigSection { } } -class Config { +final class Config { private static dict $config_sections = dict[]; private static function initConfig(): void { diff --git a/tests/inference/Generics/Typename/matchesTypeStructure/input.hack b/tests/inference/Generics/Typename/matchesTypeStructure/input.hack index 2b8bedaf..7f62c5c1 100644 --- a/tests/inference/Generics/Typename/matchesTypeStructure/input.hack +++ b/tests/inference/Generics/Typename/matchesTypeStructure/input.hack @@ -1,7 +1,7 @@ function matches_type_structure(TypeStructure $ts, mixed $value): T { } -class A { +final class A { const type T_B = shape('c' => string); } diff --git a/tests/inference/Generics/Typename/typeNameEqualsLiteralClassname/input.hack b/tests/inference/Generics/Typename/typeNameEqualsLiteralClassname/input.hack index a3c2d8a4..af5e7a48 100644 --- a/tests/inference/Generics/Typename/typeNameEqualsLiteralClassname/input.hack +++ b/tests/inference/Generics/Typename/typeNameEqualsLiteralClassname/input.hack @@ -1,5 +1,5 @@ -class A {} -class B {} +final class A {} +final class B {} function foo(typename $t): void { if ($t === A::class) { diff --git a/tests/inference/Generics/Typename/typenameProperty/input.hack b/tests/inference/Generics/Typename/typenameProperty/input.hack index d8bb932a..1a6384c3 100644 --- a/tests/inference/Generics/Typename/typenameProperty/input.hack +++ b/tests/inference/Generics/Typename/typenameProperty/input.hack @@ -4,7 +4,7 @@ final class Reesource { ) {} } -class A {} +final class A {} function expectsResourceA(Reesource $_res): void {} diff --git a/tests/inference/Immutable/writeArrayValueOnImmutableProperty/input.hack b/tests/inference/Immutable/writeArrayValueOnImmutableProperty/input.hack index baf7c4b2..fb77e081 100644 --- a/tests/inference/Immutable/writeArrayValueOnImmutableProperty/input.hack +++ b/tests/inference/Immutable/writeArrayValueOnImmutableProperty/input.hack @@ -4,7 +4,7 @@ type foo_t = shape( ); <> -class A { +final class A { public function __construct( public dict $arr, protected foo_t $foo, diff --git a/tests/inference/Immutable/writeImmutableDefinedOnTrait/input.hack b/tests/inference/Immutable/writeImmutableDefinedOnTrait/input.hack index 4f7d5461..6c188533 100644 --- a/tests/inference/Immutable/writeImmutableDefinedOnTrait/input.hack +++ b/tests/inference/Immutable/writeImmutableDefinedOnTrait/input.hack @@ -6,7 +6,7 @@ trait T { } } -class A { +final class A { use T; public function mutate() { diff --git a/tests/inference/Immutable/writeImmutablePropertyAfterClone/input.hack b/tests/inference/Immutable/writeImmutablePropertyAfterClone/input.hack index 09e90f10..c6434340 100644 --- a/tests/inference/Immutable/writeImmutablePropertyAfterClone/input.hack +++ b/tests/inference/Immutable/writeImmutablePropertyAfterClone/input.hack @@ -1,5 +1,5 @@ <> -class A { +final class A { public function __construct(public int $b) {} public function mutate(): A { diff --git a/tests/inference/Immutable/writeImmutablePropertyWithoutClone/input.hack b/tests/inference/Immutable/writeImmutablePropertyWithoutClone/input.hack index a3aba1ec..8b2ba2c0 100644 --- a/tests/inference/Immutable/writeImmutablePropertyWithoutClone/input.hack +++ b/tests/inference/Immutable/writeImmutablePropertyWithoutClone/input.hack @@ -1,5 +1,5 @@ <> -class A { +final class A { public function __construct(public int $b) {} public function mutate() { diff --git a/tests/inference/Interface/correctClassCasing/input.hack b/tests/inference/Interface/correctClassCasing/input.hack index 1b3615a0..384e6c7e 100644 --- a/tests/inference/Interface/correctClassCasing/input.hack +++ b/tests/inference/Interface/correctClassCasing/input.hack @@ -4,7 +4,7 @@ interface F { abstract class G implements F {} -class H extends G { +final class H extends G { public function m(): F { return $this; } diff --git a/tests/inference/Interface/correctInterfaceMethodSignature/input.hack b/tests/inference/Interface/correctInterfaceMethodSignature/input.hack index 39faf94a..3f36a161 100644 --- a/tests/inference/Interface/correctInterfaceMethodSignature/input.hack +++ b/tests/inference/Interface/correctInterfaceMethodSignature/input.hack @@ -2,7 +2,7 @@ interface A { public function fooFoo(int $a): void; } -class B implements A { +final class B implements A { public function fooFoo(int $a): void { } diff --git a/tests/inference/Interface/delayedInterface/input.hack b/tests/inference/Interface/delayedInterface/input.hack index dabc2c33..8070e5ff 100644 --- a/tests/inference/Interface/delayedInterface/input.hack +++ b/tests/inference/Interface/delayedInterface/input.hack @@ -1,8 +1,8 @@ // fails in PHP, whatcha gonna do $c = new C(); -class A { } +abstract class A { } interface B { } -class C extends A implements B { } \ No newline at end of file +final class C extends A implements B { } \ No newline at end of file diff --git a/tests/inference/Interface/extendIteratorIterator/input.hack b/tests/inference/Interface/extendIteratorIterator/input.hack index dbe95aea..bfc766b2 100644 --- a/tests/inference/Interface/extendIteratorIterator/input.hack +++ b/tests/inference/Interface/extendIteratorIterator/input.hack @@ -1 +1 @@ -class SomeIterator extends IteratorIterator {} \ No newline at end of file +final class SomeIterator extends IteratorIterator {} \ No newline at end of file diff --git a/tests/inference/Interface/implementsPartialInterfaceMethods/input.hack b/tests/inference/Interface/implementsPartialInterfaceMethods/input.hack index 80c9af71..96d9c9b3 100644 --- a/tests/inference/Interface/implementsPartialInterfaceMethods/input.hack +++ b/tests/inference/Interface/implementsPartialInterfaceMethods/input.hack @@ -9,7 +9,7 @@ abstract class A implements I { return "hello"; } } -class B extends A { +final class B extends A { public function bar() { return "goodbye"; } diff --git a/tests/inference/Interface/interfaceInstanceofAndReturn/input.hack b/tests/inference/Interface/interfaceInstanceofAndReturn/input.hack index 907d2f8a..ecb84fe3 100644 --- a/tests/inference/Interface/interfaceInstanceofAndReturn/input.hack +++ b/tests/inference/Interface/interfaceInstanceofAndReturn/input.hack @@ -1,7 +1,7 @@ interface A {} interface B {} -class C implements A, B {} +final class C implements A, B {} function foo(A $i): B { if ($i is B) { diff --git a/tests/inference/Interface/interfaceInstanceofInterfaceOrClass/input.hack b/tests/inference/Interface/interfaceInstanceofInterfaceOrClass/input.hack index 49a6e022..fc27226d 100644 --- a/tests/inference/Interface/interfaceInstanceofInterfaceOrClass/input.hack +++ b/tests/inference/Interface/interfaceInstanceofInterfaceOrClass/input.hack @@ -1,5 +1,5 @@ interface A {} -class B extends Exception {} +final class B extends Exception {} function foo(Throwable $e): void { if ($e is A || $e is B) { @@ -9,7 +9,7 @@ function foo(Throwable $e): void { return; } -class C extends Exception {} +final class C extends Exception {} interface D {} function bar(Throwable $e): void { diff --git a/tests/inference/Interface/interfaceInstanceofReturningInitial/input.hack b/tests/inference/Interface/interfaceInstanceofReturningInitial/input.hack index dd1a11ca..211bd5ee 100644 --- a/tests/inference/Interface/interfaceInstanceofReturningInitial/input.hack +++ b/tests/inference/Interface/interfaceInstanceofReturningInitial/input.hack @@ -1,7 +1,7 @@ interface A {} interface B {} -class C implements A, B {} +final class C implements A, B {} function takesB(B $b): void {} diff --git a/tests/inference/Interface/interfaceMethodImplementedInParent/input.hack b/tests/inference/Interface/interfaceMethodImplementedInParent/input.hack index e7e2b1e2..79534943 100644 --- a/tests/inference/Interface/interfaceMethodImplementedInParent/input.hack +++ b/tests/inference/Interface/interfaceMethodImplementedInParent/input.hack @@ -2,10 +2,10 @@ interface MyInterface { public function fooFoo(int $a): void; } -class B { +abstract class B { public function fooFoo(int $a): void { } } -class C extends B implements MyInterface { } \ No newline at end of file +final class C extends B implements MyInterface { } \ No newline at end of file diff --git a/tests/inference/Interface/interfaceMethodSignatureInTrait/input.hack b/tests/inference/Interface/interfaceMethodSignatureInTrait/input.hack index 2f17a0a0..9a17dbdb 100644 --- a/tests/inference/Interface/interfaceMethodSignatureInTrait/input.hack +++ b/tests/inference/Interface/interfaceMethodSignatureInTrait/input.hack @@ -7,6 +7,6 @@ trait T { } } -class B implements A { +final class B implements A { use T; } \ No newline at end of file diff --git a/tests/inference/Interface/interfaceRequireExtendsClass/input.hack b/tests/inference/Interface/interfaceRequireExtendsClass/input.hack index 31a92fac..c0041052 100644 --- a/tests/inference/Interface/interfaceRequireExtendsClass/input.hack +++ b/tests/inference/Interface/interfaceRequireExtendsClass/input.hack @@ -2,7 +2,7 @@ abstract class Node {} interface INode { require extends Node; } -class FooNode extends Node implements INode {} +final class FooNode extends Node implements INode {} function foo(INode $node): Node { return $node; diff --git a/tests/inference/Interface/interfaceRequireExtendsClassNegation/input.hack b/tests/inference/Interface/interfaceRequireExtendsClassNegation/input.hack index 53b35047..be70a042 100644 --- a/tests/inference/Interface/interfaceRequireExtendsClassNegation/input.hack +++ b/tests/inference/Interface/interfaceRequireExtendsClassNegation/input.hack @@ -8,7 +8,7 @@ interface HasFooNode { public static function foo(): void; } -class FooNode extends Node implements HasFooNode { +final class FooNode extends Node implements HasFooNode { public static function foo(): void {} } diff --git a/tests/inference/Interface/isExtendedInterface/input.hack b/tests/inference/Interface/isExtendedInterface/input.hack index 05d94c21..00146de0 100644 --- a/tests/inference/Interface/isExtendedInterface/input.hack +++ b/tests/inference/Interface/isExtendedInterface/input.hack @@ -1,5 +1,5 @@ interface A {} -class B implements A {} +final class B implements A {} function qux(A $a): void { } diff --git a/tests/inference/Lambda/noCrashWhenComparingIllegitimateCallable/input.hack b/tests/inference/Lambda/noCrashWhenComparingIllegitimateCallable/input.hack index 8ab831cc..34194dab 100644 --- a/tests/inference/Lambda/noCrashWhenComparingIllegitimateCallable/input.hack +++ b/tests/inference/Lambda/noCrashWhenComparingIllegitimateCallable/input.hack @@ -1,4 +1,4 @@ -class C {} +final class C {} function foo() : C { return (int $i) ==> ""; diff --git a/tests/inference/Lambda/undefinedClassForCallable/input.hack b/tests/inference/Lambda/undefinedClassForCallable/input.hack index c7f895db..51cd7d09 100644 --- a/tests/inference/Lambda/undefinedClassForCallable/input.hack +++ b/tests/inference/Lambda/undefinedClassForCallable/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { public function __construct(UndefinedClass $o) {} } new Foo(function() : void {}); \ No newline at end of file diff --git a/tests/inference/List/thisVar/input.hack b/tests/inference/List/thisVar/input.hack index fa2c749d..7be2489d 100644 --- a/tests/inference/List/thisVar/input.hack +++ b/tests/inference/List/thisVar/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public string $a = ""; public string $b = ""; diff --git a/tests/inference/Loop/Do/doNoRedundant/input.hack b/tests/inference/Loop/Do/doNoRedundant/input.hack index e3d8f9cb..81289b66 100644 --- a/tests/inference/Loop/Do/doNoRedundant/input.hack +++ b/tests/inference/Loop/Do/doNoRedundant/input.hack @@ -1,4 +1,4 @@ -class Event {} +final class Event {} function fetchEvent(): ?Event { return rand(0, 1) ? new Event() : null; diff --git a/tests/inference/Loop/Do/doWhileWithMethodCall/input.hack b/tests/inference/Loop/Do/doWhileWithMethodCall/input.hack index d4932180..e8625899 100644 --- a/tests/inference/Loop/Do/doWhileWithMethodCall/input.hack +++ b/tests/inference/Loop/Do/doWhileWithMethodCall/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getParent(): ?A { return rand(0, 1) ? new A() : null; } diff --git a/tests/inference/Loop/Do/doWhileWithNotEmptyCheck/input.hack b/tests/inference/Loop/Do/doWhileWithNotEmptyCheck/input.hack index e5ec4d72..0247ea15 100644 --- a/tests/inference/Loop/Do/doWhileWithNotEmptyCheck/input.hack +++ b/tests/inference/Loop/Do/doWhileWithNotEmptyCheck/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public ?A $a; public function __construct() { diff --git a/tests/inference/Loop/Foreach/iterateOverNonEmptyConstant/input.hack b/tests/inference/Loop/Foreach/iterateOverNonEmptyConstant/input.hack index 1625688d..6b76efb1 100644 --- a/tests/inference/Loop/Foreach/iterateOverNonEmptyConstant/input.hack +++ b/tests/inference/Loop/Foreach/iterateOverNonEmptyConstant/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const ARR = vec[0, 1, 2]; public function test() : int diff --git a/tests/inference/Loop/Foreach/iteratorAggregateIteration/input.hack b/tests/inference/Loop/Foreach/iteratorAggregateIteration/input.hack index 0c7ac20f..867e78da 100644 --- a/tests/inference/Loop/Foreach/iteratorAggregateIteration/input.hack +++ b/tests/inference/Loop/Foreach/iteratorAggregateIteration/input.hack @@ -1,4 +1,4 @@ -class C implements IteratorAggregate +final class C implements IteratorAggregate { public function getIterator(): Iterator { diff --git a/tests/inference/Loop/Foreach/secondLoopWithReturnInElseif/input.hack b/tests/inference/Loop/Foreach/secondLoopWithReturnInElseif/input.hack index 4801e937..675895b5 100644 --- a/tests/inference/Loop/Foreach/secondLoopWithReturnInElseif/input.hack +++ b/tests/inference/Loop/Foreach/secondLoopWithReturnInElseif/input.hack @@ -1,19 +1,22 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} -$b = null; -foreach (vec[new A(), new A()] as $a) { - if ($a is B) { +function foo(A $first, A $second): void { + $b = null; - } else if (!$a is C) { - return "goodbye"; - } + foreach (vec[$first, $second] as $a) { + if ($a is B) { - if ($b is C) { - return "hello"; - } + } else if (!$a is C) { + return; + } - $b = $a; -} \ No newline at end of file + if ($b is C) { + return; + } + + $b = $a; + } +} diff --git a/tests/inference/Loop/While/ComplexWhileTrueDontHaveExitPathForReturn/input.hack b/tests/inference/Loop/While/ComplexWhileTrueDontHaveExitPathForReturn/input.hack index f3d7e59d..0d1ae584 100644 --- a/tests/inference/Loop/While/ComplexWhileTrueDontHaveExitPathForReturn/input.hack +++ b/tests/inference/Loop/While/ComplexWhileTrueDontHaveExitPathForReturn/input.hack @@ -1,4 +1,4 @@ -class Test { +final class Test { private int $retryAttempts = 10; private function getResult(): string diff --git a/tests/inference/Loop/While/propertyAssertionInsideWhile/input.hack b/tests/inference/Loop/While/propertyAssertionInsideWhile/input.hack index 72e85446..de167566 100644 --- a/tests/inference/Loop/While/propertyAssertionInsideWhile/input.hack +++ b/tests/inference/Loop/While/propertyAssertionInsideWhile/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { public vec $a = dict[]; public vec $b = dict[]; public vec $c = dict[]; diff --git a/tests/inference/Loop/While/propertyAssertionInsideWhileNested/input.hack b/tests/inference/Loop/While/propertyAssertionInsideWhileNested/input.hack index 4ae1b478..247888cd 100644 --- a/tests/inference/Loop/While/propertyAssertionInsideWhileNested/input.hack +++ b/tests/inference/Loop/While/propertyAssertionInsideWhileNested/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { public vec $a = dict[]; public vec $b = dict[]; public vec $c = dict[]; diff --git a/tests/inference/Loop/While/propertyTypeUpdatedInBranch/input.hack b/tests/inference/Loop/While/propertyTypeUpdatedInBranch/input.hack index 729a7295..8b3e61ad 100644 --- a/tests/inference/Loop/While/propertyTypeUpdatedInBranch/input.hack +++ b/tests/inference/Loop/While/propertyTypeUpdatedInBranch/input.hack @@ -1,4 +1,4 @@ -class A +final class A { public ?int $foo = null; diff --git a/tests/inference/Loop/While/propertyTypeUpdatedInBranchWithBreak/input.hack b/tests/inference/Loop/While/propertyTypeUpdatedInBranchWithBreak/input.hack index ebdf625d..96754878 100644 --- a/tests/inference/Loop/While/propertyTypeUpdatedInBranchWithBreak/input.hack +++ b/tests/inference/Loop/While/propertyTypeUpdatedInBranchWithBreak/input.hack @@ -1,4 +1,4 @@ -class A +final class A { public ?int $foo = null; diff --git a/tests/inference/MethodCall/callOnVoid/input.hack b/tests/inference/MethodCall/callOnVoid/input.hack index 3a704c4f..8549321e 100644 --- a/tests/inference/MethodCall/callOnVoid/input.hack +++ b/tests/inference/MethodCall/callOnVoid/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): void {} } diff --git a/tests/inference/MethodCall/interfaceMethodCallCheck/input.hack b/tests/inference/MethodCall/interfaceMethodCallCheck/input.hack index 1423bc00..90bdb7fe 100644 --- a/tests/inference/MethodCall/interfaceMethodCallCheck/input.hack +++ b/tests/inference/MethodCall/interfaceMethodCallCheck/input.hack @@ -6,7 +6,7 @@ interface B extends A { public function foo(string $a = "") : void; } -class C implements B { +final class C implements B { public function foo(string $a = "") : void {} } diff --git a/tests/inference/MethodCall/maybeNotTooManyArgumentsToInstance/input.hack b/tests/inference/MethodCall/maybeNotTooManyArgumentsToInstance/input.hack index bad91f99..d2cc3deb 100644 --- a/tests/inference/MethodCall/maybeNotTooManyArgumentsToInstance/input.hack +++ b/tests/inference/MethodCall/maybeNotTooManyArgumentsToInstance/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(int $a): void {} } -class B { +final class B { public function fooFoo(int $a, string $s): void {} } diff --git a/tests/inference/MethodCall/nonStaticInvocation/input.hack b/tests/inference/MethodCall/nonStaticInvocation/input.hack index 264cdcb7..59dd593d 100644 --- a/tests/inference/MethodCall/nonStaticInvocation/input.hack +++ b/tests/inference/MethodCall/nonStaticInvocation/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { public static function barBar(): void {} } diff --git a/tests/inference/MethodCall/nonStaticSelfCall/input.hack b/tests/inference/MethodCall/nonStaticSelfCall/input.hack index cdda6e97..0ae4ea1b 100644 --- a/tests/inference/MethodCall/nonStaticSelfCall/input.hack +++ b/tests/inference/MethodCall/nonStaticSelfCall/input.hack @@ -1,4 +1,4 @@ -class A11 { +final class A11 { public function call() : A11 { $result = self::method(); return $result; diff --git a/tests/inference/MethodCall/noreturnLeadsToAssertion/input.hack b/tests/inference/MethodCall/noreturnLeadsToAssertion/input.hack index 8447b74f..b83af825 100644 --- a/tests/inference/MethodCall/noreturnLeadsToAssertion/input.hack +++ b/tests/inference/MethodCall/noreturnLeadsToAssertion/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): noreturn { exit(); } diff --git a/tests/inference/MethodCall/staticCallOnIntersection/input.hack b/tests/inference/MethodCall/staticCallOnIntersection/input.hack index d938ec36..c3688e00 100644 --- a/tests/inference/MethodCall/staticCallOnIntersection/input.hack +++ b/tests/inference/MethodCall/staticCallOnIntersection/input.hack @@ -4,7 +4,7 @@ interface I { public static function foo(): void; } -class AChild extends A implements I { +final class AChild extends A implements I { public static function foo(): void {} } diff --git a/tests/inference/MethodCall/staticCallOnVar/input.hack b/tests/inference/MethodCall/staticCallOnVar/input.hack index f4418fdf..bc6493ce 100644 --- a/tests/inference/MethodCall/staticCallOnVar/input.hack +++ b/tests/inference/MethodCall/staticCallOnVar/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public static function bar(): int { return 5; } diff --git a/tests/inference/MethodCall/unchainedInferredInferredMutationFreeMethodCallDontMemoize/input.hack b/tests/inference/MethodCall/unchainedInferredInferredMutationFreeMethodCallDontMemoize/input.hack index a2610cb7..7eff1a6f 100644 --- a/tests/inference/MethodCall/unchainedInferredInferredMutationFreeMethodCallDontMemoize/input.hack +++ b/tests/inference/MethodCall/unchainedInferredInferredMutationFreeMethodCallDontMemoize/input.hack @@ -1,4 +1,4 @@ -class SomeClass { +final class SomeClass { private ?int $int; public function __construct() { diff --git a/tests/inference/MethodCall/variableClassStaticCall/input.hack b/tests/inference/MethodCall/variableClassStaticCall/input.hack index 27f7f4d3..766ce631 100644 --- a/tests/inference/MethodCall/variableClassStaticCall/input.hack +++ b/tests/inference/MethodCall/variableClassStaticCall/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public static function f(int $u):void {} } diff --git a/tests/inference/MethodSignature/allowExecptionToStringIn71/input.hack b/tests/inference/MethodSignature/allowExecptionToStringIn71/input.hack index 63ecb57a..b4721c25 100644 --- a/tests/inference/MethodSignature/allowExecptionToStringIn71/input.hack +++ b/tests/inference/MethodSignature/allowExecptionToStringIn71/input.hack @@ -1,4 +1,4 @@ -class E extends Exception { +final class E extends Exception { public function __toString() : string { return "hello"; } diff --git a/tests/inference/MethodSignature/allowExecptionToStringWithNoType/input.hack b/tests/inference/MethodSignature/allowExecptionToStringWithNoType/input.hack index 2fe56476..b6f15e6b 100644 --- a/tests/inference/MethodSignature/allowExecptionToStringWithNoType/input.hack +++ b/tests/inference/MethodSignature/allowExecptionToStringWithNoType/input.hack @@ -1,4 +1,4 @@ -class E extends Exception { +final class E extends Exception { public function __toString() { return "hello"; } diff --git a/tests/inference/MethodSignature/allowExtraVariadic/input.hack b/tests/inference/MethodSignature/allowExtraVariadic/input.hack index c77335c3..c30e6ab8 100644 --- a/tests/inference/MethodSignature/allowExtraVariadic/input.hack +++ b/tests/inference/MethodSignature/allowExtraVariadic/input.hack @@ -2,7 +2,7 @@ interface I { public function f(string $a, int $b): void; } -class C implements I { +final class C implements I { public function f(string $a = "a", int $b = 1, float ...$rest): void {} } diff --git a/tests/inference/MethodSignature/allowMixedExtensionOfIteratorAggregate/input.hack b/tests/inference/MethodSignature/allowMixedExtensionOfIteratorAggregate/input.hack index 1ac39dc7..6e381e7b 100644 --- a/tests/inference/MethodSignature/allowMixedExtensionOfIteratorAggregate/input.hack +++ b/tests/inference/MethodSignature/allowMixedExtensionOfIteratorAggregate/input.hack @@ -1,4 +1,4 @@ -class C implements IteratorAggregate { +final class C implements IteratorAggregate { public function getIterator(): Iterator { return new ArrayIterator(vec[]); } diff --git a/tests/inference/MethodSignature/allowStaticInheritance/input.hack b/tests/inference/MethodSignature/allowStaticInheritance/input.hack index cea3d649..a710d367 100644 --- a/tests/inference/MethodSignature/allowStaticInheritance/input.hack +++ b/tests/inference/MethodSignature/allowStaticInheritance/input.hack @@ -1,9 +1,9 @@ -class A { +abstract class A { public function method(): this { return $this; } } -class B extends A { +final class B extends A { public function method(): this { return $this; } diff --git a/tests/inference/MethodSignature/clashWithCallMapClass/input.hack b/tests/inference/MethodSignature/clashWithCallMapClass/input.hack index eca54015..fd4c8aaa 100644 --- a/tests/inference/MethodSignature/clashWithCallMapClass/input.hack +++ b/tests/inference/MethodSignature/clashWithCallMapClass/input.hack @@ -1,5 +1,5 @@ -class HaruDestination {} -class AClass +final class HaruDestination {} +final class AClass { public function get(): HaruDestination { diff --git a/tests/inference/MethodSignature/classWithTraitExtendsNonAbstractWithMethod/input.hack b/tests/inference/MethodSignature/classWithTraitExtendsNonAbstractWithMethod/input.hack index f3f230c1..9e6d6858 100644 --- a/tests/inference/MethodSignature/classWithTraitExtendsNonAbstractWithMethod/input.hack +++ b/tests/inference/MethodSignature/classWithTraitExtendsNonAbstractWithMethod/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { public function foo() : void {} } @@ -6,6 +6,6 @@ trait T { abstract public function foo() : void; } -class B extends A { +final class B extends A { use T; } \ No newline at end of file diff --git a/tests/inference/MethodSignature/consistentConstructor/input.hack b/tests/inference/MethodSignature/consistentConstructor/input.hack index 3655b245..f42b5cff 100644 --- a/tests/inference/MethodSignature/consistentConstructor/input.hack +++ b/tests/inference/MethodSignature/consistentConstructor/input.hack @@ -1,10 +1,10 @@ <<__ConsistentConstruct>> -class A { +abstract class A { public function getInstance() : A { return new static(); } } -class AChild extends A { +final class AChild extends A { public function __construct() {} } \ No newline at end of file diff --git a/tests/inference/MethodSignature/inheritDocumentedSelf/input.hack b/tests/inference/MethodSignature/inheritDocumentedSelf/input.hack index fea8f3ee..c903fab4 100644 --- a/tests/inference/MethodSignature/inheritDocumentedSelf/input.hack +++ b/tests/inference/MethodSignature/inheritDocumentedSelf/input.hack @@ -2,7 +2,7 @@ interface I { public function foo(I $f) : I; } -class C implements I { +final class C implements I { public function foo(I $f) : I { return new C(); } diff --git a/tests/inference/MethodSignature/inheritsSplClasses/input.hack b/tests/inference/MethodSignature/inheritsSplClasses/input.hack index 05da7875..7796dd6a 100644 --- a/tests/inference/MethodSignature/inheritsSplClasses/input.hack +++ b/tests/inference/MethodSignature/inheritsSplClasses/input.hack @@ -3,14 +3,14 @@ namespace App; use SplObserver; use SplSubject; -class Observer implements \SplObserver +final class Observer implements \SplObserver { public function update(SplSubject $subject) { } } -class Subject implements \SplSubject +final class Subject implements \SplSubject { public function attach(SplObserver $observer) { diff --git a/tests/inference/MethodSignature/nullableSubclassParam/input.hack b/tests/inference/MethodSignature/nullableSubclassParam/input.hack index 1ce09c51..6e1d565c 100644 --- a/tests/inference/MethodSignature/nullableSubclassParam/input.hack +++ b/tests/inference/MethodSignature/nullableSubclassParam/input.hack @@ -1,10 +1,10 @@ -class A { +abstract class A { public function foo(string $s): ?string { return rand(0, 1) ? $s : null; } } -class B extends A { +final class B extends A { public function foo(?string $s): string { return $s ?: "hello"; } diff --git a/tests/inference/MethodSignature/nullableSubclassParamWithDefault/input.hack b/tests/inference/MethodSignature/nullableSubclassParamWithDefault/input.hack index 5e1aa8b3..b1c6e794 100644 --- a/tests/inference/MethodSignature/nullableSubclassParamWithDefault/input.hack +++ b/tests/inference/MethodSignature/nullableSubclassParamWithDefault/input.hack @@ -1,10 +1,10 @@ -class A { +abstract class A { public function foo(string $s): string { return $s; } } -class B extends A { +final class B extends A { public function foo(string $s = null): string { return $s ?: "hello"; } diff --git a/tests/inference/MethodSignature/parentIsKnown/input.hack b/tests/inference/MethodSignature/parentIsKnown/input.hack index a0c1f8a6..80b927f4 100644 --- a/tests/inference/MethodSignature/parentIsKnown/input.hack +++ b/tests/inference/MethodSignature/parentIsKnown/input.hack @@ -1,10 +1,10 @@ -class A { +abstract class A { public function returnSelf() : A { return $this; } } -class B extends A { +final class B extends A { public function returnSelf() : A { return parent::returnSelf(); } diff --git a/tests/inference/MethodSignature/privateArgs/input.hack b/tests/inference/MethodSignature/privateArgs/input.hack index 3df75ad4..85271217 100644 --- a/tests/inference/MethodSignature/privateArgs/input.hack +++ b/tests/inference/MethodSignature/privateArgs/input.hack @@ -1,6 +1,6 @@ -class A { +abstract class A { private function foo(): void {} } -class B extends A { +final class B extends A { private function foo(int $arg): void {} } \ No newline at end of file diff --git a/tests/inference/MethodSignature/selfInTraitAbstractIsFine/input.hack b/tests/inference/MethodSignature/selfInTraitAbstractIsFine/input.hack index 1c46c7e3..f339ca02 100644 --- a/tests/inference/MethodSignature/selfInTraitAbstractIsFine/input.hack +++ b/tests/inference/MethodSignature/selfInTraitAbstractIsFine/input.hack @@ -2,7 +2,7 @@ trait SomeTrait { abstract public function a(SomeClass $b): SomeClass; } -class SomeClass { +final class SomeClass { use SomeTrait; public function a(SomeClass $b): SomeClass { diff --git a/tests/inference/Namespace/constantReference/input.hack b/tests/inference/Namespace/constantReference/input.hack index 4e088425..d95f093b 100644 --- a/tests/inference/Namespace/constantReference/input.hack +++ b/tests/inference/Namespace/constantReference/input.hack @@ -6,7 +6,7 @@ namespace Aye\Bee { echo \Aye\Bee\HELLO; } - class Bar { + final class Bar { public function foo(): void { echo \Aye\Bee\HELLO; } diff --git a/tests/inference/Namespace/emptyNamespace/input.hack b/tests/inference/Namespace/emptyNamespace/input.hack index a4cecab9..749a3200 100644 --- a/tests/inference/Namespace/emptyNamespace/input.hack +++ b/tests/inference/Namespace/emptyNamespace/input.hack @@ -3,7 +3,7 @@ namespace A { } - class Bar { + final class Bar { } } diff --git a/tests/inference/Namespace/useType/input.hack b/tests/inference/Namespace/useType/input.hack index 32137993..711a6e0b 100644 --- a/tests/inference/Namespace/useType/input.hack +++ b/tests/inference/Namespace/useType/input.hack @@ -1,11 +1,11 @@ namespace Foo\Bar { - class A { + final class A { public static function bar(): void {} } } namespace A { - class B { + final class B { public static function foo(): void {} } } diff --git a/tests/inference/Php56/constantAliasInClass/input.hack b/tests/inference/Php56/constantAliasInClass/input.hack index 4561822b..380673f8 100644 --- a/tests/inference/Php56/constantAliasInClass/input.hack +++ b/tests/inference/Php56/constantAliasInClass/input.hack @@ -5,7 +5,7 @@ namespace Name\Space { namespace Noom\Spice { use const Name\Space\FOO; - class A { + final class A { public function fooFoo(): void { echo FOO . "\n"; echo \Name\Space\FOO; diff --git a/tests/inference/Php56/functionAliasInClass/input.hack b/tests/inference/Php56/functionAliasInClass/input.hack index ebd90729..edb9c6f3 100644 --- a/tests/inference/Php56/functionAliasInClass/input.hack +++ b/tests/inference/Php56/functionAliasInClass/input.hack @@ -5,7 +5,7 @@ namespace Name\Space { namespace Noom\Spice { use function Name\Space\f; - class A { + final class A { public function fooFoo(): void { f(); \Name\Space\f(); diff --git a/tests/inference/Php70/multipleUse/input.hack b/tests/inference/Php70/multipleUse/input.hack index 74ab0752..f447adad 100644 --- a/tests/inference/Php70/multipleUse/input.hack +++ b/tests/inference/Php70/multipleUse/input.hack @@ -1,9 +1,9 @@ namespace Name\Space { - class A { + final class A { } - class B { + final class B { } } diff --git a/tests/inference/PropertyType/allowLessSpecificReturnTypeForOverriddenMethod/input.hack b/tests/inference/PropertyType/allowLessSpecificReturnTypeForOverriddenMethod/input.hack index d047c396..2932bb46 100644 --- a/tests/inference/PropertyType/allowLessSpecificReturnTypeForOverriddenMethod/input.hack +++ b/tests/inference/PropertyType/allowLessSpecificReturnTypeForOverriddenMethod/input.hack @@ -1,16 +1,16 @@ -class A { +abstract class A { public function aa(): ?string { return "bar"; } } -class B extends A { +final class B extends A { public static function aa(): ?string { return rand(0, 1) ? "bar" : null; } } -class C extends A { +final class C extends A { public static function aa(): ?string { return "bar"; } diff --git a/tests/inference/PropertyType/assertOnStaticProperty/input.hack b/tests/inference/PropertyType/assertOnStaticProperty/input.hack index 82abe7c9..153376c1 100644 --- a/tests/inference/PropertyType/assertOnStaticProperty/input.hack +++ b/tests/inference/PropertyType/assertOnStaticProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public static ?string $s = null; } diff --git a/tests/inference/PropertyType/dontCarryAssertionsOver/input.hack b/tests/inference/PropertyType/dontCarryAssertionsOver/input.hack index 0aa877aa..fe45f815 100644 --- a/tests/inference/PropertyType/dontCarryAssertionsOver/input.hack +++ b/tests/inference/PropertyType/dontCarryAssertionsOver/input.hack @@ -1,4 +1,4 @@ -class A +final class A { private string $network; diff --git a/tests/inference/PropertyType/dontMemoizeConditionalAssignment/input.hack b/tests/inference/PropertyType/dontMemoizeConditionalAssignment/input.hack index 2b11526f..54c64cb4 100644 --- a/tests/inference/PropertyType/dontMemoizeConditionalAssignment/input.hack +++ b/tests/inference/PropertyType/dontMemoizeConditionalAssignment/input.hack @@ -1,8 +1,8 @@ namespace Foo; -class A {} +final class A {} -class B { +final class B { protected ?A $a = null; public function test(): void { diff --git a/tests/inference/PropertyType/goodArrayProperties/input.hack b/tests/inference/PropertyType/goodArrayProperties/input.hack index decc2653..d3d90113 100644 --- a/tests/inference/PropertyType/goodArrayProperties/input.hack +++ b/tests/inference/PropertyType/goodArrayProperties/input.hack @@ -1,10 +1,10 @@ interface I1 {} -class A1 implements I1{} +final class A1 implements I1{} -class B1 implements I1 {} +final class B1 implements I1 {} -class C1 { +final class C1 { public vec $is = dict[]; } diff --git a/tests/inference/PropertyType/issetPropertyDoesNotExist/input.hack b/tests/inference/PropertyType/issetPropertyDoesNotExist/input.hack index cb0e6fa8..d0a1326f 100644 --- a/tests/inference/PropertyType/issetPropertyDoesNotExist/input.hack +++ b/tests/inference/PropertyType/issetPropertyDoesNotExist/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { } $a = new A(); diff --git a/tests/inference/PropertyType/methodCallResetsPropertyDefault/input.hack b/tests/inference/PropertyType/methodCallResetsPropertyDefault/input.hack index 3737af3b..3e51954b 100644 --- a/tests/inference/PropertyType/methodCallResetsPropertyDefault/input.hack +++ b/tests/inference/PropertyType/methodCallResetsPropertyDefault/input.hack @@ -1,4 +1,4 @@ -class A +final class A { public ?int $foo = null; diff --git a/tests/inference/PropertyType/noConditionalCallToParentConstructor/input.hack b/tests/inference/PropertyType/noConditionalCallToParentConstructor/input.hack index dca6188f..6e4ecba4 100644 --- a/tests/inference/PropertyType/noConditionalCallToParentConstructor/input.hack +++ b/tests/inference/PropertyType/noConditionalCallToParentConstructor/input.hack @@ -1,8 +1,8 @@ -class GrandParentClassDoesNotDefine { +abstract class GrandParentClassDoesNotDefine { public function __construct() {} } -class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { +abstract class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { protected string $val; public function __construct() { @@ -11,7 +11,7 @@ class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { } } -class ChildClass extends ParentClassDefinesVar { +final class ChildClass extends ParentClassDefinesVar { public function __construct() { parent::__construct(); } diff --git a/tests/inference/PropertyType/nullCoalesceWithNullablePropertyAccess/input.hack b/tests/inference/PropertyType/nullCoalesceWithNullablePropertyAccess/input.hack index 8c9da784..aeab1453 100644 --- a/tests/inference/PropertyType/nullCoalesceWithNullablePropertyAccess/input.hack +++ b/tests/inference/PropertyType/nullCoalesceWithNullablePropertyAccess/input.hack @@ -1,4 +1,4 @@ -class Bar { +final class Bar { public ?string $a = null; } diff --git a/tests/inference/PropertyType/nullsafeShortCircuit/input.hack b/tests/inference/PropertyType/nullsafeShortCircuit/input.hack index 082d5f65..6c96e9dd 100644 --- a/tests/inference/PropertyType/nullsafeShortCircuit/input.hack +++ b/tests/inference/PropertyType/nullsafeShortCircuit/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { private ?Foo $nullableSelf = null; public function __construct(private Foo $self) {} diff --git a/tests/inference/PropertyType/promotedProtectedProperty/input.hack b/tests/inference/PropertyType/promotedProtectedProperty/input.hack index 226d29dc..2e772e25 100644 --- a/tests/inference/PropertyType/promotedProtectedProperty/input.hack +++ b/tests/inference/PropertyType/promotedProtectedProperty/input.hack @@ -1,8 +1,8 @@ -class A { +abstract class A { public function __construct(protected int $foo) {} } -class AChild extends A { +final class AChild extends A { public function bar() : int { return $this->foo; } diff --git a/tests/inference/PropertyType/promotedPublicPropertyWithDefault/input.hack b/tests/inference/PropertyType/promotedPublicPropertyWithDefault/input.hack index 45e83027..234cb895 100644 --- a/tests/inference/PropertyType/promotedPublicPropertyWithDefault/input.hack +++ b/tests/inference/PropertyType/promotedPublicPropertyWithDefault/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public int $foo = 5) {} } diff --git a/tests/inference/PropertyType/promotedPublicPropertyWitoutDefault/input.hack b/tests/inference/PropertyType/promotedPublicPropertyWitoutDefault/input.hack index 0c7b24a0..31f141bf 100644 --- a/tests/inference/PropertyType/promotedPublicPropertyWitoutDefault/input.hack +++ b/tests/inference/PropertyType/promotedPublicPropertyWitoutDefault/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public int $foo) {} } diff --git a/tests/inference/PropertyType/propertyArrayIssetAssertion/input.hack b/tests/inference/PropertyType/propertyArrayIssetAssertion/input.hack index ccef4127..5ae49d34 100644 --- a/tests/inference/PropertyType/propertyArrayIssetAssertion/input.hack +++ b/tests/inference/PropertyType/propertyArrayIssetAssertion/input.hack @@ -1,6 +1,6 @@ function bar(string $s): void { } -class A { +final class A { public dict $a = dict[]; private function foo(): void { diff --git a/tests/inference/PropertyType/propertyArrayIssetAssertionWithVariableOffset/input.hack b/tests/inference/PropertyType/propertyArrayIssetAssertionWithVariableOffset/input.hack index 3c16de50..70f9b9e3 100644 --- a/tests/inference/PropertyType/propertyArrayIssetAssertionWithVariableOffset/input.hack +++ b/tests/inference/PropertyType/propertyArrayIssetAssertionWithVariableOffset/input.hack @@ -1,6 +1,6 @@ function bar(string $s): void { } -class A { +final class A { public dict $a = dict[]; private function foo(): void { diff --git a/tests/inference/PropertyType/propertyWithoutTypeSuppressingIssue/input.hack b/tests/inference/PropertyType/propertyWithoutTypeSuppressingIssue/input.hack index df57058d..165c9c65 100644 --- a/tests/inference/PropertyType/propertyWithoutTypeSuppressingIssue/input.hack +++ b/tests/inference/PropertyType/propertyWithoutTypeSuppressingIssue/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public $foo = "hello"; } diff --git a/tests/inference/PropertyType/reflectionProperties/input.hack b/tests/inference/PropertyType/reflectionProperties/input.hack index 525bafa4..bb95a72b 100644 --- a/tests/inference/PropertyType/reflectionProperties/input.hack +++ b/tests/inference/PropertyType/reflectionProperties/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { } $a = new \ReflectionMethod(Foo::class, "__construct"); diff --git a/tests/inference/PropertyType/rememberThisPropertyAsssignmentsInMethod/input.hack b/tests/inference/PropertyType/rememberThisPropertyAsssignmentsInMethod/input.hack index c099dc45..4c9ab4eb 100644 --- a/tests/inference/PropertyType/rememberThisPropertyAsssignmentsInMethod/input.hack +++ b/tests/inference/PropertyType/rememberThisPropertyAsssignmentsInMethod/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public bool $foo = false; public function bar() : void { diff --git a/tests/inference/PropertyType/skipConstructor/input.hack b/tests/inference/PropertyType/skipConstructor/input.hack index f77970b3..397d2d7b 100644 --- a/tests/inference/PropertyType/skipConstructor/input.hack +++ b/tests/inference/PropertyType/skipConstructor/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { protected string $s; public function __construct() { @@ -6,9 +6,9 @@ class A { } } -class B extends A {} +abstract class B extends A {} -class C extends B { +final class C extends B { public function __construct() { parent::__construct(); diff --git a/tests/inference/PropertyType/someConditionalCallToParentConstructor/input.hack b/tests/inference/PropertyType/someConditionalCallToParentConstructor/input.hack index b324623b..e84c43e7 100644 --- a/tests/inference/PropertyType/someConditionalCallToParentConstructor/input.hack +++ b/tests/inference/PropertyType/someConditionalCallToParentConstructor/input.hack @@ -1,8 +1,8 @@ -class GrandParentClassDoesNotDefine { +abstract class GrandParentClassDoesNotDefine { public function __construct() {} } -class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { +abstract class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { protected string $val; public function __construct() { @@ -13,7 +13,7 @@ class ParentClassDefinesVar extends GrandParentClassDoesNotDefine { } } -class ChildClass extends ParentClassDefinesVar { +final class ChildClass extends ParentClassDefinesVar { public function __construct() { parent::__construct(); } diff --git a/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffset/input.hack b/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffset/input.hack index 3f044a4e..c4b0a785 100644 --- a/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffset/input.hack +++ b/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffset/input.hack @@ -1,6 +1,6 @@ function bar(string $s): void { } -class A { +final class A { public static dict $a = dict[]; } diff --git a/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffsetAndElse/input.hack b/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffsetAndElse/input.hack index 50fd7f25..35c527cc 100644 --- a/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffsetAndElse/input.hack +++ b/tests/inference/PropertyType/staticPropertyArrayIssetAssertionWithVariableOffsetAndElse/input.hack @@ -1,6 +1,6 @@ function bar(string $s): void { } -class A { +final class A { public static dict $a = dict[]; } diff --git a/tests/inference/PropertyType/staticPropertyDefaultWithStaticType/input.hack b/tests/inference/PropertyType/staticPropertyDefaultWithStaticType/input.hack index 00d76c4f..11c0cf0d 100644 --- a/tests/inference/PropertyType/staticPropertyDefaultWithStaticType/input.hack +++ b/tests/inference/PropertyType/staticPropertyDefaultWithStaticType/input.hack @@ -1,4 +1,4 @@ -class Test { +final class Test { private static dict $t1 = dict[]; private dict $t2 = dict[]; } \ No newline at end of file diff --git a/tests/inference/PropertyType/undefinedPropertyAssignment/input.hack b/tests/inference/PropertyType/undefinedPropertyAssignment/input.hack index 69e8712e..8a97a342 100644 --- a/tests/inference/PropertyType/undefinedPropertyAssignment/input.hack +++ b/tests/inference/PropertyType/undefinedPropertyAssignment/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { } (new A())->foo = "cool"; \ No newline at end of file diff --git a/tests/inference/PropertyType/unionPropertyType/input.hack b/tests/inference/PropertyType/unionPropertyType/input.hack index 39e683be..7b4af4e9 100644 --- a/tests/inference/PropertyType/unionPropertyType/input.hack +++ b/tests/inference/PropertyType/unionPropertyType/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public arraykey $i; public function __construct() { diff --git a/tests/inference/PropertyType/useVariableAccessInStatic/input.hack b/tests/inference/PropertyType/useVariableAccessInStatic/input.hack index 2a1b3770..b8e28435 100644 --- a/tests/inference/PropertyType/useVariableAccessInStatic/input.hack +++ b/tests/inference/PropertyType/useVariableAccessInStatic/input.hack @@ -1,4 +1,4 @@ -class A2 { +final class A2 { public static string $title = "foo"; public static string $label = "bar"; } diff --git a/tests/inference/PureAnnotation/allowPureInConstrucctorThis/input.hack b/tests/inference/PureAnnotation/allowPureInConstrucctorThis/input.hack index b4fb4781..f252c159 100644 --- a/tests/inference/PureAnnotation/allowPureInConstrucctorThis/input.hack +++ b/tests/inference/PureAnnotation/allowPureInConstrucctorThis/input.hack @@ -1,4 +1,4 @@ -class Port { +final class Port { private int $portNumber; public function __construct(int $portNumber) { diff --git a/tests/inference/ReadonlyProperty/readonlyPropertySetInConstructor/input.hack b/tests/inference/ReadonlyProperty/readonlyPropertySetInConstructor/input.hack index feb024dd..e73c6194 100644 --- a/tests/inference/ReadonlyProperty/readonlyPropertySetInConstructor/input.hack +++ b/tests/inference/ReadonlyProperty/readonlyPropertySetInConstructor/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public readonly string $bar; public function __construct() { diff --git a/tests/inference/ReturnType/allowThrowAndExitToOverrideReturnType/input.hack b/tests/inference/ReturnType/allowThrowAndExitToOverrideReturnType/input.hack index a5e9c557..798241d0 100644 --- a/tests/inference/ReturnType/allowThrowAndExitToOverrideReturnType/input.hack +++ b/tests/inference/ReturnType/allowThrowAndExitToOverrideReturnType/input.hack @@ -2,14 +2,14 @@ interface Foo { public function doFoo(): int; } -class Bar implements Foo { +final class Bar implements Foo { public function doFoo(): int { print "Error\n"; exit(1); } } -class Baz implements Foo { +final class Baz implements Foo { public function doFoo(): int { throw new \Exception("bad"); } diff --git a/tests/inference/ReturnType/returnMixed/input.hack b/tests/inference/ReturnType/returnMixed/input.hack index 4a62212f..4a8d736c 100644 --- a/tests/inference/ReturnType/returnMixed/input.hack +++ b/tests/inference/ReturnType/returnMixed/input.hack @@ -1,6 +1,6 @@ namespace Foo; -class A { +final class A { public function getThis() : mixed { return $this; } diff --git a/tests/inference/ReturnType/returnStaticThis/input.hack b/tests/inference/ReturnType/returnStaticThis/input.hack index 11b48567..7199743e 100644 --- a/tests/inference/ReturnType/returnStaticThis/input.hack +++ b/tests/inference/ReturnType/returnStaticThis/input.hack @@ -1,12 +1,12 @@ namespace Foo; -class A { +abstract class A { public function getThis() : this { return $this; } } -class B extends A { +final class B extends A { public function foo() : void {} } diff --git a/tests/inference/ReturnType/switchReturnTypeWithDefaultException/input.hack b/tests/inference/ReturnType/switchReturnTypeWithDefaultException/input.hack index 31f41e8a..e521d124 100644 --- a/tests/inference/ReturnType/switchReturnTypeWithDefaultException/input.hack +++ b/tests/inference/ReturnType/switchReturnTypeWithDefaultException/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): bool { switch (rand(0,10)) { case 1: diff --git a/tests/inference/ReturnType/switchReturnTypeWithFallthrough/input.hack b/tests/inference/ReturnType/switchReturnTypeWithFallthrough/input.hack index 039bfcd2..3f214206 100644 --- a/tests/inference/ReturnType/switchReturnTypeWithFallthrough/input.hack +++ b/tests/inference/ReturnType/switchReturnTypeWithFallthrough/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): bool { switch (rand(0,10)) { case 1: diff --git a/tests/inference/ReturnType/switchReturnTypeWithFallthroughAndStatement/input.hack b/tests/inference/ReturnType/switchReturnTypeWithFallthroughAndStatement/input.hack index 1e122794..0d6cc992 100644 --- a/tests/inference/ReturnType/switchReturnTypeWithFallthroughAndStatement/input.hack +++ b/tests/inference/ReturnType/switchReturnTypeWithFallthroughAndStatement/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): bool { switch (rand(0,10)) { case 1: diff --git a/tests/inference/ReturnType/tryCatchReturnType/input.hack b/tests/inference/ReturnType/tryCatchReturnType/input.hack index 193c29e1..58e697bf 100644 --- a/tests/inference/ReturnType/tryCatchReturnType/input.hack +++ b/tests/inference/ReturnType/tryCatchReturnType/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function fooFoo(): bool { try { // do a thing diff --git a/tests/inference/SwitchType/clearDependentTypeWhenAssigning/input.hack b/tests/inference/SwitchType/clearDependentTypeWhenAssigning/input.hack index 60e66129..bc31f0f1 100644 --- a/tests/inference/SwitchType/clearDependentTypeWhenAssigning/input.hack +++ b/tests/inference/SwitchType/clearDependentTypeWhenAssigning/input.hack @@ -1,10 +1,10 @@ -class A {} +abstract class A {} -class AChild extends A { +final class AChild extends A { public function bar() : void {} } -class B {} +final class B {} function foo(A $a) : void { $a_class = get_class($a); diff --git a/tests/inference/SwitchType/dontResolveTypesBadly/input.hack b/tests/inference/SwitchType/dontResolveTypesBadly/input.hack index 07208c54..3c066aa4 100644 --- a/tests/inference/SwitchType/dontResolveTypesBadly/input.hack +++ b/tests/inference/SwitchType/dontResolveTypesBadly/input.hack @@ -10,7 +10,7 @@ switch (rand(0,1)) { break; } -class A { +final class A { public function maybeReturnsDT(): ?\DateTimeInterface { return rand(0,1) ? new \DateTime("now") : null; } diff --git a/tests/inference/SwitchType/getClassArgWrongClass/input.hack b/tests/inference/SwitchType/getClassArgWrongClass/input.hack index 76691260..6ffc1f06 100644 --- a/tests/inference/SwitchType/getClassArgWrongClass/input.hack +++ b/tests/inference/SwitchType/getClassArgWrongClass/input.hack @@ -1,10 +1,10 @@ -class A { +final class A { public function fooFoo(): void { } } -class B { +final class B { public function barBar(): void { } diff --git a/tests/inference/SwitchType/switchManyGetClass/input.hack b/tests/inference/SwitchType/switchManyGetClass/input.hack index b080da4f..f8f083fe 100644 --- a/tests/inference/SwitchType/switchManyGetClass/input.hack +++ b/tests/inference/SwitchType/switchManyGetClass/input.hack @@ -1,7 +1,7 @@ -class A {} -class B extends A {} -class C extends A {} -class D extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} +final class D extends A {} function foo(A $a) : void { switch(get_class($a)) { diff --git a/tests/inference/SwitchType/switchWithBadBreak/input.hack b/tests/inference/SwitchType/switchWithBadBreak/input.hack index 9e857168..e9220063 100644 --- a/tests/inference/SwitchType/switchWithBadBreak/input.hack +++ b/tests/inference/SwitchType/switchWithBadBreak/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(): A { switch (rand(0,1)) { diff --git a/tests/inference/ToString/echoClass/input.hack b/tests/inference/ToString/echoClass/input.hack index be2fc6dc..9ec5c113 100644 --- a/tests/inference/ToString/echoClass/input.hack +++ b/tests/inference/ToString/echoClass/input.hack @@ -1,2 +1,2 @@ -class A {} +final class A {} echo (new A()); \ No newline at end of file diff --git a/tests/inference/ToString/goodCast/input.hack b/tests/inference/ToString/goodCast/input.hack index 2209ca55..865c087e 100644 --- a/tests/inference/ToString/goodCast/input.hack +++ b/tests/inference/ToString/goodCast/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __toString(): string { return "hello"; diff --git a/tests/inference/ToString/implicitCastWithStrictTypes/input.hack b/tests/inference/ToString/implicitCastWithStrictTypes/input.hack index 0c3a55c7..d87c7a00 100644 --- a/tests/inference/ToString/implicitCastWithStrictTypes/input.hack +++ b/tests/inference/ToString/implicitCastWithStrictTypes/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __toString(): string { return "hello"; diff --git a/tests/inference/ToString/implicitStringableDisallowed/input.hack b/tests/inference/ToString/implicitStringableDisallowed/input.hack index 2c6c5e00..45484a69 100644 --- a/tests/inference/ToString/implicitStringableDisallowed/input.hack +++ b/tests/inference/ToString/implicitStringableDisallowed/input.hack @@ -3,7 +3,7 @@ interface Stringable { } function foo(Stringable $s): void {} -class Bar { +final class Bar { public function __toString() { return "foo"; } diff --git a/tests/inference/ToString/inheritedToString/input.hack b/tests/inference/ToString/inheritedToString/input.hack index 4648385d..72216d07 100644 --- a/tests/inference/ToString/inheritedToString/input.hack +++ b/tests/inference/ToString/inheritedToString/input.hack @@ -1,14 +1,14 @@ -class A { +final class A { public function __toString() { return "hello"; } } -class B { +abstract class B { public function __toString() { return "goodbye"; } } -class C extends B {} +final class C extends B {} $c = new C(); echo (string) $c; \ No newline at end of file diff --git a/tests/inference/ToString/intersectionCanBeString/input.hack b/tests/inference/ToString/intersectionCanBeString/input.hack index fa2d82e7..6780edc6 100644 --- a/tests/inference/ToString/intersectionCanBeString/input.hack +++ b/tests/inference/ToString/intersectionCanBeString/input.hack @@ -1,6 +1,6 @@ interface EmptyInterface {} -class StringCastable implements EmptyInterface +final class StringCastable implements EmptyInterface { public function __toString() { diff --git a/tests/inference/ToString/toStringNever/input.hack b/tests/inference/ToString/toStringNever/input.hack index 6cc3d12e..b4510b00 100644 --- a/tests/inference/ToString/toStringNever/input.hack +++ b/tests/inference/ToString/toStringNever/input.hack @@ -1,4 +1,4 @@ -class B{ +final class B{ public function __toString() { throw new BadMethodCallException("bad"); } diff --git a/tests/inference/ToString/toStringToImplode/input.hack b/tests/inference/ToString/toStringToImplode/input.hack index bfcbd2d6..35f1b45b 100644 --- a/tests/inference/ToString/toStringToImplode/input.hack +++ b/tests/inference/ToString/toStringToImplode/input.hack @@ -1,4 +1,4 @@ -class Bar { +final class Bar { public function __toString() { return "foo"; } diff --git a/tests/inference/Trait/accessiblePrivateMethodFromTrait/input.hack b/tests/inference/Trait/accessiblePrivateMethodFromTrait/input.hack index eb062bb8..94d4923d 100644 --- a/tests/inference/Trait/accessiblePrivateMethodFromTrait/input.hack +++ b/tests/inference/Trait/accessiblePrivateMethodFromTrait/input.hack @@ -3,7 +3,7 @@ trait T { } } -class B { +final class B { use T; public function doFoo(): void { diff --git a/tests/inference/Trait/accessibleProtectedMethodFromInheritedTrait/input.hack b/tests/inference/Trait/accessibleProtectedMethodFromInheritedTrait/input.hack index 2ffa7d7f..21da1777 100644 --- a/tests/inference/Trait/accessibleProtectedMethodFromInheritedTrait/input.hack +++ b/tests/inference/Trait/accessibleProtectedMethodFromInheritedTrait/input.hack @@ -3,11 +3,11 @@ trait T { } } -class B { +abstract class B { use T; } -class C extends B { +final class C extends B { public function doFoo(): void { $this->fooFoo(); } diff --git a/tests/inference/Trait/accessibleProtectedMethodFromTrait/input.hack b/tests/inference/Trait/accessibleProtectedMethodFromTrait/input.hack index e8512a05..6fbd0686 100644 --- a/tests/inference/Trait/accessibleProtectedMethodFromTrait/input.hack +++ b/tests/inference/Trait/accessibleProtectedMethodFromTrait/input.hack @@ -3,7 +3,7 @@ trait T { } } -class B { +final class B { use T; public function doFoo(): void { diff --git a/tests/inference/Trait/accessiblePublicMethodFromInheritedTrait/input.hack b/tests/inference/Trait/accessiblePublicMethodFromInheritedTrait/input.hack index af5f1a62..40f5327d 100644 --- a/tests/inference/Trait/accessiblePublicMethodFromInheritedTrait/input.hack +++ b/tests/inference/Trait/accessiblePublicMethodFromInheritedTrait/input.hack @@ -3,11 +3,11 @@ trait T { } } -class B { +abstract class B { use T; } -class C extends B { +final class C extends B { public function doFoo(): void { $this->fooFoo(); } diff --git a/tests/inference/Trait/accessiblePublicMethodFromTrait/input.hack b/tests/inference/Trait/accessiblePublicMethodFromTrait/input.hack index 6a9858de..2e4d5a0d 100644 --- a/tests/inference/Trait/accessiblePublicMethodFromTrait/input.hack +++ b/tests/inference/Trait/accessiblePublicMethodFromTrait/input.hack @@ -3,7 +3,7 @@ trait T { } } -class B { +final class B { use T; public function doFoo(): void { diff --git a/tests/inference/Trait/aliasedPrivateMethodInternalCallWithLocalDefinition/input.hack b/tests/inference/Trait/aliasedPrivateMethodInternalCallWithLocalDefinition/input.hack index 3ce36ec7..cbf39006 100644 --- a/tests/inference/Trait/aliasedPrivateMethodInternalCallWithLocalDefinition/input.hack +++ b/tests/inference/Trait/aliasedPrivateMethodInternalCallWithLocalDefinition/input.hack @@ -12,7 +12,7 @@ trait T2 { } } -class A { +final class A { use T1; private function baz() : int { diff --git a/tests/inference/Trait/allMethodsReplaced/input.hack b/tests/inference/Trait/allMethodsReplaced/input.hack index 36c2e981..2968c12b 100644 --- a/tests/inference/Trait/allMethodsReplaced/input.hack +++ b/tests/inference/Trait/allMethodsReplaced/input.hack @@ -6,7 +6,7 @@ trait T { } } -class C { +final class C { use T; protected function foo(string $s) : void {} diff --git a/tests/inference/Trait/allowImplementMethodMadePublicInClass/input.hack b/tests/inference/Trait/allowImplementMethodMadePublicInClass/input.hack index af6087cf..55bbcbf0 100644 --- a/tests/inference/Trait/allowImplementMethodMadePublicInClass/input.hack +++ b/tests/inference/Trait/allowImplementMethodMadePublicInClass/input.hack @@ -6,6 +6,6 @@ trait T { private function boo() : void {} } -class A implements I { +final class A implements I { use T; } \ No newline at end of file diff --git a/tests/inference/Trait/allowImplementMethodMadePublicInParent/input.hack b/tests/inference/Trait/allowImplementMethodMadePublicInParent/input.hack index 37233556..baa6e157 100644 --- a/tests/inference/Trait/allowImplementMethodMadePublicInParent/input.hack +++ b/tests/inference/Trait/allowImplementMethodMadePublicInParent/input.hack @@ -6,8 +6,8 @@ trait T { private function boo() : void {} } -class B { +abstract class B { use T; } -class BChild extends B implements I {} \ No newline at end of file +final class BChild extends B implements I {} \ No newline at end of file diff --git a/tests/inference/Trait/inheritedProtectedTraitMethodAccess/input.hack b/tests/inference/Trait/inheritedProtectedTraitMethodAccess/input.hack index 01b15732..a2ca35ab 100644 --- a/tests/inference/Trait/inheritedProtectedTraitMethodAccess/input.hack +++ b/tests/inference/Trait/inheritedProtectedTraitMethodAccess/input.hack @@ -2,11 +2,11 @@ trait T { private function bar() : void {} } -class A { +abstract class A { use T; } -class AChild extends A { +final class AChild extends A { public function foo() : void { $this->bar(); } diff --git a/tests/inference/Trait/instanceOfTraitUser/input.hack b/tests/inference/Trait/instanceOfTraitUser/input.hack index b9cd1afd..771c5e46 100644 --- a/tests/inference/Trait/instanceOfTraitUser/input.hack +++ b/tests/inference/Trait/instanceOfTraitUser/input.hack @@ -4,10 +4,10 @@ trait T { } } -class A { +final class A { use T; } -class B { +final class B { use T; } \ No newline at end of file diff --git a/tests/inference/Trait/instanceofStaticInsideTrait/input.hack b/tests/inference/Trait/instanceofStaticInsideTrait/input.hack index 9a724ca5..6a75cb96 100644 --- a/tests/inference/Trait/instanceofStaticInsideTrait/input.hack +++ b/tests/inference/Trait/instanceofStaticInsideTrait/input.hack @@ -4,6 +4,6 @@ trait T { } } -class A { +final class A { use T; } \ No newline at end of file diff --git a/tests/inference/Trait/isAClassTraitUserClassConstant/input.hack b/tests/inference/Trait/isAClassTraitUserClassConstant/input.hack index 485a01c4..e4b4386a 100644 --- a/tests/inference/Trait/isAClassTraitUserClassConstant/input.hack +++ b/tests/inference/Trait/isAClassTraitUserClassConstant/input.hack @@ -4,11 +4,11 @@ trait T { } } -class A { +final class A { use T; } -class B { +final class B { use T; public function foo() : void {} diff --git a/tests/inference/Trait/isAClassTraitUserStringClass/input.hack b/tests/inference/Trait/isAClassTraitUserStringClass/input.hack index 485a01c4..e4b4386a 100644 --- a/tests/inference/Trait/isAClassTraitUserStringClass/input.hack +++ b/tests/inference/Trait/isAClassTraitUserStringClass/input.hack @@ -4,11 +4,11 @@ trait T { } } -class A { +final class A { use T; } -class B { +final class B { use T; public function foo() : void {} diff --git a/tests/inference/Trait/moreArgsInDefined/input.hack b/tests/inference/Trait/moreArgsInDefined/input.hack index dd71cc34..16618fcb 100644 --- a/tests/inference/Trait/moreArgsInDefined/input.hack +++ b/tests/inference/Trait/moreArgsInDefined/input.hack @@ -6,7 +6,7 @@ trait T { } } -class A { +final class A { use T; public function foo(string $s = null) : void { diff --git a/tests/inference/Trait/namespacedTraitLookup/input.hack b/tests/inference/Trait/namespacedTraitLookup/input.hack index d83b4f84..20d13124 100644 --- a/tests/inference/Trait/namespacedTraitLookup/input.hack +++ b/tests/inference/Trait/namespacedTraitLookup/input.hack @@ -1,9 +1,9 @@ namespace Classes { use Traits\T; - class A {} + final class A {} - class B { + final class B { use T; } } diff --git a/tests/inference/Trait/parentRefInTraitShouldNotFail/input.hack b/tests/inference/Trait/parentRefInTraitShouldNotFail/input.hack index 23b635aa..7bfee9fc 100644 --- a/tests/inference/Trait/parentRefInTraitShouldNotFail/input.hack +++ b/tests/inference/Trait/parentRefInTraitShouldNotFail/input.hack @@ -3,9 +3,9 @@ trait T { parent::foo(); } } -class A { +abstract class A { public function foo(): void {} } -class B extends A { +final class B extends A { use T; } \ No newline at end of file diff --git a/tests/inference/Trait/redefinedTraitMethodWithoutAlias/input.hack b/tests/inference/Trait/redefinedTraitMethodWithoutAlias/input.hack index 71f1e0ef..bc10e443 100644 --- a/tests/inference/Trait/redefinedTraitMethodWithoutAlias/input.hack +++ b/tests/inference/Trait/redefinedTraitMethodWithoutAlias/input.hack @@ -3,7 +3,7 @@ trait T { } } -class B { +final class B { use T; public function fooFoo(string $a): void { diff --git a/tests/inference/Trait/requireExtendsDontOverride/input.hack b/tests/inference/Trait/requireExtendsDontOverride/input.hack index ca24c5e5..2915371a 100644 --- a/tests/inference/Trait/requireExtendsDontOverride/input.hack +++ b/tests/inference/Trait/requireExtendsDontOverride/input.hack @@ -1,10 +1,10 @@ -class A { +abstract class A { public function getStr(): ?string { return rand(0, 1) ? "a" : null; } } -class B extends A { +abstract class B extends A { public function getStr(): string { return "a"; } @@ -14,7 +14,7 @@ trait T { require extends A; } -class C extends B { +final class C extends B { use T; public function foo(): string { return $this->getStr(); diff --git a/tests/inference/Trait/staticNotBoundInFinal/input.hack b/tests/inference/Trait/staticNotBoundInFinal/input.hack index d6c8825b..86dc12c1 100644 --- a/tests/inference/Trait/staticNotBoundInFinal/input.hack +++ b/tests/inference/Trait/staticNotBoundInFinal/input.hack @@ -5,6 +5,6 @@ trait Foo { } } -class A { +final class A { use Foo; } \ No newline at end of file diff --git a/tests/inference/Trait/traitIsSubclass/input.hack b/tests/inference/Trait/traitIsSubclass/input.hack index 6370520a..4f3239f0 100644 --- a/tests/inference/Trait/traitIsSubclass/input.hack +++ b/tests/inference/Trait/traitIsSubclass/input.hack @@ -10,9 +10,9 @@ trait MyTrait { } } -class AChild extends A { +abstract class AChild extends A { use MyTrait; public function bar(): void {} } -class AGrandChild extends AChild {} \ No newline at end of file +final class AGrandChild extends AChild {} \ No newline at end of file diff --git a/tests/inference/Trait/useTraitInClassWithAbstractMethod/input.hack b/tests/inference/Trait/useTraitInClassWithAbstractMethod/input.hack index 81aa3922..c2d2b94a 100644 --- a/tests/inference/Trait/useTraitInClassWithAbstractMethod/input.hack +++ b/tests/inference/Trait/useTraitInClassWithAbstractMethod/input.hack @@ -2,6 +2,6 @@ trait T { abstract public function foo(): void; } -class A { +final class A { public function foo(): void {} } \ No newline at end of file diff --git a/tests/inference/Trait/useTraitInSubclassWithAbstractMethod/input.hack b/tests/inference/Trait/useTraitInSubclassWithAbstractMethod/input.hack index c51e03c3..3a6b4bc6 100644 --- a/tests/inference/Trait/useTraitInSubclassWithAbstractMethod/input.hack +++ b/tests/inference/Trait/useTraitInSubclassWithAbstractMethod/input.hack @@ -6,6 +6,6 @@ abstract class A { public function foo(): void {} } -class B extends A { +final class B extends A { use T; } \ No newline at end of file diff --git a/tests/inference/Trait/useTraitInSubclassWithAbstractMethodInParent/input.hack b/tests/inference/Trait/useTraitInSubclassWithAbstractMethodInParent/input.hack index 08b3cdbd..48ff75f9 100644 --- a/tests/inference/Trait/useTraitInSubclassWithAbstractMethodInParent/input.hack +++ b/tests/inference/Trait/useTraitInSubclassWithAbstractMethodInParent/input.hack @@ -6,6 +6,6 @@ abstract class A { abstract public function foo(): void {} } -class B extends A { +final class B extends A { use T; } \ No newline at end of file diff --git a/tests/inference/TryCatch/catchFlowsIntoFinally/input.hack b/tests/inference/TryCatch/catchFlowsIntoFinally/input.hack index dcf05b1c..c0a13d4d 100644 --- a/tests/inference/TryCatch/catchFlowsIntoFinally/input.hack +++ b/tests/inference/TryCatch/catchFlowsIntoFinally/input.hack @@ -1,4 +1,4 @@ -class MyException extends Exception {} +final class MyException extends Exception {} function foo(): void { try { diff --git a/tests/inference/TryCatch/finallyArgMaybeUndefined/input.hack b/tests/inference/TryCatch/finallyArgMaybeUndefined/input.hack index a94416f4..91cd40b3 100644 --- a/tests/inference/TryCatch/finallyArgMaybeUndefined/input.hack +++ b/tests/inference/TryCatch/finallyArgMaybeUndefined/input.hack @@ -1,4 +1,4 @@ -class TestMe { +final class TestMe { private function startTransaction(): void { } diff --git a/tests/inference/TypeAlias/classConstTypeAlias/input.hack b/tests/inference/TypeAlias/classConstTypeAlias/input.hack index cf799016..95908773 100644 --- a/tests/inference/TypeAlias/classConstTypeAlias/input.hack +++ b/tests/inference/TypeAlias/classConstTypeAlias/input.hack @@ -2,7 +2,7 @@ abstract class A { abstract const type T; } -class B extends A { +final class B extends A { const type T = vec; } diff --git a/tests/inference/TypeAnnotation/almostFreeStandingTypeAlias/input.hack b/tests/inference/TypeAnnotation/almostFreeStandingTypeAlias/input.hack index 2ff1b2c7..637ad5be 100644 --- a/tests/inference/TypeAnnotation/almostFreeStandingTypeAlias/input.hack +++ b/tests/inference/TypeAnnotation/almostFreeStandingTypeAlias/input.hack @@ -1,6 +1,6 @@ type CoolType = ?A; -class A {} +final class A {} function foo(): CoolType { if (rand(0, 1)) { diff --git a/tests/inference/TypeAnnotation/classTypeConstantUsedInReturn/input.hack b/tests/inference/TypeAnnotation/classTypeConstantUsedInReturn/input.hack index 3e9a3745..e97250b3 100644 --- a/tests/inference/TypeAnnotation/classTypeConstantUsedInReturn/input.hack +++ b/tests/inference/TypeAnnotation/classTypeConstantUsedInReturn/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { const type TResult = string; public static function foo(): this::TResult { @@ -6,7 +6,7 @@ class A { } } -class B extends A {} +final class B extends A {} function bar(): string { return B::foo(); diff --git a/tests/inference/TypeCombination/multipleValuedArray/input.hack b/tests/inference/TypeCombination/multipleValuedArray/input.hack index 6246a832..00bce2bd 100644 --- a/tests/inference/TypeCombination/multipleValuedArray/input.hack +++ b/tests/inference/TypeCombination/multipleValuedArray/input.hack @@ -1,5 +1,5 @@ -class A {} -class B {} +final class A {} +final class B {} $var = vec[]; $var[] = new A(); $var[] = new B(); \ No newline at end of file diff --git a/tests/inference/TypeReconciliation/ArrayKeyExists/arrayKeyExistsComplex/input.hack b/tests/inference/TypeReconciliation/ArrayKeyExists/arrayKeyExistsComplex/input.hack index 2dd52d55..aa42e6ea 100644 --- a/tests/inference/TypeReconciliation/ArrayKeyExists/arrayKeyExistsComplex/input.hack +++ b/tests/inference/TypeReconciliation/ArrayKeyExists/arrayKeyExistsComplex/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const MAP = dict[ "a" => 1, "b" => 2, diff --git a/tests/inference/TypeReconciliation/AsExpression/asNullableThis/input.hack b/tests/inference/TypeReconciliation/AsExpression/asNullableThis/input.hack index bc32ed25..0885c0bc 100644 --- a/tests/inference/TypeReconciliation/AsExpression/asNullableThis/input.hack +++ b/tests/inference/TypeReconciliation/AsExpression/asNullableThis/input.hack @@ -4,7 +4,7 @@ function maybeGetA(): ?A { abstract class A {} -class B extends A { +final class B extends A { public function bar(): void { $a = maybeGetA(); if ($a is this) { @@ -14,4 +14,4 @@ class B extends A { } } -class C extends A {} \ No newline at end of file +final class C extends A {} \ No newline at end of file diff --git a/tests/inference/TypeReconciliation/AsExpression/complexAs/input.hack b/tests/inference/TypeReconciliation/AsExpression/complexAs/input.hack index 690a608c..e7504101 100644 --- a/tests/inference/TypeReconciliation/AsExpression/complexAs/input.hack +++ b/tests/inference/TypeReconciliation/AsExpression/complexAs/input.hack @@ -1,6 +1,6 @@ -class Vehicle {} -class Car extends Vehicle {} -class Boat extends Vehicle {} +abstract class Vehicle {} +final class Car extends Vehicle {} +final class Boat extends Vehicle {} function transport(mixed $m): ?Boat { // Exception if not a Vehicle. diff --git a/tests/inference/TypeReconciliation/AsExpression/simpleAsTypeGuard/input.hack b/tests/inference/TypeReconciliation/AsExpression/simpleAsTypeGuard/input.hack index a62046d5..b633813e 100644 --- a/tests/inference/TypeReconciliation/AsExpression/simpleAsTypeGuard/input.hack +++ b/tests/inference/TypeReconciliation/AsExpression/simpleAsTypeGuard/input.hack @@ -1,4 +1,4 @@ -class Vehicle {} +final class Vehicle {} function transport(mixed $m): Vehicle { $m as Vehicle; diff --git a/tests/inference/TypeReconciliation/AsExpression/simpleAsValue/input.hack b/tests/inference/TypeReconciliation/AsExpression/simpleAsValue/input.hack index 171f197d..325000cf 100644 --- a/tests/inference/TypeReconciliation/AsExpression/simpleAsValue/input.hack +++ b/tests/inference/TypeReconciliation/AsExpression/simpleAsValue/input.hack @@ -1,4 +1,4 @@ -class Vehicle {} +final class Vehicle {} function transport(mixed $m): Vehicle { $v = $m as Vehicle; diff --git a/tests/inference/TypeReconciliation/Conditional/assertArrayWithPropertyOffset/input.hack b/tests/inference/TypeReconciliation/Conditional/assertArrayWithPropertyOffset/input.hack index 814b4e7d..4f4e2f85 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertArrayWithPropertyOffset/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertArrayWithPropertyOffset/input.hack @@ -1,7 +1,7 @@ -class A { +final class A { public int $id = 0; } -class B { +final class B { public function foo() : void {} } diff --git a/tests/inference/TypeReconciliation/Conditional/assertOnStaticPropertyOffset/input.hack b/tests/inference/TypeReconciliation/Conditional/assertOnStaticPropertyOffset/input.hack index 7ac72daf..ebbca6a4 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertOnStaticPropertyOffset/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertOnStaticPropertyOffset/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { private static ?dict $map = dict[]; public static function foo(string $id) : ?string { diff --git a/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseStatement/input.hack b/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseStatement/input.hack index f439cf96..e999b3e4 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseStatement/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseStatement/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public string $a = ""; public string $b = ""; } diff --git a/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseifStatement/input.hack b/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseifStatement/input.hack index 92b32e92..0de7cde2 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseifStatement/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertPropertiesOfElseifStatement/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public string $a = ""; public string $b = ""; } diff --git a/tests/inference/TypeReconciliation/Conditional/assertVarAfterNakedBinaryOp/input.hack b/tests/inference/TypeReconciliation/Conditional/assertVarAfterNakedBinaryOp/input.hack index 56270e6d..d30ce99d 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertVarAfterNakedBinaryOp/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertVarAfterNakedBinaryOp/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public bool $b = false; } diff --git a/tests/inference/TypeReconciliation/Conditional/assertionAfterAssertionInsideExpandedBooleanNot/input.hack b/tests/inference/TypeReconciliation/Conditional/assertionAfterAssertionInsideExpandedBooleanNot/input.hack index 9b9feeaf..d7767cad 100644 --- a/tests/inference/TypeReconciliation/Conditional/assertionAfterAssertionInsideExpandedBooleanNot/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/assertionAfterAssertionInsideExpandedBooleanNot/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function bar(?A $a) : void { if (rand(0, 1) && (!$a || rand(0, 1))) { diff --git a/tests/inference/TypeReconciliation/Conditional/dontEliminateAssignOp/input.hack b/tests/inference/TypeReconciliation/Conditional/dontEliminateAssignOp/input.hack index 8b79482d..786ce893 100644 --- a/tests/inference/TypeReconciliation/Conditional/dontEliminateAssignOp/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/dontEliminateAssignOp/input.hack @@ -1,9 +1,9 @@ -class Obj {} -class A extends Obj {} -class B extends A {} -class C extends Obj {} -class D extends C {} -class E extends C {} +abstract class Obj {} +abstract class A extends Obj {} +final class B extends A {} +abstract class C extends Obj {} +final class D extends C {} +final class E extends C {} function bar(Obj $node) : void { if ($node is B diff --git a/tests/inference/TypeReconciliation/Conditional/filterSubclassBasedOnParentInstanceof/input.hack b/tests/inference/TypeReconciliation/Conditional/filterSubclassBasedOnParentInstanceof/input.hack index 6577d042..13d13722 100644 --- a/tests/inference/TypeReconciliation/Conditional/filterSubclassBasedOnParentInstanceof/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/filterSubclassBasedOnParentInstanceof/input.hack @@ -1,10 +1,10 @@ -class A {} -class B extends A { +abstract class A {} +final class B extends A { public function foo() : void {} } -class C {} -class D extends C {} +abstract class C {} +final class D extends C {} $b_or_d = rand(0, 1) ? new B() : new D(); diff --git a/tests/inference/TypeReconciliation/Conditional/getClassInterfaceCanBeClass/input.hack b/tests/inference/TypeReconciliation/Conditional/getClassInterfaceCanBeClass/input.hack index e084220f..6a725a23 100644 --- a/tests/inference/TypeReconciliation/Conditional/getClassInterfaceCanBeClass/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/getClassInterfaceCanBeClass/input.hack @@ -1,6 +1,6 @@ interface Id {} -class A { +final class A { public function is(Id $other): bool { return get_class($this) === get_class($other); } diff --git a/tests/inference/TypeReconciliation/Conditional/impossibleOr/input.hack b/tests/inference/TypeReconciliation/Conditional/impossibleOr/input.hack index c96d3930..da03bfd9 100644 --- a/tests/inference/TypeReconciliation/Conditional/impossibleOr/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/impossibleOr/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(int $a): void { if (rand(0, 1) || $a is A) {} diff --git a/tests/inference/TypeReconciliation/Conditional/instanceOfSubtypes/input.hack b/tests/inference/TypeReconciliation/Conditional/instanceOfSubtypes/input.hack index 201d9cc6..7a37638e 100644 --- a/tests/inference/TypeReconciliation/Conditional/instanceOfSubtypes/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/instanceOfSubtypes/input.hack @@ -1,8 +1,8 @@ abstract class A {} -class B extends A {} +final class B extends A {} abstract class C {} -class D extends C {} +final class D extends C {} function makeA(): A { return new B(); diff --git a/tests/inference/TypeReconciliation/Conditional/isAClass/input.hack b/tests/inference/TypeReconciliation/Conditional/isAClass/input.hack index 41012ef2..b59d12b5 100644 --- a/tests/inference/TypeReconciliation/Conditional/isAClass/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/isAClass/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} $a_class = rand(0, 1) ? A::class : "blargle"; if (is_a($a_class, A::class, true)) { echo "cool"; diff --git a/tests/inference/TypeReconciliation/Conditional/issetTwice/input.hack b/tests/inference/TypeReconciliation/Conditional/issetTwice/input.hack index 4e510c5b..3be2aacd 100644 --- a/tests/inference/TypeReconciliation/Conditional/issetTwice/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/issetTwice/input.hack @@ -1,4 +1,4 @@ -class B { +final class B { public function foo() : bool { return true; } diff --git a/tests/inference/TypeReconciliation/Conditional/manyNestedAsserts/input.hack b/tests/inference/TypeReconciliation/Conditional/manyNestedAsserts/input.hack index 0bcd667d..ac2bf177 100644 --- a/tests/inference/TypeReconciliation/Conditional/manyNestedAsserts/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/manyNestedAsserts/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A {} +abstract class A {} +final class B extends A {} function foo(A $left, A $right) : void { if (($left is B && rand(0, 1)) || ($right is B && rand(0, 1)) diff --git a/tests/inference/TypeReconciliation/Conditional/noLeakyClassType/input.hack b/tests/inference/TypeReconciliation/Conditional/noLeakyClassType/input.hack index ee50b14d..621ecb94 100644 --- a/tests/inference/TypeReconciliation/Conditional/noLeakyClassType/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/noLeakyClassType/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public dict $foo = dict[]; public dict $bar = dict[]; diff --git a/tests/inference/TypeReconciliation/Conditional/noReconciliationInElseIf/input.hack b/tests/inference/TypeReconciliation/Conditional/noReconciliationInElseIf/input.hack index ec519597..e3c24a87 100644 --- a/tests/inference/TypeReconciliation/Conditional/noReconciliationInElseIf/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/noReconciliationInElseIf/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} $a = rand(0, 1) ? new A() : null; if (rand(0, 1)) { diff --git a/tests/inference/TypeReconciliation/Conditional/nonRedundantConditionAfterThing/input.hack b/tests/inference/TypeReconciliation/Conditional/nonRedundantConditionAfterThing/input.hack index c0317187..443a99d6 100644 --- a/tests/inference/TypeReconciliation/Conditional/nonRedundantConditionAfterThing/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/nonRedundantConditionAfterThing/input.hack @@ -1,4 +1,4 @@ -class U { +final class U { public function takes(U $u) : bool { return true; } diff --git a/tests/inference/TypeReconciliation/Conditional/nullableNullsafePropertyAccess/input.hack b/tests/inference/TypeReconciliation/Conditional/nullableNullsafePropertyAccess/input.hack index cc358b8f..e2bed4a5 100644 --- a/tests/inference/TypeReconciliation/Conditional/nullableNullsafePropertyAccess/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/nullableNullsafePropertyAccess/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public string $b = ''; } diff --git a/tests/inference/TypeReconciliation/Conditional/nullsafeMethodCall/input.hack b/tests/inference/TypeReconciliation/Conditional/nullsafeMethodCall/input.hack index 8c530933..f27caa0a 100644 --- a/tests/inference/TypeReconciliation/Conditional/nullsafeMethodCall/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/nullsafeMethodCall/input.hack @@ -1,4 +1,4 @@ -class IntLinkedList { +final class IntLinkedList { public function __construct( public int $value, private ?IntLinkedList $next diff --git a/tests/inference/TypeReconciliation/Conditional/nullsafePropertyAccess/input.hack b/tests/inference/TypeReconciliation/Conditional/nullsafePropertyAccess/input.hack index 114baa26..4c2d773e 100644 --- a/tests/inference/TypeReconciliation/Conditional/nullsafePropertyAccess/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/nullsafePropertyAccess/input.hack @@ -1,4 +1,4 @@ -class IntLinkedList { +final class IntLinkedList { public function __construct( public int $value, public ?IntLinkedList $next diff --git a/tests/inference/TypeReconciliation/Conditional/possibleInstanceof/input.hack b/tests/inference/TypeReconciliation/Conditional/possibleInstanceof/input.hack index bf118445..921ed7d6 100644 --- a/tests/inference/TypeReconciliation/Conditional/possibleInstanceof/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/possibleInstanceof/input.hack @@ -1,7 +1,7 @@ interface I1 {} interface I2 {} -class A +abstract class A { public function foo(): void { if ($this is I1 || $this is I2) {} diff --git a/tests/inference/TypeReconciliation/Conditional/preventEqualityScalarType/input.hack b/tests/inference/TypeReconciliation/Conditional/preventEqualityScalarType/input.hack index 8779f653..66cd9757 100644 --- a/tests/inference/TypeReconciliation/Conditional/preventEqualityScalarType/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/preventEqualityScalarType/input.hack @@ -36,4 +36,4 @@ function bat(string $i) : void { if ($a === $i) {} } -class A {} \ No newline at end of file +final class A {} \ No newline at end of file diff --git a/tests/inference/TypeReconciliation/Conditional/preventStrictEqualityObjectType/input.hack b/tests/inference/TypeReconciliation/Conditional/preventStrictEqualityObjectType/input.hack index ab7c2f97..6f787ea7 100644 --- a/tests/inference/TypeReconciliation/Conditional/preventStrictEqualityObjectType/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/preventStrictEqualityObjectType/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(A $a, A $b) : bool { return $a === $b; } diff --git a/tests/inference/TypeReconciliation/Conditional/propertyChainedOutside/input.hack b/tests/inference/TypeReconciliation/Conditional/propertyChainedOutside/input.hack index 0ac235d5..7d671c71 100644 --- a/tests/inference/TypeReconciliation/Conditional/propertyChainedOutside/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/propertyChainedOutside/input.hack @@ -1,8 +1,8 @@ -class Assessment { +final class Assessment { public ?string $root = null; } -class Project { +final class Project { public ?Assessment $assessment = null; } diff --git a/tests/inference/TypeReconciliation/Conditional/reconcileWithInstanceof/input.hack b/tests/inference/TypeReconciliation/Conditional/reconcileWithInstanceof/input.hack index 0bc4a8a0..7bc3fe02 100644 --- a/tests/inference/TypeReconciliation/Conditional/reconcileWithInstanceof/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/reconcileWithInstanceof/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A { +abstract class A {} +final class B extends A { public function b() : bool { return (bool) rand(0, 1); } diff --git a/tests/inference/TypeReconciliation/Conditional/selfInstanceofStatic/input.hack b/tests/inference/TypeReconciliation/Conditional/selfInstanceofStatic/input.hack index 7f4f346f..6cb56f5f 100644 --- a/tests/inference/TypeReconciliation/Conditional/selfInstanceofStatic/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/selfInstanceofStatic/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(A $value): void { if ($value is this) {} } diff --git a/tests/inference/TypeReconciliation/Conditional/setArrayConstantOffset/input.hack b/tests/inference/TypeReconciliation/Conditional/setArrayConstantOffset/input.hack index 6e7905c3..9076c105 100644 --- a/tests/inference/TypeReconciliation/Conditional/setArrayConstantOffset/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/setArrayConstantOffset/input.hack @@ -1,4 +1,4 @@ -class S { +final class S { const A = 0; const B = 1; const C = 2; diff --git a/tests/inference/TypeReconciliation/Conditional/smallConditional/input.hack b/tests/inference/TypeReconciliation/Conditional/smallConditional/input.hack index 221e1efb..3deebb99 100644 --- a/tests/inference/TypeReconciliation/Conditional/smallConditional/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/smallConditional/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public vec $parts = vec[]; } -class FuncCall { +final class FuncCall { public ?A $name; public dict $args = dict[]; } diff --git a/tests/inference/TypeReconciliation/Conditional/usedAssertedVarButNotWithStrongerTypeGuarantee/input.hack b/tests/inference/TypeReconciliation/Conditional/usedAssertedVarButNotWithStrongerTypeGuarantee/input.hack index 5fe805b3..4fdd592f 100644 --- a/tests/inference/TypeReconciliation/Conditional/usedAssertedVarButNotWithStrongerTypeGuarantee/input.hack +++ b/tests/inference/TypeReconciliation/Conditional/usedAssertedVarButNotWithStrongerTypeGuarantee/input.hack @@ -6,7 +6,7 @@ function broken(bool $b, ?User $u) : void { if ($u) {} } -class User {} +final class User {} function takesUser(User $a) : bool { return true; diff --git a/tests/inference/TypeReconciliation/IsExpression/methodCallIsAlways/input.hack b/tests/inference/TypeReconciliation/IsExpression/methodCallIsAlways/input.hack index 047c0082..f6bee08f 100644 --- a/tests/inference/TypeReconciliation/IsExpression/methodCallIsAlways/input.hack +++ b/tests/inference/TypeReconciliation/IsExpression/methodCallIsAlways/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): string { return "a"; } diff --git a/tests/inference/TypeReconciliation/IsExpression/methodCallIsImpossible/input.hack b/tests/inference/TypeReconciliation/IsExpression/methodCallIsImpossible/input.hack index e73e910c..acca3592 100644 --- a/tests/inference/TypeReconciliation/IsExpression/methodCallIsImpossible/input.hack +++ b/tests/inference/TypeReconciliation/IsExpression/methodCallIsImpossible/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function foo(): string { return "a"; } diff --git a/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnIssetValue/input.hack b/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnIssetValue/input.hack index d851a8c6..72ece32f 100644 --- a/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnIssetValue/input.hack +++ b/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnIssetValue/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public ?string $name = null; } diff --git a/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnNotIssetValue/input.hack b/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnNotIssetValue/input.hack index 543cf83a..6ce5e8b6 100644 --- a/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnNotIssetValue/input.hack +++ b/tests/inference/TypeReconciliation/Isset/issetOnArrayOfObjectsAssertingOnNotIssetValue/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public ?string $name = null; } diff --git a/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideFunctionCall/input.hack b/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideFunctionCall/input.hack index 019ee50d..82d730a9 100644 --- a/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideFunctionCall/input.hack +++ b/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideFunctionCall/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public function foo() : ?string { return null; } diff --git a/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideMethodCall/input.hack b/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideMethodCall/input.hack index e05f5e8b..d8872611 100644 --- a/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideMethodCall/input.hack +++ b/tests/inference/TypeReconciliation/Isset/issetOnMethodCallInsideMethodCall/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public function foo() : ?string { return null; } diff --git a/tests/inference/TypeReconciliation/Isset/negatedNullCoalesce/input.hack b/tests/inference/TypeReconciliation/Isset/negatedNullCoalesce/input.hack index 3eafc3da..573a05fa 100644 --- a/tests/inference/TypeReconciliation/Isset/negatedNullCoalesce/input.hack +++ b/tests/inference/TypeReconciliation/Isset/negatedNullCoalesce/input.hack @@ -1,4 +1,4 @@ -class Bar {} +final class Bar {} type foo_t = shape( ?'a' => Bar, diff --git a/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersection/input.hack b/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersection/input.hack index 1b1f8135..c81634f7 100644 --- a/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersection/input.hack +++ b/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersection/input.hack @@ -1,6 +1,6 @@ -class A {} +abstract class A {} interface I {} -class AChild extends A implements I {} +final class AChild extends A implements I {} function isAChild(A $value): ?AChild { if (!$value is I) { diff --git a/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersectionOfInterfaces/input.hack b/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersectionOfInterfaces/input.hack index d28ab236..c4e52013 100644 --- a/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersectionOfInterfaces/input.hack +++ b/tests/inference/TypeReconciliation/RedundantCondition/noRedundantConditionWhenAssertingOnIntersectionOfInterfaces/input.hack @@ -1,6 +1,6 @@ interface A {} interface I {} -class AChild implements I, A {} +final class AChild implements I, A {} function isAChild(A $value): ?AChild { if (!$value is I) { diff --git a/tests/inference/TypeReconciliation/RedundantCondition/shapeCannotBeClass/input.hack b/tests/inference/TypeReconciliation/RedundantCondition/shapeCannotBeClass/input.hack index b94dc61b..bb6afdfe 100644 --- a/tests/inference/TypeReconciliation/RedundantCondition/shapeCannotBeClass/input.hack +++ b/tests/inference/TypeReconciliation/RedundantCondition/shapeCannotBeClass/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function foo(shape('a' => string) $s): void { if ($s is A) {} diff --git a/tests/inference/TypeReconciliation/Scope/instanceOfSubtraction/input.hack b/tests/inference/TypeReconciliation/Scope/instanceOfSubtraction/input.hack index e6ce982a..937708ca 100644 --- a/tests/inference/TypeReconciliation/Scope/instanceOfSubtraction/input.hack +++ b/tests/inference/TypeReconciliation/Scope/instanceOfSubtraction/input.hack @@ -1,12 +1,12 @@ -class Foo {} -class FooBar extends Foo{} -class FooBarBat extends FooBar{} -class FooMoo extends Foo{} +abstract class Foo {} +abstract class FooBar extends Foo{} +final class FooBarBat extends FooBar{} +final class FooMoo extends Foo{} -$a = new Foo(); +function main(Foo $a): void { + if ($a is FooBar && !$a is FooBarBat) { -if ($a is FooBar && !$a is FooBarBat) { + } else if ($a is FooMoo) { -} else if ($a is FooMoo) { - -} \ No newline at end of file + } +} diff --git a/tests/inference/TypeReconciliation/Scope/refineOredType/input.hack b/tests/inference/TypeReconciliation/Scope/refineOredType/input.hack index a2e6880b..f09e40fb 100644 --- a/tests/inference/TypeReconciliation/Scope/refineOredType/input.hack +++ b/tests/inference/TypeReconciliation/Scope/refineOredType/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { public function doThing(): void { if ($this is B || $this is C) { @@ -8,5 +8,5 @@ class A { } } } -class B extends A {} -class C extends A {} \ No newline at end of file +final class B extends A {} +final class C extends A {} \ No newline at end of file diff --git a/tests/inference/TypeReconciliation/Type/nullToNullableParam/input.hack b/tests/inference/TypeReconciliation/Type/nullToNullableParam/input.hack index b270e54b..0ce22676 100644 --- a/tests/inference/TypeReconciliation/Type/nullToNullableParam/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullToNullableParam/input.hack @@ -1,6 +1,6 @@ -class A {} +final class A {} -class B { +final class B { public function barBar(?A $a = null) : void {} } diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodInConditionWithIfGuardBefore/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodInConditionWithIfGuardBefore/input.hack index 7d3d5259..d78f33b9 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodInConditionWithIfGuardBefore/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodInConditionWithIfGuardBefore/input.hack @@ -1,14 +1,14 @@ -class One { +final class One { public string $a = ""; public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null, ?Two $two = null): void { if ($one === null) { return; diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuard/input.hack index 9e8a1abb..f0be451b 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuard/input.hack @@ -1,12 +1,12 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null, ?Two $two = null): void { if ($one && $two) { $two->fooFoo(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuardBefore/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuardBefore/input.hack index 9ddebcca..30cbb516 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuardBefore/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithBooleanIfGuardBefore/input.hack @@ -1,12 +1,12 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null, ?Two $two = null): void { if ($one === null || $two === null) { return; diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithExceptionThrown/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithExceptionThrown/input.hack index 53b13031..422992a8 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithExceptionThrown/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithExceptionThrown/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null): void { if (!$one) { throw new Exception(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinition/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinition/input.hack index 831a1932..046d7949 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinition/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinition/input.hack @@ -1,12 +1,12 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseReturn/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseReturn/input.hack index ebe57f9b..ed15e3a4 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseReturn/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseReturn/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseifReturn/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseifReturn/input.hack index 6af9b943..3ef9b578 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseifReturn/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithElseifReturn/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithReturn/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithReturn/input.hack index d9d486e0..cc0cdf88 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithReturn/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedNestedRedefinitionWithReturn/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinition/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinition/input.hack index 6b056aac..be92cfe2 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinition/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinition/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { if ($one === null) { $one = new One(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionInElse/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionInElse/input.hack index b68cfc6c..84855e27 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionInElse/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionInElse/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { if ($one) { // do nothing diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionOnThis/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionOnThis/input.hack index d8682605..243e1c6b 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionOnThis/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedRedefinitionOnThis/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public ?One $one = null; public function barBar() : void { diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchBreak/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchBreak/input.hack index 0ec99c1d..219dc7a4 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchBreak/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchBreak/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 1) ? 3 : 4; diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinition/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinition/input.hack index 958611cc..c868625d 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinition/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinition/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinitionDueToException/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinitionDueToException/input.hack index 7586f11a..7fdd07da 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinitionDueToException/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchRedefinitionDueToException/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null): void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchThatAlwaysReturns/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchThatAlwaysReturns/input.hack index b3bd631f..ae634781 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchThatAlwaysReturns/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithGuardedSwitchThatAlwaysReturns/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { $a = rand(0, 4); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuard/input.hack index e9d2fcb5..0e66ca79 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuard/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?A $a = null) : void { if ($a) { $a->fooFoo(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuardWithThis/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuardWithThis/input.hack index c3d81906..eaa91fa3 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuardWithThis/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithIfGuardWithThis/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public ?A $a = null; public function barBar(?A $a = null) : void { diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuard/input.hack index b5a5fff9..8525b0ae 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuard/input.hack @@ -1,12 +1,12 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null, ?Two $two = null) : void { if ($one !== null && $two) { $one->fooFoo(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuardAndBooleanAnd/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuardAndBooleanAnd/input.hack index 2b315098..ad362d20 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuardAndBooleanAnd/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithNonNullBooleanIfGuardAndBooleanAnd/input.hack @@ -1,12 +1,12 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null, ?Two $two = null) : void { if ($one !== null && ($two || rand(0, 1))) { $one->fooFoo(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithRedefinitionAndElse/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithRedefinitionAndElse/input.hack index 865af39c..36619f32 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithRedefinitionAndElse/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithRedefinitionAndElse/input.hack @@ -1,11 +1,11 @@ -class One { +final class One { /** @var int|null */ public $two; public function fooFoo(): void {} } -class B { +final class B { public function barBar(?One $one = null) : void { if (!$one) { $one = new One(); diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuard/input.hack index 9ecc6ecf..56e127da 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuard/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?A $a = null) : void { $b = $a ? $a->fooFoo() : null; } diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuardWithThis/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuardWithThis/input.hack index b8e7c35b..18fb4229 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuardWithThis/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryGuardWithThis/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public ?A $a = null; public function barBar(?A $a = null) : void { diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuard/input.hack index 0e5e8191..de0fb8b5 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuard/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?A $a = null) : void { $b = $a === null ? null : $a->fooFoo(); } diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuardWithThis/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuardWithThis/input.hack index 1f13ab10..0aa5a787 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuardWithThis/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIfNullGuardWithThis/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public ?A $a = null; public function barBar(?A $a = null) : void { diff --git a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIsNullGuard/input.hack b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIsNullGuard/input.hack index 3a1411c0..69430b31 100644 --- a/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIsNullGuard/input.hack +++ b/tests/inference/TypeReconciliation/Type/nullableMethodWithTernaryIsNullGuard/input.hack @@ -1,8 +1,8 @@ -class A { +final class A { public function fooFoo(): void {} } -class B { +final class B { public function barBar(?A $a = null) : void { $b = $a is null ? null : $a->fooFoo(); } diff --git a/tests/inference/TypeReconciliation/Type/objectToNullableObjectParam/input.hack b/tests/inference/TypeReconciliation/Type/objectToNullableObjectParam/input.hack index 99272217..995225d1 100644 --- a/tests/inference/TypeReconciliation/Type/objectToNullableObjectParam/input.hack +++ b/tests/inference/TypeReconciliation/Type/objectToNullableObjectParam/input.hack @@ -1,6 +1,6 @@ -class A {} +final class A {} -class B { +final class B { public function barBar(A $a = null) : void {} } diff --git a/tests/inference/TypeReconciliation/Type/variableReassignment/input.hack b/tests/inference/TypeReconciliation/Type/variableReassignment/input.hack index 2462a4b7..6928a82a 100644 --- a/tests/inference/TypeReconciliation/Type/variableReassignment/input.hack +++ b/tests/inference/TypeReconciliation/Type/variableReassignment/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function barBar(): void {} } diff --git a/tests/inference/TypeReconciliation/Type/variableReassignmentInIf/input.hack b/tests/inference/TypeReconciliation/Type/variableReassignmentInIf/input.hack index 4565f406..567e89ea 100644 --- a/tests/inference/TypeReconciliation/Type/variableReassignmentInIf/input.hack +++ b/tests/inference/TypeReconciliation/Type/variableReassignmentInIf/input.hack @@ -1,8 +1,8 @@ -class One { +final class One { public function fooFoo(): void {} } -class Two { +final class Two { public function barBar(): void {} } diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/allowAssertionInElseif/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/allowAssertionInElseif/input.hack index c54fb77e..9289c931 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/allowAssertionInElseif/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/allowAssertionInElseif/input.hack @@ -1,4 +1,4 @@ -class X { +final class X { public bool $a = false; public bool $b = false; public bool $c = false; diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/assertionAfterOredNegation/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/assertionAfterOredNegation/input.hack index 87926d69..940e877d 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/assertionAfterOredNegation/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/assertionAfterOredNegation/input.hack @@ -1,7 +1,7 @@ abstract class Base {} -class A extends Base {} -class AChild extends A {} -class B extends Base { +abstract class A extends Base {} +final class AChild extends A {} +final class B extends Base { public string $s = ""; } diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/dependentType/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/dependentType/input.hack index 2d26f281..abbd1c55 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/dependentType/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/dependentType/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function isValid() : bool { return (bool) rand(0, 1); } diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/getClassComparison/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/getClassComparison/input.hack index 20843b3f..967cbcba 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/getClassComparison/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/getClassComparison/input.hack @@ -1,11 +1,11 @@ -class Foo { +abstract class Foo { public function bar() : void {} } -class Bar extends Foo{ +final class Bar extends Foo{ public function bar() : void {} } -class Baz { +final class Baz { public function test(Foo $foo) : void { if (get_class($foo) !== Foo::class) { // do nothing diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/grandParentInstanceofConfusion/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/grandParentInstanceofConfusion/input.hack index 018950bb..cb01cae9 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/grandParentInstanceofConfusion/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/grandParentInstanceofConfusion/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends B {} +abstract class A {} +abstract class B extends A {} +final class C extends B {} function bad(A $x) : void { if (($x is C && rand(0, 1)) || rand(0, 1)) { diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrs/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrs/input.hack index 4a8f0ea4..7b27de8c 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrs/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrs/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrsWithSecondVar/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrsWithSecondVar/input.hack index f75e8ab3..1ce3009b 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrsWithSecondVar/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInBothOrsWithSecondVar/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInCNFOr/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInCNFOr/input.hack index 176b3983..5555f12e 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInCNFOr/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInCNFOr/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOr/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOr/input.hack index 29b86228..ea270d75 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOr/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOr/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOrNegated/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOrNegated/input.hack index ddcce1d0..8323c9f6 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOrNegated/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofInOrNegated/input.hack @@ -1,6 +1,6 @@ -class A {} -class B extends A {} -class C extends A {} +abstract class A {} +final class B extends A {} +final class C extends A {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofNoRedundant/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofNoRedundant/input.hack index 43fb38a7..068f7901 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/instanceofNoRedundant/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/instanceofNoRedundant/input.hack @@ -10,6 +10,6 @@ function logic(Foo $a, Foo $b) : void { } } -class Foo {} -class Bar extends Foo {} -class Bat extends Foo {} \ No newline at end of file +abstract class Foo {} +final class Bar extends Foo {} +final class Bat extends Foo {} \ No newline at end of file diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/invertLogic/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/invertLogic/input.hack index 722c86b5..6167c084 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/invertLogic/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/invertLogic/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A {} +abstract class A {} +final class B extends A {} function foo(?A $a) : A { if (!$a || !($a is B && rand(0, 1))) { diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/reconcileNestedOrsInElse/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/reconcileNestedOrsInElse/input.hack index 3a8544c6..ed023d51 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/reconcileNestedOrsInElse/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/reconcileNestedOrsInElse/input.hack @@ -1,5 +1,5 @@ -class A {} -class B {} +final class A {} +final class B {} function takesA(A $a): void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/redundantInElse/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/redundantInElse/input.hack index 7f6c4b83..7938cfa2 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/redundantInElse/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/redundantInElse/input.hack @@ -1,5 +1,5 @@ -class A {} -class AChild extends A {} +abstract class A {} +final class AChild extends A {} function foo(A $a, A $b): void { if ($a is AChild) { diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/sealedOrdering/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/sealedOrdering/input.hack index 3f6d2ca2..70e9bc9b 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/sealedOrdering/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/sealedOrdering/input.hack @@ -1,11 +1,11 @@ <<__Sealed(B::class, C::class)>> class A {} -class B extends A { +final class B extends A { public function foo(): int { return rand(0, 10); } } -class C {} +final class C {} function takesA(?A $a) { if ($a is null || $a is C || $a->foo() > 1) { diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/subtractFromAssertedType/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/subtractFromAssertedType/input.hack index bd6bb135..9c3e5736 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/subtractFromAssertedType/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/subtractFromAssertedType/input.hack @@ -1,5 +1,5 @@ -class A {} -class B {} +final class A {} +final class B {} function foo(?A $foo, B $other): ?A { if (rand(0, 1)) { diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseOnly/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseOnly/input.hack index 50b43fd6..79ebd210 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseOnly/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseOnly/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function takesA(A $a) : void {} public function foo() : void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseif/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseif/input.hack index 96912e28..5b9715cd 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseif/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/twoVarChangeInElseif/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function takesA(A $a) : void {} public function foo() : void {} diff --git a/tests/inference/TypeReconciliation/TypeAlgebra/typeSimplification/input.hack b/tests/inference/TypeReconciliation/TypeAlgebra/typeSimplification/input.hack index df920b70..61f106f1 100644 --- a/tests/inference/TypeReconciliation/TypeAlgebra/typeSimplification/input.hack +++ b/tests/inference/TypeReconciliation/TypeAlgebra/typeSimplification/input.hack @@ -1,5 +1,5 @@ -class A {} -class B extends A {} +abstract class A {} +final class B extends A {} function foo(A $a, A $b) : ?B { if (($a is B || !$b is B) && $a is B && $b is B) { diff --git a/tests/inference/TypeReconciliation/Value/negativeInts/input.hack b/tests/inference/TypeReconciliation/Value/negativeInts/input.hack index fa441e7f..35f3069c 100644 --- a/tests/inference/TypeReconciliation/Value/negativeInts/input.hack +++ b/tests/inference/TypeReconciliation/Value/negativeInts/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { const A = 1; const B = -1; } diff --git a/tests/inference/TypeReconciliation/Value/notEqualToEachOther/input.hack b/tests/inference/TypeReconciliation/Value/notEqualToEachOther/input.hack index 1b8723fb..6ea36935 100644 --- a/tests/inference/TypeReconciliation/Value/notEqualToEachOther/input.hack +++ b/tests/inference/TypeReconciliation/Value/notEqualToEachOther/input.hack @@ -1,4 +1,4 @@ -class A {} +final class A {} function example(A $a, A $b): bool { /* HAKANA_IGNORE[StrictObjectEquality] */ diff --git a/tests/inference/TypeReconciliation/Value/regularComparison3/input.hack b/tests/inference/TypeReconciliation/Value/regularComparison3/input.hack index 9c175e11..b0556cbb 100644 --- a/tests/inference/TypeReconciliation/Value/regularComparison3/input.hack +++ b/tests/inference/TypeReconciliation/Value/regularComparison3/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { const B = 1; const C = 2; diff --git a/tests/inference/TypeReconciliation/Value/yodaConditionalsShouldHaveSameOutput2/input.hack b/tests/inference/TypeReconciliation/Value/yodaConditionalsShouldHaveSameOutput2/input.hack index 0333f49d..494801ae 100644 --- a/tests/inference/TypeReconciliation/Value/yodaConditionalsShouldHaveSameOutput2/input.hack +++ b/tests/inference/TypeReconciliation/Value/yodaConditionalsShouldHaveSameOutput2/input.hack @@ -1,4 +1,4 @@ -class Foo { +final class Foo { protected shape("from" => bool, "to" => bool) $things = dict["from" => false, "to" => false]; public function foo(string ...$things) : void { diff --git a/tests/nopanic/noclasslikemember/input.hack b/tests/nopanic/noclasslikemember/input.hack index c706057c..0dbc3881 100644 --- a/tests/nopanic/noclasslikemember/input.hack +++ b/tests/nopanic/noclasslikemember/input.hack @@ -1,4 +1,4 @@ -class Foo {} +final class Foo {} function a(): void { new Foo(); diff --git a/tests/security/IndirectGetAssignment/input.hack b/tests/security/IndirectGetAssignment/input.hack index 6be4811d..983530f2 100644 --- a/tests/security/IndirectGetAssignment/input.hack +++ b/tests/security/IndirectGetAssignment/input.hack @@ -1,4 +1,4 @@ -class InputFilter { +final class InputFilter { public string $name; public function __construct(string $name) { diff --git a/tests/security/NoTaintsOnSimilarPureCall/input.hack b/tests/security/NoTaintsOnSimilarPureCall/input.hack index 94d93a0a..f521a82c 100644 --- a/tests/security/NoTaintsOnSimilarPureCall/input.hack +++ b/tests/security/NoTaintsOnSimilarPureCall/input.hack @@ -1,4 +1,4 @@ -class U { +final class U { public static function shorten(string $s)[] : string { return substr($s, 0, 15); } @@ -8,7 +8,7 @@ class U { } } -class O1 { +final class O1 { public string $s; public function __construct(string $s) { @@ -16,7 +16,7 @@ class O1 { } } -class O2 { +final class O2 { public string $t; public function __construct() { @@ -24,14 +24,14 @@ class O2 { } } -class V1 { +final class V1 { public function foo() : void { $o = new O1((string) $_GET["FOO"]); echo U::escape(U::shorten($o->s)); } } -class V2 { +final class V2 { public function foo(O2 $o) : void { echo U::shorten(U::escape($o->t)); } diff --git a/tests/security/doTaintSpecializedInstanceProperty/input.hack b/tests/security/doTaintSpecializedInstanceProperty/input.hack index cfa97e50..a870acf7 100644 --- a/tests/security/doTaintSpecializedInstanceProperty/input.hack +++ b/tests/security/doTaintSpecializedInstanceProperty/input.hack @@ -1,4 +1,4 @@ -class StringHolder { +final class StringHolder { public string $x; public function __construct(string $x) { diff --git a/tests/security/dontPropagateTaintToChildConstructor/input.hack b/tests/security/dontPropagateTaintToChildConstructor/input.hack index f75a20d1..a77e12b0 100644 --- a/tests/security/dontPropagateTaintToChildConstructor/input.hack +++ b/tests/security/dontPropagateTaintToChildConstructor/input.hack @@ -1,8 +1,8 @@ -class A { +abstract class A { public function __construct(string $a) {} } -class B extends A { +final class B extends A { public function __construct(string $a) { echo $a; } diff --git a/tests/security/dontTaintObjectThroughStringCheck/input.hack b/tests/security/dontTaintObjectThroughStringCheck/input.hack index f397d3f1..d2e6af16 100644 --- a/tests/security/dontTaintObjectThroughStringCheck/input.hack +++ b/tests/security/dontTaintObjectThroughStringCheck/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public string $s) {} } diff --git a/tests/security/dontTaintObjectThroughStringCheckAfterArrayFetch/input.hack b/tests/security/dontTaintObjectThroughStringCheckAfterArrayFetch/input.hack index 17b3d47d..48027425 100644 --- a/tests/security/dontTaintObjectThroughStringCheckAfterArrayFetch/input.hack +++ b/tests/security/dontTaintObjectThroughStringCheckAfterArrayFetch/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public string $s) {} } diff --git a/tests/security/dontTaintSpecializedInstanceProperty/input.hack b/tests/security/dontTaintSpecializedInstanceProperty/input.hack index aa9243c1..4c5f6393 100644 --- a/tests/security/dontTaintSpecializedInstanceProperty/input.hack +++ b/tests/security/dontTaintSpecializedInstanceProperty/input.hack @@ -1,5 +1,5 @@ <> -class StringHolder { +final class StringHolder { public $x; public function __construct(string $x) { diff --git a/tests/security/dontTaintThroughChildConstructorWhenMethodOverridden/input.hack b/tests/security/dontTaintThroughChildConstructorWhenMethodOverridden/input.hack index c3fb3741..42fd43ce 100644 --- a/tests/security/dontTaintThroughChildConstructorWhenMethodOverridden/input.hack +++ b/tests/security/dontTaintThroughChildConstructorWhenMethodOverridden/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private $taint; public function __construct($taint) { @@ -10,7 +10,7 @@ class A { } } -class B extends A { +final class B extends A { public function __construct($taint) {} } diff --git a/tests/security/dontTaintThroughSpecializedStaticCall/input.hack b/tests/security/dontTaintThroughSpecializedStaticCall/input.hack index 93766d3f..de236b8a 100644 --- a/tests/security/dontTaintThroughSpecializedStaticCall/input.hack +++ b/tests/security/dontTaintThroughSpecializedStaticCall/input.hack @@ -7,7 +7,7 @@ function foo(mixed $c) { echo $d; } -class A { +final class A { <> public static function reflect(string $s): string { return $s; diff --git a/tests/security/immutableClassTrackInputThroughMethod/input.hack b/tests/security/immutableClassTrackInputThroughMethod/input.hack index 8195d70a..ceb29fe1 100644 --- a/tests/security/immutableClassTrackInputThroughMethod/input.hack +++ b/tests/security/immutableClassTrackInputThroughMethod/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $taint = ""; public function __construct(string $taint) { diff --git a/tests/security/memoizedValueInInstanceCall/input.hack b/tests/security/memoizedValueInInstanceCall/input.hack index 97724fc5..02e49f9f 100644 --- a/tests/security/memoizedValueInInstanceCall/input.hack +++ b/tests/security/memoizedValueInInstanceCall/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $prev = ""; public function getPrevious(string $current): string { diff --git a/tests/security/memoizedValueInInstanceCallInapplicable/input.hack b/tests/security/memoizedValueInInstanceCallInapplicable/input.hack index 2bb25f73..91741de2 100644 --- a/tests/security/memoizedValueInInstanceCallInapplicable/input.hack +++ b/tests/security/memoizedValueInInstanceCallInapplicable/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $prev = ""; public function getPrevious(string $current): string { diff --git a/tests/security/memoizedValueInMethodCall/input.hack b/tests/security/memoizedValueInMethodCall/input.hack index 52c25071..35938b72 100644 --- a/tests/security/memoizedValueInMethodCall/input.hack +++ b/tests/security/memoizedValueInMethodCall/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private static string $prev = ""; public static function getPrevious(string $current): string { diff --git a/tests/security/noTaintInOtherInstance/input.hack b/tests/security/noTaintInOtherInstance/input.hack index bc5e0a6b..8fd5a711 100644 --- a/tests/security/noTaintInOtherInstance/input.hack +++ b/tests/security/noTaintInOtherInstance/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $taint = ""; public function __construct(string $taint) { diff --git a/tests/security/potentialTaintThroughChildClassSettingProperty/input.hack b/tests/security/potentialTaintThroughChildClassSettingProperty/input.hack index b8b57330..171bf93f 100644 --- a/tests/security/potentialTaintThroughChildClassSettingProperty/input.hack +++ b/tests/security/potentialTaintThroughChildClassSettingProperty/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { public string $taint = ""; public function getTaint() : string { @@ -6,7 +6,7 @@ class A { } } -class B extends A { +final class B extends A { public function __construct(string $taint) { $this->taint = $taint; } diff --git a/tests/security/sinkAnnotation/input.hack b/tests/security/sinkAnnotation/input.hack index f2823f75..4a2401a7 100644 --- a/tests/security/sinkAnnotation/input.hack +++ b/tests/security/sinkAnnotation/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : string { return (string) $_GET['user_id']; } @@ -13,7 +13,7 @@ class A { } } -class MySqlHandler { +final class MySqlHandler { public function exec( <<\Hakana\SecurityAnalysis\Sink('Sql')>> string $sql ) : void {} diff --git a/tests/security/specializeStaticMethod/input.hack b/tests/security/specializeStaticMethod/input.hack index ddc9bc1b..8fa1e67f 100644 --- a/tests/security/specializeStaticMethod/input.hack +++ b/tests/security/specializeStaticMethod/input.hack @@ -1,6 +1,6 @@ StringUtility::foo($_GET["c"]); -class StringUtility { +final class StringUtility { <<\Hakana\SecurityAnalysis\SpecializeCall()>> public static function foo(string $str) : string { diff --git a/tests/security/specializedInstanceWithState/input.hack b/tests/security/specializedInstanceWithState/input.hack index 5e3a2744..62cdda36 100644 --- a/tests/security/specializedInstanceWithState/input.hack +++ b/tests/security/specializedInstanceWithState/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $taint = ""; private static string $stub = ""; diff --git a/tests/security/taintAppendedToArray/input.hack b/tests/security/taintAppendedToArray/input.hack index cd1deec8..086835f2 100644 --- a/tests/security/taintAppendedToArray/input.hack +++ b/tests/security/taintAppendedToArray/input.hack @@ -1,4 +1,4 @@ -class C { +final class C { public static function foo() : array { $a = vec[]; $a[] = (string) $_GET["bad"]; diff --git a/tests/security/taintFromAbstractMethod/input.hack b/tests/security/taintFromAbstractMethod/input.hack index fd067099..aeede030 100644 --- a/tests/security/taintFromAbstractMethod/input.hack +++ b/tests/security/taintFromAbstractMethod/input.hack @@ -29,13 +29,13 @@ abstract class AHandler extends InputHandler {} abstract class BHandler extends InputHandler {} abstract class CHandler extends InputHandler {} -class MyHandler extends BHandler { +final class MyHandler extends BHandler { public function getResult(my_args_t $args) { B::handle($args); } } -class B { +final class B { public static function handle(my_args_t $args) { $ch = curl_init($args['a']); } diff --git a/tests/security/taintFromAwaitedAbstractMethod/input.hack b/tests/security/taintFromAwaitedAbstractMethod/input.hack index bae6dec7..c54744b9 100644 --- a/tests/security/taintFromAwaitedAbstractMethod/input.hack +++ b/tests/security/taintFromAwaitedAbstractMethod/input.hack @@ -49,7 +49,7 @@ type my_args_t = shape('a' => string); abstract class BHandler extends InputHandler {} -class MyHandler extends BHandler { +final class MyHandler extends BHandler { public async function getResult(my_args_t $args): Awaitable> { return new ResultSuccess($args['a']); } diff --git a/tests/security/taintOnPregReplaceCall/input.hack b/tests/security/taintOnPregReplaceCall/input.hack index 77f5300d..ee936382 100644 --- a/tests/security/taintOnPregReplaceCall/input.hack +++ b/tests/security/taintOnPregReplaceCall/input.hack @@ -1,12 +1,12 @@ -class U { +final class U { public static function shorten(string $s)[]: string { return preg_replace("/foo/", "bar", $s); } } -class V {} +final class V {} -class O1 { +final class O1 { public string $s; public function __construct() { @@ -14,7 +14,7 @@ class O1 { } } -class V1 extends V { +final class V1 extends V { public function foo(O1 $o) : void { echo U::shorten($o->s); } diff --git a/tests/security/taintOnStrReplaceCallRemovedInFunction/input.hack b/tests/security/taintOnStrReplaceCallRemovedInFunction/input.hack index 2a3e5afd..235c4634 100644 --- a/tests/security/taintOnStrReplaceCallRemovedInFunction/input.hack +++ b/tests/security/taintOnStrReplaceCallRemovedInFunction/input.hack @@ -1,13 +1,13 @@ -class U { +final class U { <<\Hakana\SecurityAnalysis\Sanitize('HtmlTag')>> public static function shorten(string $s)[]: string { return str_replace("foo", "bar", $s); } } -class V {} +final class V {} -class O1 { +final class O1 { public string $s; public function __construct() { @@ -15,7 +15,7 @@ class O1 { } } -class V1 extends V { +final class V1 extends V { public function foo(O1 $o) : void { echo U::shorten($o->s); } diff --git a/tests/security/taintOnStrReplaceCallSimple/input.hack b/tests/security/taintOnStrReplaceCallSimple/input.hack index d80e6470..7c12ba15 100644 --- a/tests/security/taintOnStrReplaceCallSimple/input.hack +++ b/tests/security/taintOnStrReplaceCallSimple/input.hack @@ -1,12 +1,12 @@ -class U { +final class U { public static function shorten(string $s)[]: string { return str_replace("foo", "bar", $s); } } -class V {} +final class V {} -class O1 { +final class O1 { public string $s; public function __construct() { @@ -14,7 +14,7 @@ class O1 { } } -class V1 extends V { +final class V1 extends V { public function foo(O1 $o) : void { echo U::shorten($o->s); } diff --git a/tests/security/taintOnSubstrCall/input.hack b/tests/security/taintOnSubstrCall/input.hack index 7edb3a40..a3344b3b 100644 --- a/tests/security/taintOnSubstrCall/input.hack +++ b/tests/security/taintOnSubstrCall/input.hack @@ -1,12 +1,12 @@ -class U { +final class U { public static function shorten(string $s)[]: string { return substr($s, 0, 15); } } -class V {} +final class V {} -class O1 { +final class O1 { public string $s; public function __construct() { @@ -14,7 +14,7 @@ class O1 { } } -class V1 extends V { +final class V1 extends V { public function foo(O1 $o) : void { echo U::shorten($o->s); } diff --git a/tests/security/taintPropertyPassingObject/input.hack b/tests/security/taintPropertyPassingObject/input.hack index 84cbd5f2..99ec0484 100644 --- a/tests/security/taintPropertyPassingObject/input.hack +++ b/tests/security/taintPropertyPassingObject/input.hack @@ -1,5 +1,5 @@ <<\Hakana\Immutable>> -class User { +final class User { public string $id; public function __construct(string $userId) { @@ -7,7 +7,7 @@ class User { } } -class UserUpdater { +final class UserUpdater { public static function doDelete(AsyncMysqlConnection $conn, User $user) : void { self::deleteUser($conn, $user->id); } diff --git a/tests/security/taintPropertyPassingObjectSettingValueLater/input.hack b/tests/security/taintPropertyPassingObjectSettingValueLater/input.hack index ecabb89f..9928e1cf 100644 --- a/tests/security/taintPropertyPassingObjectSettingValueLater/input.hack +++ b/tests/security/taintPropertyPassingObjectSettingValueLater/input.hack @@ -1,4 +1,4 @@ -class User { +final class User { public string $id; public function __construct(string $userId) { diff --git a/tests/security/taintPropertyPassingObjectWithDifferentValue/input.hack b/tests/security/taintPropertyPassingObjectWithDifferentValue/input.hack index a094834b..3c46eb26 100644 --- a/tests/security/taintPropertyPassingObjectWithDifferentValue/input.hack +++ b/tests/security/taintPropertyPassingObjectWithDifferentValue/input.hack @@ -1,5 +1,5 @@ <<\Hakana\Immutable>> -class User { +final class User { public string $id; public $name = "Luke"; @@ -8,7 +8,7 @@ class User { } } -class UserUpdater { +final class UserUpdater { public static function doDelete(AsyncMysqlConnection $conn, User $user) : void { self::deleteUser($conn, $user->name); } diff --git a/tests/security/taintPropertyWithoutPassingObject/input.hack b/tests/security/taintPropertyWithoutPassingObject/input.hack index 30bf73b3..38b774fc 100644 --- a/tests/security/taintPropertyWithoutPassingObject/input.hack +++ b/tests/security/taintPropertyWithoutPassingObject/input.hack @@ -1,4 +1,4 @@ -class User { +final class User { public string $id; public function __construct(string $userId) { diff --git a/tests/security/taintSpecializedMethod/input.hack b/tests/security/taintSpecializedMethod/input.hack index 641da98d..cf51d0c1 100644 --- a/tests/security/taintSpecializedMethod/input.hack +++ b/tests/security/taintSpecializedMethod/input.hack @@ -1,4 +1,4 @@ -class Unsafe { +final class Unsafe { public function isUnsafe() { return $_GET["unsafe"]; } diff --git a/tests/security/taintSpecializedMethodForAnonymousInstance/input.hack b/tests/security/taintSpecializedMethodForAnonymousInstance/input.hack index 7cf166f5..c62198fa 100644 --- a/tests/security/taintSpecializedMethodForAnonymousInstance/input.hack +++ b/tests/security/taintSpecializedMethodForAnonymousInstance/input.hack @@ -1,4 +1,4 @@ -class Unsafe { +final class Unsafe { public function isUnsafe() { return $_GET["unsafe"]; } diff --git a/tests/security/taintSpecializedMethodForStubMadeInstance/input.hack b/tests/security/taintSpecializedMethodForStubMadeInstance/input.hack index 8da7c77d..fdefa96b 100644 --- a/tests/security/taintSpecializedMethodForStubMadeInstance/input.hack +++ b/tests/security/taintSpecializedMethodForStubMadeInstance/input.hack @@ -1,5 +1,5 @@ <<\Hakana\SecurityAnalysis\Specialize()>> -class Unsafe { +final class Unsafe { public function isUnsafe() { return $_GET["unsafe"]; } diff --git a/tests/security/taintThroughChildConstructorCallingGrandParentMethod/input.hack b/tests/security/taintThroughChildConstructorCallingGrandParentMethod/input.hack index 9faed7cf..b788bf52 100644 --- a/tests/security/taintThroughChildConstructorCallingGrandParentMethod/input.hack +++ b/tests/security/taintThroughChildConstructorCallingGrandParentMethod/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private string $taint; public function __construct($taint) { @@ -10,9 +10,9 @@ class A { } } -class B extends A {} +final class B extends A {} -class C extends B {} +final class C extends B {} function foo(A $a) { echo $a->getTaint(); diff --git a/tests/security/taintThroughChildConstructorCallingParentMethod/input.hack b/tests/security/taintThroughChildConstructorCallingParentMethod/input.hack index c0355607..c4ff3454 100644 --- a/tests/security/taintThroughChildConstructorCallingParentMethod/input.hack +++ b/tests/security/taintThroughChildConstructorCallingParentMethod/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private string $taint; public function __construct($taint) { @@ -10,9 +10,9 @@ class A { } } -class B extends A {} +final class B extends A {} -class C extends B {} +final class C extends B {} function foo(B $b) { echo $b->getTaint(); diff --git a/tests/security/taintThroughChildConstructorWhenMethodOverriddenWithParentConstructorCall/input.hack b/tests/security/taintThroughChildConstructorWhenMethodOverriddenWithParentConstructorCall/input.hack index 5e28f44e..e0670667 100644 --- a/tests/security/taintThroughChildConstructorWhenMethodOverriddenWithParentConstructorCall/input.hack +++ b/tests/security/taintThroughChildConstructorWhenMethodOverriddenWithParentConstructorCall/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private string $taint; public function __construct($taint) { @@ -10,7 +10,7 @@ class A { } } -class B extends A { +final class B extends A { public function __construct($taint) { parent::__construct($taint); } diff --git a/tests/security/taintThroughChildConstructorWithoutMethodOverride/input.hack b/tests/security/taintThroughChildConstructorWithoutMethodOverride/input.hack index 39d7014d..92387a1b 100644 --- a/tests/security/taintThroughChildConstructorWithoutMethodOverride/input.hack +++ b/tests/security/taintThroughChildConstructorWithoutMethodOverride/input.hack @@ -1,4 +1,4 @@ -class A { +abstract class A { private string $taint; public function __construct($taint) { @@ -10,7 +10,7 @@ class A { } } -class B extends A {} +final class B extends A {} $b = new B($_GET["bar"]); diff --git a/tests/security/taintThroughPromotedProperty/input.hack b/tests/security/taintThroughPromotedProperty/input.hack index 6cae6b42..444bfc25 100644 --- a/tests/security/taintThroughPromotedProperty/input.hack +++ b/tests/security/taintThroughPromotedProperty/input.hack @@ -1,4 +1,4 @@ -class User { +final class User { public function __construct(public string $userId) {} } diff --git a/tests/security/taintThroughStaticProperty/input.hack b/tests/security/taintThroughStaticProperty/input.hack index bbb83509..406e53cf 100644 --- a/tests/security/taintThroughStaticProperty/input.hack +++ b/tests/security/taintThroughStaticProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private static string $foo = ""; public static function setFoo(string $s): void { diff --git a/tests/security/taintThroughStringCheck/input.hack b/tests/security/taintThroughStringCheck/input.hack index d78dd883..1fd19e86 100644 --- a/tests/security/taintThroughStringCheck/input.hack +++ b/tests/security/taintThroughStringCheck/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(public string $s) {} } diff --git a/tests/security/taintedInParentLoader/input.hack b/tests/security/taintedInParentLoader/input.hack index 6aa5ab99..f991fae4 100644 --- a/tests/security/taintedInParentLoader/input.hack +++ b/tests/security/taintedInParentLoader/input.hack @@ -10,15 +10,15 @@ function getPdo() : AsyncMysqlConnection { return new AsyncMysqlConnection("connectionstring"); } -class AChild extends A { +final class AChild extends A { public static function loadPartial(string $sink) : void { getPdo()->query("select * from foo where bar = " . $sink); } } -class AGrandChild extends AChild {} +final class AGrandChild extends AChild {} -class C { +final class C { public function foo(string $user_id) : void { AGrandChild::loadFull($user_id); } diff --git a/tests/security/taintedInputDirectly/input.hack b/tests/security/taintedInputDirectly/input.hack index 22ce144f..b2a33a73 100644 --- a/tests/security/taintedInputDirectly/input.hack +++ b/tests/security/taintedInputDirectly/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function deleteUser(AsyncMysqlConnection $conn) : void { $userId = (string) $_GET["user_id"]; $conn->query("delete from users where user_id = " . $userId); diff --git a/tests/security/taintedInputFromExplicitTaintSourceStaticMethod/input.hack b/tests/security/taintedInputFromExplicitTaintSourceStaticMethod/input.hack index 2bb41084..b285ac52 100644 --- a/tests/security/taintedInputFromExplicitTaintSourceStaticMethod/input.hack +++ b/tests/security/taintedInputFromExplicitTaintSourceStaticMethod/input.hack @@ -1,4 +1,4 @@ -class Request { +final class Request { <<\Hakana\SecurityAnalysis\Source('UriRequestHeader')>> public static function getName() : string { return ""; diff --git a/tests/security/taintedInputFromMethodReturnTypeSimple/input.hack b/tests/security/taintedInputFromMethodReturnTypeSimple/input.hack index d8201d27..49d6983a 100644 --- a/tests/security/taintedInputFromMethodReturnTypeSimple/input.hack +++ b/tests/security/taintedInputFromMethodReturnTypeSimple/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : string { return (string) $_GET["user_id"]; } diff --git a/tests/security/taintedInputFromParam/input.hack b/tests/security/taintedInputFromParam/input.hack index cec47c66..a6aeea16 100644 --- a/tests/security/taintedInputFromParam/input.hack +++ b/tests/security/taintedInputFromParam/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : string { $user_id = (string) $_GET["user_id"]; return $user_id; diff --git a/tests/security/taintedInputFromProperty/input.hack b/tests/security/taintedInputFromProperty/input.hack index 60f976c6..46b7b495 100644 --- a/tests/security/taintedInputFromProperty/input.hack +++ b/tests/security/taintedInputFromProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public string $userId; public function __construct(string $key) { diff --git a/tests/security/taintedInputFromReturnTypeToEcho/input.hack b/tests/security/taintedInputFromReturnTypeToEcho/input.hack index 85ff93af..11e39172 100644 --- a/tests/security/taintedInputFromReturnTypeToEcho/input.hack +++ b/tests/security/taintedInputFromReturnTypeToEcho/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : string { return (string) $_GET["user_id"]; } diff --git a/tests/security/taintedInputFromReturnTypeWithBranch/input.hack b/tests/security/taintedInputFromReturnTypeWithBranch/input.hack index 7316bacd..dfe2e194 100644 --- a/tests/security/taintedInputFromReturnTypeWithBranch/input.hack +++ b/tests/security/taintedInputFromReturnTypeWithBranch/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : string { return (string) $_GET["user_id"]; } diff --git a/tests/security/taintedInputToParam/input.hack b/tests/security/taintedInputToParam/input.hack index 725c1f24..ef3466de 100644 --- a/tests/security/taintedInputToParam/input.hack +++ b/tests/security/taintedInputToParam/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId(AsyncMysqlConnection $conn) : void { $this->deleteUser( $conn, diff --git a/tests/security/taintedInputToParamAfterAssignment/input.hack b/tests/security/taintedInputToParamAfterAssignment/input.hack index dc0b25e1..04619ba4 100644 --- a/tests/security/taintedInputToParamAfterAssignment/input.hack +++ b/tests/security/taintedInputToParamAfterAssignment/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId(AsyncMysqlConnection $conn) : void { $this->deleteUser( $conn, diff --git a/tests/security/taintedInputToParamAlternatePath/input.hack b/tests/security/taintedInputToParamAlternatePath/input.hack index f08ae4ca..1272c00c 100644 --- a/tests/security/taintedInputToParamAlternatePath/input.hack +++ b/tests/security/taintedInputToParamAlternatePath/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId(AsyncMysqlConnection $conn) : void { $this->deleteUser( $conn, diff --git a/tests/security/taintedInputToParamButSafe/input.hack b/tests/security/taintedInputToParamButSafe/input.hack index fe1e7de8..fbb28f77 100644 --- a/tests/security/taintedInputToParamButSafe/input.hack +++ b/tests/security/taintedInputToParamButSafe/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId(AsyncMysqlConnection $conn) : void { $this->deleteUser( $conn, diff --git a/tests/security/taintedInputViaPureStaticFunction/input.hack b/tests/security/taintedInputViaPureStaticFunction/input.hack index de59e2b2..e3fd6f33 100644 --- a/tests/security/taintedInputViaPureStaticFunction/input.hack +++ b/tests/security/taintedInputViaPureStaticFunction/input.hack @@ -1,10 +1,10 @@ -class Utils { +final class Utils { public static function shorten(string $str)[]: string { return substr($str, 0, 100); } } -class A { +final class A { public function foo() : void { echo(Utils::shorten((string) $_GET["user_id"])); } diff --git a/tests/security/taintedInputViaStaticFunction/input.hack b/tests/security/taintedInputViaStaticFunction/input.hack index f3bfefc3..c493366e 100644 --- a/tests/security/taintedInputViaStaticFunction/input.hack +++ b/tests/security/taintedInputViaStaticFunction/input.hack @@ -1,10 +1,10 @@ -class Utils { +final class Utils { public static function shorten(string $str) : string { return $str; } } -class A { +final class A { public function foo() : void { echo(Utils::shorten((string) $_GET["user_id"])); } diff --git a/tests/security/taintedInstanceCallWithNoTypes/input.hack b/tests/security/taintedInstanceCallWithNoTypes/input.hack index 36d65746..cfa32c60 100644 --- a/tests/security/taintedInstanceCallWithNoTypes/input.hack +++ b/tests/security/taintedInstanceCallWithNoTypes/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function rawinput() { return $_GET['rawinput']; } diff --git a/tests/security/taintedStaticCallWithNoTypes/input.hack b/tests/security/taintedStaticCallWithNoTypes/input.hack index 0c5419dd..fe633311 100644 --- a/tests/security/taintedStaticCallWithNoTypes/input.hack +++ b/tests/security/taintedStaticCallWithNoTypes/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public static function rawinput() { return $_GET['rawinput']; } diff --git a/tests/security/untaintedInputAfterIntCast/input.hack b/tests/security/untaintedInputAfterIntCast/input.hack index 19a8e935..5891575a 100644 --- a/tests/security/untaintedInputAfterIntCast/input.hack +++ b/tests/security/untaintedInputAfterIntCast/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function getUserId() : int { return (int) $_GET["user_id"]; } diff --git a/tests/security/untaintedInputViaStaticFunctionWithSafePath/input.hack b/tests/security/untaintedInputViaStaticFunctionWithSafePath/input.hack index 6fcff482..5414ffbc 100644 --- a/tests/security/untaintedInputViaStaticFunctionWithSafePath/input.hack +++ b/tests/security/untaintedInputViaStaticFunctionWithSafePath/input.hack @@ -1,10 +1,10 @@ -class Utils { +final class Utils { public static function shorten(string $str)[] : string { return $str; } } -class A { +final class A { public function foo() : void { echo(htmlentities(Utils::shorten((string) $_GET["user_id"]), \ENT_QUOTES)); } diff --git a/tests/security/untaintedInputViaStaticFunctionWithoutSafePath/input.hack b/tests/security/untaintedInputViaStaticFunctionWithoutSafePath/input.hack index b1e060f5..7120b98e 100644 --- a/tests/security/untaintedInputViaStaticFunctionWithoutSafePath/input.hack +++ b/tests/security/untaintedInputViaStaticFunctionWithoutSafePath/input.hack @@ -1,10 +1,10 @@ -class Utils { +final class Utils { public static function shorten(string $str)[]: string { return $str; } } -class A { +final class A { public function foo() : void { echo(Utils::shorten((string) $_GET["user_id"])); } diff --git a/tests/unused/UnusedCode/abstractMethodImplementerCoveredByParentCall/input.hack b/tests/unused/UnusedCode/abstractMethodImplementerCoveredByParentCall/input.hack index a3ee2e7f..c860e7e9 100644 --- a/tests/unused/UnusedCode/abstractMethodImplementerCoveredByParentCall/input.hack +++ b/tests/unused/UnusedCode/abstractMethodImplementerCoveredByParentCall/input.hack @@ -6,7 +6,7 @@ abstract class Foobar { abstract protected function inner(): void; } -class MyFooBar extends Foobar { +final class MyFooBar extends Foobar { protected function inner(): void { // Do nothing } diff --git a/tests/unused/UnusedCode/coverByFixme/input.hack b/tests/unused/UnusedCode/coverByFixme/input.hack index 4378af63..6d08ebda 100644 --- a/tests/unused/UnusedCode/coverByFixme/input.hack +++ b/tests/unused/UnusedCode/coverByFixme/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { /* HAKANA_FIXME[UnusedPublicOrProtectedMethod] */ public function foo(): void { } diff --git a/tests/unused/UnusedCode/interfaceRequireExtendsClass/input.hack b/tests/unused/UnusedCode/interfaceRequireExtendsClass/input.hack index 0dfe6a8f..9d272cc0 100644 --- a/tests/unused/UnusedCode/interfaceRequireExtendsClass/input.hack +++ b/tests/unused/UnusedCode/interfaceRequireExtendsClass/input.hack @@ -11,7 +11,7 @@ trait HasDefault implements IHasDefault { } } -class FooNode extends Node { +final class FooNode extends Node { use HasDefault; public static function getDefault(): mixed { diff --git a/tests/unused/UnusedCode/unusedClass/input.hack b/tests/unused/UnusedCode/unusedClass/input.hack index 0e9ef9e7..8ea8540b 100644 --- a/tests/unused/UnusedCode/unusedClass/input.hack +++ b/tests/unused/UnusedCode/unusedClass/input.hack @@ -1 +1 @@ -class A { } \ No newline at end of file +final class A { } \ No newline at end of file diff --git a/tests/unused/UnusedCode/unusedClassIgnoreWhenMisspelt/input.hack b/tests/unused/UnusedCode/unusedClassIgnoreWhenMisspelt/input.hack index 41d6ba16..0fc82d35 100644 --- a/tests/unused/UnusedCode/unusedClassIgnoreWhenMisspelt/input.hack +++ b/tests/unused/UnusedCode/unusedClassIgnoreWhenMisspelt/input.hack @@ -1,4 +1,4 @@ -class FooBar {} +final class FooBar {} function baz(): void {} diff --git a/tests/unused/UnusedCode/unusedProperty/input.hack b/tests/unused/UnusedCode/unusedProperty/input.hack index cdadd70a..c95c67a3 100644 --- a/tests/unused/UnusedCode/unusedProperty/input.hack +++ b/tests/unused/UnusedCode/unusedProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private string $a = 'c'; public int $b = 1; public function __construct( @@ -7,7 +7,7 @@ class A { ) {} } -class B { +final class B { private string $a = 'c'; public int $b = 1; public function __construct( diff --git a/tests/unused/UnusedCode/usedMethodDefinedInTrait/input.hack b/tests/unused/UnusedCode/usedMethodDefinedInTrait/input.hack index 2ed86e1a..e5023ecb 100644 --- a/tests/unused/UnusedCode/usedMethodDefinedInTrait/input.hack +++ b/tests/unused/UnusedCode/usedMethodDefinedInTrait/input.hack @@ -12,7 +12,7 @@ trait T1 { abstract class Base implements I {} -class Concrete extends Base { +final class Concrete extends Base { use T1; } diff --git a/tests/unused/UnusedExpression/afterMethodExistsCheck/input.hack b/tests/unused/UnusedExpression/afterMethodExistsCheck/input.hack index 2323e0b8..a67c7413 100644 --- a/tests/unused/UnusedExpression/afterMethodExistsCheck/input.hack +++ b/tests/unused/UnusedExpression/afterMethodExistsCheck/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public function __construct(dict $options) { $this->setOptions($options); } diff --git a/tests/unused/UnusedExpression/arrayAssignmentInFunctionCoerced/input.hack b/tests/unused/UnusedExpression/arrayAssignmentInFunctionCoerced/input.hack index d1f2865f..b4bb267d 100644 --- a/tests/unused/UnusedExpression/arrayAssignmentInFunctionCoerced/input.hack +++ b/tests/unused/UnusedExpression/arrayAssignmentInFunctionCoerced/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { public int $a = 0; public int $b = 1; diff --git a/tests/unused/UnusedExpression/checkValueBeforeAdding/input.hack b/tests/unused/UnusedExpression/checkValueBeforeAdding/input.hack index 731e99e2..ec5c327b 100644 --- a/tests/unused/UnusedExpression/checkValueBeforeAdding/input.hack +++ b/tests/unused/UnusedExpression/checkValueBeforeAdding/input.hack @@ -1,4 +1,4 @@ -class T { +final class T { public bool $b = false; } diff --git a/tests/unused/UnusedExpression/promotedPropertiesAreNeverMarkedAsUnusedParams/input.hack b/tests/unused/UnusedExpression/promotedPropertiesAreNeverMarkedAsUnusedParams/input.hack index 295388da..b607f5ff 100644 --- a/tests/unused/UnusedExpression/promotedPropertiesAreNeverMarkedAsUnusedParams/input.hack +++ b/tests/unused/UnusedExpression/promotedPropertiesAreNeverMarkedAsUnusedParams/input.hack @@ -1,4 +1,4 @@ -class MyContainer { +final class MyContainer { private function __construct( public float $value ) {} diff --git a/tests/unused/UnusedExpression/throwWithReturnInOneCatch/input.hack b/tests/unused/UnusedExpression/throwWithReturnInOneCatch/input.hack index 4ce1c42b..c8c63d46 100644 --- a/tests/unused/UnusedExpression/throwWithReturnInOneCatch/input.hack +++ b/tests/unused/UnusedExpression/throwWithReturnInOneCatch/input.hack @@ -1,4 +1,4 @@ -class E1 extends Exception {} +final class E1 extends Exception {} function dangerous(): void { if (rand(0, 1)) { diff --git a/tests/unused/UnusedExpression/unusedMethodCallAsync/input.hack b/tests/unused/UnusedExpression/unusedMethodCallAsync/input.hack index 1a0467c6..0d203fc2 100644 --- a/tests/unused/UnusedExpression/unusedMethodCallAsync/input.hack +++ b/tests/unused/UnusedExpression/unusedMethodCallAsync/input.hack @@ -1,4 +1,4 @@ -class UnusedMethodClass { +final class UnusedMethodClass { <> public async function getEncodedId(): Awaitable { return ''; diff --git a/tests/unused/UnusedExpression/unusedMustUseMethodCall/input.hack b/tests/unused/UnusedExpression/unusedMustUseMethodCall/input.hack index 02c2387f..d971308d 100644 --- a/tests/unused/UnusedExpression/unusedMustUseMethodCall/input.hack +++ b/tests/unused/UnusedExpression/unusedMustUseMethodCall/input.hack @@ -1,4 +1,4 @@ -class UnusedMethodClass { +final class UnusedMethodClass { <> public function getEncodedId(): string { return ''; diff --git a/tests/unused/UnusedExpression/unusedPureMethodCall/input.hack b/tests/unused/UnusedExpression/unusedPureMethodCall/input.hack index 55c943d0..eecacfb3 100644 --- a/tests/unused/UnusedExpression/unusedPureMethodCall/input.hack +++ b/tests/unused/UnusedExpression/unusedPureMethodCall/input.hack @@ -1,4 +1,4 @@ -class UnusedMethodClass { +final class UnusedMethodClass { public function getId()[]: int { return 5; } diff --git a/tests/unused/UnusedExpression/usedPrivatePromotedProperty/input.hack b/tests/unused/UnusedExpression/usedPrivatePromotedProperty/input.hack index d0e9ecba..ab968ee9 100644 --- a/tests/unused/UnusedExpression/usedPrivatePromotedProperty/input.hack +++ b/tests/unused/UnusedExpression/usedPrivatePromotedProperty/input.hack @@ -1,4 +1,4 @@ -class A { +final class A { private function __construct(private int $i) {} public static function gen(): A {