| phpstan-rules | by dg | added Nette\Schema\Expect::array() return type narrowing | | | |
| phpstan-rules | by dg | RethrowAbortExceptionRule: don't report a dedicated catch (AbortException) A catch that explicitly names AbortException (or a subtype) is a deliberate swallow, e.g. Presenter::run() ending the lifecycle. Only broad catches (\Throwable, \Exception) that swallow it incidentally are reported now. | | | |
| phpstan-rules | by dg | added RemoveFailingReturnTypeExtension extension to remove |false from native functions and methods | | | |
| phpstan-rules | by dg | nette/database row type narrowing (table/related/ref/insert) Narrows return types based on a configurable table-to-entity-class mapping (nette.database.mapping.tables), which is not yet part of the nette/database distribution. Kept as the topmost commit so the whole feature can be excluded or rebased independently. Includes: - TableRowTypeResolver shared resolver - Explorer::table() -> Selection<EntityRow> - ActiveRow::related() -> GroupedSelection<EntityRow> - ActiveRow::ref() -> ?EntityRow - Selection::insert() -> mapped EntityRow | | | |
| phpstan-rules | by dg | added Registry::getMapper(), getAsset() and Mapper::getAsset() return type narrowing | | | |
| phpstan-rules | by dg | report invalid regex patterns in Nette\Utils\Strings calls New ValidRegularExpressionRule (the first custom rule in the project) checks constant patterns passed to Strings::match/matchAll/split/replace and reports compilation errors via RegexpException under identifier nette.strings.regexpPattern. Enabled by default. Adds TypeAssert::assertErrors() for testing rules (assertNoErrors now delegates to it). | | | |
| phpstan-rules | by dg | added arrow function void ignore for passing fn() => to Closure(): void parameters | | | |
| phpstan-rules | by dg | guard dynamic return type extensions against first-class callables Extensions called getArgs() unconditionally on the entry node. For a first-class callable such as json_encode(...) or $form[x]->m(...), PHPStan getArgs() asserts !isFirstClassCallable(), so any covered function/method/static method used in first-class-callable syntax crashed the whole analysis with an internal error. Bail out (return null) when the call node is a first-class callable, before touching getArgs(). Mirrors the standard guard in core PHPStan extensions. | | | |
| phpstan-rules | by dg | add StringsRegexHelper for the Nette\Utils\Strings regex extensions Shared helper that centralizes the translation of Nette's boolean parameters into a PREG flag mask, the RegexArrayShapeMatcher calls (matchShape/matchAllShape, instance) and stateless argument resolution (resolveFlag/findArg, static). The Strings regex extensions added in the following commits build on it. | | | |
| phpstan-rules | by dg | added Arrays::invoke() and invokeMethod() return type narrowing | | | |
| phpstan-rules | by dg | suppress false argument.type on Callback::toReflection() Its @param callable is intentionally strict, but the method escalates the validity check to a ReflectionException at runtime, so a value that cannot be statically proven callable (e.g. a [class-string, method] tuple) is valid by design. New IgnoreErrorExtension matched narrowly to that single method. | | | |
| phpstan-rules | by dg | init | | | |
| phpstan-rules | by dg | derive exact array shape from regex in Strings::match/matchAll StringsReturnTypeExtension now uses phpstan's RegexArrayShapeMatcher to infer the precise shape (capture groups, named/optional groups, offsets) for constant patterns, translating Nette's boolean parameters into a PREG flag mask. Non-constant patterns and the lazy matchAll() Generator fall back to the previous generic shape; split() is unchanged. | | | |
| phpstan-rules | by dg | compatibility with PHPStan 2.2.6 RemoveFailingReturnTypeExtension: DynamicReturnTypeExtensionRegistry is injected directly, the provider layer was removed from PHPStan. Tests: PHPStan reverted decimal-int-string inference for regex groups back to numeric-string. StringsRegexHelper: matchAllShape() passes wasMatched=maybe; matchAll() may return an empty list, and PHPStan now infers non-empty-list for yes. | | | |
| phpstan-rules | by dg | added Container::getComponent() and $container['…'] return type narrowing Also resolves nested access - chained ($container['a']['b']) and Nette's dash notation ($container['a-b']) - via createComponent<Name>() factories. | | | |
| phpstan-rules | by dg | added suppression for Form event-handler callback assignments | | | |
| phpstan-rules | by dg | added .phpt file extension | | | |
| phpstan-rules | by dg | RemoveFailingReturnTypeExtension: preg_* narrowing only for constant patterns | | | |
| phpstan-rules | by dg | narrow match subject string after Strings::match/matchAll New StringsMatchTypeSpecifyingExtension narrows the subject of a successful Strings::match()/matchAll() call inside a truthy context, e.g. `if (Strings::match($s, '#\d+#'))` makes $s a non-empty-string. Delegates to RegexArrayShapeMatcher::matchSubjectExpr(). | | | |
| phpstan-rules | by dg | added Html::getXxx(), setXxx(), addXxx() magic method resolution | | | |
| phpstan-rules | by dg | added AGENTS.md & DOCS | | | |
| phpstan-rules | by dg | RemoveFailingReturnTypeExtension: strip |false from glob() Claude-Session: https://claude.ai/code/session_01YAusXLYHRUMofgyF5LHxqN | | | |
| phpstan-rules | by dg | interface @property tag support (type resolution + property.notFound suppression) PHPStan core ignores @property/@property-read tags on interfaces: the allowsDynamicProperties() gate skips annotation-based properties there, so e.g. $asset->url on Nette\Assets\Asset reports property.notFound and a custom PropertiesClassReflectionExtension is never consulted. InterfacePropertyTagTypeExtension (ExpressionTypeResolverExtension) gives such reads the annotated type (narrowed expression types and native properties win), InterfacePropertyTagIgnoreExtension suppresses the false property.notFound. Writes are intentionally left unsupported. Claude-Session: https://claude.ai/code/session_01YAusXLYHRUMofgyF5LHxqN | | | |
| phpstan-rules | by dg | added Tester\Assert type narrowing for assertion methods (null, notNull, true, false, same, type, …) | | | |
| phpstan-rules | by dg | RemoveFailingReturnTypeExtension: preserved |false for UTF-8 validation patterns like //u | | | |
| phpstan-rules | by dg | readonly properties | | | |
| phpstan-rules | by dg | warn when catch swallows Nette\Application\AbortException New RethrowAbortExceptionRule flags the common presenter bug where a broad catch (\Throwable)/catch (\Exception) swallows an AbortException thrown by redirect()/forward()/terminate(), silently breaking the redirect. It fires only when the try block can actually throw AbortException (detected via method getThrowType()) and the first matching catch does not rethrow. Carving out a catch (AbortException) { throw; } before the broad catch silences it. Enabled by default. | | | |
| phpstan-rules | by dg | added boilerplate | | | |
| phpstan-rules | by dg | enabled strict PHPStan analysis parameters Added 9 strict analysis parameters to extension.neon to enforce stricter type checking in Nette libraries: callable signatures, function/class name casing, nullable types in signatures and PHPDocs, redundant conditions, and @var tag validation. | | | |
| phpstan-rules | by dg | treat #[Inject] attribute properties as initialized New InjectPropertyExtension (ReadWritePropertiesExtension) marks properties annotated with #[Nette\DI\Attributes\Inject] as always-written and initialized, since Nette DI assigns them after instantiation. Only the attribute form is recognized, not the legacy @inject phpDoc. Also teaches TypeAssert::assertNoErrors() to pass the analysed file into analysedPaths (like assertTypes already does), so classes defined in the test file are in reflection scope. | | | |
| phpstan-rules | by dg | added TypeAssert helper for type inference testing with Nette Tester | | | |
| phpstan-rules | by dg | added Forms\Container::getComponent() and $form['…'] return type narrowing based on addXxx() calls | | | |