Refactor AnalysisDriver constructor so that more fields can be final.
I think this is a nice win; we just need to make a few utility functions static (and then rename them, and then sort them). And then these fields can be initialized in constructor initializers, and be marked final.
A win for readability and maintainability. We can see at their declarations that the fields are not meant to be mutable.
It is a nice win that the methods can be static as well; they don't
depend on any state of the class, and are just pure calculations made
on their parameters.
Change-Id: Iaeca7dfa80a17a8f81cbb2d07e442fe31c038f46
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398762
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index f62e67c..5b53aec 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -161,13 +161,13 @@
final DriverBasedAnalysisContext? analysisContext;
/// The salt to mix into all hashes used as keys for unlinked data.
- Uint32List _saltForUnlinked = Uint32List(0);
+ final Uint32List _saltForUnlinked;
/// The salt to mix into all hashes used as keys for elements.
- Uint32List _saltForElements = Uint32List(0);
+ final Uint32List _saltForElements;
/// The salt to mix into all hashes used as keys for linked data.
- Uint32List _saltForResolution = Uint32List(0);
+ final Uint32List _saltForResolution;
/// The set of priority files, that should be analyzed sooner.
final _priorityFiles = <String>{};
@@ -239,7 +239,7 @@
late final FileSystemState _fsState;
/// The [FileTracker] used by this driver.
- late FileTracker _fileTracker;
+ late final FileTracker _fileTracker;
/// Whether resolved units should be indexed.
final bool enableIndex;
@@ -312,17 +312,19 @@
declaredVariables = declaredVariables ?? DeclaredVariables(),
testingData = retainDataForTesting ? TestingData() : null,
_enableLintRuleTiming = enableLintRuleTiming,
- // This extra work is temporary and will get simplified when the
- // deprecated support for passing in an `analysisOptions` is removed.
- assert(
- analysisOptionsMap == null || analysisOptions == null,
- 'An analysisOptionsMap or analysisOptions can be specified, but not both',
- ),
// This '!' is temporary. The analysisOptionsMap is effectively
// required but can't be until Google3 is updated.
analysisOptionsMap = analysisOptions == null
? analysisOptionsMap!
- : AnalysisOptionsMap.forSharedOptions(analysisOptions) {
+ : AnalysisOptionsMap.forSharedOptions(analysisOptions),
+ _saltForUnlinked = _calculateSaltForUnlinked(enableIndex: enableIndex),
+ _saltForElements =
+ _calculateSaltForElements(declaredVariables ?? DeclaredVariables()),
+ _saltForResolution = _calculateSaltForResolution(
+ enableIndex: enableIndex,
+ analysisContext: analysisContext,
+ declaredVariables: declaredVariables ?? DeclaredVariables(),
+ ) {
analysisContext?.driver = this;
testView?.driver = this;
@@ -1299,17 +1301,6 @@
return request.completer.future;
}
- void _addDeclaredVariablesToSignature(ApiSignature buffer) {
- var variableNames = declaredVariables.variableNames;
- buffer.addInt(variableNames.length);
-
- for (var name in variableNames) {
- var value = declaredVariables.get(name);
- buffer.addString(name);
- buffer.addString(value!);
- }
- }
-
Future<void> _analyzeFile(String path) async {
await scheduler.accumulatedPerformance.runAsync(
'analyzeFile',
@@ -1593,8 +1584,6 @@
///
/// This is used on initial construction.
void _createFileTracker() {
- _fillSalt();
-
var featureSetProvider = FeatureSetProvider.build(
sourceFactory: sourceFactory,
resourceProvider: _resourceProvider,
@@ -1690,40 +1679,6 @@
}
}
- void _fillSalt() {
- _fillSaltForUnlinked();
- _fillSaltForElements();
- _fillSaltForResolution();
- }
-
- void _fillSaltForElements() {
- var buffer = ApiSignature();
- buffer.addInt(DATA_VERSION);
- _addDeclaredVariablesToSignature(buffer);
- _saltForElements = buffer.toUint32List();
- }
-
- void _fillSaltForResolution() {
- var buffer = ApiSignature();
- buffer.addInt(DATA_VERSION);
- buffer.addBool(enableIndex);
- buffer.addBool(enableDebugResolutionMarkers);
- _addDeclaredVariablesToSignature(buffer);
-
- var workspace = analysisContext?.contextRoot.workspace;
- workspace?.contributeToResolutionSalt(buffer);
-
- _saltForResolution = buffer.toUint32List();
- }
-
- void _fillSaltForUnlinked() {
- var buffer = ApiSignature();
- buffer.addInt(DATA_VERSION);
- buffer.addBool(enableIndex);
-
- _saltForUnlinked = buffer.toUint32List();
- }
-
Future<void> _getErrors(String path) async {
var file = _fsState.getFileForPath(path);
@@ -2208,8 +2163,8 @@
/// [FileState.hasErrorOrWarning] flag.
void _updateHasErrorOrWarningFlag(
FileState file, List<AnalysisError> errors) {
- for (AnalysisError error in errors) {
- ErrorSeverity severity = error.errorCode.errorSeverity;
+ for (var error in errors) {
+ var severity = error.errorCode.errorSeverity;
if (severity == ErrorSeverity.ERROR) {
file.hasErrorOrWarning = true;
return;
@@ -2217,6 +2172,49 @@
}
file.hasErrorOrWarning = false;
}
+
+ static void _addDeclaredVariablesToSignature(
+ ApiSignature buffer, DeclaredVariables declaredVariables) {
+ buffer.addInt(declaredVariables.variableNames.length);
+
+ for (var name in declaredVariables.variableNames) {
+ var value = declaredVariables.get(name);
+ buffer.addString(name);
+ buffer.addString(value!);
+ }
+ }
+
+ static Uint32List _calculateSaltForElements(
+ DeclaredVariables declaredVariables) {
+ var buffer = ApiSignature()..addInt(DATA_VERSION);
+ _addDeclaredVariablesToSignature(buffer, declaredVariables);
+ return buffer.toUint32List();
+ }
+
+ static Uint32List _calculateSaltForResolution({
+ required bool enableIndex,
+ required DriverBasedAnalysisContext? analysisContext,
+ required DeclaredVariables declaredVariables,
+ }) {
+ var buffer = ApiSignature()
+ ..addInt(DATA_VERSION)
+ ..addBool(enableIndex)
+ ..addBool(enableDebugResolutionMarkers);
+ _addDeclaredVariablesToSignature(buffer, declaredVariables);
+
+ var workspace = analysisContext?.contextRoot.workspace;
+ workspace?.contributeToResolutionSalt(buffer);
+
+ return buffer.toUint32List();
+ }
+
+ static Uint32List _calculateSaltForUnlinked({required bool enableIndex}) {
+ var buffer = ApiSignature()
+ ..addInt(DATA_VERSION)
+ ..addBool(enableIndex);
+
+ return buffer.toUint32List();
+ }
}
/// Priorities of [AnalysisDriver] work. The farther a priority to the beginning