1+ import 'dart:io' ;
2+
13import 'package:analyzer/dart/analysis/results.dart' ;
24import 'package:analyzer/dart/analysis/session.dart' ;
5+ import 'package:analyzer/dart/ast/ast.dart' ;
36import 'package:analyzer/dart/element/element.dart' ;
4- import 'package:analyzer/dart/element/visitor.dart' ;
57import 'package:analyzer/error/error.dart' hide LintCode;
68import 'package:analyzer/error/listener.dart' ;
7- import 'package:analyzer/src/dart/ast/ast.dart' ;
89import 'package:custom_lint_builder/custom_lint_builder.dart' ;
910import '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
1316final 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
3447class 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