Skip to content

Commit

Permalink
enh(php) Add support for constants and php 8.1 keywords
Browse files Browse the repository at this point in the history
  • Loading branch information
wkania committed Dec 6, 2021
1 parent 91c5228 commit d55e79e
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -19,6 +19,7 @@ Grammars:
- fix(clojure) Remove inconsistent/broken highlighting for metadata
- enh(clojure) Add `punctuation` mode for commas.
- enh(nsis) Update variables pattern (#3416) [idleberg][]
- enh(php) Add support for constants and PHP 8.1 keywords [Wojciech Kania][]

Developer Tools:

Expand Down
30 changes: 27 additions & 3 deletions src/languages/php.js
Expand Up @@ -18,6 +18,28 @@ export default function(hljs) {
// Perl at all like $ident$, @ident@, etc.
`(?![A-Za-z0-9])(?![$])`
};
const CONSTANT = {
className: "variable",
relevance: 0,
variants: [
{
begin: /const\s*/,
end: /\w+/,
excludeBegin: true
},
{
begin: /::(?!class\b)/,
end: /\w+/,
excludeBegin: true
},
{
className: "keyword",
begin: /::/,
end: /class/,
excludeBegin: true
},
]
};
const PREPROCESSOR = {
className: 'meta',
variants: [
Expand Down Expand Up @@ -87,7 +109,7 @@ export default function(hljs) {
'array abstract and as binary bool boolean break callable case catch class clone const continue declare ' +
'default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends ' +
'final finally float for foreach from global goto if implements instanceof insteadof int integer interface ' +
'isset iterable list match|0 mixed new object or private protected public real return string switch throw trait ' +
'isset iterable list match|0 mixed new never object or private protected public readonly real return string switch throw trait ' +
'try unset use var void while xor yield',
literal: 'false null true',
built_in:
Expand All @@ -97,10 +119,10 @@ export default function(hljs) {
'AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ' +
// Reserved interfaces:
// <https://www.php.net/manual/en/reserved.interfaces.php>
'ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap ' +
'ArrayAccess BackedEnum Closure Fiber Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable UnitEnum WeakReference WeakMap ' +
// Reserved classes:
// <https://www.php.net/manual/en/reserved.classes.php>
'Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass'
'Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass',
};
return {
case_insensitive: true,
Expand Down Expand Up @@ -133,6 +155,7 @@ export default function(hljs) {
className: 'keyword', begin: /\$this\b/
},
VARIABLE,
CONSTANT,
{
// swallow composed identifiers to avoid parsing them as keywords
begin: /(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/
Expand Down Expand Up @@ -160,6 +183,7 @@ export default function(hljs) {
contains: [
'self',
VARIABLE,
CONSTANT,
hljs.C_BLOCK_COMMENT_MODE,
STRING,
NUMBER
Expand Down
10 changes: 10 additions & 0 deletions test/markup/php/titles.expect.txt
@@ -0,0 +1,10 @@
<span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Example</span> </span>{
<span class="hljs-keyword">const</span> <span class="hljs-variable">FOO</span>=<span class="hljs-string">&#x27;foo&#x27;</span>;
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params">
<span class="hljs-keyword">public</span> <span class="hljs-keyword">readonly</span> <span class="hljs-keyword">string</span> <span class="hljs-variable">$name</span> = <span class="hljs-built_in">self</span>::<span class="hljs-variable">FOO</span>
</span>) </span>{}

<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getClass</span>(<span class="hljs-params"></span>): <span class="hljs-title">string</span> </span>{
<span class="hljs-keyword">return</span> DateTimeImmutable::<span class="hljs-keyword">class</span>;
}
}
10 changes: 10 additions & 0 deletions test/markup/php/titles.txt
@@ -0,0 +1,10 @@
final class Example {
const FOO='foo';
public function __construct(
public readonly string $name = self::FOO
) {}

public function getClass(): string {
return DateTimeImmutable::class;
}
}

0 comments on commit d55e79e

Please sign in to comment.