implicit-reopen
Same as implicit_reopen in Dart lints
- Group
- Correctness
- Path
lint/correctness/implicit-reopen- Default
- Off, opt in
- Origin
- Dart lints
- Rule
- 245 of 512
Flags classes that implicitly reopen a supertype declared in the same library.
Class modifiers are only enforced across library boundaries, so inside its
own library an interface or final class can be extended by a class that
drops the restriction — silently letting other libraries extend what the
author meant to close. Mark the subclass with the same modifier, or annotate
it with package:meta's @reopen when reopening is intended.
interface class I {}
class C extends I {} // flagged: reopens 'I' (not marked 'interface')
final class F {}
base class B extends F {} // flagged: reopens 'F' (not marked 'final')
Sealed and mixin classes and classes annotated with @reopen are exempt.
Only superclasses declared in the same library (this file or its parts) are
considered, including named mixin applications. A sealed superclass carries
the modifier its own supertypes induce (a sealed subclass of an interface
class is an interface).
Invalid
interface class I {}
class C extends I {}
abstract class D extends I {}
base class B extends I {}
final class F {}
base class G extends F {}
mixin M {}
class Alias = I with M;
base class BaseAlias = F with M;
// Sealed intermediates retain restrictions induced by their superclass.
sealed class SealedInterface extends I {}
class ReopensInterface extends SealedInterface {}
sealed class SealedFinal extends F {}
base class ReopensFinal extends SealedFinal {}
// A named mixin application is still a class and induces restrictions.
mixin EmptyMixin {}
sealed class SealedAlias = I with EmptyMixin;
class ReopensAlias extends SealedAlias {}
sealed class SealedFinalAlias = F with EmptyMixin;
base class ReopensFinalAlias extends SealedFinalAlias {} class C extends I {} abstract class D extends I {} base class B extends I {} base class G extends F {} class Alias = I with M; base class BaseAlias = F with M; class ReopensInterface extends SealedInterface {} base class ReopensFinal extends SealedFinal {} class ReopensAlias extends SealedAlias {} base class ReopensFinalAlias extends SealedFinalAlias {}Valid
import 'package:meta/meta.dart';
interface class I {}
interface class C extends I {}
final class E extends I {}
sealed class S extends I {}
@reopen
class R extends I {}
final class F {}
final class G extends F {}
sealed class H extends F {}
base class Open {}
base class Plain extends Open {}
// Supertype from another library.
class Remote extends SomeUnknownBase {}
class Base {}
class Derived extends Base {}
sealed class SealedInterface extends I {}
interface class KeepsInterface extends SealedInterface {}
sealed class SealedFinal extends F {}
final class KeepsFinal extends SealedFinal {}
mixin EmptyMixin {}
sealed class SealedAlias = I with EmptyMixin;
interface class KeepsAliasInterface extends SealedAlias {}Configure implicit-reopen
Set its severity in falcon.json. See the configuration guide.
{
"linter": {
"rules": {
"correctness": {
"implicit-reopen": "error"
}
}
}
}Or silence one occurrence with a suppression comment; the reason is required.
// falcon-ignore lint/correctness/implicit-reopen: <reason>More correctness rules
- invalid-case-patterns
invalid_case_patternsrecommendedFlags pre-3.0 switch case expressions that change meaning or break under Dart 3 patterns.
- invalid-runtime-check-with-js-interop-types
invalid_runtime_check_with_js_interop_typesrecommendedReject platform-dependent runtime checks involving JavaScript interop types.
- library-private-types-in-public-api
library_private_types_in_public_apirecommendedAvoid using library-private types in public APIs.
- list-all-equatable-fieldsrecommendedequatable
Flags declared instance fields omitted from a statically understood Equatable props list.
- literal-only-boolean-expressions
literal_only_boolean_expressionsrecommendedFlags conditions built only from literals, whose value never changes.
- match-getter-setter-field-names
Detect likely copy-paste errors in trivial accessors when a different field matching the accessor name is declared.
- missing-test-assertionrecommendedtest
Reports inline test callbacks that contain no recognized assertion calls.
- no-adjacent-strings-in-list
no_adjacent_strings_in_listrecommendedFlags adjacent string literals used as an element of a list or set literal.