Skip to content

Commit

Permalink
fix: remove duplicate classes from nested routers (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
ferrarafer authored Jul 9, 2024
1 parent 7125a51 commit 57b3475
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ class ArgumentsClassBuilder {
(b) => b
..name = argumentsBuilderHelper.argumentClassName
..fields.addAll(argumentsBuilderHelper.convertParametersToClassFields)
..constructors
.add(argumentsBuilderHelper.argumentConstructer(emitter))
..constructors.add(
argumentsBuilderHelper.argumentConstructer(emitter),
)
..methods.addAll([
Method(
(b) => b
Expand All @@ -40,7 +41,8 @@ class ArgumentsClassBuilder {
fields: argumentsBuilderHelper.convertParametersToClassFields,
),
_buildHashCode(
argumentsBuilderHelper.convertParametersToClassFields),
argumentsBuilderHelper.convertParametersToClassFields,
),
]),
);
});
Expand All @@ -50,30 +52,38 @@ class ArgumentsClassBuilder {
Method _buildHashCode(List<Field> fields) {
final buffer = StringBuffer();
buffer.writeln(
'return ${fields.map((f) => '${f.name}.hashCode').join(' ^ ')};');
'return ${fields.map((f) => '${f.name}.hashCode').join(' ^ ')};',
);

return Method((b) => b
..name = 'hashCode'
..returns = refer('int')
..annotations.add(refer('override'))
..type = MethodType.getter
..body = Code(buffer.toString().trim()));
return Method(
(b) => b
..name = 'hashCode'
..returns = refer('int')
..annotations.add(refer('override'))
..type = MethodType.getter
..body = Code(buffer.toString().trim()),
);
}

Method _buildEqualityOperator(
{required String className, required List<Field> fields}) {
Method _buildEqualityOperator({
required String className,
required List<Field> fields,
}) {
final buffer = StringBuffer();
buffer.writeln('if (identical(this, other)) return $literalTrue;');
buffer.writeln(
'return ${fields.map((f) => 'other.${f.name} == ${f.name}').join(' && ')};');
'return ${fields.map((f) => 'other.${f.name} == ${f.name}').join(' && ')};',
);

return Method((b) => b
..name = 'operator =='
..returns = refer('bool')
..annotations.add(refer('override'))
..requiredParameters.add(Parameter((p) => p
..covariant = true
..name = 'other'
..type = refer(className)))
..body = Code(buffer.toString()));
return Method(
(b) => b
..name = 'operator =='
..returns = refer('bool')
..annotations.add(refer('override'))
..requiredParameters.add(Parameter((p) => p
..covariant = true
..name = 'other'
..type = refer(className)))
..body = Code(buffer.toString()),
);
}
25 changes: 20 additions & 5 deletions lib/src/generators/router/generator/router_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import 'package:dart_style/dart_style.dart';
import 'package:stacked_generator/src/generators/base_generator.dart';
import 'package:stacked_generator/src/generators/extensions/routes_extension.dart';
import 'package:stacked_generator/src/generators/router/generator/routes_class/routes_class_builder.dart';
import 'package:stacked_generator/src/generators/router_common/models/router_config.dart';

import '../../router_common/models/router_config.dart';
import 'arguments_class/arguments_class_builder.dart';
import 'navigate_extension_class/navigate_extension_class_builder.dart';
import 'route_allocator.dart';
Expand All @@ -17,10 +17,13 @@ class RouterGenerator implements BaseGenerator {

/// Where we store the result of [_generateClasses]
List<Spec> classes = [];

List<String> notAliasedImports = [];

@override
String generate() {
if (_rootRouterConfig.routes.isEmpty) return '';

final emitter = DartEmitter(
allocator: RouteAllocator(),
useNullSafetySyntax: true,
Expand All @@ -38,13 +41,25 @@ class RouterGenerator implements BaseGenerator {
routes: _rootRouterConfig.routesIncludingTheirChildren,
).build(emitter);

/// Remove duplicate classes from nested routers
List<Class> parsedClasses = [];
for (var c in classes) {
if (c is! Class) continue;

if (parsedClasses.any((parsedClass) => parsedClass.name == c.name)) {
continue;
}

parsedClasses.add(c);
}

final library = Library(
(b) => b
..directives.add(
// No need to alias this import that's why we're adding it
Directive.import('package:flutter/material.dart'),
)
..body.addAll([...classes, navigationExtensionClassBuilder]),
..body.addAll([...parsedClasses, navigationExtensionClassBuilder]),
);

return DartFormatter().format('${library.accept(emitter)}');
Expand All @@ -61,9 +76,9 @@ class RouterGenerator implements BaseGenerator {
if (routerConfig.routes.isEmpty) return;

final routesClassBuilder = RoutesClassBuilder(
routes: routerConfig.routes,
routesClassName: routerConfig.routesClassName)
.buildRoutesClass();
routes: routerConfig.routes,
routesClassName: routerConfig.routesClassName,
).buildRoutesClass();

final routerClassBuilder = RouterClassBuilder(
routesClassName: routerConfig.routesClassName,
Expand Down

0 comments on commit 57b3475

Please sign in to comment.