]> git.graph-it.com Git - graphit/parser.git/commitdiff
Psalm-Fehler bearbeitet master v0.2.1
authorSebastian Brix <sebastian.brix@graph-it.com>
Mon, 26 Jan 2026 14:25:49 +0000 (15:25 +0100)
committerSebastian Brix <sebastian.brix@graph-it.com>
Mon, 26 Jan 2026 14:25:49 +0000 (15:25 +0100)
40 files changed:
bin/generate_parser.php
src/EBNF/AltResult.php
src/EBNF/Anonymous11Result.php
src/EBNF/Anonymous14Result.php
src/EBNF/Anonymous16Result.php
src/EBNF/Anonymous18Result.php
src/EBNF/Anonymous20Result.php
src/EBNF/Anonymous22Result.php
src/EBNF/Anonymous23Result.php
src/EBNF/Anonymous25Result.php
src/EBNF/Anonymous26Result.php
src/EBNF/Anonymous28Result.php
src/EBNF/Anonymous29Result.php
src/EBNF/Anonymous2Result.php
src/EBNF/Anonymous31Result.php
src/EBNF/Anonymous3Result.php
src/EBNF/Anonymous7Result.php
src/EBNF/BarewordResult.php
src/EBNF/CommatermResult.php
src/EBNF/CommatermlistResult.php
src/EBNF/CommentResult.php
src/EBNF/ConcResult.php
src/EBNF/DqResult.php
src/EBNF/EBNFParser.php
src/EBNF/GroupResult.php
src/EBNF/OptionalResult.php
src/EBNF/PipeconcResult.php
src/EBNF/PipeconclistResult.php
src/EBNF/RegexResult.php
src/EBNF/RepetitionResult.php
src/EBNF/RuleResult.php
src/EBNF/RulesResult.php
src/EBNF/SpaceResult.php
src/EBNF/SqResult.php
src/EBNF/SyntaxResult.php
src/EBNF/TermResult.php
src/EBNF/WhitespaceResult.php
src/EBNFParserGenerator.php
src/EBNFResultGenerator.php
src/EBNFTransform.php

index aae6384c39674d1a535667111b9e1803220ffd7e..70c7fa23ae52182277a1664e62bc9383039ea3e1 100755 (executable)
@@ -54,6 +54,11 @@ use Graphit\Parser\EBNFResultGenerator;
 use Graphit\Parser\EBNFParserGenerator;
 
 $EBNFFileContent = file_get_contents($EBNFFile);
+if ($EBNFFileContent === false) {
+  echo PHP_EOL;
+  echo "Unable to read $EBNFFile" . PHP_EOL;
+  exit(1);
+}
 $result = EBNFParser::parse($EBNFFileContent);
 if ($result === null) {
   echo PHP_EOL;
@@ -67,6 +72,10 @@ function folderHasContents(string $folder): bool {
   }
 
   $files = scandir($folder);
+  if ($files === false) {
+    return true;
+  }
+  
   return count($files) > 2;
 }
 
index c185fa29413263cb097825cbd310c79eb01842a7..9e2b6722b9162c1075bd5b9d2941c7f96155b616 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class AltResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class AltResult 
 {
   /**
    * @param list{ConcResult, PipeconclistResult} $result
index 2970530c04bb00ea60a9c04f86eda32f749ce859..f96936984dee47fa48d92282eec23f1ae202a2f7 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous11Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous11Result 
 {
   /**
    * @param ',' $result
index 9a636c76c10170cf460ccf1d97a8cedba8c38a55..941102fdfc4d3159dee84596bad8a3d2cae685bd 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous14Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous14Result 
 {
   /**
    * @param string $result
index 498c5793c424097a4f04e162877531d29c0ab215..a02579d89fb068238a45363e22b716c8737c855e 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous16Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous16Result 
 {
   /**
    * @param string $result
index e8fbf15dc5017d5ff08f447e57ac5f6242c2dedd..965af4874574a135bb58035b9f1b2255978f9159 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous18Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous18Result 
 {
   /**
    * @param string $result
index ea042b59aa6697032bcfd3f7f20acf8ae2558ed3..ddcecab4756935fab46369d3390e48fdf1f7a0d6 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous20Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous20Result 
 {
   /**
    * @param string $result
index d435b2a508733128a502dfd5f1d7416360987b90..e343cfcd797a1b0111c6e668c3146bd8531a89e6 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous22Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous22Result 
 {
   /**
    * @param '(' $result
index 8b0f4ff887db59c67d031e96752ef2cfae2d7c70..cc00fb1d0423f623ef7df699ec25fd95b555da8c 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous23Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous23Result 
 {
   /**
    * @param ')' $result
index ce3caa0ef9f996e9ac79fd28d3dcef5126d9e7cb..89d7e9a0dccc933a53ad3b0c068c42b0d1208f63 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous25Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous25Result 
 {
   /**
    * @param '{' $result
index e98dbb853f19207842a4ff9328d645b48f266e89..3ec2730c19e1ab7db27ef9b6b9634d6ec743c5e5 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous26Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous26Result 
 {
   /**
    * @param '}' $result
index d8ba184061d5de63a83f32f583632663688e7ec1..651e1cfcfa8f390e6bc1a54630e0f8680f18f18e 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous28Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous28Result 
 {
   /**
    * @param '[' $result
index 2a1404e363274fdeab1c55cbc7aa3ce18de88005..2298e492eeb5a04260b6639c446b5ab4ad5a3cf5 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous29Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous29Result 
 {
   /**
    * @param ']' $result
index 069c3775d14658fce5936d0c7ffc7bc6cba50ede..b2cce900045091722ba12757e96a73446061107d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous2Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous2Result 
 {
   /**
    * @param '=' $result
index 2d298c8205a0ed6a30e679c48e188cf594678751..8366515729935d581e5f23b19f8299beb81c3fcb 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous31Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous31Result 
 {
   /**
    * @param WhitespaceResult|CommentResult $result
index 437001fd580b5155e02a28c092994dfd410d8857..e734b1dc3280488fe357aa8392a1bdb97c860999 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous3Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous3Result 
 {
   /**
    * @param ';' $result
index 1062b7afa271ac6a3760125157839ca0c05dcca6..f72f398c57d75456bf6a5c7c9f1d858cc530dcff 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class Anonymous7Result 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class Anonymous7Result 
 {
   /**
    * @param '|' $result
index f47d5d084a1c9b0526620637c8973f7bd94101a1..ddd80c4988fbd8214b8bc9af629f4d299f37290d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class BarewordResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class BarewordResult 
 {
   /**
    * @param list{Anonymous14Result, SpaceResult} $result
index d4ff02710e45c11caa399e5b9054f64a29bb6519..32bda54afe822672cfd82b1b142697a2dc23cc54 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class CommatermResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommatermResult 
 {
   /**
    * @param list{Anonymous11Result, SpaceResult, TermResult} $result
index 7cfb79863c8a11dd6f53ef3d8195907fd477c32f..4a4395b1d02952323b19055d01e45c3a0f391a8d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class CommatermlistResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommatermlistResult 
 {
   /**
    * @param list<CommatermResult> $result
index 3c4d7c7be49edd2a9c7a5307b6a3d6746157c3d4..aae5156f8315ec8c80986ef5457687a1ff78d23c 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class CommentResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class CommentResult 
 {
   /**
    * @param string $result
index 39ecf596a8b4c74d400c31013d560f02236ebe09..702628ba85d7c7506f497edf612b8d2b12663d44 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class ConcResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class ConcResult 
 {
   /**
    * @param list{TermResult, CommatermlistResult} $result
index ccd021aa651cf74f7b941647b734ca80a1cc7e39..14170c8ae55619ae11c08e674ea5064138947df2 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class DqResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class DqResult 
 {
   /**
    * @param list{Anonymous18Result, SpaceResult} $result
index 19f70390bd3f204aff85d92376d29e2307be59fd..cbeea8b93f2ad7550a2ac54c8ce66f7e1da28ecc 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class EBNFParser 
+final class EBNFParser 
 {
   public static function parse(string $code): ?SyntaxResult
   {
index 6232b70be48a2282247162237c6bb97d36c00f8d..206b9459d0063bdfb885218261b3bfb27a6ce706 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class GroupResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class GroupResult 
 {
   /**
    * @param list{Anonymous22Result, SpaceResult, AltResult, Anonymous23Result, SpaceResult} $result
index 5f225caf621b5af6e8ca5208bb99bacac9804ca3..f5ed07cf4a50acdc0f9b4af5f6d317650d6fdb3b 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class OptionalResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class OptionalResult 
 {
   /**
    * @param list{Anonymous28Result, SpaceResult, AltResult, Anonymous29Result, SpaceResult} $result
index f6efd01d0c06b9b34da46dba5cfcdc0f56684ce1..b9490952b1d720d1dd1ee5699ab171b6ee02de7d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class PipeconcResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class PipeconcResult 
 {
   /**
    * @param list{Anonymous7Result, SpaceResult, ConcResult} $result
index e73617dab0fee1a740228ba887ca7e14e0108688..74e38265f51d0cc8148021f95b0d15f6896c1b5e 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class PipeconclistResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class PipeconclistResult 
 {
   /**
    * @param list<PipeconcResult> $result
index d8bcf765e5f939e473836dac9835d0fa711ea781..ee62a63be9714963314000b18816c289f9b43a95 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class RegexResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RegexResult 
 {
   /**
    * @param list{Anonymous20Result, SpaceResult} $result
index 653e00d445895b99030032b340dbf9b9fa533039..5a0f07b84f161d021654a932ad559ac669563bf4 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class RepetitionResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RepetitionResult 
 {
   /**
    * @param list{Anonymous25Result, SpaceResult, AltResult, Anonymous26Result, SpaceResult} $result
index cea4357e74fdf82ef13788f042677e16745c555e..7ea4f52ce4b14fb089c8ad5c61cc704b990a2927 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class RuleResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RuleResult 
 {
   /**
    * @param list{BarewordResult, SpaceResult, Anonymous2Result, SpaceResult, AltResult, Anonymous3Result, SpaceResult} $result
index 154f127d6bcc8802b66a711cb98573b0dc2fcf3a..e1c5aa26c189135c36115832264d3358e2884f75 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class RulesResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class RulesResult 
 {
   /**
    * @param list<RuleResult> $result
index 79f45f8e995dee6ef3b5e50a86354fb9db1e5733..6904dbeda00bf549d7323e0e85f59a1deb2067f8 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class SpaceResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SpaceResult 
 {
   /**
    * @param list<Anonymous31Result> $result
index 2c2742c08918c79b7ef2edaf61774baca2442373..1698c9d022bb2014f7671df41740cfeeefba0625 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class SqResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SqResult 
 {
   /**
    * @param list{Anonymous16Result, SpaceResult} $result
index f830f5333dbeaf36bdcc112bfb060c8350f0d14a..4435a74308cf3af5b0103a8ebd9816a8d83a45b6 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class SyntaxResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class SyntaxResult 
 {
   /**
    * @param list{SpaceResult, RulesResult} $result
index bc4c72997570e75434bb361a4b3c21eff492824d..b6e7ad8dfae308afd169745c311fa7a04e8ba84e 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class TermResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class TermResult 
 {
   /**
    * @param BarewordResult|SqResult|DqResult|RegexResult|GroupResult|RepetitionResult|OptionalResult $result
index 7dba2ac1d9fa1976767873dcd92b4789dc156a1e..f29592ee4e3df5bcf87c37a4b02c230aef1835f7 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 namespace Graphit\Parser\EBNF;
 
-class WhitespaceResult 
+/** @psalm-suppress PossiblyUnusedProperty */
+final class WhitespaceResult 
 {
   /**
    * @param string $result
index 34d5d81b6e3a452cee26a2d3428adddf01a845e9..d3733f31205ae6b06d9ec0876df94682f24e3bdc 100644 (file)
@@ -4,7 +4,7 @@ namespace Graphit\Parser;
 
 use Graphit\Parser\ParserType;
 
-class EBNFParserGenerator
+final class EBNFParserGenerator
 {
   /**
    * @param array<string, ParserType> $transformResults 
@@ -74,7 +74,7 @@ class EBNFParserGenerator
         <?php
         namespace <NAME_SPACE>;
 
-        class <CLASS_NAME> 
+        final class <CLASS_NAME> 
         {
         <FUNCTIONS>
         }
index e20dcd48b2242e82823685ad35b6cffa0f26db5e..c321a478006f9fe9f8895355b2dacf75f3d587d7 100644 (file)
@@ -4,7 +4,7 @@ namespace Graphit\Parser;
 
 use Graphit\Parser\ParserType;
 
-class EBNFResultGenerator
+final class EBNFResultGenerator
 {
   /**
    * @param array<string, ParserType> $transformResults 
@@ -40,7 +40,8 @@ class EBNFResultGenerator
   private static function classTemplate(string $className, string $phpType, ?string $psalmType = null): string
   {
     $template = <<<TEMPLATE
-        class <CLASS_NAME> 
+        /** @psalm-suppress PossiblyUnusedProperty */
+        final class <CLASS_NAME> 
         {<PSALM_TYPE>
           public function __construct(
             public readonly <PHP_TYPE> \$result,
@@ -56,7 +57,7 @@ class EBNFResultGenerator
            */ 
         PSALM;
 
-    if ($psalmType) {
+    if ($psalmType !== null) {
       $psalmTemplate = strtr($psalmTemplate, [
         '<PSALM_TYPE>' => $psalmType
       ]);
@@ -86,4 +87,3 @@ class EBNFResultGenerator
     }
   }
 }
-
index d94d1bcb8135d1e19d21415e48996aca31373599..5ecdf2e2b9cfbe891316a993173a3a60917084ae 100644 (file)
@@ -31,19 +31,22 @@ abstract class ParserType {
   public abstract function needsDocType(): bool;
 }
 
-class RuleType extends ParserType {
+final class RuleType extends ParserType {
   private function __construct(
     public readonly string $name
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     return ucfirst($this->name).'Result';
   }
 
+  #[\Override]
   public function asDocType(): string {
     return $this->asPHPType();
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return false;
   }
@@ -53,19 +56,22 @@ class RuleType extends ParserType {
   }
 }
 
-class AnonType extends ParserType {
+final class AnonType extends ParserType {
   private function __construct(
     public readonly string $name
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     return ucfirst($this->name).'Result';
   }
 
+  #[\Override]
   public function asDocType(): string {
     return $this->asPHPType();
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return false;
   }
@@ -75,19 +81,22 @@ class AnonType extends ParserType {
   }
 }
 
-class StringType extends ParserType {
+final class StringType extends ParserType {
   private function __construct(
     public readonly string $string
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     return 'string';
   }
 
+  #[\Override]
   public function asDocType(): string {
     return var_export($this->string, true);
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return true;
   }
@@ -98,19 +107,22 @@ class StringType extends ParserType {
   }
 }
 
-class RegexpType extends ParserType {
+final class RegexpType extends ParserType {
   private function __construct(
     public readonly string $regexp
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     return 'string';
   }
 
+  #[\Override]
   public function asDocType(): string {
     return $this->asPHPType();
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return false;
   }
@@ -120,17 +132,19 @@ class RegexpType extends ParserType {
   }
 }
 
-class ConcType extends ParserType {
+final class ConcType extends ParserType {
 
   /** @param non-empty-list<ParserType> $types */
   private function __construct(
     public readonly array $types
   ) { }
 
+  #[\Override]
   public function asPHPType(): string {
     return 'array';
   }
 
+  #[\Override]
   public function asDocType(): string {
     $types = [];
     foreach($this->types as $type) {
@@ -139,6 +153,7 @@ class ConcType extends ParserType {
     return 'list{'.implode(', ', $types).'}';
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return true;
   }
@@ -158,13 +173,14 @@ class ConcType extends ParserType {
   }
 }
 
-class UnionType extends ParserType {
+final class UnionType extends ParserType {
 
   /** @param non-empty-array<string, ParserType> $types */
   private function __construct(
     public readonly array $types
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     if ($this->needsDocType()) {
       return 'mixed';
@@ -172,6 +188,7 @@ class UnionType extends ParserType {
     return $this->asDocType();
   }
 
+  #[\Override]
   public function asDocType(): string {
     $types = [];
     foreach($this->types as $type) {
@@ -180,6 +197,7 @@ class UnionType extends ParserType {
     return implode('|', $types);
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     foreach($this->types as $type) {
       if ($type->needsDocType()) return true;
@@ -230,11 +248,12 @@ class UnionType extends ParserType {
   }
 }
 
-class OptionalType extends ParserType {
+final class OptionalType extends ParserType {
   private function __construct(
     public readonly ParserType $type
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     if ($this->needsDocType()) {
       return 'mixed';
@@ -242,10 +261,12 @@ class OptionalType extends ParserType {
     return $this->asDocType();
   }
 
+  #[\Override]
   public function asDocType(): string {
     return '?'.$this->type->asDocType();
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return $this->type->needsDocType();
   }
@@ -256,19 +277,22 @@ class OptionalType extends ParserType {
   }
 }
 
-class RepetitionType extends ParserType {
+final class RepetitionType extends ParserType {
   private function __construct(
     public readonly ParserType $type
   ) {}
 
+  #[\Override]
   public function asPHPType(): string {
     return 'array';
   }
 
+  #[\Override]
   public function asDocType(): string {
     return 'list<'.$this->type->asDocType().'>';
   }
 
+  #[\Override]
   public function needsDocType(): bool {
     return true;
   }
@@ -279,7 +303,7 @@ class RepetitionType extends ParserType {
   }
 }
 
-class TypeInfos {
+final class TypeInfos {
 
   /** @param array<string, ParserType> $named */
   private function __construct(
@@ -349,7 +373,7 @@ class TypeInfos {
   }
 }
 
-class EBNFTransform
+final class EBNFTransform
 {
   public static function toRuleName(BarewordResult $result): string {
     return $result->result[0]->result;
@@ -488,8 +512,3 @@ class EBNFTransform
     return static::transformAlt($result->result[2])->repetition();
   }
 }
-
-
-
-
-