diff --git a/.arclint b/.arclint --- a/.arclint +++ b/.arclint @@ -136,6 +136,10 @@ "(^src/bench/nanobench.h$)" ] }, + "lint-std-chrono": { + "type": "lint-std-chrono", + "include": "(^src/.*\\.(h|cpp)$)" + }, "lint-stdint": { "type": "lint-stdint", "include": "(^src/.*\\.(h|c|cpp)$)", diff --git a/arcanist/__phutil_library_map__.php b/arcanist/__phutil_library_map__.php --- a/arcanist/__phutil_library_map__.php +++ b/arcanist/__phutil_library_map__.php @@ -43,6 +43,7 @@ 'RustfmtLinter' => 'linter/RustfmtLinter.php', 'ShellCheckLinter' => 'linter/ShellCheckLinter.php', 'ShellLocaleLinter' => 'linter/ShellLocaleLinter.php', + 'StdChronoLinter' => 'linter/StdChronoLinter.php', 'StdintLinter' => 'linter/StdintLinter.php', 'TestsLinter' => 'linter/TestsLinter.php', 'WhitespaceLinter' => 'linter/WhitespaceLinter.php', @@ -88,6 +89,7 @@ 'RustfmtLinter' => 'ArcanistExternalLinter', 'ShellCheckLinter' => 'ArcanistExternalLinter', 'ShellLocaleLinter' => 'ArcanistLinter', + 'StdChronoLinter' => 'ArcanistLinter', 'StdintLinter' => 'ArcanistLinter', 'TestsLinter' => 'ArcanistExternalLinter', 'WhitespaceLinter' => 'ArcanistLinter', diff --git a/arcanist/linter/StdChronoLinter.php b/arcanist/linter/StdChronoLinter.php new file mode 100644 --- /dev/null +++ b/arcanist/linter/StdChronoLinter.php @@ -0,0 +1,60 @@ + ArcanistLintSeverity::SEVERITY_ERROR, + ); + } + + public function getLintNameMap() { + return array( + self::BAD_DURATION_CONSTRUCTOR => pht( + 'Uninitialized chrono::duration constructor'), + ); + } + + public function lintPath($path) { + $absPath = Filesystem::resolvePath($path, $this->getProjectRoot()); + $fileContent = Filesystem::readFile($absPath); + + if (preg_match_all( + '/std::chrono::(?:'. + 'duration|hours|minutes|seconds|milliseconds|microseconds|nanoseconds)'. + '(?:<.*>)?\(\)/', $fileContent, $matches, PREG_OFFSET_CAPTURE)) { + foreach ($matches[0] as $match) { + list($durationConstructor, $offset) = $match; + $this->raiseLintAtOffset( + $offset, + self::BAD_DURATION_CONSTRUCTOR, + pht($durationConstructor." without an explicit initialized value ". + "may lead to undesired behavior."), + $durationConstructor, + substr_replace($durationConstructor, '0', -1, 0) + ); + } + } + } +}