mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
parent
0574e06a42
commit
89999fd554
@ -500,6 +500,10 @@ abstract class Type
|
|||||||
return new Atomic\TScalarClassConstant($fq_classlike_name, $const_name);
|
return new Atomic\TScalarClassConstant($fq_classlike_name, $const_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^\-?(0|[1-9][0-9]*)(\.[0-9]{1,})$/', $parse_tree->value)) {
|
||||||
|
return new TLiteralFloat((float) $parse_tree->value);
|
||||||
|
}
|
||||||
|
|
||||||
if (preg_match('/^\-?(0|[1-9][0-9]*)$/', $parse_tree->value)) {
|
if (preg_match('/^\-?(0|[1-9][0-9]*)$/', $parse_tree->value)) {
|
||||||
return new TLiteralInt((int) $parse_tree->value);
|
return new TLiteralInt((int) $parse_tree->value);
|
||||||
}
|
}
|
||||||
@ -701,6 +705,17 @@ abstract class Type
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($char === '.') {
|
if ($char === '.') {
|
||||||
|
if ($i + 1 < $c
|
||||||
|
&& is_numeric($chars[$i + 1])
|
||||||
|
&& $i > 0
|
||||||
|
&& is_numeric($chars[$i - 1])
|
||||||
|
) {
|
||||||
|
$type_tokens[$rtc] .= $char;
|
||||||
|
$was_char = false;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ($i + 2 > $c || $chars[$i + 1] !== '.' || $chars[$i + 2] !== '.') {
|
if ($i + 2 > $c || $chars[$i + 1] !== '.' || $chars[$i + 2] !== '.') {
|
||||||
throw new TypeParseTreeException('Unexpected token ' . $char);
|
throw new TypeParseTreeException('Unexpected token ' . $char);
|
||||||
}
|
}
|
||||||
|
@ -31,13 +31,15 @@ class EnumTest extends TestCase
|
|||||||
'<?php
|
'<?php
|
||||||
namespace Ns;
|
namespace Ns;
|
||||||
|
|
||||||
/** @psalm-param "foo\"with"|"bar"|1|2|3 $s */
|
/** @psalm-param "foo\"with"|"bar"|1|2|3|4.0|4.1 $s */
|
||||||
function foo($s) : void {}
|
function foo($s) : void {}
|
||||||
foo("foo\"with");
|
foo("foo\"with");
|
||||||
foo("bar");
|
foo("bar");
|
||||||
foo(1);
|
foo(1);
|
||||||
foo(2);
|
foo(2);
|
||||||
foo(3);',
|
foo(3);
|
||||||
|
foo(4.0);
|
||||||
|
foo(4.1);',
|
||||||
],
|
],
|
||||||
'noRedundantConditionWithSwitch' => [
|
'noRedundantConditionWithSwitch' => [
|
||||||
'<?php
|
'<?php
|
||||||
@ -138,6 +140,15 @@ class EnumTest extends TestCase
|
|||||||
foo(4);',
|
foo(4);',
|
||||||
'error_message' => 'InvalidArgument',
|
'error_message' => 'InvalidArgument',
|
||||||
],
|
],
|
||||||
|
'enumWrongFloat' => [
|
||||||
|
'<?php
|
||||||
|
namespace Ns;
|
||||||
|
|
||||||
|
/** @psalm-param 1.2|3.4|5.6 $s */
|
||||||
|
function foo($s) : void {}
|
||||||
|
foo(7.8);',
|
||||||
|
'error_message' => 'InvalidArgument',
|
||||||
|
],
|
||||||
'classConstantIncorrect' => [
|
'classConstantIncorrect' => [
|
||||||
'<?php
|
'<?php
|
||||||
namespace Ns;
|
namespace Ns;
|
||||||
|
@ -657,7 +657,7 @@ class TypeParseTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testEnum()
|
public function testEnum()
|
||||||
{
|
{
|
||||||
$docblock_type = Type::parseString('( \'foo\\\'with\' | "bar\"bar" | "baz" | "bat\\\\" | \'bang bang\' | 1 | 2 | 3)');
|
$docblock_type = Type::parseString('( \'foo\\\'with\' | "bar\"bar" | "baz" | "bat\\\\" | \'bang bang\' | 1 | 2 | 3 | 4.5)');
|
||||||
|
|
||||||
$resolved_type = new Type\Union([
|
$resolved_type = new Type\Union([
|
||||||
new Type\Atomic\TLiteralString('foo\'with'),
|
new Type\Atomic\TLiteralString('foo\'with'),
|
||||||
@ -667,7 +667,8 @@ class TypeParseTest extends TestCase
|
|||||||
new Type\Atomic\TLiteralString('bang bang'),
|
new Type\Atomic\TLiteralString('bang bang'),
|
||||||
new Type\Atomic\TLiteralInt(1),
|
new Type\Atomic\TLiteralInt(1),
|
||||||
new Type\Atomic\TLiteralInt(2),
|
new Type\Atomic\TLiteralInt(2),
|
||||||
new Type\Atomic\TLiteralInt(3)
|
new Type\Atomic\TLiteralInt(3),
|
||||||
|
new Type\Atomic\TLiteralFloat(4.5)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertSame($resolved_type->getId(), $docblock_type->getId());
|
$this->assertSame($resolved_type->getId(), $docblock_type->getId());
|
||||||
@ -678,7 +679,7 @@ class TypeParseTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testEnumWithoutSpaces()
|
public function testEnumWithoutSpaces()
|
||||||
{
|
{
|
||||||
$docblock_type = Type::parseString('\'foo\\\'with\'|"bar\"bar"|"baz"|"bat\\\\"|\'bang bang\'|1|2|3');
|
$docblock_type = Type::parseString('\'foo\\\'with\'|"bar\"bar"|"baz"|"bat\\\\"|\'bang bang\'|1|2|3|4.5');
|
||||||
|
|
||||||
$resolved_type = new Type\Union([
|
$resolved_type = new Type\Union([
|
||||||
new Type\Atomic\TLiteralString('foo\'with'),
|
new Type\Atomic\TLiteralString('foo\'with'),
|
||||||
@ -688,7 +689,8 @@ class TypeParseTest extends TestCase
|
|||||||
new Type\Atomic\TLiteralString('bang bang'),
|
new Type\Atomic\TLiteralString('bang bang'),
|
||||||
new Type\Atomic\TLiteralInt(1),
|
new Type\Atomic\TLiteralInt(1),
|
||||||
new Type\Atomic\TLiteralInt(2),
|
new Type\Atomic\TLiteralInt(2),
|
||||||
new Type\Atomic\TLiteralInt(3)
|
new Type\Atomic\TLiteralInt(3),
|
||||||
|
new Type\Atomic\TLiteralFloat(4.5)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertSame($resolved_type->getId(), $docblock_type->getId());
|
$this->assertSame($resolved_type->getId(), $docblock_type->getId());
|
||||||
|
Loading…
Reference in New Issue
Block a user