4cb5274108
Change-Id: If6115cd0d3ffe4416f13567b79c835d0ab90bc79 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/392280 Commit-Queue: Samuel Rawlins <srawlins@google.com> Reviewed-by: Phil Quitslund <pquitslund@google.com>
109 lines
5.1 KiB
Dart
109 lines
5.1 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
|
|
import 'package:analyzer/dart/analysis/analysis_options.dart';
|
|
import 'package:analyzer/dart/analysis/declared_variables.dart';
|
|
import 'package:analyzer/file_system/file_system.dart';
|
|
import 'package:analyzer/instrumentation/instrumentation.dart';
|
|
import 'package:analyzer/src/generated/source.dart' show SourceFactory;
|
|
import 'package:meta/meta.dart';
|
|
|
|
export 'package:analyzer/dart/analysis/analysis_options.dart';
|
|
export 'package:analyzer/error/listener.dart' show RecordingErrorListener;
|
|
export 'package:analyzer/src/dart/analysis/analysis_options.dart';
|
|
export 'package:analyzer/src/generated/timestamped_data.dart'
|
|
show TimestampedData;
|
|
|
|
/// A context in which a single analysis can be performed and incrementally
|
|
/// maintained. The context includes such information as the version of the SDK
|
|
/// being analyzed against, and how to resolve 'package:' URI's. (Both of which
|
|
/// are known indirectly through the [SourceFactory].)
|
|
///
|
|
/// An analysis context also represents the state of the analysis, which includes
|
|
/// knowing which sources have been included in the analysis (either directly or
|
|
/// indirectly) and the results of the analysis. Sources must be added and
|
|
/// removed from the context, which is also used to notify the context when
|
|
/// sources have been modified and, consequently, previously known results might
|
|
/// have been invalidated.
|
|
///
|
|
/// There are two ways to access the results of the analysis. The most common is
|
|
/// to use one of the 'get' methods to access the results. The 'get' methods have
|
|
/// the advantage that they will always return quickly, but have the disadvantage
|
|
/// that if the results are not currently available they will return either
|
|
/// nothing or in some cases an incomplete result. The second way to access
|
|
/// results is by using one of the 'compute' methods. The 'compute' methods will
|
|
/// always attempt to compute the requested results but might block the caller
|
|
/// for a significant period of time.
|
|
///
|
|
/// When results have been invalidated, have never been computed (as is the case
|
|
/// for newly added sources), or have been removed from the cache, they are
|
|
/// <b>not</b> automatically recreated. They will only be recreated if one of the
|
|
/// 'compute' methods is invoked.
|
|
///
|
|
/// However, this is not always acceptable. Some clients need to keep the
|
|
/// analysis results up-to-date. For such clients there is a mechanism that
|
|
/// allows them to incrementally perform needed analysis and get notified of the
|
|
/// consequent changes to the analysis results.
|
|
///
|
|
/// Analysis engine allows for having more than one context. This can be used,
|
|
/// for example, to perform one analysis based on the state of files on disk and
|
|
/// a separate analysis based on the state of those files in open editors. It can
|
|
/// also be used to perform an analysis based on a proposed future state, such as
|
|
/// the state after a refactoring.
|
|
abstract class AnalysisContext {
|
|
/// Return the set of analysis options controlling the behavior of this
|
|
/// context. Clients should not modify the returned set of options.
|
|
@Deprecated("Use 'getAnalysisOptionsForFile(file)' instead")
|
|
AnalysisOptions get analysisOptions;
|
|
|
|
/// Return the set of declared variables used when computing constant values.
|
|
DeclaredVariables get declaredVariables;
|
|
|
|
/// Return the source factory used to create the sources that can be analyzed
|
|
/// in this context.
|
|
SourceFactory get sourceFactory;
|
|
|
|
/// Get the [AnalysisOptions] instance for the given [file].
|
|
///
|
|
/// NOTE: this API is experimental and subject to change in a future
|
|
/// release (see https://github.com/dart-lang/sdk/issues/53876 for context).
|
|
@experimental
|
|
AnalysisOptions getAnalysisOptionsForFile(File file);
|
|
}
|
|
|
|
/// The entry point for the functionality provided by the analysis engine. There
|
|
/// is a single instance of this class.
|
|
class AnalysisEngine {
|
|
/// The unique instance of this class.
|
|
static final AnalysisEngine instance = AnalysisEngine._();
|
|
|
|
/// The instrumentation service that is to be used by this analysis engine.
|
|
InstrumentationService _instrumentationService =
|
|
InstrumentationService.NULL_SERVICE;
|
|
|
|
AnalysisEngine._();
|
|
|
|
/// Return the instrumentation service that is to be used by this analysis
|
|
/// engine.
|
|
InstrumentationService get instrumentationService => _instrumentationService;
|
|
|
|
/// Set the instrumentation service that is to be used by this analysis engine
|
|
/// to the given [service].
|
|
set instrumentationService(InstrumentationService? service) {
|
|
if (service == null) {
|
|
_instrumentationService = InstrumentationService.NULL_SERVICE;
|
|
} else {
|
|
_instrumentationService = service;
|
|
}
|
|
}
|
|
|
|
/// Clear any caches holding on to analysis results so that a full re-analysis
|
|
/// will be performed the next time an analysis context is created.
|
|
void clearCaches() {
|
|
// Ensure the string canonicalization cache size is reasonable.
|
|
pruneStringCanonicalizationCache();
|
|
}
|
|
}
|