From ac627b1a10b91200532ae9f58e8fc0ea6062f8e4 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Thu, 14 Dec 2023 00:00:39 +0100 Subject: [PATCH] Fix wrapping code with collection literals (#2787) --- .../src/analysis/resolver/dart/accessor.dart | 2 +- drift_dev/lib/src/analysis/results/dart.dart | 48 ++++++++++++++----- drift_dev/test/writer/writer_test.dart | 38 +++++++++++++++ 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/drift_dev/lib/src/analysis/resolver/dart/accessor.dart b/drift_dev/lib/src/analysis/resolver/dart/accessor.dart index f80928bd..b2b151b3 100644 --- a/drift_dev/lib/src/analysis/resolver/dart/accessor.dart +++ b/drift_dev/lib/src/analysis/resolver/dart/accessor.dart @@ -122,7 +122,7 @@ class DartAccessorResolver final declaration = DriftDeclaration.dartElement(element); if (discovered.isDatabase) { final accessors = []; - final rawDaos = annotation.getField('daos')!.toListValue()!; + final rawDaos = annotation.getField('daos')?.toListValue() ?? const []; for (final value in rawDaos) { final type = value.toTypeValue()!; diff --git a/drift_dev/lib/src/analysis/results/dart.dart b/drift_dev/lib/src/analysis/results/dart.dart index 23e8d9e3..5171595d 100644 --- a/drift_dev/lib/src/analysis/results/dart.dart +++ b/drift_dev/lib/src/analysis/results/dart.dart @@ -1,4 +1,5 @@ import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/syntactic_entity.dart'; import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; @@ -459,13 +460,20 @@ class _AddFromAst extends GeneralizingAstVisitor { } } - @override - void visitNode(AstNode node) { - if (_excluding.contains(node)) return; + void _visitCommaSeparated(NodeList nodes) { + var first = true; + for (final arg in nodes) { + if (!first) _builder.addText(','); + arg.accept(this); + first = false; + } + } + + void _childEntities(Iterable childEntities) { int? offset; - for (final childEntity in node.childEntities) { + for (final childEntity in childEntities) { if (offset != null && childEntity.offset > offset) { _builder.addText(' '); } @@ -479,19 +487,17 @@ class _AddFromAst extends GeneralizingAstVisitor { } } + @override + void visitNode(AstNode node) { + if (_excluding.contains(node)) return; + _childEntities(node.childEntities); + } + @override void visitArgumentList(ArgumentList node) { // Workaround to the analyzer not including commas: https://github.com/dart-lang/sdk/blob/20ad5db3ab3f2ae49f9668b75331e51c84267011/pkg/analyzer/lib/src/dart/ast/ast.dart#L389 _builder.addText('('); - - var first = true; - for (final arg in node.arguments) { - if (!first) _builder.addText(','); - - visitNode(arg); - first = false; - } - + _visitCommaSeparated(node.arguments); _builder.addText(')'); } @@ -534,4 +540,20 @@ class _AddFromAst extends GeneralizingAstVisitor { _builder.addText(node.name); } } + + @override + void visitListLiteral(ListLiteral node) { + _childEntities( + [node.constKeyword, node.typeArguments, node.leftBracket].whereType()); + _visitCommaSeparated(node.elements); + _childEntities([node.rightBracket]); + } + + @override + void visitSetOrMapLiteral(SetOrMapLiteral node) { + _childEntities( + [node.constKeyword, node.typeArguments, node.leftBracket].whereType()); + _visitCommaSeparated(node.elements); + _childEntities([node.rightBracket]); + } } diff --git a/drift_dev/test/writer/writer_test.dart b/drift_dev/test/writer/writer_test.dart index 7a68549e..b9f5762b 100644 --- a/drift_dev/test/writer/writer_test.dart +++ b/drift_dev/test/writer/writer_test.dart @@ -149,4 +149,42 @@ class MyDatabase {} result.writer, ); }); + + test('generates code for view with multiple group by', () async { + final result = await emulateDriftBuild( + inputs: { + 'a|lib/a.dart': r''' +import 'package:drift/drift.dart'; + +class Todo extends Table { + TextColumn get id => text()(); + TextColumn get listid => text().nullable()(); + BoolColumn get completed => boolean()(); +} + +@DriftView() +abstract class SomeView extends View { + Todo get todoItems; + + @override + Query as() => select([todoItems.id]).from(todoItems) + ..groupBy([todoItems.id, todoItems.listId]); +} + +@DriftDatabase(tables: [Todo], views: [SomeView]) +class MyDatabase {} +''', + }, + logger: loggerThat(neverEmits(anything)), + ); + + checkOutputs( + { + 'a|lib/a.drift.dart': allOf(IsValidDartFile(anything), + decodedMatches(contains('todoItems.id, todoItems.listId'))) + }, + result.dartOutputs, + result.writer, + ); + }); }