This repository was archived by the owner on Dec 1, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 43
Expand file tree
/
Copy pathHHClientLinter.hack
More file actions
93 lines (86 loc) · 2.37 KB
/
Copy pathHHClientLinter.hack
File metadata and controls
93 lines (86 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
namespace Facebook\HHAST;
use namespace Facebook\TypeAssert;
use namespace HH\Lib\{C, Str, Vec};
/**
* A linter as a proxy invoking `hh_client --lint`.
*/
final class HHClientLinter extends BaseLinter {
use SuppressibleTrait;
const type TConfig = shape();
const type TJSONResult = shape(
'errors' => vec<HHClientLintError::TJSONError>,
'version' => string,
);
private static function blameCode(
vec<string> $file_lines,
HHClientLintError::TJSONError $error,
): string {
$line_number_1base = $error['line'];
$line_index_0base = $line_number_1base - 1;
$line_content = $file_lines[$line_index_0base];
return Str\slice(
$line_content,
$error['start'],
$error['end'] - $error['start'],
);
}
<<__Override>>
public async function getLintErrorsAsync(
): Awaitable<vec<HHClientLintError>> {
$lines = await __Private\execute_async(
'hh_client',
'--lint',
$this->getFile()->getPath(),
'--json',
'--from',
'hhast',
);
$hh_client_lint_result = TypeAssert\matches<this::TJSONResult>(
\json_decode(
C\firstx($lines),
/* assoc = */ true,
/* depth = */ 512,
\JSON_FB_HACK_ARRAYS,
),
);
$file_lines = Str\split($this->getFile()->getContents(), "\n");
return $hh_client_lint_result['errors']
|> Vec\map(
$$,
$error ==> new HHClientLintError(
$this->getFile(),
$error,
$this::blameCode($file_lines, $error),
),
)
|> Vec\filter($$, $error ==> {
if ($error->getLintRule()->isSuppressedForFile($this->getFile())) {
return false;
}
$range = $error->getRange();
if ($range is null) {
return true;
}
list(list($line_number, $_), $_) = $range;
$previous_line_number = $line_number - 1;
if ($this->isSuppressedForLine($this->getFile(), $previous_line_number)) {
return false;
}
if (
$error->getLintRule()
->isSuppressedForLine($this->getFile(), $previous_line_number)
) {
return false;
}
return true;
});
}
}