Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(388)

Unified Diff: pkg/front_end/lib/src/base/processed_options.dart

Issue 2894283002: Reapply CL: first step for modular support in fasta (Closed)
Patch Set: new changes since first CL Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/front_end/lib/src/base/processed_options.dart
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index a2060b97bdc6987724ba6c600458473165b8793a..f60bac5d52bf35123cf86d5e643ffd4a5af92aff 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -4,13 +4,14 @@
import 'dart:async';
-import 'package:analyzer/src/summary/idl.dart';
import 'package:front_end/compiler_options.dart';
import 'package:front_end/file_system.dart';
import 'package:front_end/src/fasta/translate_uri.dart';
import 'package:front_end/src/base/performace_logger.dart';
import 'package:front_end/src/incremental/byte_store.dart';
+import 'package:front_end/src/simple_error.dart';
import 'package:package_config/packages_file.dart' as package_config;
+import 'package:kernel/kernel.dart' show Program, loadProgramFromBytes;
/// Wrapper around [CompilerOptions] which exposes the options in a form useful
/// to the front end implementation.
@@ -32,13 +33,18 @@ class ProcessedOptions {
/// or `null` if it has not been computed yet.
TranslateUri _uriTranslator;
- /// The summary bundle for the SDK, or `null` if it has not been read yet.
- PackageBundle _sdkSummary;
+ /// The SDK summary, or `null` if it has not been read yet.
+ Program _sdkSummaryProgram;
+
+ /// The summary for each uri in `options.inputSummaries`.
+ List<Program> _inputSummariesPrograms;
/// The location of the SDK, or `null` if the location hasn't been determined
/// yet.
Uri _sdkRoot;
+ Uri get sdkRoot => _sdkRoot ??= _normalizeSdkRoot();
+
/// Initializes a [ProcessedOptions] object wrapping the given [rawOptions].
ProcessedOptions(CompilerOptions rawOptions) : this._raw = rawOptions;
@@ -52,6 +58,31 @@ class ProcessedOptions {
return _raw.byteStore;
}
+ /// Runs various validations checks on the input options. For instance,
+ /// if an option is a path to a file, it checks that the file exists.
+ Future<bool> validateOptions() async {
+ var fs = _raw.fileSystem;
+ var root = _raw.sdkRoot;
+
+ bool _report(String msg) {
+ _raw.onError(new SimpleError(msg));
+ return false;
+ }
+
+ if (root != null && !await fs.entityForUri(root).exists()) {
+ return _report("SDK root directory not found: ${_raw.sdkRoot}");
+ }
+
+ var summary = _raw.sdkSummary;
+ if (summary != null && !await fs.entityForUri(summary).exists()) {
+ return _report("SDK summary not found: ${_raw.sdkSummary}");
+ }
+
+ // TODO(sigmund): add checks for options that are meant to be disjoint (like
+ // sdkRoot and sdkSummary).
+ return true;
+ }
+
/// Determine whether to generate code for the SDK when compiling a
/// whole-program.
bool get compileSdk => _raw.compileSdk;
@@ -70,28 +101,29 @@ class ProcessedOptions {
/// Whether to interpret Dart sources in strong-mode.
bool get strongMode => _raw.strongMode;
- /// Get the summary bundle for the SDK.
- ///
- /// This is an asynchronous getter since file system operations are required.
- Future<PackageBundle> getSdkSummary() async {
- if (_sdkSummary == null) {
- Uri summaryLocation;
- if (_raw.sdkSummary != null) {
- // Options sdkSummary and sdkRoot are mutually exclusive.
- assert(_raw.sdkRoot == null);
- // No need to look for the SDK; we were told where the SDK summary is.
- summaryLocation = _raw.sdkSummary;
- } else {
- // Need to look for the SDK summary inside the SDK.
- var sdkRoot = await _getSdkRoot();
- summaryLocation = sdkRoot.resolve(
- 'lib/_internal/' + (_raw.strongMode ? 'strong.sum' : 'spec.sum'));
- }
- var summaryBytes =
- await fileSystem.entityForUri(summaryLocation).readAsBytes();
- _sdkSummary = new PackageBundle.fromBuffer(summaryBytes);
+ /// Get an outline program that summarizes the SDK.
+ Future<Program> get sdkSummaryProgram async {
+ if (_sdkSummaryProgram == null) {
+ if (_raw.sdkSummary == null) return null;
+ _sdkSummaryProgram = await _loadProgram(_raw.sdkSummary);
+ }
+ return _sdkSummaryProgram;
+ }
+
+ /// Get the summary programs for each of the underlying `inputSummaries`
+ /// provided via [CompilerOptions].
+ Future<List<Program>> get inputSummariesPrograms async {
+ if (_inputSummariesPrograms == null) {
+ var uris = _raw.inputSummaries;
+ if (uris == null || uris.isEmpty) return const <Program>[];
+ _inputSummariesPrograms = await Future.wait(uris.map(_loadProgram));
}
- return _sdkSummary;
+ return _inputSummariesPrograms;
+ }
+
+ Future<Program> _loadProgram(Uri uri) async {
+ var bytes = await fileSystem.entityForUri(uri).readAsBytes();
+ return loadProgramFromBytes(bytes)..unbindCanonicalNames();
}
/// Get the [TranslateUri] which resolves "package:" and "dart:" URIs.
@@ -132,21 +164,19 @@ class ProcessedOptions {
///
/// This is an asynchronous getter since file system operations may be
/// required to locate the SDK.
- Future<Uri> _getSdkRoot() async {
- if (_sdkRoot == null) {
- // If an SDK summary location was provided, the SDK itself should not be
- // needed.
- assert(_raw.sdkSummary == null);
- if (_raw.sdkRoot == null) {
- // TODO(paulberry): implement the algorithm for finding the SDK
- // automagically.
- throw new UnimplementedError();
- }
- _sdkRoot = _raw.sdkRoot;
- if (!_sdkRoot.path.endsWith('/')) {
- _sdkRoot = _sdkRoot.replace(path: _sdkRoot.path + '/');
- }
+ Uri _normalizeSdkRoot() {
+ // If an SDK summary location was provided, the SDK itself should not be
+ // needed.
+ assert(_raw.sdkSummary == null);
+ if (_raw.sdkRoot == null) {
+ // TODO(paulberry): implement the algorithm for finding the SDK
+ // automagically.
+ throw new UnimplementedError();
+ }
+ var root = _raw.sdkRoot;
+ if (!root.path.endsWith('/')) {
+ root = root.replace(path: _sdkRoot.path + '/');
}
- return _sdkRoot;
+ return root;
}
}

Powered by Google App Engine
This is Rietveld 408576698