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

Unified Diff: pkg/dev_compiler/lib/src/compiler/compiler.dart

Issue 2423313002: Emulate compiling a source file in the context of an existing library. Add --debugger-compile flag … (Closed)
Patch Set: Code review comments. Created 4 years, 2 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/dev_compiler/lib/src/compiler/compiler.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/compiler.dart b/pkg/dev_compiler/lib/src/compiler/compiler.dart
index e789bca3278c080ed1642d2fb992e9810afb8947..c5d93872076ac58ab428af14648da2d135262320 100644
--- a/pkg/dev_compiler/lib/src/compiler/compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/compiler.dart
@@ -16,6 +16,7 @@ import 'package:analyzer/src/generated/source_io.dart'
show Source, SourceKind, UriResolver;
import 'package:analyzer/src/summary/package_bundle_reader.dart'
show InSummarySource, InputPackagesResultProvider, SummaryDataStore;
+import 'package:analyzer/src/error/codes.dart' show StaticTypeWarningCode;
import 'package:args/args.dart' show ArgParser, ArgResults;
import 'package:args/src/usage_exception.dart' show UsageException;
import 'package:func/func.dart' show Func1;
@@ -97,6 +98,21 @@ class ModuleCompiler {
return new ModuleCompiler.withContext(context, summaryData);
}
+ bool _isFatalError(AnalysisError e, CompilerOptions options) {
+ if (errorSeverity(context, e) != ErrorSeverity.ERROR) return false;
+
+ // These errors are not fatal in the REPL compile mode as we
+ // allow access to private members across library boundaries
+ // and those accesses will show up as undefined members unless
+ // additional analyzer changes are made to support them.
+ // TODO(jacobr): consider checking that the identifier name
+ // referenced by the error is private.
+ return !options.replCompile ||
+ (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
+ e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
+ e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
+ }
+
/// Compiles a single Dart build unit into a JavaScript module.
///
/// *Warning* - this may require resolving the entire world.
@@ -159,6 +175,7 @@ class ModuleCompiler {
}
sortErrors(context, errors);
+
var messages = <String>[];
for (var e in errors) {
var m = formatError(context, e);
@@ -166,10 +183,9 @@ class ModuleCompiler {
}
if (!options.unsafeForceCompile &&
- errors.any((e) => errorSeverity(context, e) == ErrorSeverity.ERROR)) {
+ errors.any((e) => _isFatalError(e, options))) {
return new JSModuleFile.invalid(unit.name, messages, options);
}
-
var codeGenerator =
new CodeGenerator(context, summaryData, options, _extensionTypes);
return codeGenerator.compile(unit, trees, messages);
@@ -204,6 +220,10 @@ class CompilerOptions {
/// Whether to force compilation of code with static errors.
final bool unsafeForceCompile;
+ /// Whether to compile code in a more permissive REPL mode allowing access
+ /// to private members across library boundaries.
+ final bool replCompile;
+
/// Whether to emit Closure Compiler-friendly code.
final bool closure;
@@ -248,6 +268,7 @@ class CompilerOptions {
this.summarizeApi: true,
this.summaryExtension: 'sum',
this.unsafeForceCompile: false,
+ this.replCompile: false,
this.emitMetadata: false,
this.closure: false,
this.destructureNamedParams: false,
@@ -265,6 +286,7 @@ class CompilerOptions {
summarizeApi = args['summarize'],
summaryExtension = args['summary-extension'],
unsafeForceCompile = args['unsafe-force-compile'],
+ replCompile = args['repl-compile'],
emitMetadata = args['emit-metadata'],
closure = args['closure-experimental'],
destructureNamedParams = args['destructure-named-params'],
@@ -303,6 +325,11 @@ class CompilerOptions {
'This has undefined behavior!',
defaultsTo: false,
hide: true)
+ ..addFlag('repl-compile',
+ help: 'Compile code more permissively when in REPL mode allowing '
+ 'access to private members across library boundaries.',
+ defaultsTo: false,
+ hide: true)
..addFlag('hoist-instance-creation',
help: 'Hoist the class type from generic instance creations',
defaultsTo: true,

Powered by Google App Engine
This is Rietveld 408576698