From ed1cd9f4e9178b0397e775e0ea8ec6b6a9cbab71 Mon Sep 17 00:00:00 2001 From: Joshua Matthews Date: Mon, 18 Sep 2023 10:20:45 -0400 Subject: [PATCH] Preventing naming conflicts between table columns and existing class fields --- .../lib/src/writer/schema_version_writer.dart | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/drift_dev/lib/src/writer/schema_version_writer.dart b/drift_dev/lib/src/writer/schema_version_writer.dart index 5e1ea849..fd888708 100644 --- a/drift_dev/lib/src/writer/schema_version_writer.dart +++ b/drift_dev/lib/src/writer/schema_version_writer.dart @@ -71,6 +71,21 @@ class SchemaVersionWriter { final Map _columnCodeToFactory = {}; final Map<_TableShape, String> _shapes = {}; + // A list of member names already in use in the generated class. This is used + // to prevent table getters from conflicting with other class members. + final Set _usedNames = {}; + + void _resetUsedNames() { + _usedNames.clear(); + _usedNames.addAll([ + 'database', + 'entities', + 'version', + 'stepByStepHelper', + 'runMigrationSteps', + ]); + } + SchemaVersionWriter(this.versions, this.libraryScope) { assert(versions.isSortedBy((element) => element.version)); } @@ -158,9 +173,26 @@ class SchemaVersionWriter { }); } + String _getNonCollidingGetterName(DriftSchemaElement element) { + var name = element.dbGetterName!; + while (_usedNames.contains(name)) { + name = '$name${_suffixForElement(element)}'; + } + _usedNames.add(name); + return name; + } + + String _suffixForElement(DriftSchemaElement element) => switch (element) { + DriftTable() => 'Table', + DriftView() => 'View', + DriftIndex() => 'Index', + DriftTrigger() => 'Trigger', + _ => throw ArgumentError('Unhandled element type $element'), + }; + String _writeWithResultSet( DriftElementWithResultSet entity, TextEmitter writer) { - final getterName = entity.dbGetterName; + final getterName = _getNonCollidingGetterName(entity); final shape = _shapeClass(entity); writer ..write('late final $shape $getterName = ') @@ -259,7 +291,7 @@ class SchemaVersionWriter { writer.write('attachedDatabase: database,'); writer.write('), alias: null)'); - return getterName!; + return getterName; } String _writeEntity({ @@ -271,14 +303,14 @@ class SchemaVersionWriter { if (element is DriftElementWithResultSet) { name = _writeWithResultSet(element, definition); } else if (element is DriftIndex) { - name = element.dbGetterName; + name = _getNonCollidingGetterName(element); final index = definition.drift('Index'); definition ..write('final $index $name = ') ..writeln(DatabaseWriter.createIndex(definition.parent!, element)); } else if (element is DriftTrigger) { - name = element.dbGetterName; + name = _getNonCollidingGetterName(element); final trigger = definition.drift('Trigger'); definition @@ -313,6 +345,7 @@ class SchemaVersionWriter { final versionNo = version.version; final versionClass = '_S$versionNo'; final versionScope = libraryScope.child(); + _resetUsedNames(); // Write an _S class for each schema version x. versionScope.leaf()