Skip to content

Commit

Permalink
Keep import aliases in generated code
Browse files Browse the repository at this point in the history
  • Loading branch information
simolus3 committed Jan 18, 2024
1 parent 38d603c commit 261c151
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 7 deletions.
5 changes: 5 additions & 0 deletions drift_dev/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 2.15.1-dev

- Keep import alias when referencing existing elements in generated code
([#2845](https://github.com/simolus3/drift/issues/2845)).

## 2.15.0

- Potentially __breaking change__: Fix a bug causing `NULL` column constraints
Expand Down
6 changes: 3 additions & 3 deletions drift_dev/lib/src/backends/build/drift_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class _DriftBuildRun {
return;
}

_createWriter();
await _createWriter();
if (mode.isMonolithic) {
await _generateMonolithic(fileResult);
} else {
Expand Down Expand Up @@ -394,10 +394,10 @@ class _DriftBuildRun {
}
}

void _createWriter() {
Future<void> _createWriter() async {
if (mode.isMonolithic) {
final generationOptions = GenerationOptions(
imports: ImportManagerForPartFiles(),
imports: ImportManagerForPartFiles(await buildStep.inputLibrary),
);
writer = Writer(options, generationOptions: generationOptions);
} else {
Expand Down
2 changes: 1 addition & 1 deletion drift_dev/lib/src/cli/commands/schema/generate_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class GenerateUtilsCommand extends Command {
forSchema: version,
writeCompanions: companions,
writeDataClasses: dataClasses,
imports: ImportManagerForPartFiles(),
imports: NullImportManager(),
),
);
final file = File(p.join(output.path, _filenameForVersion(version)));
Expand Down
35 changes: 34 additions & 1 deletion drift_dev/lib/src/writer/import_manager.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:path/path.dart' show url;

import '../utils/string_escaper.dart';
Expand All @@ -8,9 +9,41 @@ abstract class ImportManager {
}

class ImportManagerForPartFiles extends ImportManager {
final LibraryElement mainLibrary;
final Map<String, Map<String, Element>> _namedImports = {};

ImportManagerForPartFiles(this.mainLibrary) {
for (final import in mainLibrary.libraryImports) {
if (import.prefix case ImportElementPrefix prefix) {
// Not using import.namespace here because that contains the prefix
// everywhere. We want to look up the prefix from the raw name.
final library = import.importedLibrary;
if (library != null) {
_namedImports[prefix.element.name] =
library.exportNamespace.definedNames;
}
}
}
}

@override
String? prefixFor(Uri definitionUri, String elementName) {
// Part files can't add their own imports, so try to find the element in an
// existing import.
for (final MapEntry(:key, :value) in _namedImports.entries) {
if (value.containsKey(elementName)) {
return key;
}
}

return null;
}
}

class NullImportManager extends ImportManager {
@override
String? prefixFor(Uri definitionUri, String elementName) {
return null; // todo: Find import alias from existing imports?
return null;
}
}

Expand Down
37 changes: 37 additions & 0 deletions drift_dev/test/backends/build/build_integration_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,43 @@ CREATE INDEX b_idx /* comment should be stripped */ ON b (foo, upper(foo));
}, result.dartOutputs, result.writer);
});

test('keep import aliases', () async {
final result = await emulateDriftBuild(
inputs: {
'a|lib/main.dart': r'''
import 'package:drift/drift.dart' as drift;
import 'tables.dart' as tables;
@drift.DriftDatabase(tables: [tables.Texts])
class MyDatabase extends _$MyDatabase {}
''',
'a|lib/tables.dart': '''
import 'package:drift/drift.dart';
class Texts extends Table {
TextColumn get content => text()();
}
''',
},
logger: loggerThat(neverEmits(anything)),
);

checkOutputs({
'a|lib/main.drift.dart': decodedMatches(
allOf(
contains(
r'class $TextsTable extends tables.Texts with '
r'drift.TableInfo<$TextsTable, Text>',
),
contains(
'class Text extends drift.DataClass implements '
'drift.Insertable<Text>',
),
),
),
}, result.dartOutputs, result.writer);
});

test('warns about errors in imports', () async {
final logger = Logger.detached('build');
final logs = logger.onRecord.map((e) => e.message).toList();
Expand Down
2 changes: 1 addition & 1 deletion drift_dev/test/services/schema/writer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class Database {}
forSchema: 1,
writeCompanions: true,
writeDataClasses: true,
imports: ImportManagerForPartFiles(),
imports: NullImportManager(),
),
);

Expand Down
2 changes: 1 addition & 1 deletion drift_dev/test/writer/queries/query_writer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ void main() {
final writer = Writer(
options,
generationOptions: GenerationOptions(
imports: ImportManagerForPartFiles(),
imports: NullImportManager(),
),
);
QueryWriter(writer.child())
Expand Down

0 comments on commit 261c151

Please sign in to comment.