diff --git a/packages/freezed_lint/example/lib/mixin_name.dart b/packages/freezed_lint/example/lib/mixin_name.dart new file mode 100644 index 00000000..8664c1de --- /dev/null +++ b/packages/freezed_lint/example/lib/mixin_name.dart @@ -0,0 +1,8 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'mixin_name.freezed.dart'; + +@freezed +class _FooModel with _$FooModel { + const factory _FooModel() = __FooModel; +} diff --git a/packages/freezed_lint/example/lib/mixin_name.freezed.dart b/packages/freezed_lint/example/lib/mixin_name.freezed.dart new file mode 100644 index 00000000..77ba758f --- /dev/null +++ b/packages/freezed_lint/example/lib/mixin_name.freezed.dart @@ -0,0 +1,214 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'mixin_name.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$FooModel { + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _FooModel); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + String toString() { + return '_FooModel()'; + } +} + +/// @nodoc +class _$FooModelCopyWith<$Res> { + _$FooModelCopyWith(_FooModel _, $Res Function(_FooModel) __); +} + +/// Adds pattern-matching-related methods to [_FooModel]. +extension _FooModelPatterns on _FooModel { + /// A variant of `map` that fallback to returning `orElse`. + /// + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case final Subclass value: + /// return ...; + /// case _: + /// return orElse(); + /// } + /// ``` + + @optionalTypeArgs + TResult maybeMap( + TResult Function(__FooModel value)? $default, { + required TResult orElse(), + }) { + final _that = this; + switch (_that) { + case __FooModel() when $default != null: + return $default(_that); + case _: + return orElse(); + } + } + + /// A `switch`-like method, using callbacks. + /// + /// Callbacks receives the raw object, upcasted. + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case final Subclass value: + /// return ...; + /// case final Subclass2 value: + /// return ...; + /// } + /// ``` + + @optionalTypeArgs + TResult map( + TResult Function(__FooModel value) $default, + ) { + final _that = this; + switch (_that) { + case __FooModel(): + return $default(_that); + case _: + throw StateError('Unexpected subclass'); + } + } + + /// A variant of `map` that fallback to returning `null`. + /// + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case final Subclass value: + /// return ...; + /// case _: + /// return null; + /// } + /// ``` + + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(__FooModel value)? $default, + ) { + final _that = this; + switch (_that) { + case __FooModel() when $default != null: + return $default(_that); + case _: + return null; + } + } + + /// A variant of `when` that fallback to an `orElse` callback. + /// + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case Subclass(:final field): + /// return ...; + /// case _: + /// return orElse(); + /// } + /// ``` + + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + required TResult orElse(), + }) { + final _that = this; + switch (_that) { + case __FooModel() when $default != null: + return $default(); + case _: + return orElse(); + } + } + + /// A `switch`-like method, using callbacks. + /// + /// As opposed to `map`, this offers destructuring. + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case Subclass(:final field): + /// return ...; + /// case Subclass2(:final field2): + /// return ...; + /// } + /// ``` + + @optionalTypeArgs + TResult when( + TResult Function() $default, + ) { + final _that = this; + switch (_that) { + case __FooModel(): + return $default(); + case _: + throw StateError('Unexpected subclass'); + } + } + + /// A variant of `when` that fallback to returning `null` + /// + /// It is equivalent to doing: + /// ```dart + /// switch (sealedClass) { + /// case Subclass(:final field): + /// return ...; + /// case _: + /// return null; + /// } + /// ``` + + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, + ) { + final _that = this; + switch (_that) { + case __FooModel() when $default != null: + return $default(); + case _: + return null; + } + } +} + +/// @nodoc + +class __FooModel implements _FooModel { + const __FooModel(); + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is __FooModel); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + String toString() { + return '_FooModel()'; + } +} + +// dart format on diff --git a/packages/freezed_lint/lib/src/missing_mixin.dart b/packages/freezed_lint/lib/src/missing_mixin.dart index cdbd4ce2..608bea71 100644 --- a/packages/freezed_lint/lib/src/missing_mixin.dart +++ b/packages/freezed_lint/lib/src/missing_mixin.dart @@ -24,7 +24,9 @@ class MissingMixin extends DartLintRule { final annotation = freezedAnnotationChecker.hasAnnotationOfExact(element); if (!annotation) return; - final name = '_\$${element.name}'; + final name = element.name.startsWith('_') + ? '_\$${element.name.substring(1)}' + : '_\$${element.name}'; final withClause = node.withClause; if (withClause == null) { reporter.atElement(element, _code, arguments: [name]);