diff --git a/moor_generator/lib/src/analyzer/session.dart b/moor_generator/lib/src/analyzer/session.dart index 2300a85e..7942417b 100644 --- a/moor_generator/lib/src/analyzer/session.dart +++ b/moor_generator/lib/src/analyzer/session.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:moor_generator/src/analyzer/runner/file_graph.dart'; import 'package:moor_generator/src/analyzer/runner/task.dart'; import 'package:moor_generator/src/backends/backend.dart'; +import 'package:moor_generator/src/backends/build/moor_builder.dart'; import 'package:path/path.dart' as p; const _fileEndings = { @@ -14,11 +15,12 @@ const _fileEndings = { class MoorSession { final FileGraph fileGraph = FileGraph(); final Backend backend; + final MoorOptions options; final _completedTasks = StreamController.broadcast(); final _changedFiles = StreamController>.broadcast(); - MoorSession(this.backend); + MoorSession(this.backend, {this.options = const MoorOptions()}); /// Stream that emits a [Task] that has been completed. Stream get completedTasks => _completedTasks.stream; diff --git a/moor_generator/lib/src/backends/backend.dart b/moor_generator/lib/src/backends/backend.dart index ca74f3f7..d3fe2133 100644 --- a/moor_generator/lib/src/backends/backend.dart +++ b/moor_generator/lib/src/backends/backend.dart @@ -1,20 +1,12 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:logging/logging.dart'; -import 'package:moor_generator/src/analyzer/session.dart'; /// A backend for the moor generator. /// /// Currently, we only have a backend based on the build package, but we can /// extend this to a backend for an analyzer plugin or a standalone tool. abstract class Backend { - MoorSession _session; - MoorSession get session => _session; - - Backend() { - _session = MoorSession(this); - } - /// Resolves an [import] statement from the context of a [base] uri. This /// should support both relative and `package:` imports. Uri resolve(Uri base, String import); diff --git a/moor_generator/lib/src/backends/build/moor_builder.dart b/moor_generator/lib/src/backends/build/moor_builder.dart index 55eaf994..8bc4bd19 100644 --- a/moor_generator/lib/src/backends/build/moor_builder.dart +++ b/moor_generator/lib/src/backends/build/moor_builder.dart @@ -1,5 +1,6 @@ import 'package:build/build.dart'; import 'package:moor_generator/src/analyzer/runner/results.dart'; +import 'package:moor_generator/src/analyzer/session.dart'; import 'package:moor_generator/src/backends/build/build_backend.dart'; import 'package:moor_generator/src/backends/build/generators/dao_generator.dart'; import 'package:moor_generator/src/backends/build/generators/moor_generator.dart'; @@ -11,6 +12,9 @@ part 'options.dart'; class MoorBuilder extends SharedPartBuilder { final MoorOptions options; + final BuildBackend _backend = BuildBackend(); + final Expando _sessions = Expando(); + MoorBuilder._(List generators, String name, this.options) : super(generators, name); @@ -33,10 +37,17 @@ class MoorBuilder extends SharedPartBuilder { Writer createWriter() => Writer(options); + MoorSession _getSession(BuildStep step) { + if (_sessions[step] != null) { + return _sessions[step]; + } else { + return _sessions[step] = MoorSession(_backend, options: options); + } + } + Future analyzeDartFile(BuildStep step) async { - final backend = BuildBackend(); - final backendTask = backend.createTask(step); - final session = backend.session; + final session = _getSession(step); + final backendTask = _backend.createTask(step); final input = session.registerFile(step.inputId.uri); final task = session.startTask(backendTask); diff --git a/moor_generator/lib/src/backends/plugin/backend/driver.dart b/moor_generator/lib/src/backends/plugin/backend/driver.dart index 51fa4a31..aeb3d6e3 100644 --- a/moor_generator/lib/src/backends/plugin/backend/driver.dart +++ b/moor_generator/lib/src/backends/plugin/backend/driver.dart @@ -31,7 +31,7 @@ class MoorDriver implements AnalysisDriverGeneric { this.contentOverlay, this._resourceProvider) { _scheduler.add(this); final backend = PluginBackend(this); - session = backend.session; + session = MoorSession(backend); _fileChangeSubscription = session.changedFiles.listen(_tracker.notifyFilesChanged); diff --git a/moor_generator/lib/src/model/specified_column.dart b/moor_generator/lib/src/model/specified_column.dart index 5acfd9c6..64138e70 100644 --- a/moor_generator/lib/src/model/specified_column.dart +++ b/moor_generator/lib/src/model/specified_column.dart @@ -2,6 +2,7 @@ import 'package:moor_generator/src/analyzer/sql_queries/meta/declarations.dart'; import 'package:moor_generator/src/backends/build/moor_builder.dart'; import 'package:moor_generator/src/model/used_type_converter.dart'; +/// The column types in sql. enum ColumnType { integer, text, boolean, datetime, blob, real } /// Name of a column. Contains additional info on whether the name was chosen diff --git a/moor_generator/lib/src/writer/database_writer.dart b/moor_generator/lib/src/writer/database_writer.dart index 63d6332f..04eef526 100644 --- a/moor_generator/lib/src/writer/database_writer.dart +++ b/moor_generator/lib/src/writer/database_writer.dart @@ -5,6 +5,8 @@ import 'package:moor_generator/src/writer/utils/memoized_getter.dart'; import 'package:moor_generator/src/writer/writer.dart'; import 'package:recase/recase.dart'; +/// Generates the Dart code put into a `.g.dart` file when running the +/// generator. class DatabaseWriter { final SpecifiedDatabase db; final Scope scope; diff --git a/moor_generator/lib/src/writer/writer.dart b/moor_generator/lib/src/writer/writer.dart index 85fcda5a..aa18cc1f 100644 --- a/moor_generator/lib/src/writer/writer.dart +++ b/moor_generator/lib/src/writer/writer.dart @@ -17,6 +17,7 @@ class Writer { _root = Scope(parent: null, writer: this); } + /// Returns the code generated by this [Writer]. String writeGenerated() => _leafNodes(_root).join(); Iterable _leafNodes(Scope scope) sync* { diff --git a/moor_generator/test/analyzer/cyclic_moor_dart_dependency.dart b/moor_generator/test/analyzer/cyclic_moor_dart_dependency.dart index efff2bb6..a08bc934 100644 --- a/moor_generator/test/analyzer/cyclic_moor_dart_dependency.dart +++ b/moor_generator/test/analyzer/cyclic_moor_dart_dependency.dart @@ -30,7 +30,7 @@ CREATE TABLE bars ( ); ''', }); - session = backend.session; + session = MoorSession(backend); }); tearDownAll(() { diff --git a/moor_generator/test/analyzer/integration_test.dart b/moor_generator/test/analyzer/integration_test.dart index 0aaa7c46..43b36b1f 100644 --- a/moor_generator/test/analyzer/integration_test.dart +++ b/moor_generator/test/analyzer/integration_test.dart @@ -66,7 +66,7 @@ class ProgrammingLanguages extends Table { ''', }, ); - session = backend.session; + session = MoorSession(backend); }); tearDownAll(() { diff --git a/moor_generator/test/analyzer/moor/cfe_test.dart b/moor_generator/test/analyzer/moor/cfe_test.dart index 45eefdc3..cd097458 100644 --- a/moor_generator/test/analyzer/moor/cfe_test.dart +++ b/moor_generator/test/analyzer/moor/cfe_test.dart @@ -38,7 +38,7 @@ WITH alias(first, second) AS (SELECT * FROM foo) SELECT * FROM alias; ''', }, ); - session = backend.session; + session = MoorSession(backend); }); setUp(() async {