diff --git a/src/parser/PhutilDocblockParser.php b/src/parser/PhutilDocblockParser.php --- a/src/parser/PhutilDocblockParser.php +++ b/src/parser/PhutilDocblockParser.php @@ -97,19 +97,39 @@ foreach ($matches as $match) { list($_, $type, $data) = $match; $data = trim($data); - if (isset($special[$type])) { - $special[$type] = $special[$type]."\n".$data; - } else { + + // For flags like "@stable" which don't have any string data, set the + // value to true. + if (!strlen($data)) { + $data = true; + } + + if (!isset($special[$type])) { $special[$type] = $data; + } else { + if (!is_array($special[$type])) { + $special[$type] = (array)$special[$type]; + } + $special[$type][] = $data; } } } - // For flags like "@stable" which don't have any string data, set the value - // to true. + // Convert `array(true, true, true)` to `true`. foreach ($special as $type => $data) { - if (!strlen(trim($data))) { - $special[$type] = true; + if (is_array($data)) { + $all_trues = true; + + foreach ($data as $value) { + if ($value !== true) { + $all_trues = false; + break; + } + } + + if ($all_trues) { + $special[$type] = true; + } } } diff --git a/src/parser/__tests__/PhutilDocblockParserTestCase.php b/src/parser/__tests__/PhutilDocblockParserTestCase.php --- a/src/parser/__tests__/PhutilDocblockParserTestCase.php +++ b/src/parser/__tests__/PhutilDocblockParserTestCase.php @@ -52,7 +52,8 @@ case 'multi-specials.docblock': $this->assertEqual( array( - 'special' => "north\nsouth", + 'special' => array('north', 'south'), + 'stable' => true, ), $specials); $this->assertEqual( @@ -64,6 +65,7 @@ array( 'type' => 'type', 'task' => 'task', + 'special' => array('dot', 'dot', 'dash'), ), $specials); $this->assertEqual( @@ -83,7 +85,7 @@ case 'specials-with-hyphen.docblock': $this->assertEqual( array( - 'repeat-hyphen' => "a\nb", + 'repeat-hyphen' => array('a', 'b'), 'multiline-hyphen' => 'mmm nnn', 'normal-hyphen' => 'x', ), @@ -110,6 +112,13 @@ ), $specials); break; + case 'mixed-types.docblock': + $this->assertEqual( + array( + 'special' => array('squirrels', true), + ), + $specials); + break; default: throw new Exception(pht("No test case to handle file '%s'!", $file)); } diff --git a/src/parser/__tests__/docblock/mixed-types.docblock b/src/parser/__tests__/docblock/mixed-types.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/mixed-types.docblock @@ -0,0 +1,4 @@ +/** + * @special squirrels + * @special + */ diff --git a/src/parser/__tests__/docblock/multi-specials.docblock b/src/parser/__tests__/docblock/multi-specials.docblock --- a/src/parser/__tests__/docblock/multi-specials.docblock +++ b/src/parser/__tests__/docblock/multi-specials.docblock @@ -1,4 +1,8 @@ /** * @special north * @special south + * + * @stable + * @stable + * @stable */ diff --git a/src/parser/__tests__/docblock/specials.docblock b/src/parser/__tests__/docblock/specials.docblock --- a/src/parser/__tests__/docblock/specials.docblock +++ b/src/parser/__tests__/docblock/specials.docblock @@ -1,4 +1,8 @@ /** * @type type * @task task + * + * @special dot + * @special dot + * @special dash */