diff --git a/LE.md b/LE.md index 9411f746897f5..179c1986bd82a 100644 --- a/LE.md +++ b/LE.md @@ -1,5 +1,33 @@ # Generics syntax +``` +interface Comparable { + +} + +interface Equatable { + +} + +int implements Comparable, Equatable; + +class Foo { + + class Bar { + + } + +} + +enum FooBar { + + case Blum(int bam); + case Bam(T boom); + +} + +``` + ## Generic classes and interfaces ### Basic case diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 72f2f0c938ac7..aa3381a8a580e 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1395,6 +1395,7 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ } "function" { + yy_push_state(ST_IN_FUNC_DEF); RETURN_TOKEN_WITH_IDENT(T_FUNCTION); } @@ -1537,18 +1538,35 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN_WITH_IDENT(T_PRINT); } - "!🥖" { + "<" { + yy_push_state(ST_IN_GENERIC); RETURN_TOKEN(T_GENERIC_START); } - "!🥥" { + ">" { + yy_pop_state(); RETURN_TOKEN(T_GENERIC_END); } +{LABEL} { + RETURN_TOKEN_WITH_STR(T_STRING, 0); +} + + "class" { + yy_push_state(ST_IN_CLASS_DEF); RETURN_TOKEN_WITH_IDENT(T_CLASS); } + + +"{" { + yy_pop_state(); + yy_push_state(ST_IN_SCRIPTING); + enter_nesting('{'); + RETURN_TOKEN('{'); +} + "interface" { RETURN_TOKEN_WITH_IDENT(T_INTERFACE); } @@ -1570,11 +1588,11 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN_WITH_IDENT(T_ENUM); } -"extends" { +"extends" { RETURN_TOKEN_WITH_IDENT(T_EXTENDS); } -"implements" { +"implements" { RETURN_TOKEN_WITH_IDENT(T_IMPLEMENTS); } @@ -1588,7 +1606,7 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN(T_NULLSAFE_OBJECT_OPERATOR); } -{WHITESPACE}+ { +{WHITESPACE}+ { goto return_whitespace; } @@ -1730,9 +1748,14 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ } "private" { + yy_push_state(ST_IN_PROPERTY_TYPE_DEF); RETURN_TOKEN_WITH_IDENT(T_PRIVATE); } + { + +} + "protected" { RETURN_TOKEN_WITH_IDENT(T_PROTECTED); } @@ -1916,6 +1939,16 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN(yytext[0]); } +"(" { + yy_pop_state(); + enter_nesting(yytext[0]); + RETURN_TOKEN(yytext[0]); +} + +":"|"," { + RETURN_TOKEN(yytext[0]); +} + {TOKENS} { RETURN_TOKEN(yytext[0]); } @@ -2402,7 +2435,7 @@ inline_char_handler: RETURN_TOKEN(T_NS_SEPARATOR); } -{LABEL} { +{LABEL} { RETURN_TOKEN_WITH_STR(T_STRING, 0); } diff --git a/le-test/simple-class.php b/le-test/simple-class.php new file mode 100644 index 0000000000000..73423ce0166f2 --- /dev/null +++ b/le-test/simple-class.php @@ -0,0 +1,16 @@ + { + // T can be used as type alias inside of 'GenericTestClass' + public function __construct( + private T $property + ) {} + + public function getMyT(): T { + return $this->property; + } + + public function setMyT(T $newValue) { + $this->property = $newValue; + } +} \ No newline at end of file diff --git a/le-test/simple-function.php b/le-test/simple-function.php new file mode 100644 index 0000000000000..307fa2d5f8d03 --- /dev/null +++ b/le-test/simple-function.php @@ -0,0 +1,3 @@ +(): void {} \ No newline at end of file diff --git a/t.php b/t.php index 7619145823363..93668b01e91a6 100644 --- a/t.php +++ b/t.php @@ -1,10 +1,25 @@ > { + + private array $content = []; + public function __construct( - public string $lol -){ + private K $serializer + ) {} + + public function add(T $toAdd) + { + $content[] = $toAdd; + } + + public function asSerializedList(): array + { + return array_map( + fn ($obj) => $this->serializer->serialize($obj), + $this->content + ); } } -$lelelele = new test("le"); echo "hi\n"; \ No newline at end of file diff --git a/tree.php b/tree.php index 16fb675a5a960..934f17b7dd468 100644 --- a/tree.php +++ b/tree.php @@ -1,18 +1,10 @@ , $le) - echo "hi\n";'); - -var_export($tokens); +$classTokens = token_get_all( +' { + public Serializable $test; + function __construct() {} +} +'); + +var_export($classTokens); \ No newline at end of file