diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -461,6 +461,7 @@
     'xhpast_get_parser_future' => 'parser/xhpast/bin/xhpast_parse.php',
     'xhpast_is_available' => 'parser/xhpast/bin/xhpast_parse.php',
     'xhpast_parser_token_constants' => 'parser/xhpast/parser_tokens.php',
+    'xhpast_version' => 'parser/xhpast/bin/xhpast_parse.php',
     'xsprintf' => 'xsprintf/xsprintf.php',
     'xsprintf_callback_example' => 'xsprintf/xsprintf.php',
     'xsprintf_command' => 'xsprintf/csprintf.php',
diff --git a/src/parser/xhpast/bin/xhpast_parse.php b/src/parser/xhpast/bin/xhpast_parse.php
--- a/src/parser/xhpast/bin/xhpast_parse.php
+++ b/src/parser/xhpast/bin/xhpast_parse.php
@@ -2,19 +2,11 @@
 
 function xhpast_is_available() {
   static $available;
+
   if ($available === null) {
-    $available = false;
-    $bin = xhpast_get_binary_path();
-    if (Filesystem::pathExists($bin)) {
-      list($err, $stdout) = exec_manual('%s --version', $bin);
-      if (!$err) {
-        $version = trim($stdout);
-        if ($version === 'xhpast version 5.5.8/1g') {
-          $available = true;
-        }
-      }
-    }
+    $available = xhpast_version() == 'xhpast version 5.5.8/1g';
   }
+
   return $available;
 }
 
@@ -57,3 +49,19 @@
   $root = phutil_get_library_root('phutil');
   execx('%s', $root.'/../scripts/build_xhpast.sh');
 }
+
+function xhpast_version() {
+  static $version;
+
+  if ($version === null) {
+    $bin = xhpast_get_binary_path();
+    if (Filesystem::pathExists($bin)) {
+      list($err, $stdout) = exec_manual('%s --version', $bin);
+      if (!$err) {
+        $version = trim($stdout);
+      }
+    }
+  }
+
+  return $version;
+}