Skip to content

Commit b64d602

Browse files
committed
Implement drift backend
1 parent b998a40 commit b64d602

File tree

2 files changed

+56
-26
lines changed

2 files changed

+56
-26
lines changed

docs/lib/broken.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:drift/drift.dart';
2+
3+
class BrokenTable extends Table {
4+
IntColumn get unknownRef => integer().customConstraint('CHECK foo > 10')();
5+
}
Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1+
import 'dart:io';
2+
13
import 'package:analyzer/dart/analysis/results.dart';
24
import 'package:analyzer/dart/analysis/session.dart';
5+
import 'package:analyzer/dart/ast/ast.dart';
36
import 'package:analyzer/dart/element/element.dart';
4-
import 'package:analyzer/dart/element/visitor.dart';
57
import 'package:analyzer/error/error.dart' hide LintCode;
68
import 'package:analyzer/error/listener.dart';
7-
import 'package:analyzer/src/dart/ast/ast.dart';
89
import 'package:custom_lint_builder/custom_lint_builder.dart';
910
import 'package:drift_dev/src/analysis/backend.dart';
10-
import 'package:drift_dev/src/backends/build/backend.dart';
11-
import 'package:logging/src/logger.dart';
11+
import 'package:drift_dev/src/analysis/options.dart';
12+
import 'package:logging/logging.dart';
13+
14+
import '../analysis/driver/driver.dart';
1215

1316
final columnBuilderChecker =
1417
TypeChecker.fromName('DriftDatabase', packageName: 'drift');
@@ -22,59 +25,81 @@ class DriftBuildErrors extends DartLintRule {
2225
'All futures in a transaction should be awaited to ensure that all operations are completed before the transaction is closed.',
2326
errorSeverity: ErrorSeverity.ERROR,
2427
);
28+
2529
@override
2630
void run(CustomLintResolver resolver, ErrorReporter reporter,
2731
CustomLintContext context) async {
2832
final unit = await resolver.getResolvedUnitResult();
33+
final backend = CustomLintBackend(unit.session);
34+
final driver = DriftAnalysisDriver(backend, const DriftOptions.defaults());
2935

30-
/// @Simon
36+
final file = await driver.fullyAnalyze(unit.uri);
37+
print(
38+
'test? - ${unit.uri} - ${file.allErrors.length} - ${file.analysis.length}');
39+
for (final error in file.allErrors) {
40+
if (error.span case final span?) {
41+
reporter.reportErrorForSpan(_code, span);
42+
}
43+
}
3144
}
3245
}
3346

3447
class CustomLintBackend extends DriftBackend {
3548
@override
36-
// TODO: implement canReadDart
37-
bool get canReadDart => throw UnimplementedError();
49+
final Logger log = Logger('drift_dev.CustomLintBackend');
50+
final AnalysisSession session;
51+
52+
CustomLintBackend(this.session);
3853

3954
@override
40-
Future<AstNode?> loadElementDeclaration(Element element) {
41-
// TODO: implement loadElementDeclaration
42-
throw UnimplementedError();
43-
}
55+
bool get canReadDart => true;
4456

4557
@override
46-
// TODO: implement log
47-
Logger get log => throw UnimplementedError();
58+
Future<AstNode?> loadElementDeclaration(Element element) async {
59+
final library = element.library;
60+
if (library == null) return null;
61+
62+
final info = await library.session.getResolvedLibraryByElement(library);
63+
if (info is ResolvedLibraryResult) {
64+
return info.getElementDeclaration(element)?.node;
65+
} else {
66+
return null;
67+
}
68+
}
4869

4970
@override
50-
Future<String> readAsString(Uri uri) {
51-
// TODO: implement readAsString
52-
throw UnimplementedError();
71+
Future<String> readAsString(Uri uri) async {
72+
final file = session.getFile(uri.path);
73+
74+
if (file is FileResult) {
75+
return file.content;
76+
}
77+
78+
throw FileSystemException('Not a file result: $file');
5379
}
5480

5581
@override
56-
Future<LibraryElement> readDart(Uri uri) {
57-
// TODO: implement readDart
58-
throw UnimplementedError();
82+
Future<LibraryElement> readDart(Uri uri) async {
83+
final result = await session.getLibraryByUri(uri.toString());
84+
if (result is LibraryElementResult) {
85+
return result.element;
86+
}
87+
88+
throw NotALibraryException(uri);
5989
}
6090

6191
@override
6292
Future<Expression> resolveExpression(
6393
Uri context, String dartExpression, Iterable<String> imports) {
64-
// TODO: implement resolveExpression
65-
throw UnimplementedError();
94+
throw CannotReadExpressionException('Not supported at the moment');
6695
}
6796

6897
@override
6998
Future<Element?> resolveTopLevelElement(
7099
Uri context, String reference, Iterable<Uri> imports) {
71-
// TODO: implement resolveTopLevelElement
72100
throw UnimplementedError();
73101
}
74102

75103
@override
76-
Uri resolveUri(Uri base, String uriString) {
77-
// TODO: implement resolveUri
78-
throw UnimplementedError();
79-
}
104+
Uri resolveUri(Uri base, String uriString) => base.resolve(uriString);
80105
}

0 commit comments

Comments
 (0)