Skip to content

Commit

Permalink
wip initiable register modules
Browse files Browse the repository at this point in the history
  • Loading branch information
Milad Alakarie committed Feb 22, 2020
1 parent 9772af4 commit 31c5ea0
Show file tree
Hide file tree
Showing 18 changed files with 214 additions and 143 deletions.

Large diffs are not rendered by default.

Binary file modified example/.dart_tool/build/entrypoint/build.dart.snapshot
Binary file not shown.

This file was deleted.

2 changes: 1 addition & 1 deletion example/.dart_tool/package_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@
"languageVersion": "2.3"
}
],
"generated": "2020-02-14T15:25:50.264888Z",
"generated": "2020-02-22T17:34:55.989916Z",
"generator": "pub",
"generatorVersion": "2.7.0"
}
2 changes: 1 addition & 1 deletion example/.packages
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by pub on 2020-02-14 17:25:50.238844.
# Generated by pub on 2020-02-22 19:34:55.966011.
_fe_analyzer_shared:file:///Users/milad/dev/sdk/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-1.0.1/lib/
analyzer:file:///Users/milad/dev/sdk/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-0.39.2+1/lib/
archive:file:///Users/milad/dev/sdk/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/
Expand Down
7 changes: 0 additions & 7 deletions example/lib/injector.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,3 @@ final getIt = GetIt.instance;

@injectableInit
Future<void> configure() async => await $initGetIt(getIt);

@registerModule
abstract class RegisterModule {
Dio get dioDev => Dio(BaseOptions(baseUrl: "baseUrl"));

Future<SharedPreferences> get prefss => SharedPreferences.getInstance();
}
36 changes: 36 additions & 0 deletions example/lib/injector.iconfig.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions example/lib/register_module.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
import 'package:shared_preferences/shared_preferences.dart';

import 'injector.dart';

@registerModule
abstract class RegisterModule {
@dev
@singleton
Dio get dioDev => Dio(BaseOptions(baseUrl: "baseUrl"));

@prod
ServiceAA get service;
@dev
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}

class ServiceAA {}
92 changes: 46 additions & 46 deletions example/lib/services.dart
Original file line number Diff line number Diff line change
@@ -1,46 +1,46 @@
import 'package:injectable/injectable.dart';

@injectable
abstract class Service {
@factoryMethod
static create(Service11 s11) => ServiceImpl2();
}

@named
@RegisterAs(Service)
@singleton
class ServiceImpl2 implements Service {
ServiceImpl2();
}

@prod
@RegisterAs(Service)
@singleton
class ServiceImpl extends Service {}

@injectable
class MyRepository {
@factoryMethod
MyRepository.from(Service ss);
}

@injectable
class ServiceA {}

@injectable
class ServiceB {
ServiceB(ServiceA sa);
}

@injectable
class Service3 {
Service3(Service2 s2);
}

@injectable
class Service2 {
Service2(Service11 s1, ServiceA sa);
}

@injectable
class Service11 {}
// import 'package:injectable/injectable.dart';

// @injectable
// abstract class Service {
// @factoryMethod
// static create(Service11 s11) => ServiceImpl2();
// }

// @named
// @RegisterAs(Service, env: 'test')
// @injectable
// class ServiceImpl2 implements Service {
// ServiceImpl2();
// }

// @injectable
// @RegisterAs(Service, env: 'dev')
// class ServiceImpl extends Service {}

// @injectable
// @dev
// class MyRepository {
// @factoryMethod
// MyRepository.from(Service ss);
// }

// @injectable
// class ServiceA {}

// @injectable
// class ServiceB {
// ServiceB(ServiceA sa);
// }

// @injectable
// class Service3 {
// Service3(Service2 s2);
// }

// @injectable
// class Service2 {
// Service2(Service11 s1, ServiceA sa);
// }

// @injectable
// class Service11 {}
4 changes: 2 additions & 2 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -302,14 +302,14 @@ packages:
path: "../injectable"
relative: true
source: path
version: "0.2.1"
version: "0.2.2"
injectable_generator:
dependency: "direct dev"
description:
path: "../injectable_generator"
relative: true
source: path
version: "0.2.1"
version: "0.2.2"
io:
dependency: transitive
description:
Expand Down
4 changes: 2 additions & 2 deletions injectable_generator/.dart_tool/package_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@
},
{
"name": "injectable",
"rootUri": "file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/injectable-0.2.2",
"rootUri": "../../injectable",
"packageUri": "lib/",
"languageVersion": "2.5"
},
Expand Down Expand Up @@ -362,7 +362,7 @@
"languageVersion": "2.5"
}
],
"generated": "2020-02-14T16:55:55.510656Z",
"generated": "2020-02-22T17:34:47.275946Z",
"generator": "pub",
"generatorVersion": "2.7.0"
}
4 changes: 2 additions & 2 deletions injectable_generator/.packages
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by pub on 2020-02-14 18:55:55.491078.
# Generated by pub on 2020-02-22 19:34:47.253103.
_fe_analyzer_shared:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-1.0.1/lib/
analyzer:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/analyzer-0.39.2+1/lib/
args:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/
Expand Down Expand Up @@ -26,7 +26,7 @@ html:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/html-0.14.0+3/lib/
http:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+2/lib/
http_multi_server:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.1.0/lib/
http_parser:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/
injectable:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/injectable-0.2.2/lib/
injectable:../injectable/lib/
io:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/io-0.3.3/lib/
js:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/
json_annotation:file:///Users/milad/.pub-cache/hosted/pub.dartlang.org/json_annotation-3.0.0/lib/
Expand Down
86 changes: 48 additions & 38 deletions injectable_generator/lib/config_code_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ class ConfigCodeGenerator {
final Set<DependencyConfig> sorted = {};
_sortByDependents(allDeps.toSet(), sorted);

final modules = sorted
.where((d) => d.moduleConfig != null)
.map((d) => d.moduleConfig.moduleName)
.toSet();

final Set<DependencyConfig> eagerDeps = sorted
.where((d) => d.injectableType == InjectableType.singleton)
.toSet();
Expand All @@ -42,57 +47,34 @@ class ConfigCodeGenerator {
_writeln("void \$initGetIt(GetIt g, {String environment}) {");
}

modules.forEach((m) {
_writeln('final ${toCamelCase(m)} = _\$$m(g);');
});
// generate configuration function declaration

// generate common registering
_generateDeps(lazyDeps.where((dep) => dep.environment == null).toSet());

_writeln("");

final environmentMap = <String, Set<DependencyConfig>>{};
lazyDeps
.map((dep) => dep.environment)
.toSet()
.where((env) => env != null)
.forEach((env) {
_writeln('\n\n //Register $env Dependencies --------');
_writeln("if(environment == '$env'){");
final envDeps = sorted.where((dep) => dep.environment == env).toSet();
environmentMap[env] = envDeps;
_writeln(
'${_hasAsync(envDeps) ? 'await' : ''} _register${capitalize(env)}Dependencies(g);');
final envDeps = lazyDeps.where((dep) => dep.environment == env).toSet();
_generateDeps(envDeps);
_writeln('}');
});

if (eagerDeps.isNotEmpty) {
_writeln(
'${_hasAsync(eagerDeps) ? 'await' : ''} _registerEagerSingletons(g,environment);');
}

_write('}');
"\n\n// Eager singletons must be registered in the right order");

// generate environment registering
environmentMap.forEach((env, deps) {
if (_hasAsync(deps)) {
_writeln(
"Future<void> _register${capitalize(env)}Dependencies(GetIt g) async {");
} else {
_writeln("void _register${capitalize(env)}Dependencies(GetIt g){");
}
_generateDeps(deps);
_writeln("}");
});

if (eagerDeps.isNotEmpty) {
var currentEnv;
final eagerList = eagerDeps.toList();
_writeln("\n\n// Eager singletons must be registered in the right order");

if (_hasAsync(eagerDeps)) {
_writeln(
"Future<void> _registerEagerSingletons(GetIt g,String environment) async {");
} else {
_writeln("void _registerEagerSingletons(GetIt g,String environment) {");
}

for (int i = 0; i < eagerList.length; i++) {
final dep = eagerList[i];
Expand All @@ -110,10 +92,12 @@ class ConfigCodeGenerator {
}
currentEnv = dep.environment;
}

_writeln("}");
}

_write('}');

_generateModules(modules, sorted);

return _buffer.toString();
}

Expand Down Expand Up @@ -141,14 +125,15 @@ class ConfigCodeGenerator {
String registerFunc;
String constructBody;

if (dep.initializer != null) {
final init = dep.initializer;
if (init.isAsync) {
if (dep.moduleConfig != null) {
final mConfig = dep.moduleConfig;
final mName = toCamelCase(mConfig.moduleName);
if (mConfig.isAsync) {
final awaitedVar = toCamelCase(dep.type);
_writeln('final $awaitedVar = await ${init.code} ;');
_writeln('final $awaitedVar = await $mName.${mConfig.name};');
constructBody = awaitedVar;
} else {
constructBody = init.code;
constructBody = '$mName.${mConfig.name}';
}
} else {
constructBody = _generateConstructor(dep);
Expand Down Expand Up @@ -198,6 +183,31 @@ class ConfigCodeGenerator {
}

bool _hasAsync(Set<DependencyConfig> deps) {
return deps.any((d) => d.initializer?.isAsync == true);
return deps.any((d) => d.moduleConfig?.isAsync == true);
}

void _generateModules(Set<String> modules, Set<DependencyConfig> deps) {
modules.forEach((m) {
_writeln('class _\$$m extends $m{');
final moduleDeps = deps
.where((d) =>
d.moduleConfig != null &&
d.moduleConfig.moduleName == m &&
d.moduleConfig.isAbstract)
.toList();

_writeln("final GetIt g;");
_writeln('_\$$m(this.g);');
_generateModuleItems(moduleDeps);

_writeln('}');
});
}

void _generateModuleItems(List<DependencyConfig> moduleDeps) {
moduleDeps.forEach((d) {
final constructor = _generateConstructor(d);
_writeln('${d.bindTo} get ${d.moduleConfig.name} => $constructor ;');
});
}
}
Loading

0 comments on commit 31c5ea0

Please sign in to comment.