From 17dc9018b471f0eefbb9b488556457642f722b70 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 00:42:47 +0100 Subject: [PATCH 01/13] don't force the user to have a special hhast-lint.json --- src/TranspilerCLI.hh | 181 ++++++++++++++++++++++++++++++++ src/lint-config/hhast-lint.json | 19 ++++ 2 files changed, 200 insertions(+) create mode 100644 src/TranspilerCLI.hh create mode 100644 src/lint-config/hhast-lint.json diff --git a/src/TranspilerCLI.hh b/src/TranspilerCLI.hh new file mode 100644 index 0000000..a4ecb4b --- /dev/null +++ b/src/TranspilerCLI.hh @@ -0,0 +1,181 @@ +> + public static function getHelpTextForOptionalArguments(): string { + return 'PATH'; + } + + <<__Override>> + protected function getSupportedOptions(): vec { + return vec[ + CLIOptions\flag( + () ==> { + $this->xhprof = true; + }, + 'Enable XHProf profiling', + '--xhprof', + ), + CLIOptions\with_required_enum( + AST_Prv\LinterCLIMode::class, + $m ==> { + $this->mode = $m; + }, + 'Set the output mode; supported values are '. + Str\join(AST_Prv\LinterCLIMode::getValues(), ' | '), + '--mode', + '-m', + ), + CLIOptions\with_required_string( + $_ ==> {}, + 'Name of the caller; intended for use with `--mode json` or `--mode lsp`', + '--from', + ), + $this->getVerbosityOption(), + ]; + } + + <<__Override>> + public async function mainAsync(): Awaitable { + if ($this->xhprof) { + AST_Prv\XHProf::enable(); + } + + $result = await $this->mainImplAsync(); + + if ($this->xhprof) { + AST_Prv\XHProf::disableAndDump(\STDERR); + } + + return $result; + } + + private async function mainImplAsync(): Awaitable { + $terminal = $this->getTerminal(); + if ($this->mode === AST_Prv\LinterCLIMode::LSP) { + return await (new AST_Prv\LSPImpl\Server($terminal))->mainAsync(); + } + + $err = $this->getStderr(); + $roots = $this->getArguments(); + + + /* if (C\is_empty($roots)) { + $config = AST_Prv\LintRunConfig::getForPath(\getcwd()); + $roots = $config->getRoots(); + if (C\is_empty($roots)) { + await $err->writeAsync( + "You must either specify PATH arguments, or provide a configuration". + "file.\n", + ); + return 1; + } + } else { + foreach ($roots as $root) { + $path = \realpath($root); + if (\is_dir($path)) { + $config_file = $path.'/hhast-lint.json'; + if (\file_exists($config_file)) { + /* HHAST_IGNORE_ERROR[DontAwaitInALoop] * / + await $err->writeAsync( + "Warning: PATH arguments contain a hhast-lint.json, ". + "which modifies the linters used and customizes behavior. ". + "Consider 'cd ". + $root. + "; vendor/bin/hhast-lint'\n\n", + ); + } + } + } + $config = null; + } + */ + + $config = AST_Prv\LintRunConfig::getForPath(__DIR__ . '/lint-config'); + + switch ($this->mode) { + case AST_Prv\LinterCLIMode::PLAIN: + $error_handler = new AST_Prv\LintRunCLIEventHandler($terminal); + break; + case AST_Prv\LinterCLIMode::JSON: + $error_handler = new AST_Prv\LintRunJSONEventHandler($terminal); + break; + case AST_Prv\LinterCLIMode::LSP: + invariant_violation('should have returned earlier'); + } + + try { + $result = await (new AST_Prv\LintRun($config, $error_handler, $roots)) + ->runAsync(); + } catch (Linters\LinterException $e) { + $orig = $e->getPrevious() ?? $e; + $err = $terminal->getStderr(); + $pos = $e->getPosition(); + await $err->writeAsync(Str\format( + "A linter threw an exception:\n Linter: %s\n File: %s%s\n", + $e->getLinterClass(), + \realpath($e->getFileBeingLinted()), + $pos === null ? '' : Str\format(':%d:%d', $pos[0], $pos[1] + 1), + )); + if ($pos !== null && \is_readable($e->getFileBeingLinted())) { + list($line, $column) = $pos; + $content = \file_get_contents($e->getFileBeingLinted()); + await \file_get_contents($e->getFileBeingLinted()) + |> Str\split($$, "\n") + |> Vec\take($$, $line) + |> Vec\slice($$, Math\maxva($line - 3, 0)) + |> Vec\map($$, $line ==> ' > '.$line) + |> Str\join($$, "\n") + |> Str\format("%s\n %s^ HERE\n", $$, Str\repeat(' ', $column)) + |> $err->writeAsync($$); + } + await $err->writeAsync(Str\format( + " Exception: %s\n"." Message: %s\n", + \get_class($orig), + $orig->getMessage(), + )); + await $err->writeAsync( + $orig->getTraceAsString() + |> Str\split($$, "\n") + |> Vec\map($$, $line ==> ' '.$line) + |> Str\join($$, "\n") + |> " Trace:\n".$$."\n\n", + ); + return 2; + } + + switch ($result) { + case AST_Prv\LintRunResult::NO_ERRORS: + case AST_Prv\LintRunResult::HAD_AUTOFIXED_ERRORS: + return 0; + case AST_Prv\LintRunResult::HAVE_UNFIXED_ERRORS: + return 1; + } + } +} diff --git a/src/lint-config/hhast-lint.json b/src/lint-config/hhast-lint.json new file mode 100644 index 0000000..cd64d9c --- /dev/null +++ b/src/lint-config/hhast-lint.json @@ -0,0 +1,19 @@ +{ + "roots": [ + ], + "builtinLinters": "none", + "namespaceAliases": { + "HHAST": "Facebook\\HHAST\\Linters" + }, + "extraLinters": [ + "HHAST\\HackToPHPLinter" + ], + "overrides": [ + { + "patterns": [ + "codegen/*" + ], + "disableAllAutoFixes": true + } + ] +} \ No newline at end of file From 50d1e85057f3980809652c22fed7735db6aef7d6 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 00:49:04 +0100 Subject: [PATCH 02/13] strict mode and async --- bin/hack2php | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/bin/hack2php b/bin/hack2php index ee91b42..c69c7b1 100755 --- a/bin/hack2php +++ b/bin/hack2php @@ -1,5 +1,5 @@ #!/usr/bin/env hhvm -> +function transpileAsync(): Awaitable { + + $root = realpath(__DIR__.'/..'); + $found_autoloader = false; + while (true) { + $autoloader = $root.'/vendor/hh_autoload.php'; + if (file_exists($autoloader)) { + $found_autoloader = true; + require_once($autoloader); + break; + } + if ($root === '') { + break; + } + $parts = explode('/', $root); + array_pop(&$parts); + $root = implode('/', $parts); } - if ($root === '') { - break; + + if (!$found_autoloader) { + fprintf(STDERR, "Failed to find autoloader.\n"); + + exit(1); } - $parts = explode('/', $root); - array_pop(&$parts); - $root = implode('/', $parts); -} -if (!$found_autoloader) { - fprintf(STDERR, "Failed to find autoloader.\n"); - exit(1); + exit(await TranspilerCLI::runAsync()); } - -LinterCLI::main(); From 4a533b4dec1edf5f3364886b61f6c9d248ad9d14 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 01:07:04 +0100 Subject: [PATCH 03/13] fix: async --- bin/hack2php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/hack2php b/bin/hack2php index c69c7b1..6f65131 100755 --- a/bin/hack2php +++ b/bin/hack2php @@ -12,7 +12,7 @@ namespace codeneric\hack2php; <<__EntryPoint>> -function transpileAsync(): Awaitable { +async function transpileAsync(): Awaitable { $root = realpath(__DIR__.'/..'); $found_autoloader = false; @@ -37,5 +37,5 @@ function transpileAsync(): Awaitable { exit(1); } - exit(await TranspilerCLI::runAsync()); + await TranspilerCLI::runAsync(); } From 21196424d9ef17e6de668239f4df8320f3576936 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 11:27:24 +0100 Subject: [PATCH 04/13] autoload bin/ and src/ --- hh_autoload.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hh_autoload.json b/hh_autoload.json index cca5e72..b6fe352 100644 --- a/hh_autoload.json +++ b/hh_autoload.json @@ -1,5 +1,5 @@ { - "roots": [], + "roots": ["bin", "src"], "devRoots": [], "devFailureHandler": "Facebook\\AutoloadMap\\HHClientFallbackHandler" } From 78235e485bdec7bfd2953250eb99fe7eb13276e9 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 12:06:09 +0100 Subject: [PATCH 05/13] fix: hhast-lint should lint the code, not transpile --- hhast-lint.json | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/hhast-lint.json b/hhast-lint.json index c1703db..097f636 100644 --- a/hhast-lint.json +++ b/hhast-lint.json @@ -1,20 +1,5 @@ { "roots": [ - "example-files/" - ], - "builtinLinters": "none", - "namespaceAliases": { - "HHAST": "Facebook\\HHAST\\Linters" - }, - "extraLinters": [ - "HHAST\\HackToPHPLinter" - ], - "overrides": [ - { - "patterns": [ - "codegen/*" - ], - "disableAllAutoFixes": true - } + "src/", "bin/" ] } \ No newline at end of file From 41a8c95746724b8109cb1344ccc35889fe3f7f92 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 12:10:58 +0100 Subject: [PATCH 06/13] -unused/unintended comited file --- out/common.php | 314 ------------------------------------------------- 1 file changed, 314 deletions(-) delete mode 100644 out/common.php diff --git a/out/common.php b/out/common.php deleted file mode 100644 index d9b66e6..0000000 --- a/out/common.php +++ /dev/null @@ -1,314 +0,0 @@ -get_charset_collate(); - $table_name = "codeneric_phmm_comments"; - /* - if(UAM_Config::$ENV === 'development'){ - $wpdb->query( " DROP TABLE $table_name" ); - }*/ - - - /*UNSAFE_EXPR*/ - $sql = "CREATE TABLE $table_name ( - id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, - time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, - content text DEFAULT '' NOT NULL, - project_id bigint(20) UNSIGNED NOT NULL, - attachment_id bigint(20) UNSIGNED NOT NULL, - wp_user_id bigint(20) UNSIGNED NOT NULL, - client_id bigint(20) UNSIGNED NOT NULL, - UNIQUE KEY id (id) - ) $charset_collate;"; - - - dbDelta( /*UNSAFE_EXPR*/ $sql ); - - } - - private - $write_comment = array( - 'attachment_id' => 0, - 'wp_user_id' => 0, - 'project_id' => 0, - 'content' => "test", - 'client_id' => 0, - ); - - public function setUp() { - parent::setUp(); - - // // probably better to use wpdb query or insert here to avoid inconsistency - // // i.e. at this point we to do not know if save_comment works - // $state = CommentService::save_comment($this->write_comment); - - // $this->assertSame( - // $state, - // true, - // 'Saving the test comment during setup failed!', - // ); - } - - public function tearDown() { - parent::tearDown(); - - /*UNSAFE_EXPR*/ - $wpdb = $GLOBALS['wpdb']; - // get comment count with image id - /*UNSAFE_EXPR*/ - $wpdb->delete( - 'codeneric_phmm_comments', - array( - 'attachment_id' => 0, - 'wp_user_id' => 0, - 'project_id' => 0, - 'content' => "test", - 'client_id' => 0, - ) ); - } - - private function prepareComment() { - $state = CommentService::save_comment($this->write_comment); - $this->assertSame( - $state, - true, - 'Saving the test comment during setup failed!' ); - } - - public function testGetCommentsCount() { - $this->prepareComment(); - // need to setup array with image ids to match get_comments_count function parameters - $image_id = array(0); - // call comment api - $count = CommentService::get_comments_counts($image_id); - // count is an array and is expected to be size 1 - $this->assertSame(is_array($count), true, 'Count is not an array!'); - $this->assertSame( - count($count), - 1, - 'Size of count array is expected to be 1.' ); - // image id is 0, so we check field 0 for the count of comments for image 0 - // expected to be 1 according to setup. - $this->assertSame( - $count[0], - 1, - 'Comment count for image_id 0 is expected to be 1.' ); - } - - public function testGetComentsCountForProject() { - $this->prepareComment(); - // call comment api - $count = CommentService::get_comments_counts_for_project(0); - - // testing method is equal to get_comments_count since get_comments_counts_for_project - // is just a wrapper to use project id for requesting comment counts - // count is an array and is expected to be size 1 - $this->assertSame(is_array($count), true, 'Count is not an array!'); - $this->assertSame( - count($count), - 1, - 'Size of count array is expected to be 1.' ); - // image id is 0, so we check field 0 for the count of comments for image 0 - // expected to be 1 according to setup. - $this->assertSame( - $count[0], - 1, - 'Comment count for image_id 0 is expected to be 1.' ); - } - - public function testSaveComment() { - $this->prepareComment(); - // prepare query_result var - $query_result = array(); - // query api and try to save comment - $bool = CommentService::save_comment($this->write_comment); - // check if save_comment returns true to signalise successful query with db - $this->assertSame($bool, true, 'Something went wrong saving a comment.'); - // manually get comment and check content - // fields that will not be checked are id, time - // prepare query to get test comment - $query = - "SELECT * FROM codeneric_phmm_comments WHERE attachment_id = 0 AND content='test' AND project_id = 0 AND wp_user_id = 0 AND client_id = 0"; - /*UNSAFE_EXPR*/ - $wpdb = $GLOBALS['wpdb']; - // query db for test entry - /*UNSAFE_EXPR*/ - $query_result = $wpdb->get_results($query, ARRAY_A); - // check if query result is an array - $this->assertSame( - is_array($query_result), - true, - 'Query result is not an array.' ); - // expected size here is 2, since we have the setup entry and the entry we are saving to check - // function save_comment - $this->assertSame( - count($query_result), - 2, - 'Query result array size is expected to be 2.' ); - // get entry of query result array - $entry = $query_result[0]; - // check for values in entry - $this->assertSame( - intval($entry['attachment_id']), - 0, - 'Attachment id='.$entry['attachment_id'].' does not match.' ); - $this->assertSame( - intval($entry['wp_user_id']), - 0, - 'WP user id='.$entry['wp_user_id'].' does not match.' ); - $this->assertSame( - intval($entry['project_id']), - 0, - 'Project id='.$entry['project_id'].' does not match.' ); - $this->assertSame( - $entry['content'], - "test", - 'Content='.$entry['content'].' does not match.' ); - $this->assertSame( - intval($entry['client_id']), - 0, - 'Client id='.$entry['client_id'].' does not match.' ); - } - - public function testGetCommentsForImage() { - $this->prepareComment(); - // prepare query_result var - $query_result = array(); - // query api and try to get comments for image id 0 - $query_result = CommentService::get_comments_for_image(0,0); - // check if query result is an array and size is 1 - $this->assertSame( - is_array($query_result), - true, - 'Query result is not an array.' ); - $this->assertSame( - count($query_result), - 1, - 'Query result array size is expected to be 1.' ); - // get entry of query result array - $entry = $query_result[0]; - // check for values in entry - $this->assertSame( - intval($entry['attachment_id']), - 0, - 'Attachment id='.$entry['attachment_id'].' does not match.' ); - $this->assertSame( - intval($entry['wp_user_id']), - 0, - 'WP user id='.$entry['wp_user_id'].' does not match.' ); - $this->assertSame( - intval($entry['project_id']), - 0, - 'Project id='.$entry['project_id'].' does not match.' ); - $this->assertSame( - $entry['content'], - "test", - 'Content='.$entry['content'].' does not match.' ); - $this->assertSame( - intval($entry['client_id']), - 0, - 'Client id='.$entry['client_id'].' does not match.' ); - } - - public function testFuzzyGetCommentsCount() { - $this->forAll(Generator\seq(Generator\int()))->then( - function($ids) { - $count = CommentService::get_comments_counts($ids); - - foreach ($ids as $id) { - $this->assertEquals(0, $count[$id]); - } - // $this->assertEquals(count($array), count(array_reverse($array))); - } ); - } - - public function testFuzzyGetCommentsCountForProject() { - $this->forAll(Generator\int())->then( - function($id) { - $count = CommentService::get_comments_counts_for_project($id); - $this->assertEquals([], $count); - } ); - } - public function testFuzzySaveComment() { - $this->forAll( - Generator\associative( - [ - 'attachment_id' => Generator\nat(), - 'wp_user_id' => Generator\nat(), - 'project_id' => Generator\nat(), - 'content' => Generator\string(), - 'client_id' => Generator\nat(), - ] ) ) - ->then( - function($comment) { - $bool = CommentService::save_comment($comment); - // check if save_comment returns true to signalise successful query with db - $this->assertSame( - $bool, - true, - 'Something went wrong saving a comment.' ); - - $query_result = []; - - $wpdb = /*UNSAFE_EXPR*/ $GLOBALS['wpdb']; - - $s = esc_sql($comment['content']); - $query = - "SELECT * FROM codeneric_phmm_comments WHERE attachment_id = $comment['attachment_id'] AND content='$s' AND project_id = $comment['project_id'] AND wp_user_id = $comment['wp_user_id'] AND client_id = $comment['client_id']"; - - // query db for test entry - /*UNSAFE_EXPR*/ - $query_result = $wpdb->get_results($query, ARRAY_A); - // check if query result is an array - $this->assertSame( - is_array($query_result), - true, - 'Query result is not an array.' ); - - // get entry of query result array - $entry = $query_result[0]; - // check for values in entry - $this->assertSame( - intval($entry['attachment_id']), - $comment['attachment_id'], - 'Attachment id='.$entry['attachment_id'].' does not match.' ); - $this->assertSame( - intval($entry['wp_user_id']), - $comment['wp_user_id'], - 'WP user id='.$entry['wp_user_id'].' does not match.' ); - $this->assertSame( - intval($entry['project_id']), - $comment['project_id'], - 'Project id='.$entry['project_id'].' does not match.' ); - $this->assertSame( - $entry['content'], - $comment['content'], - 'Content='.$entry['content'].' does not match.' ); - $this->assertSame( - intval($entry['client_id']), - $comment['client_id'], - 'Client id='.$entry['client_id'].' does not match.' ); - } ); - } - - public function testFuzzyGetCommentsForImage() { - $this->forAll(Generator\int())->then( - function($imageID, $projectID) { - $count = CommentService::get_comments_for_image($imageID, $projectID); - $this->assertEquals([], $count); - - } ); - } - -} From fea8d6548e73cbe55ff19203f82a83c807b7db10 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 15:21:43 +0100 Subject: [PATCH 07/13] Refactoring --- src/HackToPHPLinter.php | 42 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/src/HackToPHPLinter.php b/src/HackToPHPLinter.php index 1bc4ba7..d8bbd52 100644 --- a/src/HackToPHPLinter.php +++ b/src/HackToPHPLinter.php @@ -396,7 +396,7 @@ }; use function Facebook\HHAST\{Missing, find_position, find_offset}; use namespace Facebook\TypeAssert; -use namespace HH\Lib\{C, Vec}; +use namespace HH\Lib\{C, Vec, Dict}; final class HackToPHPLinter extends ASTLinter { @@ -542,37 +542,31 @@ private function transpile( } if ($child instanceof EnumDeclaration) { - // $enum_keyword = $node->getKeyword()->getCode(); $enum_name = $child->getName()->getCode(); $enumerators = $child->getEnumerators()?->getChildren(); - $enumerators = !\is_null($enumerators) ? $enumerators : []; - $code = "final class $enum_name { private function __construct() {} \n"; - - $code .= "private static \$hacklib_values = array(\n"; - foreach ($enumerators as $i => $e) { - invariant( - $e instanceof Enumerator, - 'Children of EnumDeclaration has to be Enumerator', - ); - $e_name = $e->getName()->getText(); - $e_value = $e->getValue()->getCode(); - $sep = $i >= \count($enumerators) - 1 ? '' : ','; - $code .= "\"$e_name\" => $e_value $sep\n"; + $enum_array = []; + // = Dict\pull($enumerators, $e ==> $e->getName()->getText(), $e ==> $e->getValue()->getCode()); + invariant() + if ($enumerators !== null) { + foreach ($enumerators as $e) { + invariant( + $e instanceof Enumerator, + 'Children of EnumDeclaration has to be Enumerator', + ); + $enum_array[$e->getName()->getText()] = $e->getValue()->getCode(); + } } - $code .= ");\n"; + $code = "final class $enum_name { private function __construct() {} \n"; + $code .= "private static \$hacklib_values = \n"; + $code .= \print_r($enum_array, true); + $code .= ";\n"; $code .= "use \HH\HACKLIB_ENUM_LIKE;\n"; - foreach ($enumerators as $e) { - invariant( - $e instanceof Enumerator, - 'Children of EnumDeclaration has to be Enumerator', - ); - $e_name = $e->getName()->getText(); - $e_value = $e->getValue()->getCode(); + foreach ($enum_array as $e_name => $e_value) { $code .= "const $e_name = $e_value;\n"; } $code .= " }\n"; + $sub_ast = $this->ast_from_code($code); $node = $node->replace($child, $sub_ast); } @@ -624,7 +618,7 @@ private function transpile( if ($node instanceof NamespaceDeclaration) { $code = $node ->getName() - ->getCode(); + ?->getCode(); $php = $this->sprinft($php, "namespace $code$P"); $parents[] = $node; From 44287b1885ae9cc9cc97d6632a4b60e4fccfa116 Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 15:55:04 +0100 Subject: [PATCH 08/13] linted --- bin/hack2php | 5 ++++- src/HackToPHPLinter.php | 9 +++------ src/TranspilerCLI.hh | 2 +- src/Util.php | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bin/hack2php b/bin/hack2php index 6f65131..7f1deb7 100755 --- a/bin/hack2php +++ b/bin/hack2php @@ -37,5 +37,8 @@ async function transpileAsync(): Awaitable { exit(1); } - await TranspilerCLI::runAsync(); + +# $code = await TranspilerCLI::runAsync(); +# exit($code); + exit(await TranspilerCLI::runAsync()); } diff --git a/src/HackToPHPLinter.php b/src/HackToPHPLinter.php index d8bbd52..1df2357 100644 --- a/src/HackToPHPLinter.php +++ b/src/HackToPHPLinter.php @@ -1,4 +1,4 @@ - { @@ -921,7 +918,7 @@ private function transpile( // return $php; // } - if ($node->isToken()) { //abstraction + if ($node->isToken()) { //abstraction $token = $node->getCode(); $php = $this->sprinft($php, "$token$P"); diff --git a/src/TranspilerCLI.hh b/src/TranspilerCLI.hh index a4ecb4b..c1a208a 100644 --- a/src/TranspilerCLI.hh +++ b/src/TranspilerCLI.hh @@ -16,7 +16,7 @@ namespace codeneric\hack2php; use namespace Facebook\HHAST\__Private as AST_Prv; use namespace Facebook\HHAST\Linters; -use namespace HH\Lib\{C, Math, Str, Vec}; +use namespace HH\Lib\{Math, Str, Vec}; use type Facebook\CLILib\CLIWithArguments; use namespace Facebook\CLILib\CLIOptions; diff --git a/src/Util.php b/src/Util.php index 0d995be..e9c54af 100644 --- a/src/Util.php +++ b/src/Util.php @@ -2,7 +2,7 @@ namespace codeneric\util; -use type Facebook\HHAST\{LambdaExpression, EditableNode, VariableExpression}; +use type Facebook\HHAST\LambdaExpression; type error_message = shape( "descr" => string, From e4e30e35870dc9c19a8b8f1df3a01c12b91d6b9b Mon Sep 17 00:00:00 2001 From: Andi Date: Sat, 2 Mar 2019 17:09:58 +0100 Subject: [PATCH 09/13] composer (self-)update --- composer.json | 5 +- composer.lock | 318 +++++++++++++++++++++++++++++++++----------------- composer.phar | Bin 1863286 -> 1909682 bytes 3 files changed, 212 insertions(+), 111 deletions(-) diff --git a/composer.json b/composer.json index c1cbaf5..63d3f2b 100644 --- a/composer.json +++ b/composer.json @@ -6,11 +6,10 @@ "hhvm/hhast": "^3.27" }, "require-dev": { - "phpunit/phpunit": "^5.7", - "91carriage/phpunit-hhi": "^5.7", "facebook/fbexpect": "^0.4.0|^1.0.0", "facebook/hack-codegen": "~3.0.3", - "hhvm/hhvm-autoload": "^1.5" + "hhvm/hhvm-autoload": "^1.5", + "hhvm/hacktest": "^1.3" }, "license": "MIT", "authors": [ diff --git a/composer.lock b/composer.lock index 1b140e5..01a10d0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,140 +4,146 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6a251c36badb3066e48292007114b903", + "content-hash": "6d78726c01dc42a1309f5e5d52dc3bad", "packages": [ { - "name": "facebook/hh-clilib", - "version": "v1.1.2", + "name": "facebook/difflib", + "version": "v1.0", "source": { "type": "git", - "url": "https://github.com/hhvm/hh-clilib.git", - "reference": "2772c82a8f5fc715d5a2fbe801563f36fdda9943" + "url": "https://github.com/hhvm/difflib.git", + "reference": "09505c7d66224fa7e5a8f775825bd70f05e57b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hhvm/hh-clilib/zipball/2772c82a8f5fc715d5a2fbe801563f36fdda9943", - "reference": "2772c82a8f5fc715d5a2fbe801563f36fdda9943", + "url": "https://api.github.com/repos/hhvm/difflib/zipball/09505c7d66224fa7e5a8f775825bd70f05e57b01", + "reference": "09505c7d66224fa7e5a8f775825bd70f05e57b01", "shasum": "" }, "require": { - "hhvm/hsl": "^3.26", - "hhvm/type-assert": "^3.2" + "hhvm/hsl": "^3.28" }, "require-dev": { - "91carriage/phpunit-hhi": "^5.7", - "facebook/fbexpect": "^1.1.0", - "hhvm/hhast": "^3.27.0", - "phpunit/phpunit": "^5.7" + "facebook/fbexpect": "^2.1.2", + "hhvm/hacktest": "^1.0", + "hhvm/hhast": "^3.28" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.2.x-dev" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "time": "2018-06-20T03:25:12+00:00" + "time": "2018-09-24T22:01:02+00:00" }, { - "name": "fredemmott/hack-error-suppressor", - "version": "v1.0.1", + "name": "facebook/hh-clilib", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/fredemmott/hack-error-suppressor.git", - "reference": "cb145c771b50f4f4eeec8c9cac4740df3d486a12" + "url": "https://github.com/hhvm/hh-clilib.git", + "reference": "ef39116c527ac2496c985657f93af0253c9d8227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fredemmott/hack-error-suppressor/zipball/cb145c771b50f4f4eeec8c9cac4740df3d486a12", - "reference": "cb145c771b50f4f4eeec8c9cac4740df3d486a12", + "url": "https://api.github.com/repos/hhvm/hh-clilib/zipball/ef39116c527ac2496c985657f93af0253c9d8227", + "reference": "ef39116c527ac2496c985657f93af0253c9d8227", "shasum": "" }, + "require": { + "hhvm/hsl": "^3.26", + "hhvm/hsl-experimental": "^3.29.5", + "hhvm/type-assert": "^3.2" + }, "require-dev": { - "91carriage/phpunit-hhi": "^5.6", - "phpunit/phpunit": "^5.7" + "facebook/fbexpect": "^2.1.0", + "hhvm/hacktest": "^1.0.0", + "hhvm/hhast": "^3.29.1" }, "type": "library", - "autoload": { - "classmap": [ - "src/" - ] + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" - ], - "authors": [ - { - "name": "Fred Emmott", - "email": "fred@fredemmott.co.uk" - } + "MIT" ], - "description": "Suppress HHVM's automatic conversion of typechecker errors to fatals.", - "time": "2017-05-02T03:07:37+00:00" + "time": "2018-12-05T19:10:19+00:00" }, { "name": "hhvm/hhast", - "version": "v3.27.1", + "version": "v3.30.0", "source": { "type": "git", "url": "https://github.com/hhvm/hhast.git", - "reference": "8cd58881ccecaf81a0c330dd204f4e0089ef9104" + "reference": "525177bd5328483af2c2bc2a4d23be0599a8e418" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hhvm/hhast/zipball/8cd58881ccecaf81a0c330dd204f4e0089ef9104", - "reference": "8cd58881ccecaf81a0c330dd204f4e0089ef9104", + "url": "https://api.github.com/repos/hhvm/hhast/zipball/525177bd5328483af2c2bc2a4d23be0599a8e418", + "reference": "525177bd5328483af2c2bc2a4d23be0599a8e418", "shasum": "" }, "require": { - "facebook/hh-clilib": "^1.1.1", - "hhvm": "^3.26.0", - "hhvm/hsl": "^1.0.0|^3.26.0", + "facebook/difflib": "^1.0.0", + "facebook/hh-clilib": "^2.0.0", + "hhvm": "3.30.*", + "hhvm/hsl": "^3.30.0", "hhvm/type-assert": "^3.1" }, "require-dev": { - "91carriage/phpunit-hhi": "^5.7", - "facebook/fbexpect": "^1.1.0", - "facebook/hack-codegen": "~3.0.3", - "hhvm/hhvm-autoload": "^1.5", - "phpunit/phpunit": "^5.7" + "facebook/fbexpect": "^2.1.1", + "facebook/hack-codegen": "^4.0", + "hhvm/hacktest": "^1.3", + "hhvm/hhvm-autoload": "^1.5" }, "bin": [ "bin/hhast-lint", - "bin/hhast-inspect" + "bin/hhast-inspect", + "bin/hhast-migrate" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "time": "2018-06-28T15:01:11+00:00" + "time": "2018-12-14T22:20:05+00:00" }, { "name": "hhvm/hhvm-autoload", - "version": "v1.6.6", + "version": "v1.8", "source": { "type": "git", "url": "https://github.com/hhvm/hhvm-autoload.git", - "reference": "2808fe06fa850532270c54155c0bdab1bf0f67da" + "reference": "5d3fdbf7c203b05e13edab7b4f9981b19877f368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hhvm/hhvm-autoload/zipball/2808fe06fa850532270c54155c0bdab1bf0f67da", - "reference": "2808fe06fa850532270c54155c0bdab1bf0f67da", + "url": "https://api.github.com/repos/hhvm/hhvm-autoload/zipball/5d3fdbf7c203b05e13edab7b4f9981b19877f368", + "reference": "5d3fdbf7c203b05e13edab7b4f9981b19877f368", "shasum": "" }, "require": { "composer-plugin-api": "^1.0", - "fredemmott/hack-error-suppressor": "^1.0", - "hhvm": "^3.23" + "hhvm": "^3.28" }, "replace": { "facebook/hhvm-autoload": "1.*" }, "require-dev": { - "91carriage/phpunit-hhi": "^5.5", - "facebook/fbexpect": "^1.1", - "phpunit/phpunit": "^5.5" + "facebook/fbexpect": "^2.1", + "hhvm/hacktest": "^1.0" }, "bin": [ "bin/hh-autoload" @@ -146,7 +152,10 @@ "extra": { "class": [ "Facebook\\AutoloadMap\\ComposerPlugin" - ] + ], + "branch-alias": { + "dev-master": "1.x-dev" + } }, "autoload": { "classmap": [ @@ -160,64 +169,110 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "time": "2018-06-12T20:21:07+00:00" + "time": "2019-01-22T22:32:09+00:00" }, { "name": "hhvm/hsl", - "version": "v3.27.0", + "version": "v3.30.0", "source": { "type": "git", "url": "https://github.com/hhvm/hsl.git", - "reference": "f43f027681402f0a6807325400a761106fa10274" + "reference": "9a5f26ad5e7c078281f66dd74117af3a3b785e50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hhvm/hsl/zipball/f43f027681402f0a6807325400a761106fa10274", - "reference": "f43f027681402f0a6807325400a761106fa10274", + "url": "https://api.github.com/repos/hhvm/hsl/zipball/9a5f26ad5e7c078281f66dd74117af3a3b785e50", + "reference": "9a5f26ad5e7c078281f66dd74117af3a3b785e50", "shasum": "" }, "require": { - "hhvm": "^3.27.0", - "hhvm/hhvm-autoload": "^1.4" + "hhvm": "^3.30.0", + "hhvm/hhvm-autoload": "^1.7" }, "require-dev": { - "91carriage/phpunit-hhi": "^5.7", - "facebook/fbexpect": "^1.0.0", - "phpunit/phpunit": "^5.7" + "facebook/fbexpect": "^2.0.0", + "hhvm/hacktest": "^1.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "The Hack Standard Library", - "time": "2018-06-07T01:25:22+00:00" + "time": "2018-12-14T21:18:17+00:00" + }, + { + "name": "hhvm/hsl-experimental", + "version": "v3.30.3", + "source": { + "type": "git", + "url": "https://github.com/hhvm/hsl-experimental.git", + "reference": "989c59471877e1e7dae78f758213bcc0bb30f461" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hhvm/hsl-experimental/zipball/989c59471877e1e7dae78f758213bcc0bb30f461", + "reference": "989c59471877e1e7dae78f758213bcc0bb30f461", + "shasum": "" + }, + "require": { + "hhvm": "^3.30.0", + "hhvm/hhvm-autoload": "^1.7", + "hhvm/hsl": "^3.30.0" + }, + "require-dev": { + "facebook/fbexpect": "^2.0 <2.4.0", + "hhvm/hacktest": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.30.x-dev", + "dev-3.30.x": "3.30.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Hack Standard Library - Experimental Additions", + "time": "2019-02-20T21:35:23+00:00" }, { "name": "hhvm/type-assert", - "version": "v3.2.2", + "version": "v3.2.6", "source": { "type": "git", "url": "https://github.com/hhvm/type-assert.git", - "reference": "9bbe7cac2ff831142d74203479e72046cbc932f8" + "reference": "ab4d907d5fd4894a6833b5926cafc9fb9c894ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hhvm/type-assert/zipball/9bbe7cac2ff831142d74203479e72046cbc932f8", - "reference": "9bbe7cac2ff831142d74203479e72046cbc932f8", + "url": "https://api.github.com/repos/hhvm/type-assert/zipball/ab4d907d5fd4894a6833b5926cafc9fb9c894ff9", + "reference": "ab4d907d5fd4894a6833b5926cafc9fb9c894ff9", "shasum": "" }, "require": { - "hhvm": "^3.23.0", + "hhvm": "^3.29.0", "hhvm/hhvm-autoload": "^1.4", - "hhvm/hsl": "^1.0|^3.26.0" + "hhvm/hsl": "^3.29.0" }, "require-dev": { - "91carriage/phpunit-hhi": "~5.1", - "facebook/fbexpect": "^0.4.0|^1.0.0", - "phpunit/phpunit": "~5.1" + "facebook/fbexpect": "^2.0.0", + "hhvm/hacktest": "^1.0", + "hhvm/hhast": "^3.27" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -227,17 +282,17 @@ "TypeAssert", "hack" ], - "time": "2018-05-09T18:23:07+00:00" + "time": "2018-12-14T23:24:44+00:00" } ], "packages-dev": [ { "name": "91carriage/phpunit-hhi", - "version": "5.7.4", + "version": "5.7.5", "source": { "type": "git", "url": "https://git.simon.geek.nz/91-carriage/phpunit-hhi.git", - "reference": "29e50b1130dc6d72266460f1f303ba1f24937a40" + "reference": "0526087ebf783199e4b90bf5ecb997b94a6f130f" }, "require": { "hhvm": ">=3.24.3" @@ -278,7 +333,8 @@ "phpunit", "testing" ], - "time": "2018-03-02T23:37:33+00:00" + "abandoned": "hhvm/hacktest", + "time": "2018-08-15T10:19:54+00:00" }, { "name": "doctrine/instantiator", @@ -430,6 +486,47 @@ ], "time": "2018-05-18T15:49:36+00:00" }, + { + "name": "hhvm/hacktest", + "version": "v1.3", + "source": { + "type": "git", + "url": "https://github.com/hhvm/hacktest.git", + "reference": "ed8eaf18c1a4443e0a735707ac3d0c2749273f08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hhvm/hacktest/zipball/ed8eaf18c1a4443e0a735707ac3d0c2749273f08", + "reference": "ed8eaf18c1a4443e0a735707ac3d0c2749273f08", + "shasum": "" + }, + "require": { + "facebook/hh-clilib": "^2.0.0", + "hhvm": "^3.28.0", + "hhvm/hhvm-autoload": "^1.6", + "hhvm/hsl": "^3.26", + "hhvm/type-assert": "^3.2" + }, + "require-dev": { + "facebook/fbexpect": "^2.3.0", + "hhvm/hhast": "^3.27" + }, + "bin": [ + "bin/hacktest" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Hack Test Library", + "time": "2018-11-30T17:17:20+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.8.1", @@ -632,16 +729,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.6", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", "shasum": "" }, "require": { @@ -653,12 +750,12 @@ }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -691,7 +788,7 @@ "spy", "stub" ], - "time": "2018-04-18T13:57:24+00:00" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1081,6 +1178,7 @@ "mock", "xunit" ], + "abandoned": true, "time": "2017-06-30T09:13:00+00:00" }, { @@ -1598,25 +1696,28 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.8.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "suggest": { + "ext-ctype": "For best performance" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1649,20 +1750,20 @@ "polyfill", "portable" ], - "time": "2018-04-30T19:57:29+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/yaml", - "version": "v4.1.1", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e" + "reference": "d461670ee145092b7e2a56c1da7118f19cadadb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/80e4bfa9685fc4a09acc4a857ec16974a9cd944e", - "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d461670ee145092b7e2a56c1da7118f19cadadb0", + "reference": "d461670ee145092b7e2a56c1da7118f19cadadb0", "shasum": "" }, "require": { @@ -1681,7 +1782,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1708,24 +1809,25 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "time": "2019-01-16T20:35:37+00:00" }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "phpunit/phpunit": "^4.6", @@ -1758,7 +1860,7 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2018-12-25T11:19:39+00:00" } ], "aliases": [], diff --git a/composer.phar b/composer.phar index 7f6d8962c75081966a8a1ec407505caa90fe8965..b8ce13f23ed5f124a5a19ead8ef849989eb87088 100644 GIT binary patch delta 70076 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 CXX*0* delta 37918 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 Z{Q2fR)zALp$3OGu;H{2-N1zq@e*<6_t}Xxo From 48a5f4dfbab1e5ce157793da5dc121b087608710 Mon Sep 17 00:00:00 2001 From: Andi Date: Sun, 3 Mar 2019 01:23:47 +0100 Subject: [PATCH 10/13] updated readme --- README.md | 46 +++++++++++++++++++++++++++++++++------------- bin/hack2php | 5 ++--- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 3be3a05..2bd1130 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # hack2php [![Build Status](https://travis-ci.org/codeneric/hack2php.svg?branch=master)](https://travis-ci.org/codeneric/hack2php) -hack2php is a project which aims to implement a compiler to translate Hack files to PHP 5.4 files. +hack2php is a project which aims to implement a compiler to translate Hack files to PHP 7 files. This ability becomes useful when you have no control over the environment in which your code is supposed to run, but you still want to write your code in Hack. -An example might be the development of WordPress plugins or themes. +An example might be the development of WordPress plugins or themes. E.g. this Hack code: + ```php `). + +Compile: `vendor/bin/hack2php > ` -# Getting started -Clone this repository and run `hhvm composer.phar install` +To validate the php code you can run `php -l ` -Compile a Hack file to PHP: `./bin/hack2php ` +## Tests -# Tests There is only one test (HackToPhpTest). It reads each Hack file from the example-files directory, compiles it to PHP and checks the PHP syntax for errors. If no error were found, the test succeeds. Otherwise it fails. To add a test, simply create a new Hack file in example-files. -Run the test: ` hhvm vendor/bin/phpunit` +Run the test: `hhvm vendor/bin/phpunit` -# Contributing -If you find an issue you can help to fix it. Please add a Hack file which is not compiled correctly in the example-files folder and create a PR. -Or you can fix the issue directly :) -But please add an example Hack file to the example-files folder nonetheless. +## Contributing +If you find an issue you can help to fix it. Please add a Hack file which is not compiled correctly in the example-files folder and create a PR. +Or you can fix the issue directly :) +But please add an example Hack file to the example-files folder nonetheless. diff --git a/bin/hack2php b/bin/hack2php index 7f1deb7..d18c717 100755 --- a/bin/hack2php +++ b/bin/hack2php @@ -38,7 +38,6 @@ async function transpileAsync(): Awaitable { } -# $code = await TranspilerCLI::runAsync(); -# exit($code); - exit(await TranspilerCLI::runAsync()); + $code = await TranspilerCLI::runAsync(); + exit($code); } From f1b9032c8efe32754802eaf240332b39aa4686e2 Mon Sep 17 00:00:00 2001 From: Andi Date: Sun, 3 Mar 2019 13:29:42 +0100 Subject: [PATCH 11/13] use HackTest + log errors --- example-files/function.php | 6 ++++-- tests/HackToPhpTest.php | 29 +++++++++++++++++------------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/example-files/function.php b/example-files/function.php index c7937fd..89288e3 100644 --- a/example-files/function.php +++ b/example-files/function.php @@ -1,4 +1,4 @@ - $dependencies, string $version, ): void {}; +*/ diff --git a/tests/HackToPhpTest.php b/tests/HackToPhpTest.php index a00f867..35eb758 100644 --- a/tests/HackToPhpTest.php +++ b/tests/HackToPhpTest.php @@ -14,7 +14,8 @@ use function Facebook\FBExpect\expect; use namespace HH\Lib\{C, Str, Vec}; -final class HackToPHPTest extends \PHPUnit\Framework\TestCase { +final class HackToPhpTest extends \Facebook\HackTest\HackTest { + const string TEST_CODE_DIR = '/example-files'; private function rglob(string $pattern, int $flags = 0): array { $files = \glob($pattern, $flags); @@ -28,28 +29,32 @@ private function rglob(string $pattern, int $flags = 0): array { } return $files; } + public function testPHPOnlyFeature(): void { $d = \dirname(\dirname(__FILE__)); - $t = "$d/example-files/temp"; - if (!\file_exists($t)) - \mkdir($t); - $files = $this->rglob("example-files/*.php"); + $files = $this->rglob($d.self::TEST_CODE_DIR."/*.php"); // $files = $this->rglob("example-files/phmm/vendor/giorgiosironi/*.php"); - $i = 0; - echo \count($files)." hack files to compile..."; + echo C\count($files)." hack files to compile...\n"; + + $log = \tempnam(\sys_get_temp_dir(), 'hack2php_test_'); + \file_put_contents($log, \date('Y-m-d_h:i:sP')."\n"); foreach ($files as $filename) { - // echo "Testing $filename...\n"; - $tf = "temp_".\basename($filename); - $res = \exec("$d/bin/hack2php $filename | php -l "); + echo "Testing $filename...\n"; + $res = \exec("$d/bin/hack2php $filename 2>> $log | php -l "); expect($res)->toBeSame( - "No syntax errors detected in -", - "Syntax error in file $filename:\n$res", + "No syntax errors detected in Standard input code", + "PHP Syntax error in file $filename:\n$res", ); } + expect(\filesize($log))->toBeSame( + 26, + "Error while compiling.\nLog: %s ", + $log, + ); } } From 3286be74fa5aae838c75b3cdef7ec961fef1eb61 Mon Sep 17 00:00:00 2001 From: Andi Date: Sun, 3 Mar 2019 13:36:04 +0100 Subject: [PATCH 12/13] fix: wrong enum convertig --- src/HackToPHPLinter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HackToPHPLinter.php b/src/HackToPHPLinter.php index 1df2357..c7c98b0 100644 --- a/src/HackToPHPLinter.php +++ b/src/HackToPHPLinter.php @@ -556,7 +556,7 @@ private function transpile( $code = "final class $enum_name { private function __construct() {} \n"; $code .= "private static \$hacklib_values = \n"; - $code .= \print_r($enum_array, true); + $code .= \var_export($enum_array, true); $code .= ";\n"; $code .= "use \HH\HACKLIB_ENUM_LIKE;\n"; foreach ($enum_array as $e_name => $e_value) { From 0706ce2773667a2653d4a5c881f9500c4c8123c7 Mon Sep 17 00:00:00 2001 From: Andi Date: Sun, 3 Mar 2019 13:48:14 +0100 Subject: [PATCH 13/13] updated README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2bd1130..875e13c 100644 --- a/README.md +++ b/README.md @@ -78,9 +78,9 @@ To validate the php code you can run `php -l ` ## Tests -There is only one test (HackToPhpTest). It reads each Hack file from the example-files directory, compiles it to PHP and checks the PHP syntax for errors. If no error were found, the test succeeds. Otherwise it fails. -To add a test, simply create a new Hack file in example-files. -Run the test: `hhvm vendor/bin/phpunit` +There is only one test (HackToPhpTest). It reads each Hack file from the example-files directory, compiles it to PHP and checks the PHP syntax for errors. If no error were found, the test succeeds. Otherwise it fails. +To add a test, simply create a new Hack file in example-files. +Run the test: `hhvm vendor/bin//hacktest tests/` ## Contributing