Skip to content

Commit ff38291

Browse files
committed
move reference type matchto linter
1 parent 4a2d75e commit ff38291

File tree

7 files changed

+435
-36
lines changed

7 files changed

+435
-36
lines changed

drift_dev/lib/src/analysis/driver/error.dart

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,45 @@ import 'package:source_gen/source_gen.dart';
44
import 'package:source_span/source_span.dart';
55
import 'package:sqlparser/sqlparser.dart' as sql;
66

7+
enum DriftAnalysisErrorLevel { warning, error }
8+
79
class DriftAnalysisError {
810
final SourceSpan? span;
911
final String message;
12+
final DriftAnalysisErrorLevel level;
1013

11-
DriftAnalysisError(this.span, this.message);
14+
DriftAnalysisError(this.span, this.message,
15+
{this.level = DriftAnalysisErrorLevel.error});
1216

1317
factory DriftAnalysisError.forDartElement(
14-
dart.Element element, String message) {
15-
return DriftAnalysisError(
16-
spanForElement(element),
17-
message,
18-
);
18+
dart.Element element, String message,
19+
{DriftAnalysisErrorLevel level = DriftAnalysisErrorLevel.error}) {
20+
return DriftAnalysisError(spanForElement(element), message, level: level);
1921
}
2022

2123
factory DriftAnalysisError.inDartAst(
22-
dart.Element element, dart.SyntacticEntity entity, String message) {
23-
return DriftAnalysisError(dartAstSpan(element, entity), message);
24+
dart.Element element, dart.SyntacticEntity entity, String message,
25+
{DriftAnalysisErrorLevel level = DriftAnalysisErrorLevel.error}) {
26+
return DriftAnalysisError(dartAstSpan(element, entity), message,
27+
level: level);
2428
}
2529

2630
factory DriftAnalysisError.inDriftFile(
27-
sql.SyntacticEntity sql, String message) {
28-
return DriftAnalysisError(sql.span, message);
31+
sql.SyntacticEntity sql, String message,
32+
{DriftAnalysisErrorLevel level = DriftAnalysisErrorLevel.error}) {
33+
return DriftAnalysisError(sql.span, message, level: level);
2934
}
3035

31-
factory DriftAnalysisError.fromSqlError(sql.AnalysisError error) {
36+
factory DriftAnalysisError.fromSqlError(sql.AnalysisError error,
37+
{DriftAnalysisErrorLevel level = DriftAnalysisErrorLevel.error}) {
3238
var message = error.message ?? '';
3339
if (error.type == sql.AnalysisErrorType.notSupportedInDesiredVersion) {
3440
message =
3541
'$message\nNote: You can change the assumed sqlite version with build '
3642
'options. See https://drift.simonbinder.eu/options/#assumed-sql-environment for details!';
3743
}
3844

39-
return DriftAnalysisError(error.span, message);
45+
return DriftAnalysisError(error.span, message, level: level);
4046
}
4147

4248
@override

drift_dev/lib/src/analysis/resolver/dart/column.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ class ColumnParser {
507507
customConstraints: foundCustomConstraint,
508508
referenceName: _readReferenceName(element),
509509
),
510+
element: element,
510511
referencesColumnInSameTable: referencesColumnInSameTable,
511512
);
512513
}
@@ -665,5 +666,8 @@ class PendingColumnInformation {
665666
/// this column in that case.
666667
final String? referencesColumnInSameTable;
667668

668-
PendingColumnInformation(this.column, {this.referencesColumnInSameTable});
669+
final Element element;
670+
671+
PendingColumnInformation(this.column,
672+
{this.referencesColumnInSameTable, required this.element});
669673
}

drift_dev/lib/src/analysis/resolver/dart/table.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ class DartTableResolver extends LocalElementResolver<DiscoveredDartTable> {
4141
} else {
4242
for (final constraint in column.column.constraints) {
4343
if (constraint is ForeignKeyReference) {
44+
if (column.column.sqlType.builtin !=
45+
constraint.otherColumn.sqlType.builtin ||
46+
column.column.typeConverter?.dartType !=
47+
constraint.otherColumn.typeConverter?.dartType) {
48+
print(
49+
"The Manager API can only generate filters and orderings for relations where the types are exactly the same.");
50+
reportError(DriftAnalysisError.forDartElement(column.element,
51+
"This column references a column whose type doesn't match this one. The generated managers will ignore this relation",
52+
level: DriftAnalysisErrorLevel.warning));
53+
}
4454
references.add(constraint.otherColumn.owner);
4555
}
4656
}

drift_dev/lib/src/lints/drift_backend_errors.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/error/error.dart' hide LintCode;
88
import 'package:analyzer/error/listener.dart';
99
import 'package:custom_lint_builder/custom_lint_builder.dart';
1010
import 'package:drift_dev/src/analysis/backend.dart';
11+
import 'package:drift_dev/src/analysis/driver/error.dart';
1112
import 'package:drift_dev/src/analysis/options.dart';
1213
import 'package:logging/logging.dart';
1314

@@ -25,6 +26,11 @@ class DriftBuildErrors extends DartLintRule {
2526
errorSeverity: ErrorSeverity.ERROR,
2627
);
2728

29+
LintCode get _codeAsWarning => LintCode(
30+
name: _code.name,
31+
problemMessage: _code.problemMessage,
32+
errorSeverity: ErrorSeverity.WARNING);
33+
2834
@override
2935
void run(CustomLintResolver resolver, ErrorReporter reporter,
3036
CustomLintContext context) async {
@@ -35,7 +41,12 @@ class DriftBuildErrors extends DartLintRule {
3541
final file = await driver.fullyAnalyze(unit.uri);
3642
for (final error in file.allErrors) {
3743
if (error.span case final span?) {
38-
reporter.reportErrorForSpan(_code, span, [error.message.trim()]);
44+
reporter.reportErrorForSpan(
45+
error.level == DriftAnalysisErrorLevel.warning
46+
? _codeAsWarning
47+
: _code,
48+
span,
49+
[error.message.trim()]);
3950
}
4051
}
4152
}

drift_dev/lib/src/writer/manager/table_manager_writer.dart

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,7 @@ class _TableManagerWriter {
104104

105105
final currentType = typeForColumn(relation.currentColumn);
106106
final referencedType = typeForColumn(relation.referencedColumn);
107-
if (currentType != referencedType) {
108-
print(
109-
"\"${relation.currentTable.baseDartName}.${relation.currentColumn.nameInSql}\" has a type of \"$currentType\""
110-
" and \"${relation.referencedTable.baseDartName}.${relation.referencedColumn.nameInSql}\" has a type of \"$referencedType\"."
111-
" Filters, orderings and reference getters for this relation wont be generated."
112-
" The Manager API can only generate filters and orderings for relations where the types are exactly the same."
113-
" If you aren't using the Manager API, you can ignore this message.");
114-
return false;
115-
}
116-
return true;
107+
return currentType == referencedType;
117108
}).toList();
118109

119110
final columnFilters = <String>[];

drift_dev/test/linter_test/pkg/lib/db.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,27 @@ class Users extends Table {
99
late final age = integer();
1010
// ignore: drift_build_errors
1111
late final age2 = integer()();
12+
// expect_lint: drift_build_errors
13+
late final group = integer().references(Group, #id)();
14+
// expect_lint: drift_build_errors
15+
late final group2 = integer().references(Group, #id)();
16+
}
17+
18+
extension type PK(String id) {}
19+
20+
class Group extends Table {
21+
late final id = text() //
22+
.map(TypeConverter.extensionType<PK, String>())();
23+
late final id2 = integer() //
24+
.map(TypeConverter.extensionType<PK, int>())();
1225
}
1326

1427
class BrokenTable extends Table {
1528
// expect_lint: drift_build_errors
1629
IntColumn get unknownRef => integer().customConstraint('CHECK foo > 10')();
1730
}
1831

19-
@DriftDatabase(tables: [Users])
32+
@DriftDatabase(tables: [Users, Group])
2033
class TestDatabase extends _$TestDatabase {
2134
TestDatabase(super.e);
2235

@@ -46,7 +59,8 @@ class TestDatabase extends _$TestDatabase {
4659
transaction(
4760
() async {
4861
// expect_lint: unawaited_futures_in_transaction
49-
into(users).insert(UsersCompanion.insert(name: 'name'));
62+
into(users)
63+
.insert(UsersCompanion.insert(name: 'name', age2: 1, group: 5));
5064
},
5165
);
5266
}

0 commit comments

Comments
 (0)