Skip to content

Commit

Permalink
Add support for readonly constructor properties
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewnicols committed Feb 17, 2024
1 parent 01c8320 commit 393aac6
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
1 change: 1 addition & 0 deletions file.php
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ public function &get_functions() {
case T_PUBLIC:
case T_PROTECTED:
case T_PRIVATE:
case T_READONLY:
continue 2;
case T_VARIABLE:
// The variale name, adding in the vardiadic if required.
Expand Down
47 changes: 47 additions & 0 deletions tests/fixtures/phpdoc_constructor_property_promotion_readonly.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

namespace local_moodlecheck;

use cm_info;
use stdClass;

/**
* A fixture to verify phpdoc tags used in constructor property promotion.
*
* @package local_moodlecheck
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class constructor_property_promotion {
/**
* An example of a constructor using constructor property promotion.
*
* @param stdClass|cm_info $cm The course module data
* @param string $name The name
* @param int|float $size The size
* @param null|string $description The description
* @param ?string $content The content
*/
public function __construct(
private stdClass|cm_info $cm,
public readonly string $name,
public readonly float|int $size,
protected readonly?string $description = null,
protected ?string $content = null
) {
}
}
28 changes: 28 additions & 0 deletions tests/moodlecheck_rules_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,34 @@ public function test_phpdoc_constructor_property_promotion(): void {
$this->assertStringNotContainsString('constructor_property_promotion::__construct has incomplete parameters list', $result);
}

/**
* Verify that constructor property promotion supports readonly properties.
*
* @covers ::local_moodlecheck_functionarguments
* @requires PHP >= 8.1
*/
public function test_phpdoc_constructor_property_promotion_readonly(): void {
global $PAGE;
$output = $PAGE->get_renderer('local_moodlecheck');
$path = new local_moodlecheck_path(
'local/moodlecheck/tests/fixtures/phpdoc_constructor_property_promotion_readonly.php',
null
);
$result = $output->display_path($path, 'xml');

// Convert results to XML Objext.
$xmlresult = new \DOMDocument();
$xmlresult->loadXML($result);

// Let's verify we have received a xml with file top element and 8 children.
$xpath = new \DOMXpath($xmlresult);
$found = $xpath->query("//file/error");

$this->assertCount(1, $found);
$this->assertStringContainsString('packagevalid', $result);
$this->assertStringNotContainsString('constructor_property_promotion::__construct has incomplete parameters list', $result);
}

/**
* Verify that constructor property promotion is supported.
*
Expand Down

0 comments on commit 393aac6

Please sign in to comment.