Skip to content

Commit e4c433c

Browse files
kkarkuscorpsee
authored andcommitted
Support for PHP 7.1's nullable types.
1 parent ad8749e commit e4c433c

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

src/CheckerCommand.php

+15
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,21 @@ protected function processFile($file)
336336
'method' => $name,
337337
'line' => $method['line'],
338338
];
339+
} elseif (is_array($method['return'])) {
340+
$docblockTypes = explode('|', $method['docblock']['return']);
341+
sort($docblockTypes);
342+
if ($method['return'] != $docblockTypes) {
343+
$warnings = true;
344+
$this->warnings[] = [
345+
'type' => 'return-mismatch',
346+
'file' => $file,
347+
'class' => $name,
348+
'method' => $name,
349+
'line' => $method['line'],
350+
'return-type' => implode('|', $method['return']),
351+
'doc-type' => $method['docblock']['return'],
352+
];
353+
}
339354
} elseif ($method['docblock']['return'] != $method['return']) {
340355
if ($method['return'] == 'array' && substr($method['docblock']['return'], -2) == '[]') {
341356
// Do nothing because this is fine.

src/FileProcessor.php

+31-16
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PhpParser\Comment\Doc;
66
use PhpParser\Node\Stmt;
77
use PhpParser\Node\Stmt\Class_;
8+
use PhpParser\Node\NullableType;
89
use PhpParser\Node\Stmt\ClassMethod;
910
use PhpParser\Node\Stmt\Namespace_;
1011
use PhpParser\Node\Stmt\Use_;
@@ -93,8 +94,12 @@ protected function processStatements(array $statements, $prefix = '')
9394

9495
$type = $method->returnType;
9596

96-
if (!is_null($type)) {
97-
$type = (string)$type;
97+
if (!$method->returnType instanceof NullableType) {
98+
if (!is_null($type)) {
99+
$type = (string)$type;
100+
}
101+
} else {
102+
$type = (string)$type->type;
98103
}
99104

100105
if (isset($uses[$type])) {
@@ -103,6 +108,10 @@ protected function processStatements(array $statements, $prefix = '')
103108

104109
$type = substr($type, 0, 1) == '\\' ? substr($type, 1) : $type;
105110

111+
if ($method->returnType instanceof NullableType) {
112+
$type = ['null', $type];
113+
sort($type);
114+
}
106115

107116
$thisMethod = [
108117
'file' => $this->file,
@@ -117,8 +126,12 @@ protected function processStatements(array $statements, $prefix = '')
117126
foreach ($method->params as $param) {
118127
$type = $param->type;
119128

120-
if (!is_null($type)) {
121-
$type = (string)$type;
129+
if (!$type instanceof NullableType) {
130+
if (!is_null($type)) {
131+
$type = (string)$type;
132+
}
133+
} else {
134+
$type = (string)$type->type;
122135
}
123136

124137
if (isset($uses[$type])) {
@@ -177,13 +190,14 @@ protected function processDocblock($text, array $uses = [])
177190
$type = (string)$type;
178191
}
179192

180-
if (isset($uses[$type])) {
181-
$type = $uses[$type];
193+
$types = [];
194+
foreach (explode('|', $type) as $tmpType) {
195+
if (isset($uses[$tmpType])) {
196+
$tmpType = $uses[$tmpType];
197+
}
198+
$types[] = substr($tmpType, 0, 1) == '\\' ? substr($tmpType, 1) : $tmpType;
182199
}
183-
184-
$type = substr($type, 0, 1) == '\\' ? substr($type, 1) : $type;
185-
186-
$rtn['params'][$param['var']] = $type;
200+
$rtn['params'][$param['var']] = implode('|', $types);
187201
}
188202
}
189203

@@ -196,13 +210,14 @@ protected function processDocblock($text, array $uses = [])
196210
$type = (string)$type;
197211
}
198212

199-
if (isset($uses[$type])) {
200-
$type = $uses[$type];
213+
$types = [];
214+
foreach (explode('|', $type) as $tmpType) {
215+
if (isset($uses[$tmpType])) {
216+
$tmpType = $uses[$tmpType];
217+
}
218+
$types[] = substr($tmpType, 0, 1) == '\\' ? substr($tmpType, 1) : $tmpType;
201219
}
202-
203-
$type = substr($type, 0, 1) == '\\' ? substr($type, 1) : $type;
204-
205-
$rtn['return'] = $type;
220+
$rtn['return'] = implode('|', $types);
206221
}
207222

208223
return $rtn;

0 commit comments

Comments
 (0)