Skip to content

Commit

Permalink
fix(all-sh): run all.sh bash to fix all issues in the project.
Browse files Browse the repository at this point in the history
  • Loading branch information
gbtb16 committed Jul 21, 2024
1 parent f5e3d33 commit 5430287
Show file tree
Hide file tree
Showing 13 changed files with 148 additions and 55 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/dart_kiwi_example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ jobs:
channel: 'stable'
- run: flutter packages get
- run: flutter analyze
- run: dart format -o none --set-exit-if-changed .
- run: dart format -o none --set-exit-if-changed .
2 changes: 1 addition & 1 deletion .github/workflows/flutter_kiwi_example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ jobs:
channel: 'stable'
- run: flutter packages get
- run: flutter analyze
- run: dart format -o none --set-exit-if-changed .
- run: dart format -o none --set-exit-if-changed .
2 changes: 1 addition & 1 deletion .github/workflows/kiwi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ jobs:
sdk: ${{ matrix.sdk }}
- run: dart pub get
- run: dart analyze --fatal-infos --fatal-warnings .
- run: dart format -o none --set-exit-if-changed .
- run: dart format -o none --set-exit-if-changed .
- run: dart pub run test
9 changes: 6 additions & 3 deletions examples/flutter_kiwi/lib/screens/main_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ class MainScreen extends StatelessWidget {
MaterialButton(
color: Theme.of(context).primaryColor,
onPressed: () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (context) => ResolveScreen()));
await Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ResolveScreen()));
KiwiContainer().clear();
},
child: Text(
Expand All @@ -34,7 +35,8 @@ class MainScreen extends StatelessWidget {
MaterialButton(
color: Theme.of(context).primaryColor,
onPressed: () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (context) => ErrorScreen()));
await Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => ErrorScreen()));
KiwiContainer().clear();
},
child: Text(
Expand All @@ -47,7 +49,8 @@ class MainScreen extends StatelessWidget {
MaterialButton(
color: Theme.of(context).primaryColor,
onPressed: () async {
await Navigator.of(context).push(MaterialPageRoute(builder: (context) => ScopedScreen()));
await Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ScopedScreen()));
KiwiContainer().clear();
},
child: Text(
Expand Down
3 changes: 2 additions & 1 deletion packages/kiwi/example/kiwi_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ main() {

container.registerInstance(Logger());
container.registerSingleton((c) => Logger(), name: 'namedLogger');
container.registerFactory((c) => ServiceA(logger: c.resolve<Logger>('namedLogger')));
container.registerFactory(
(c) => ServiceA(logger: c.resolve<Logger>('namedLogger')));

final comumLogger = container.resolve<Logger>();
final namedLogger = container.resolve<Logger>('namedLogger');
Expand Down
12 changes: 8 additions & 4 deletions packages/kiwi/lib/src/kiwi_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ class KiwiContainer {
/// };
/// ```
Map<_ProviderName?, _ProviderValue> get namedProviders {
return Map<_ProviderName?, _ProviderValue>.from(_providers)..removeWhere((key, value) => key == null);
return Map<_ProviderName?, _ProviderValue>.from(_providers)
..removeWhere((key, value) => key == null);
}

/// All unnamed providers values registered in the container.
Expand All @@ -73,7 +74,8 @@ class KiwiContainer {
/// };
/// ```
Map<_ProviderName?, _ProviderValue> get unnamedProviders {
return Map<_ProviderName?, _ProviderValue>.from(_providers)..removeWhere((key, value) => key != null);
return Map<_ProviderName?, _ProviderValue>.from(_providers)
..removeWhere((key, value) => key != null);
}

/// Whether ignoring KiwiErrors in the following cases:
Expand Down Expand Up @@ -214,10 +216,12 @@ class KiwiContainer {

void _setProvider<T>(String? name, _Provider<T> provider) {
if (!silent && isRegistered<T>(name: name)) {
throw KiwiError('The type `$T` was already registered${name == null ? '' : ' for the name `$name`'}');
throw KiwiError(
'The type `$T` was already registered${name == null ? '' : ' for the name `$name`'}');
}

_providers.putIfAbsent(name, () => _ProviderValue.from({}))[T] = provider as _Provider<Object>;
_providers.putIfAbsent(name, () => _ProviderValue.from({}))[T] =
provider as _Provider<Object>;
}
}

Expand Down
40 changes: 27 additions & 13 deletions packages/kiwi/test/kiwi_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -94,30 +94,41 @@ void main() {

test('builders should be resolved', () {
container.registerSingleton((c) => 5);
container.registerFactory((c) => const Sith('Anakin', 'Skywalker', 'DarthVader'));
container.registerFactory(
(c) => const Sith('Anakin', 'Skywalker', 'DarthVader'));
container.registerFactory((c) => const Character('Anakin', 'Skywalker'));
container.registerFactory<Character>((c) => const Sith('Anakin', 'Skywalker', 'DarthVader'), name: 'named');
container.registerFactory<Character>(
(c) => const Sith('Anakin', 'Skywalker', 'DarthVader'),
name: 'named');

expect(container.resolve<int>(), 5);
expect(container.resolve<Sith>(), const Sith('Anakin', 'Skywalker', 'DarthVader'));
expect(container.resolve<Character>(), const Character('Anakin', 'Skywalker'));
expect(container.resolve<Character>('named'), const Sith('Anakin', 'Skywalker', 'DarthVader'));
expect(container.resolve<Sith>(),
const Sith('Anakin', 'Skywalker', 'DarthVader'));
expect(container.resolve<Character>(),
const Character('Anakin', 'Skywalker'));
expect(container.resolve<Character>('named'),
const Sith('Anakin', 'Skywalker', 'DarthVader'));
});

test('builders should always be created', () {
container.registerFactory((c) => Character('Anakin', 'Skywalker'));

expect(container.resolve<Character>(), isNot(same(container.resolve<Character>())));
expect(container.resolve<Character>(),
isNot(same(container.resolve<Character>())));
});

test('one time builders should be resolved', () {
container.registerSingleton((c) => 5);
container.registerSingleton((c) => const Sith('Anakin', 'Skywalker', 'DarthVader'));
container.registerSingleton<Character>((c) => const Character('Anakin', 'Skywalker'));
container.registerSingleton(
(c) => const Sith('Anakin', 'Skywalker', 'DarthVader'));
container.registerSingleton<Character>(
(c) => const Character('Anakin', 'Skywalker'));

expect(container.resolve<int>(), 5);
expect(container.resolve<Sith>(), const Sith('Anakin', 'Skywalker', 'DarthVader'));
expect(container.resolve<Character>(), const Character('Anakin', 'Skywalker'));
expect(container.resolve<Sith>(),
const Sith('Anakin', 'Skywalker', 'DarthVader'));
expect(container.resolve<Character>(),
const Character('Anakin', 'Skywalker'));
});

test('one time builders should be created one time only', () {
Expand Down Expand Up @@ -239,7 +250,8 @@ void main() {
)));
});

test('Parented [KiwiContainer.scoped] should inherit global registrations', () {
test('Parented [KiwiContainer.scoped] should inherit global registrations',
() {
container.registerInstance(5);
container.registerInstance(6, name: 'named');
container.registerInstance<num>(7);
Expand Down Expand Up @@ -407,9 +419,11 @@ void main() {
// Named instances
expect(scoped.isRegistered<String>(name: 'named_string_instance'), false);

scoped.registerInstance<String>('random_string', name: 'named_string_instance');
scoped.registerInstance<String>('random_string',
name: 'named_string_instance');

expect(scoped.isRegistered<String>(), false); // [isRegistered] cannot be true if String it is named and is tested unnamed.
expect(scoped.isRegistered<String>(),
false); // [isRegistered] cannot be true if String it is named and is tested unnamed.
expect(scoped.isRegistered<String>(name: 'named_string_instance'), true);
expect(scoped.resolve<String>('named_string_instance'), 'random_string');

Expand Down
88 changes: 63 additions & 25 deletions packages/kiwi_generator/lib/src/kiwi_injector_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import 'package:source_gen/source_gen.dart';

const TypeChecker _registerTypeChecker = TypeChecker.fromRuntime(Register);

bool _isRegisterMethod(MethodElement method) => (method.returnType is VoidType && _registerTypeChecker.hasAnnotationOfExact(method));
bool _isRegisterMethod(MethodElement method) =>
(method.returnType is VoidType &&
_registerTypeChecker.hasAnnotationOfExact(method));

class KiwiInjectorGenerator extends Generator {
const KiwiInjectorGenerator();
Expand All @@ -24,14 +26,20 @@ class KiwiInjectorGenerator extends Generator {
// An injector is an abstract class where all abstract methods are
// annotated with Register.
final injectors = library.classes
.where(
(c) => c.isAbstract && c.methods.where((m) => m.isAbstract).isNotEmpty && c.methods.where((m) => m.isAbstract && _isRegisterMethod(m)).isNotEmpty)
.where((c) =>
c.isAbstract &&
c.methods.where((m) => m.isAbstract).isNotEmpty &&
c.methods
.where((m) => m.isAbstract && _isRegisterMethod(m))
.isNotEmpty)
.toList();

if (injectors.isEmpty) {
return null;
}
final file = Library((lb) => lb..body.addAll(injectors.map((i) => _generateInjector(i, library, buildStep))));
final file = Library((lb) => lb
..body.addAll(
injectors.map((i) => _generateInjector(i, library, buildStep))));

final DartEmitter emitter = DartEmitter(allocator: Allocator());
return DartFormatter().format('${file.accept(emitter)}');
Expand All @@ -49,23 +57,31 @@ class KiwiInjectorGenerator extends Generator {
}
}

Class _generateInjector(ClassElement injector, LibraryReader library, BuildStep? buildStep) {
Class _generateInjector(
ClassElement injector, LibraryReader library, BuildStep? buildStep) {
return Class((cb) => cb
..name = '_\$${injector.name}'
..extend = refer(injector.name)
..methods.addAll(_generateInjectorMethods(injector)));
}

List<Method> _generateInjectorMethods(ClassElement injector) {
return injector.methods.where((m) => m.isAbstract).map((m) => _generateInjectorMethod(m)).toList();
return injector.methods
.where((m) => m.isAbstract)
.map((m) => _generateInjectorMethod(m))
.toList();
}

Method _generateInjectorMethod(MethodElement method) {
if (method.parameters.length > 1) {
throw KiwiGeneratorError('Only 1 parameter is supported `KiwiContainer scopedContainer`, ${method.name} contains ${method.parameters.length} param(s)');
throw KiwiGeneratorError(
'Only 1 parameter is supported `KiwiContainer scopedContainer`, ${method.name} contains ${method.parameters.length} param(s)');
}
final scopedContainerParam = method.parameters.singleOrNullWhere(
(element) => element.name == 'scopedContainer' && element.type.getDisplayString(withNullability: true) == 'KiwiContainer',
(element) =>
element.name == 'scopedContainer' &&
element.type.getDisplayString(withNullability: true) ==
'KiwiContainer',
);

return Method.returnsVoid((mb) {
Expand Down Expand Up @@ -104,7 +120,8 @@ class KiwiInjectorGenerator extends Generator {
} else {
mb
..body = Block((bb) => bb
..statements.add(Code('final KiwiContainer container = ${scopedContainer}KiwiContainer();'))
..statements.add(Code(
'final KiwiContainer container = ${scopedContainer}KiwiContainer();'))
..addExpression(registers));
}
});
Expand All @@ -123,56 +140,72 @@ class KiwiInjectorGenerator extends Generator {
);
}

Expression _generateRegister(Expression registerExpression, AnnotatedElement annotatedMethod) {
Expression _generateRegister(
Expression registerExpression, AnnotatedElement annotatedMethod) {
final ConstantReader annotation = annotatedMethod.annotation;
final DartObject registerObject = annotation.objectValue;

final String? name = registerObject.getField('name')?.toStringValue();
final DartType? type = registerObject.getField('type')?.toTypeValue();
final DartType? concrete = registerObject.getField('from')?.toTypeValue();
final String? constructorName = registerObject.getField('constructorName')?.toStringValue();
final String? constructorName =
registerObject.getField('constructorName')?.toStringValue();
final DartType? concreteType = concrete ?? type;

// TODO: Implement null type check
if (concreteType == null) {
throw KiwiGeneratorError('null can not be registered because there is no type for null');
throw KiwiGeneratorError(
'null can not be registered because there is no type for null');
}

final String className = concreteType.getDisplayString(withNullability: false);
final String typeParameters = concrete == null ? '' : '<${type?.getDisplayString(withNullability: false)}>';
final String className =
concreteType.getDisplayString(withNullability: false);
final String typeParameters = concrete == null
? ''
: '<${type?.getDisplayString(withNullability: false)}>';

final String nameArgument = name == null ? '' : ", name: '$name'";
final String constructorNameArgument = constructorName == null ? '' : '.$constructorName';
final String constructorNameArgument =
constructorName == null ? '' : '.$constructorName';

final ClassElement? clazz = concreteType.element?.library?.getClass(className);
final ClassElement? clazz =
concreteType.element?.library?.getClass(className);
if (clazz == null) {
throw KiwiGeneratorError('$className not found');
}

final bool oneTime = registerObject.getField('oneTime')?.toBoolValue() ?? false;
final Map<DartType?, String?>? resolvers = _computeResolvers(registerObject.getField('resolvers')?.toMapValue());
final bool oneTime =
registerObject.getField('oneTime')?.toBoolValue() ?? false;
final Map<DartType?, String?>? resolvers =
_computeResolvers(registerObject.getField('resolvers')?.toMapValue());

final String methodSuffix = oneTime ? 'Singleton' : 'Factory';

final constructor = constructorName == null ? clazz.unnamedConstructor : clazz.getNamedConstructor(constructorName);
final constructor = constructorName == null
? clazz.unnamedConstructor
: clazz.getNamedConstructor(constructorName);

if (constructor == null) {
throw KiwiGeneratorError('the constructor ${clazz.name}.$constructorName does not exist');
throw KiwiGeneratorError(
'the constructor ${clazz.name}.$constructorName does not exist');
}

final String factoryParameters = _generateRegisterArguments(
constructor,
resolvers,
).join(', ');

return registerExpression.cascade('register$methodSuffix$typeParameters((c) => $className$constructorNameArgument($factoryParameters)$nameArgument)');
return registerExpression.cascade(
'register$methodSuffix$typeParameters((c) => $className$constructorNameArgument($factoryParameters)$nameArgument)');
}

List<String> _generateRegisterArguments(
ConstructorElement constructor,
Map<DartType?, String?>? resolvers,
) {
return constructor.parameters.map((p) => _generateRegisterArgument(p, resolvers)).toList();
return constructor.parameters
.map((p) => _generateRegisterArgument(p, resolvers))
.toList();
}

String _generateRegisterArgument(
Expand All @@ -182,17 +215,22 @@ class KiwiInjectorGenerator extends Generator {
final List<DartType> dartTypes = resolvers == null
? []
: resolvers.keys
.where((e) => e?.getDisplayString(withNullability: false) == parameter.type.getDisplayString(withNullability: false))
.where((e) =>
e?.getDisplayString(withNullability: false) ==
parameter.type.getDisplayString(withNullability: false))
.where((e) => e != null)
.map((e) => e!)
.toList();
final String nameArgument = dartTypes.isEmpty || resolvers == null ? '' : "'${resolvers[dartTypes.first]}'";
final String nameArgument = dartTypes.isEmpty || resolvers == null
? ''
: "'${resolvers[dartTypes.first]}'";
return '${parameter.isNamed ? parameter.name + ': ' : ''}c.resolve<${parameter.type.getDisplayString(withNullability: false)}>($nameArgument)';
}

Map<DartType?, String?>? _computeResolvers(
Map<DartObject?, DartObject?>? resolvers,
) {
return resolvers?.map((key, value) => MapEntry<DartType?, String?>(key?.toTypeValue(), value?.toStringValue()));
return resolvers?.map((key, value) => MapEntry<DartType?, String?>(
key?.toTypeValue(), value?.toStringValue()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ class KiwiGeneratorError extends Error {
var toString = '\nKiwiGeneratorError\n\n$message\n\n';
final internalError = error;
if (internalError != null) {
toString += '============\n${internalError.toString()}\n${internalError.stackTrace}\n============\n\n';
toString +=
'============\n${internalError.toString()}\n${internalError.stackTrace}\n============\n\n';
}
return toString;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/kiwi_generator/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ environment:
sdk: '>=2.14.0 <4.0.0'

dependencies:
analyzer: ">=6.0.0 <7.0.0"
analyzer: ^6.0.0
build: ^2.4.1
build_config: ^1.1.1
built_collection: ^5.1.1
Expand Down
1 change: 1 addition & 0 deletions tools/all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

./packages_get.sh
./analyze.sh
./fix.sh
./format.sh
./test.sh
./build.sh
Loading

0 comments on commit 5430287

Please sign in to comment.