Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

'ctags' output parsing logic refactored

  • Loading branch information...
commit 719c9676544b2f98b3489e710d66786abd86762f 1 parent 1caf7a5
@seporaitis authored
Showing with 50 additions and 11 deletions.
  1. +50 −11 scripts/symbols/generate_ctags_symbols.php
View
61 scripts/symbols/generate_ctags_symbols.php
@@ -21,8 +21,14 @@
require_once $root.'/scripts/__init_script__.php';
phutil_require_module('phutil', 'console');
-phutil_require_module('phutil', 'parser/xhpast/bin');
+if (ctags_check_executable() == false) {
+ echo phutil_console_format(
+ "Could not find Exuberant ctags. Make sure it is installed and\n".
+ "available in executable path.\n\n".
+ "Exuberant ctags project page: http://ctags.sourceforge.net/\n");
+ exit(1);
+}
if ($argc !== 1 || posix_isatty(STDIN)) {
echo phutil_console_format(
@@ -47,28 +53,43 @@
$tags = explode("\n", $tags[1]);
foreach ($tags as $tag) {
- $parts = explode("\t", $tag);
+ $parts = explode(";", $tag);
+ // skip lines that we can not parse
+ if (count($parts) < 2) {
+ continue;
+ }
+
+ // split ctags information
+ $tag_info = explode("\t", $parts[0]);
+ // split exuberant ctags "extension fields" (aditional information)
+ $parts[1] = trim($parts[1], "\t \"");
+ $extension_fields = explode("\t", $parts[1]);
+
// skip lines that we can not parse
- if (count($parts) < 6) {
+ if (count($tag_info) < 3 || count($extension_fields) < 2) {
continue;
}
- list($token, $file_path, $regex, $type, $line_num, $language) = $parts;
+ list($token, $file_path, $line_num) = $tag_info;
+ list($type, $language) = $extension_fields;
- // strip "line:" and "language:"
- $line_num = substr($line_num, 5);
+ // strip "language:"
$language = substr($language, 9);
// To keep consistent with "Separate with commas, for example: php, py"
// in Arcanist Project edit form.
$language = str_ireplace("python", "py", $language);
+ // also, "normalize" c++ and c#
+ $language = str_ireplace("c++", "cpp", $language);
+ $language = str_ireplace("c#", "csharp", $language);
+
switch ($type) {
case 'class':
- print_symbol($file, $line_num, 'class', $token, $language);
+ print_symbol($file_path, $line_num, 'class', $token, $language);
break;
- case 'member':
- print_symbol($file, $line_num, 'function', $token, $language);
+ case 'function':
+ print_symbol($file_path, $line_num, 'function', $token, $language);
break;
default:
}
@@ -76,18 +97,36 @@
}
function ctags_get_parser_future($file_path) {
- $future = new ExecFuture('ctags --python-kinds=cf --fields=Kln -o - %s',
+ $future = new ExecFuture('ctags -n --fields=Kl -o - %s',
$file_path);
return $future;
}
+function ctags_check_executable() {
+ $future = new ExecFuture('ctags --version');
+ $result = $future->resolve();
+
+ if (empty($result[1])) {
+ return false;
+ }
+
+ return true;
+}
+
function print_symbol($file, $line_num, $type, $token, $language) {
+ // get rid of relative path
+ $file = explode('/', $file);
+ if ($file[0] == '.') {
+ array_shift($file);
+ }
+ $file = '/' . implode('/', $file);
+
$parts = array(
$token,
$type,
strtolower($language),
$line_num,
- '/'.ltrim($file, './'),
+ $file,
);
echo implode(' ', $parts)."\n";
}
Please sign in to comment.
Something went wrong with that request. Please try again.