Skip to content

Commit 804b94d

Browse files
committed
Try fine grained dependencies.
1 parent 6368c5a commit 804b94d

File tree

4 files changed

+130
-6
lines changed

4 files changed

+130
-6
lines changed

build_runner/lib/src/build/resolver/analysis_driver.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
import 'dart:io';
66

77
import 'package:analyzer/file_system/file_system.dart' show ResourceProvider;
8-
// ignore: implementation_imports
9-
import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart';
108
import 'package:package_config/package_config.dart' show PackageConfig;
119
import 'package:path/path.dart' as p;
1210
import 'package:pub_semver/pub_semver.dart';
1311

1412
import 'analysis_driver_filesystem.dart';
1513
import 'analysis_driver_model.dart';
14+
import 'build_resolvers.dart';
1615

1716
/// Builds an [AnalysisDriverForPackageBuild] backed by a summary SDK.
1817
///

build_runner/lib/src/build/resolver/analysis_driver_model.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import 'dart:async';
66

7-
// ignore: implementation_imports
8-
import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart';
97
import 'package:build/build.dart';
108

119
import '../../logging/timed_activities.dart';
@@ -15,6 +13,8 @@ import '../library_cycle_graph/library_cycle_graph_loader.dart';
1513
import '../library_cycle_graph/phased_asset_deps.dart';
1614
import 'analysis_driver_filesystem.dart';
1715

16+
import 'build_resolvers.dart';
17+
1818
/// Manages analysis driver and related build state.
1919
///
2020
/// - Tracks the import graph of all sources needed for analysis.
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// ignore_for_file: implementation_imports
6+
7+
import 'dart:typed_data';
8+
9+
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
10+
import 'package:analyzer/dart/analysis/analysis_options.dart';
11+
import 'package:analyzer/dart/analysis/session.dart';
12+
import 'package:analyzer/file_system/file_system.dart';
13+
import 'package:analyzer/src/context/packages.dart';
14+
import 'package:analyzer/src/dart/analysis/analysis_options.dart';
15+
import 'package:analyzer/src/dart/analysis/analysis_options_map.dart';
16+
import 'package:analyzer/src/dart/analysis/byte_store.dart';
17+
import 'package:analyzer/src/dart/analysis/driver.dart';
18+
import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
19+
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
20+
import 'package:analyzer/src/generated/source.dart';
21+
import 'package:analyzer/src/summary/package_bundle_reader.dart';
22+
import 'package:analyzer/src/summary/summary_sdk.dart';
23+
import 'package:analyzer/src/summary2/package_bundle_format.dart';
24+
25+
export 'package:analyzer/dart/analysis/analysis_options.dart'
26+
show AnalysisOptions;
27+
export 'package:analyzer/source/source.dart' show Source;
28+
export 'package:analyzer/src/context/packages.dart' show Package, Packages;
29+
export 'package:analyzer/src/dart/analysis/analysis_options.dart'
30+
show AnalysisOptionsImpl;
31+
export 'package:analyzer/src/dart/analysis/byte_store.dart' show ByteStore;
32+
export 'package:analyzer/src/dart/analysis/experiments.dart'
33+
show ExperimentStatus;
34+
export 'package:analyzer/src/generated/source.dart' show UriResolver;
35+
36+
/// A somewhat low level API to create [AnalysisSession].
37+
///
38+
/// Ideally we want clients to use [AnalysisContextCollection], which
39+
/// encapsulates any internals and is driven by `package_config.json` and
40+
/// `analysis_options.yaml` files. But so far it looks that `build_resolvers`
41+
/// wants to provide [UriResolver], and push [Packages] created by other means
42+
/// than parsing `package_config.json`.
43+
AnalysisDriverForPackageBuild createAnalysisDriver({
44+
required ResourceProvider resourceProvider,
45+
required Uint8List sdkSummaryBytes,
46+
required AnalysisOptions analysisOptions,
47+
FileContentCache? fileContentCache,
48+
required List<UriResolver> uriResolvers,
49+
required Packages packages,
50+
ByteStore? byteStore,
51+
}) {
52+
final sdkBundle = PackageBundleReader(sdkSummaryBytes);
53+
final sdk = SummaryBasedDartSdk.forBundle(sdkBundle);
54+
55+
final sourceFactory = SourceFactory([DartUriResolver(sdk), ...uriResolvers]);
56+
57+
final dataStore = SummaryDataStore();
58+
dataStore.addBundle('', sdkBundle);
59+
60+
final logger = PerformanceLog(null);
61+
byteStore ??= MemoryByteStore();
62+
63+
final scheduler = AnalysisDriverScheduler(logger);
64+
scheduler.events.drain<void>().ignore();
65+
66+
final sharedOptions = analysisOptions as AnalysisOptionsImpl;
67+
final optionsMap = AnalysisOptionsMap.forSharedOptions(sharedOptions);
68+
final driver = AnalysisDriver(
69+
scheduler: scheduler,
70+
logger: logger,
71+
resourceProvider: resourceProvider,
72+
byteStore: byteStore,
73+
sourceFactory: sourceFactory,
74+
analysisOptionsMap: optionsMap,
75+
fileContentCache: fileContentCache,
76+
externalSummaries: dataStore,
77+
packages: packages,
78+
withFineDependencies: true,
79+
shouldReportInconsistentAnalysisException: false,
80+
);
81+
82+
scheduler.start();
83+
84+
return AnalysisDriverForPackageBuild._(sdk.libraryUris, driver);
85+
}
86+
87+
/// [AnalysisSession] plus a tiny bit more.
88+
class AnalysisDriverForPackageBuild {
89+
final List<Uri> _sdkLibraryUris;
90+
final AnalysisDriver _driver;
91+
92+
AnalysisDriverForPackageBuild._(this._sdkLibraryUris, this._driver);
93+
94+
AnalysisSession get currentSession {
95+
return _driver.currentSession;
96+
}
97+
98+
/// Returns URIs of libraries in the given SDK.
99+
List<Uri> get sdkLibraryUris {
100+
return _sdkLibraryUris;
101+
}
102+
103+
/// Return a [Future] that completes after pending file changes are applied,
104+
/// so that [currentSession] can be used to compute results.
105+
Future<void> applyPendingFileChanges() {
106+
return _driver.applyPendingFileChanges();
107+
}
108+
109+
/// The file with the given [path] might have changed - updated, added or
110+
/// removed. Or not, we don't know. Or it might have, but then changed back.
111+
///
112+
/// The [path] must be absolute and normalized.
113+
///
114+
/// The [currentSession] most probably will be invalidated.
115+
/// Note, is does NOT at the time of writing this comment.
116+
/// But we are going to fix this.
117+
void changeFile(String path) {
118+
_driver.changeFile(path);
119+
}
120+
121+
/// Return `true` if the [uri] can be resolved to an existing file.
122+
bool isUriOfExistingFile(Uri uri) {
123+
final source = _driver.sourceFactory.forUri2(uri);
124+
return source != null && source.exists();
125+
}
126+
}

build_runner/lib/src/build/resolver/resolver.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import 'package:analyzer/dart/ast/ast.dart';
1414
import 'package:analyzer/dart/element/element2.dart';
1515
import 'package:analyzer/diagnostic/diagnostic.dart';
1616
import 'package:analyzer/error/error.dart';
17-
// ignore: implementation_imports
18-
import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart';
1917
import 'package:async/async.dart';
2018
import 'package:build/build.dart';
2119
import 'package:build/experiments.dart';
@@ -29,6 +27,7 @@ import '../../logging/timed_activities.dart';
2927
import 'analysis_driver.dart';
3028
import 'analysis_driver_filesystem.dart';
3129
import 'analysis_driver_model.dart';
30+
import 'build_resolvers.dart';
3231
import 'sdk_summary.dart';
3332
import 'shared_resource_pool.dart';
3433

0 commit comments

Comments
 (0)