Fix wrapping code with collection literals (#2787)

This commit is contained in:
Simon Binder 2023-12-14 00:00:39 +01:00
parent 08ceb939bc
commit ac627b1a10
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
3 changed files with 74 additions and 14 deletions

View File

@ -122,7 +122,7 @@ class DartAccessorResolver
final declaration = DriftDeclaration.dartElement(element);
if (discovered.isDatabase) {
final accessors = <DatabaseAccessor>[];
final rawDaos = annotation.getField('daos')!.toListValue()!;
final rawDaos = annotation.getField('daos')?.toListValue() ?? const [];
for (final value in rawDaos) {
final type = value.toTypeValue()!;

View File

@ -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<void> {
}
}
@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<SyntacticEntity> 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<void> {
}
}
@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<void> {
_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]);
}
}

View File

@ -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,
);
});
}