Migrate to analyzer version 0.40

This commit is contained in:
Simon Binder 2020-10-16 19:25:10 +02:00
parent bbde479479
commit e4d985728a
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
41 changed files with 255 additions and 177 deletions

View File

@ -18,7 +18,7 @@ class CategoriesDrawer extends StatelessWidget {
.subtitle1
.copyWith(color: Colors.white),
),
decoration: BoxDecoration(color: Colors.orange),
decoration: const BoxDecoration(color: Colors.orange),
),
Flexible(
child: StreamBuilder<List<CategoryWithActiveInfo>>(

View File

@ -1,6 +1,6 @@
import 'dart:isolate';
import 'package:analyzer_plugin/starter.dart';
import 'package:analyzer_plugin_fork/starter.dart';
import 'package:moor_generator/src/backends/plugin/plugin.dart';
void start(List<String> args, SendPort sendPort) {

View File

@ -252,12 +252,11 @@ class ColumnParser {
final annotations = getter.metadata;
final object = annotations.singleWhere((e) {
final value = e.computeConstantValue();
return isFromMoor(value.type) &&
value.type.getDisplayString() == 'JsonKey';
return isFromMoor(value.type) && value.type.element.name == 'JsonKey';
}, orElse: () => null);
if (object == null) return null;
return object.constantValue.getField('key').toStringValue();
return object.computeConstantValue().getField('key').toStringValue();
}
}

View File

@ -42,14 +42,16 @@ class TableParser {
String _readDartTypeName(ClassElement element) {
final nameAnnotation = element.metadata.singleWhere(
(e) =>
e.computeConstantValue().type.getDisplayString() == 'DataClassName',
(e) => e.computeConstantValue().type.element.name == 'DataClassName',
orElse: () => null);
if (nameAnnotation == null) {
return dataClassNameForClassName(element.name);
} else {
return nameAnnotation.constantValue.getField('name').toStringValue();
return nameAnnotation
.computeConstantValue()
.getField('name')
.toStringValue();
}
}

View File

@ -108,7 +108,7 @@ class QueryHandler {
}
columns.add(ResultColumn(column.name, moorType, type?.nullable ?? true,
converter: converter));
typeConverter: converter));
final table = _tableOfColumn(column);
candidatesForSingleTable.removeWhere((t) => t != table);

View File

@ -1,5 +1,6 @@
import 'package:build/build.dart';
import 'package:moor_generator/src/backends/build/moor_builder.dart';
import 'package:moor_generator/src/utils/type_utils.dart';
import 'package:moor_generator/writer.dart';
import 'package:source_gen/source_gen.dart';
@ -18,8 +19,9 @@ class DaoGenerator extends Generator implements BaseGenerator {
final daoName = element.displayName;
final dbTypeName = dao.dbClass.codeString(writer.generationOptions);
classScope.leaf().write('mixin _\$${daoName}Mixin on '
'DatabaseAccessor<${dao.dbClass.getDisplayString()}> {\n');
'DatabaseAccessor<$dbTypeName> {\n');
for (final table in dao.tables) {
final infoType = table.tableInfoName;

View File

@ -4,8 +4,8 @@ import 'package:analyzer/src/context/context_root.dart'; // ignore: implementati
// ignore: implementation_imports
import 'package:analyzer/src/dart/analysis/driver.dart'
show AnalysisDriverScheduler;
import 'package:analyzer_plugin/plugin/plugin.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as proto;
import 'package:analyzer_plugin_fork/plugin/plugin.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart' as proto;
import 'package:meta/meta.dart';
import 'package:moor_generator/src/analyzer/options.dart';

View File

@ -1,4 +1,4 @@
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart';
import 'package:logging/logging.dart';
import 'package:moor_generator/src/backends/plugin/plugin.dart';

View File

@ -1,15 +1,16 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer_plugin/plugin/completion_mixin.dart';
import 'package:analyzer_plugin/plugin/folding_mixin.dart';
import 'package:analyzer_plugin/plugin/navigation_mixin.dart';
import 'package:analyzer_plugin/plugin/outline_mixin.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/folding/folding.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/outline/outline.dart';
import 'package:analyzer_plugin_fork/plugin/completion_mixin.dart';
import 'package:analyzer_plugin_fork/plugin/folding_mixin.dart';
import 'package:analyzer_plugin_fork/plugin/navigation_mixin.dart';
import 'package:analyzer_plugin_fork/plugin/outline_mixin.dart';
import 'package:analyzer_plugin_fork/protocol/protocol.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart'
as plugin;
import 'package:analyzer_plugin_fork/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin_fork/utilities/folding/folding.dart';
import 'package:analyzer_plugin_fork/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin_fork/utilities/outline/outline.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:moor_generator/src/backends/common/base_plugin.dart';
import 'package:moor_generator/src/backends/common/driver.dart';

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/utilities/completion/completion_core.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
class MoorCompletingContributor implements CompletionContributor {

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart';
import 'package:moor_generator/src/analyzer/errors.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:moor_generator/src/backends/plugin/plugin.dart';

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/folding/folding.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/utilities/folding/folding.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
import 'package:sqlparser/sqlparser.dart';

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/utilities/navigation/navigation.dart';
import 'package:moor_generator/moor_generator.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
import 'package:moor_generator/src/backends/plugin/utils/ast_to_location.dart';

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/utilities/outline/outline.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/utilities/outline/outline.dart';
import 'package:moor_generator/src/backends/plugin/services/requests.dart';
import 'package:moor_generator/src/backends/plugin/utils/ast_to_location.dart';
import 'package:sqlparser/sqlparser.dart';

View File

@ -1,10 +1,10 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin/utilities/folding/folding.dart';
import 'package:analyzer_plugin/utilities/highlights/highlights.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin/utilities/outline/outline.dart';
import 'package:analyzer_plugin_fork/utilities/assist/assist.dart';
import 'package:analyzer_plugin_fork/utilities/completion/completion_core.dart';
import 'package:analyzer_plugin_fork/utilities/folding/folding.dart';
import 'package:analyzer_plugin_fork/utilities/highlights/highlights.dart';
import 'package:analyzer_plugin_fork/utilities/navigation/navigation.dart';
import 'package:analyzer_plugin_fork/utilities/outline/outline.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:moor_generator/src/analyzer/runner/results.dart';
import 'package:source_span/source_span.dart';

View File

@ -1,4 +1,4 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:moor_generator/moor_generator.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:source_gen/source_gen.dart' show spanForElement;

View File

@ -2,7 +2,7 @@ import 'dart:io';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart';
import 'package:cli_util/cli_util.dart';
import 'package:moor_generator/src/analyzer/options.dart';
import 'package:moor_generator/src/backends/common/base_plugin.dart';

View File

@ -2,8 +2,8 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:analyzer_plugin/channel/channel.dart';
import 'package:analyzer_plugin/protocol/protocol.dart';
import 'package:analyzer_plugin_fork/channel/channel.dart';
import 'package:analyzer_plugin_fork/protocol/protocol.dart';
import 'package:moor_generator/src/backends/plugin/plugin.dart';
import '../cli.dart';

View File

@ -1,6 +1,7 @@
import 'package:moor_generator/src/analyzer/options.dart';
import 'declarations/declaration.dart';
import 'types.dart';
import 'used_type_converter.dart';
/// The column types in sql.
@ -37,48 +38,8 @@ class ColumnName {
}
}
const Map<ColumnType, String> dartTypeNames = {
ColumnType.boolean: 'bool',
ColumnType.text: 'String',
ColumnType.integer: 'int',
ColumnType.datetime: 'DateTime',
ColumnType.blob: 'Uint8List',
ColumnType.real: 'double',
};
/// Maps to the method name of a "QueryRow" from moor to extract a column type
/// of a result row.
const Map<ColumnType, String> readFromMethods = {
ColumnType.boolean: 'readBool',
ColumnType.text: 'readString',
ColumnType.integer: 'readInt',
ColumnType.datetime: 'readDateTime',
ColumnType.blob: 'readBlob',
ColumnType.real: 'readDouble',
};
/// Maps from a column type to code that can be used to create a variable of the
/// respective type.
const Map<ColumnType, String> createVariable = {
ColumnType.boolean: 'Variable.withBool',
ColumnType.text: 'Variable.withString',
ColumnType.integer: 'Variable.withInt',
ColumnType.datetime: 'Variable.withDateTime',
ColumnType.blob: 'Variable.withBlob',
ColumnType.real: 'Variable.withReal',
};
const Map<ColumnType, String> sqlTypes = {
ColumnType.boolean: 'BoolType',
ColumnType.text: 'StringType',
ColumnType.integer: 'IntType',
ColumnType.datetime: 'DateTimeType',
ColumnType.blob: 'BlobType',
ColumnType.real: 'RealType',
};
/// A column, as specified by a getter in a table.
class MoorColumn implements HasDeclaration {
class MoorColumn implements HasDeclaration, HasType {
/// The getter name of this column in the table class. It will also be used
/// as getter name in the TableInfo class (as it needs to override the field)
/// and in the generated data class that will be generated for each table.
@ -93,6 +54,7 @@ class MoorColumn implements HasDeclaration {
bool get declaredInMoorFile => declaration?.isDefinedInMoorFile ?? false;
/// The sql type of this column
@override
final ColumnType type;
/// The name of this column, as chosen by the user
@ -110,6 +72,7 @@ class MoorColumn implements HasDeclaration {
/// Whether the user has explicitly declared this column to be nullable, the
/// default is false
@override
final bool nullable;
/// Whether this column has auto increment.
@ -130,22 +93,9 @@ class MoorColumn implements HasDeclaration {
final String clientDefaultCode;
/// The [UsedTypeConverter], if one has been set on this column.
@override
final UsedTypeConverter typeConverter;
/// The dart type that matches the values of this column. For instance, if a
/// table has declared an `IntColumn`, the matching dart type name would be
/// [int].
String get dartTypeName {
if (typeConverter != null) {
return typeConverter.mappedType?.getDisplayString();
}
return variableTypeName;
}
/// the Dart type of this column that can be handled by moors type mapping.
/// Basically the same as [dartTypeName], minus custom types.
String get variableTypeName => dartTypeNames[type];
/// The column type from the dsl library. For instance, if a table has
/// declared an `IntColumn`, the matching dsl column name would also be an
/// `IntColumn`.
@ -170,10 +120,6 @@ class MoorColumn implements HasDeclaration {
ColumnType.real: 'GeneratedRealColumn',
}[type];
/// The class inside the moor library that represents the same sql type as
/// this column.
String get sqlTypeName => sqlTypes[type];
MoorColumn({
this.type,
this.dartGetterName,

View File

@ -8,4 +8,5 @@ export 'special_queries.dart';
export 'sql_query.dart';
export 'table.dart';
export 'trigger.dart';
export 'types.dart';
export 'used_type_converter.dart';

View File

@ -3,11 +3,13 @@ import 'package:meta/meta.dart';
import 'package:moor/moor.dart' show $mrjf, $mrjc, UpdateKind;
import 'package:moor_generator/src/analyzer/runner/results.dart';
import 'package:moor_generator/src/utils/hash.dart';
import 'package:moor_generator/src/writer/writer.dart';
import 'package:recase/recase.dart';
import 'package:sqlparser/sqlparser.dart';
import 'column.dart';
import 'table.dart';
import 'types.dart';
import 'used_type_converter.dart';
final _illegalChars = RegExp(r'[^0-9a-zA-Z_]');
@ -112,22 +114,6 @@ class SqlSelectQuery extends SqlQuery {
/// The name of the result class, as requested by the user.
final String /*?*/ requestedResultClass;
String get resultClassName {
if (resultSet.matchingTable != null) {
return resultSet.matchingTable.table.dartTypeName;
}
if (resultSet.singleColumn) {
return resultSet.columns.single.dartType;
}
if (resultSet.resultClassName != null) {
return resultSet.resultClassName;
}
return '${ReCase(name).pascalCase}Result';
}
SqlSelectQuery(
String name,
AnalysisContext fromContext,
@ -151,6 +137,30 @@ class SqlSelectQuery extends SqlQuery {
null,
);
}
String get resultClassName {
if (resultSet.matchingTable != null || resultSet.singleColumn) {
throw UnsupportedError('This result set does not introduce a class, '
'either because it has a matching table or because it only returns '
'one column.');
}
return resultSet.resultClassName ?? '${ReCase(name).pascalCase}Result';
}
/// The Dart type representing a row of this result set.
String resultTypeCode(
[GenerationOptions options = const GenerationOptions()]) {
if (resultSet.matchingTable != null) {
return resultSet.matchingTable.table.dartTypeName;
}
if (resultSet.singleColumn) {
return resultSet.columns.single.dartTypeCode(options);
}
return resultClassName;
}
}
class UpdatingQuery extends SqlQuery {
@ -297,29 +307,25 @@ class MatchingMoorTable {
}
}
class ResultColumn {
class ResultColumn implements HasType {
final String name;
@override
final ColumnType type;
@override
final bool nullable;
final UsedTypeConverter converter;
@override
final UsedTypeConverter typeConverter;
ResultColumn(this.name, this.type, this.nullable, {this.converter});
/// The dart type that can store a result of this column.
String get dartType {
if (converter != null) {
return converter.mappedType.getDisplayString();
} else {
return dartTypeNames[type];
}
}
ResultColumn(this.name, this.type, this.nullable, {this.typeConverter});
/// Hash-code that matching [compatibleTo], so that two compatible columns
/// will have the same [compatibilityHashCode].
int get compatibilityHashCode {
return $mrjf($mrjc(name.hashCode,
$mrjc(type.hashCode, $mrjc(nullable.hashCode, converter.hashCode))));
return $mrjf($mrjc(
name.hashCode,
$mrjc(
type.hashCode, $mrjc(nullable.hashCode, typeConverter.hashCode))));
}
/// Checks whether this column is compatible to the [other], meaning that they
@ -328,7 +334,7 @@ class ResultColumn {
return other.name == name &&
other.type == type &&
other.nullable == nullable &&
other.converter == converter;
other.typeConverter == typeConverter;
}
}
@ -439,7 +445,8 @@ class FoundVariable extends FoundElement {
String get parameterType {
String innerType;
if (converter != null) {
innerType = converter.mappedType.getDisplayString();
// todo: Respect nullability here
innerType = converter.mappedType.getDisplayString(withNullability: false);
} else {
innerType = dartTypeNames[type] ?? 'dynamic';
}

View File

@ -0,0 +1,80 @@
import 'package:moor_generator/src/model/model.dart';
import 'package:moor_generator/src/utils/type_utils.dart';
import 'package:moor_generator/writer.dart';
/// Something that has a type.
///
/// This includes table and result-set column and variables.
abstract class HasType {
/// Whether the type is nullable in Dart.
bool get nullable;
/// The associated sql type.
ColumnType get type;
/// The applied type converter, or null.
UsedTypeConverter get typeConverter;
}
extension OperationOnTypes on HasType {
/// the Dart type of this column that can be handled by moors type mapping.
/// Basically the same as [dartTypeCode], minus custom types.
// todo: Respect nullability
String get variableTypeName => dartTypeNames[type];
/// The class inside the moor library that represents the same sql type as
/// this column.
String get sqlTypeName => sqlTypes[type];
/// The dart type that matches the values of this column. For instance, if a
/// table has declared an `IntColumn`, the matching dart type name would be
/// [int].
String dartTypeCode([GenerationOptions options = const GenerationOptions()]) {
if (typeConverter != null) {
return typeConverter.mappedType?.codeString(options);
}
final hasSuffix = nullable && options.nnbd;
return hasSuffix ? '$variableTypeName?' : variableTypeName;
}
}
const Map<ColumnType, String> dartTypeNames = {
ColumnType.boolean: 'bool',
ColumnType.text: 'String',
ColumnType.integer: 'int',
ColumnType.datetime: 'DateTime',
ColumnType.blob: 'Uint8List',
ColumnType.real: 'double',
};
/// Maps to the method name of a "QueryRow" from moor to extract a column type
/// of a result row.
const Map<ColumnType, String> readFromMethods = {
ColumnType.boolean: 'readBool',
ColumnType.text: 'readString',
ColumnType.integer: 'readInt',
ColumnType.datetime: 'readDateTime',
ColumnType.blob: 'readBlob',
ColumnType.real: 'readDouble',
};
/// Maps from a column type to code that can be used to create a variable of the
/// respective type.
const Map<ColumnType, String> createVariable = {
ColumnType.boolean: 'Variable.withBool',
ColumnType.text: 'Variable.withString',
ColumnType.integer: 'Variable.withInt',
ColumnType.datetime: 'Variable.withDateTime',
ColumnType.blob: 'Variable.withBlob',
ColumnType.real: 'Variable.withReal',
};
const Map<ColumnType, String> sqlTypes = {
ColumnType.boolean: 'BoolType',
ColumnType.text: 'StringType',
ColumnType.integer: 'IntType',
ColumnType.datetime: 'DateTimeType',
ColumnType.blob: 'BlobType',
ColumnType.real: 'RealType',
};

View File

@ -2,8 +2,11 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:meta/meta.dart';
import 'package:moor_generator/src/model/table.dart';
import 'package:moor_generator/src/utils/type_utils.dart';
import 'package:moor_generator/src/writer/writer.dart';
import 'column.dart';
import 'types.dart';
class UsedTypeConverter {
/// Index of this converter in the table in which it has been created.
@ -23,12 +26,6 @@ class UsedTypeConverter {
/// The type that will be written to the database.
final ColumnType sqlType;
/// A suitable typename to store an instance of the type converter used here.
String get displayNameOfConverter {
final sqlDartType = dartTypeNames[sqlType];
return 'TypeConverter<${mappedType.getDisplayString()}, $sqlDartType>';
}
/// Type converters are stored as static fields in the table that created
/// them. This will be the field name for this converter.
String get fieldName => '\$converter$index';
@ -57,6 +54,12 @@ class UsedTypeConverter {
sqlType: ColumnType.integer,
);
}
/// A suitable typename to store an instance of the type converter used here.
String converterNameInCode(GenerationOptions options) {
final sqlDartType = dartTypeNames[sqlType];
return 'TypeConverter<${mappedType.codeString(options)}, $sqlDartType>';
}
}
class InvalidTypeForEnumConverterException implements Exception {
@ -66,13 +69,13 @@ class InvalidTypeForEnumConverterException implements Exception {
InvalidTypeForEnumConverterException(this.reason, this.invalidType);
String get errorDescription {
return "Can't use the type ${invalidType.getDisplayString()} as an enum "
return "Can't use the type ${invalidType.userVisibleName} as an enum "
'type: $reason';
}
@override
String toString() {
return 'Invalid type for enum converter: '
'${invalidType.getDisplayString()}. Reason: $reason';
'${invalidType.userVisibleName}. Reason: $reason';
}
}

View File

@ -1,6 +1,6 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart';
import 'package:analyzer_plugin_fork/utilities/assist/assist.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:sqlparser/sqlparser.dart';

View File

@ -1,4 +1,4 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:moor_generator/src/analyzer/runner/file_graph.dart';
import 'package:sqlparser/sqlparser.dart';

View File

@ -1,5 +1,5 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin/protocol/protocol_generated.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_generated.dart';
import 'package:moor_generator/src/analyzer/session.dart';
import 'package:moor_generator/src/services/ide/assists/assist_service.dart';

View File

@ -101,7 +101,8 @@ class SchemaWriter {
if (column.typeConverter != null)
'type_converter': {
'dart_expr': column.typeConverter.expression,
'dart_type_name': column.typeConverter.mappedType.getDisplayString(),
'dart_type_name': column.typeConverter.mappedType
.getDisplayString(withNullability: false),
}
};
}

View File

@ -1,4 +1,6 @@
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:moor_generator/src/writer/writer.dart';
bool isFromMoor(DartType type) {
return type.element?.library?.location?.components?.first?.contains('moor') ??
@ -6,9 +8,23 @@ bool isFromMoor(DartType type) {
}
bool isColumn(DartType type) {
final name = type.getDisplayString();
final name = type.element?.name ?? '';
return isFromMoor(type) &&
name.contains('Column') &&
!name.contains('Builder');
}
extension TypeUtils on DartType {
String get userVisibleName => getDisplayString(withNullability: true);
/// How this type should look like in generated code.
String codeString([GenerationOptions options = const GenerationOptions()]) {
if (nullabilitySuffix == NullabilitySuffix.star) {
// We can't actually use the legacy star in code, so don't show it.
return getDisplayString(withNullability: false);
}
return getDisplayString(withNullability: options.nnbd);
}
}

View File

@ -4,6 +4,7 @@ import 'package:moor/src/runtime/executor/stream_queries.dart';
import 'package:moor_generator/moor_generator.dart';
import 'package:moor_generator/src/services/find_stream_update_rules.dart';
import 'package:moor_generator/src/utils/string_escaper.dart';
import 'package:moor_generator/src/utils/type_utils.dart';
import 'package:moor_generator/writer.dart';
import 'package:recase/recase.dart';
@ -86,7 +87,7 @@ class DatabaseWriter {
// Write fields to access an dao. We use a lazy getter for that.
for (final dao in db.daos) {
final typeName = dao.getDisplayString();
final typeName = dao.codeString(scope.generationOptions);
final getterName = ReCase(typeName).camelCase;
final databaseImplName = db.fromClass.name;

View File

@ -143,8 +143,8 @@ class QueryWriter {
final dartLiteral = asDartLiteral(column.name);
var code = 'row.$readMethod($dartLiteral)';
if (column.converter != null) {
final converter = column.converter;
if (column.typeConverter != null) {
final converter = column.typeConverter;
code = '${_converter(converter)}.mapToDart($code)';
}
return code;
@ -161,7 +161,8 @@ class QueryWriter {
/// Writes a method returning a `Selectable<T>`, where `T` is the return type
/// of the custom query.
void _writeSelectStatementCreator() {
final returnType = 'Selectable<${_select.resultClassName}>';
final returnType =
'Selectable<${_select.resultTypeCode(scope.generationOptions)}>';
final methodName = _nameOfCreationMethod();
_buffer.write('$returnType $methodName(');
@ -180,7 +181,9 @@ class QueryWriter {
}
void _writeOneTimeReader() {
_buffer.write('Future<List<${_select.resultClassName}>> ${query.name}(');
final returnType =
'Future<List<${_select.resultTypeCode(scope.generationOptions)}>>';
_buffer.write('$returnType ${query.name}(');
_writeParameters();
_buffer..write(') {\n')..write('return ${_nameOfCreationMethod()}(');
_writeUseParameters();
@ -199,7 +202,9 @@ class QueryWriter {
methodName = 'watch$upperQueryName';
}
_buffer.write('Stream<List<${_select.resultClassName}>> $methodName(');
final returnType =
'Stream<List<${_select.resultTypeCode(scope.generationOptions)}>>';
_buffer.write('$returnType $methodName(');
_writeParameters();
_buffer..write(') {\n')..write('return ${_nameOfCreationMethod()}(');
_writeUseParameters();

View File

@ -1,4 +1,5 @@
import 'package:moor_generator/src/model/sql_query.dart';
import 'package:moor_generator/src/model/types.dart';
import 'package:moor_generator/src/writer/utils/override_toString.dart';
import 'package:moor_generator/writer.dart';
@ -28,7 +29,7 @@ class ResultSetWriter {
// write fields
for (final column in resultSet.columns) {
final name = resultSet.dartNameFor(column);
final runtimeType = column.dartType;
final runtimeType = column.dartTypeCode(scope.generationOptions);
into.write('$modifier $runtimeType $name\n;');

View File

@ -21,8 +21,8 @@ class DataClassWriter {
// write individual fields
for (final column in table.columns) {
final modifier = scope.options.fieldModifier;
_buffer.write(
'$modifier ${column.dartTypeName} ${column.dartGetterName}; \n');
_buffer.write('$modifier ${column.dartTypeCode(scope.generationOptions)} '
'${column.dartGetterName}; \n');
}
// write constructor with named optional fields
@ -123,7 +123,7 @@ class DataClassWriter {
for (final column in table.columns) {
final getter = column.dartGetterName;
final jsonKey = column.getJsonKey(scope.options);
final type = column.dartTypeName;
final type = column.dartTypeCode(scope.generationOptions);
_buffer.write("$getter: serializer.fromJson<$type>(json['$jsonKey']),");
}
@ -151,9 +151,9 @@ class DataClassWriter {
final getter = column.dartGetterName;
final needsThis = getter == 'serializer';
final value = needsThis ? 'this.$getter' : getter;
final dartType = column.dartTypeCode(scope.generationOptions);
_buffer
.write("'$name': serializer.toJson<${column.dartTypeName}>($value),");
_buffer.write("'$name': serializer.toJson<$dartType>($value),");
}
_buffer.write('};}');
@ -168,12 +168,13 @@ class DataClassWriter {
final column = table.columns[i];
final last = i == table.columns.length - 1;
final typeName = column.dartTypeCode(scope.generationOptions);
if (wrapNullableInValue && column.nullable) {
_buffer
..write('Value<${column.dartTypeName}> ${column.dartGetterName} ')
..write('Value<$typeName> ${column.dartGetterName} ')
..write('= const Value.absent()');
} else {
_buffer.write('${column.dartTypeName} ${column.dartGetterName}');
_buffer.write('$typeName ${column.dartGetterName}');
}
if (!last) {

View File

@ -94,7 +94,7 @@ class TableWriter {
void _writeConvertersAsStaticFields() {
for (final converter in table.converters) {
final typeName = converter.displayNameOfConverter;
final typeName = converter.converterNameInCode(scope.generationOptions);
final code = converter.expression;
_buffer.write('static $typeName ${converter.fieldName} = $code;');
}

View File

@ -32,8 +32,8 @@ class UpdateCompanionWriter {
void _writeFields() {
for (final column in table.columns) {
final modifier = scope.options.fieldModifier;
_buffer.write('$modifier Value<${column.dartTypeName}>'
' ${column.dartGetterName};\n');
final type = column.dartTypeCode(scope.generationOptions);
_buffer.write('$modifier Value<$type> ${column.dartGetterName};\n');
}
}
@ -72,8 +72,9 @@ class UpdateCompanionWriter {
if (table.isColumnRequiredForInsert(column)) {
requiredColumns.add(column);
final typeName = column.dartTypeCode(scope.generationOptions);
_buffer.write('@required ${column.dartTypeName} $param,');
_buffer.write('@required $typeName $param,');
} else {
_buffer.write('this.$param = const Value.absent(),');
}
@ -138,7 +139,9 @@ class UpdateCompanionWriter {
_buffer.write(', ');
}
first = false;
_buffer.write('Value<${column.dartTypeName}> ${column.dartGetterName}');
final typeName = column.dartTypeCode(scope.generationOptions);
_buffer.write('Value<$typeName> ${column.dartGetterName}');
}
_buffer

View File

@ -98,9 +98,16 @@ class Scope extends _Node {
/// Options that are specific to code-generation.
class GenerationOptions {
/// Whether we're generating code to verify schema migrations.
///
/// When non-null, we're generating from a schema snapshot instead of from
/// source.
final int forSchema;
const GenerationOptions({this.forSchema});
/// Whether to generate Dart code that supports non-nullable types.
final bool nnbd;
const GenerationOptions({this.forSchema, this.nnbd = false});
/// Whether, instead of generating the full database code, we're only
/// generating a subset needed for schema verification.

View File

@ -26,8 +26,9 @@ dependencies:
sqlparser: ^0.11.0-dev
# Dart analysis
analyzer: '^0.39.11'
analyzer_plugin: '>=0.2.4 <0.4.0'
analyzer: '^0.40.0'
analyzer_plugin_fork:
path: /home/simon/programming/analyzer_plugin_fork
source_span: ^1.5.5
# Build system

View File

@ -48,7 +48,7 @@ class ProductsDao extends BaseProductsDao with _$ProductDaoMixin {
expect(file.errors.errors, isEmpty);
final dao = (file.currentResult as ParsedDartFile).declaredDaos.single;
expect(dao.dbClass.getDisplayString(), 'MyDatabase');
expect(dao.dbClass.element.name, 'MyDatabase');
state.close();
});

View File

@ -39,7 +39,7 @@ void main() {
contains('EnumIndexConverter<Fruits>'),
)
.having(
(e) => e.mappedType.getDisplayString(),
(e) => e.mappedType.getDisplayString(withNullability: false),
'mappedType',
'Fruits',
),

View File

@ -1,4 +1,5 @@
import 'package:build/build.dart';
import 'package:moor_generator/src/model/types.dart';
import 'package:moor_generator/src/analyzer/runner/results.dart';
import 'package:moor_generator/src/analyzer/runner/steps.dart';
import 'package:moor_generator/src/analyzer/session.dart';
@ -41,7 +42,7 @@ usersWithLongName: SELECT * FROM users WHERE LENGTH(name) > 25;
['id', 'name', 'field', 'another', 'different_json']);
expect(table.columns.map((c) => c.dartGetterName),
['id', 'name', 'field', 'another', 'differentJson']);
expect(table.columns.map((c) => c.dartTypeName),
expect(table.columns.map((c) => c.dartTypeCode()),
['int', 'String', 'bool', 'DateTime', 'int']);
expect(table.columns.map((c) => c.getJsonKey()),
['id', 'name', 'field', 'another', 'myJsonKey']);

View File

@ -1,4 +1,4 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:build/build.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';

View File

@ -1,4 +1,4 @@
import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:analyzer_plugin_fork/protocol/protocol_common.dart';
import 'package:build/build.dart';
import 'package:moor_generator/src/services/ide/moor_ide.dart';
import 'package:test/test.dart';