mirror of https://github.com/AMT-Cheif/drift.git
Better support for changing analysis sessions
This commit is contained in:
parent
bd32d470ea
commit
9f651b3ce9
|
@ -8,7 +8,7 @@ targets:
|
|||
generate_connect_constructor: true
|
||||
compact_query_methods: true
|
||||
write_from_json_string_constructor: true
|
||||
eagerly_load_dart_ast: true
|
||||
# eagerly_load_dart_ast: true
|
||||
sqlite_modules:
|
||||
- json1
|
||||
- fts5
|
|
@ -1,5 +1,6 @@
|
|||
import 'dart:convert';
|
||||
import 'package:analyzer/dart/analysis/results.dart';
|
||||
import 'package:analyzer/dart/analysis/session.dart';
|
||||
import 'package:analyzer/dart/element/element.dart';
|
||||
import 'package:analyzer/dart/element/type.dart';
|
||||
import 'package:build/build.dart' hide log;
|
||||
|
@ -32,6 +33,10 @@ class BuildBackendTask extends BackendTask {
|
|||
|
||||
final Map<AssetId, ResolvedLibraryResult> _cachedResults = {};
|
||||
|
||||
/// The analysis session might be invalidated every time we resolve a new
|
||||
/// library, so we grab a new one instead of using `LibraryElement.session`.
|
||||
AnalysisSession _currentAnalysisSession;
|
||||
|
||||
BuildBackendTask(this.step, this.backend)
|
||||
: typeDeserializer = TypeDeserializer(step);
|
||||
|
||||
|
@ -52,6 +57,7 @@ class BuildBackendTask extends BackendTask {
|
|||
try {
|
||||
final asset = _resolve(uri);
|
||||
final library = await step.resolver.libraryFor(asset);
|
||||
_currentAnalysisSession = library.session;
|
||||
|
||||
if (backend.options.eagerlyLoadDartAst) {
|
||||
_cachedResults[asset] =
|
||||
|
@ -75,7 +81,20 @@ class BuildBackendTask extends BackendTask {
|
|||
if (result != null) {
|
||||
return result.getElementDeclaration(element);
|
||||
} else {
|
||||
return super.loadElementDeclaration(element);
|
||||
final session = _currentAnalysisSession ?? element.session;
|
||||
|
||||
// Transform element to new session if necessary
|
||||
var library = element.library;
|
||||
if (library.session != session) {
|
||||
library = await session.getLibraryByUri(assetId.uri.toString());
|
||||
}
|
||||
|
||||
final result = await session.getResolvedLibraryByElement(library);
|
||||
_cachedResults[assetId] = result;
|
||||
|
||||
// Note: getElementDeclaration works by comparing source offsets, so
|
||||
// element.session != session is not a problem in this case.
|
||||
return result.getElementDeclaration(element);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue