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

Side by Side 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: 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'dart:collection' show HashSet, Queue; 5 import 'dart:collection' show HashSet, Queue;
6 import 'dart:convert' show BASE64, JSON, UTF8; 6 import 'dart:convert' show BASE64, JSON, UTF8;
7 import 'dart:io' show File; 7 import 'dart:io' show File;
8 import 'package:analyzer/dart/element/element.dart' show LibraryElement; 8 import 'package:analyzer/dart/element/element.dart' show LibraryElement;
9 import 'package:analyzer/analyzer.dart' 9 import 'package:analyzer/analyzer.dart'
10 show AnalysisError, CompilationUnit, ErrorSeverity; 10 show AnalysisError, CompilationUnit, ErrorSeverity;
11 import 'package:analyzer/file_system/file_system.dart' show ResourceProvider; 11 import 'package:analyzer/file_system/file_system.dart' show ResourceProvider;
12 import 'package:analyzer/src/generated/engine.dart' 12 import 'package:analyzer/src/generated/engine.dart'
13 show AnalysisContext, AnalysisEngine; 13 show AnalysisContext, AnalysisEngine;
14 import 'package:analyzer/src/generated/source.dart' show DartUriResolver; 14 import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
15 import 'package:analyzer/src/generated/source_io.dart' 15 import 'package:analyzer/src/generated/source_io.dart'
16 show Source, SourceKind, UriResolver; 16 show Source, SourceKind, UriResolver;
17 import 'package:analyzer/src/summary/package_bundle_reader.dart' 17 import 'package:analyzer/src/summary/package_bundle_reader.dart'
18 show InSummarySource, InputPackagesResultProvider, SummaryDataStore; 18 show InSummarySource, InputPackagesResultProvider, SummaryDataStore;
19 import 'package:analyzer/src/error/codes.dart' show StaticTypeWarningCode;
19 import 'package:args/args.dart' show ArgParser, ArgResults; 20 import 'package:args/args.dart' show ArgParser, ArgResults;
20 import 'package:args/src/usage_exception.dart' show UsageException; 21 import 'package:args/src/usage_exception.dart' show UsageException;
21 import 'package:func/func.dart' show Func1; 22 import 'package:func/func.dart' show Func1;
22 import 'package:path/path.dart' as path; 23 import 'package:path/path.dart' as path;
23 import 'package:source_maps/source_maps.dart'; 24 import 'package:source_maps/source_maps.dart';
24 25
25 import '../analyzer/context.dart' 26 import '../analyzer/context.dart'
26 show 27 show
27 AnalyzerOptions, 28 AnalyzerOptions,
28 createAnalysisContext, 29 createAnalysisContext,
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 trees.add(tree); 153 trees.add(tree);
153 errors.addAll(context.computeErrors(library.source)); 154 errors.addAll(context.computeErrors(library.source));
154 155
155 for (var part in library.parts) { 156 for (var part in library.parts) {
156 trees.add(context.resolveCompilationUnit(part.source, library)); 157 trees.add(context.resolveCompilationUnit(part.source, library));
157 errors.addAll(context.computeErrors(part.source)); 158 errors.addAll(context.computeErrors(part.source));
158 } 159 }
159 } 160 }
160 161
161 sortErrors(context, errors); 162 sortErrors(context, errors);
163
162 var messages = <String>[]; 164 var messages = <String>[];
163 for (var e in errors) { 165 for (var e in errors) {
164 var m = formatError(context, e); 166 var m = formatError(context, e);
165 if (m != null) messages.add(m); 167 if (m != null) messages.add(m);
166 } 168 }
167 169
168 if (!options.unsafeForceCompile && 170 if (!options.unsafeForceCompile &&
169 errors.any((e) => errorSeverity(context, e) == ErrorSeverity.ERROR)) { 171 errors.any(options.replCompile
172 ? (e) {
Jennifer Messerly 2016/10/18 18:46:01 style: could we pull this out into its own functio
173 // These errors are not fatal in the REPL compile mode as we
174 // allow access to private members across library boundaries
175 // and those accesses will show up as undefined members unless
176 // additional analyzer changes are made to support them.
177 // TODO(jacobr): consider checking that the identifier name
178 // referenced by the error is private.
179 return errorSeverity(context, e) == ErrorSeverity.ERROR &&
180 e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
181 e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
182 e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD;
183 }
184 : (e) => errorSeverity(context, e) == ErrorSeverity.ERROR)) {
170 return new JSModuleFile.invalid(unit.name, messages, options); 185 return new JSModuleFile.invalid(unit.name, messages, options);
171 } 186 }
172
173 var codeGenerator = 187 var codeGenerator =
174 new CodeGenerator(context, summaryData, options, _extensionTypes); 188 new CodeGenerator(context, summaryData, options, _extensionTypes);
175 return codeGenerator.compile(unit, trees, messages); 189 return codeGenerator.compile(unit, trees, messages);
176 } 190 }
177 } 191 }
178 192
179 class CompilerOptions { 193 class CompilerOptions {
180 /// Whether to emit the source mapping file. 194 /// Whether to emit the source mapping file.
181 /// 195 ///
182 /// This supports debugging the original source code instead of the generated 196 /// This supports debugging the original source code instead of the generated
(...skipping 14 matching lines...) Expand all
197 211
198 /// The file extension for summaries. 212 /// The file extension for summaries.
199 final String summaryExtension; 213 final String summaryExtension;
200 214
201 /// Whether to preserve metdata only accessible via mirrors 215 /// Whether to preserve metdata only accessible via mirrors
202 final bool emitMetadata; 216 final bool emitMetadata;
203 217
204 /// Whether to force compilation of code with static errors. 218 /// Whether to force compilation of code with static errors.
205 final bool unsafeForceCompile; 219 final bool unsafeForceCompile;
206 220
221 /// Whether to compile code in a more permissive REPL mode allowing access
222 /// to private members across library boundaries.
223 final bool replCompile;
224
207 /// Whether to emit Closure Compiler-friendly code. 225 /// Whether to emit Closure Compiler-friendly code.
208 final bool closure; 226 final bool closure;
209 227
210 /// Hoist the types at instance creation sites 228 /// Hoist the types at instance creation sites
211 final bool hoistInstanceCreation; 229 final bool hoistInstanceCreation;
212 230
213 /// Hoist types from class signatures 231 /// Hoist types from class signatures
214 final bool hoistSignatureTypes; 232 final bool hoistSignatureTypes;
215 233
216 /// Name types in type tests 234 /// Name types in type tests
(...skipping 24 matching lines...) Expand all
241 /// source maps. 259 /// source maps.
242 final Map<String, String> bazelMapping; 260 final Map<String, String> bazelMapping;
243 261
244 const CompilerOptions( 262 const CompilerOptions(
245 {this.sourceMap: true, 263 {this.sourceMap: true,
246 this.sourceMapComment: true, 264 this.sourceMapComment: true,
247 this.inlineSourceMap: false, 265 this.inlineSourceMap: false,
248 this.summarizeApi: true, 266 this.summarizeApi: true,
249 this.summaryExtension: 'sum', 267 this.summaryExtension: 'sum',
250 this.unsafeForceCompile: false, 268 this.unsafeForceCompile: false,
269 this.replCompile: false,
251 this.emitMetadata: false, 270 this.emitMetadata: false,
252 this.closure: false, 271 this.closure: false,
253 this.destructureNamedParams: false, 272 this.destructureNamedParams: false,
254 this.hoistInstanceCreation: true, 273 this.hoistInstanceCreation: true,
255 this.hoistSignatureTypes: false, 274 this.hoistSignatureTypes: false,
256 this.nameTypeTests: true, 275 this.nameTypeTests: true,
257 this.hoistTypeTests: true, 276 this.hoistTypeTests: true,
258 this.useAngular2Whitelist: false, 277 this.useAngular2Whitelist: false,
259 this.bazelMapping: const {}}); 278 this.bazelMapping: const {}});
260 279
261 CompilerOptions.fromArguments(ArgResults args) 280 CompilerOptions.fromArguments(ArgResults args)
262 : sourceMap = args['source-map'], 281 : sourceMap = args['source-map'],
263 sourceMapComment = args['source-map-comment'], 282 sourceMapComment = args['source-map-comment'],
264 inlineSourceMap = args['inline-source-map'], 283 inlineSourceMap = args['inline-source-map'],
265 summarizeApi = args['summarize'], 284 summarizeApi = args['summarize'],
266 summaryExtension = args['summary-extension'], 285 summaryExtension = args['summary-extension'],
267 unsafeForceCompile = args['unsafe-force-compile'], 286 unsafeForceCompile = args['unsafe-force-compile'],
287 replCompile = args['repl-compile'],
268 emitMetadata = args['emit-metadata'], 288 emitMetadata = args['emit-metadata'],
269 closure = args['closure-experimental'], 289 closure = args['closure-experimental'],
270 destructureNamedParams = args['destructure-named-params'], 290 destructureNamedParams = args['destructure-named-params'],
271 hoistInstanceCreation = args['hoist-instance-creation'], 291 hoistInstanceCreation = args['hoist-instance-creation'],
272 hoistSignatureTypes = args['hoist-signature-types'], 292 hoistSignatureTypes = args['hoist-signature-types'],
273 nameTypeTests = args['name-type-tests'], 293 nameTypeTests = args['name-type-tests'],
274 hoistTypeTests = args['hoist-type-tests'], 294 hoistTypeTests = args['hoist-type-tests'],
275 useAngular2Whitelist = args['unsafe-angular2-whitelist'], 295 useAngular2Whitelist = args['unsafe-angular2-whitelist'],
276 bazelMapping = _parseBazelMappings(args['bazel-mapping']); 296 bazelMapping = _parseBazelMappings(args['bazel-mapping']);
277 297
(...skipping 18 matching lines...) Expand all
296 ..addFlag('closure-experimental', 316 ..addFlag('closure-experimental',
297 help: 'emit Closure Compiler-friendly code (experimental)', 317 help: 'emit Closure Compiler-friendly code (experimental)',
298 defaultsTo: false) 318 defaultsTo: false)
299 ..addFlag('destructure-named-params', 319 ..addFlag('destructure-named-params',
300 help: 'Destructure named parameters', defaultsTo: false, hide: true) 320 help: 'Destructure named parameters', defaultsTo: false, hide: true)
301 ..addFlag('unsafe-force-compile', 321 ..addFlag('unsafe-force-compile',
302 help: 'Compile code even if it has errors. ಠ_ಠ\n' 322 help: 'Compile code even if it has errors. ಠ_ಠ\n'
303 'This has undefined behavior!', 323 'This has undefined behavior!',
304 defaultsTo: false, 324 defaultsTo: false,
305 hide: true) 325 hide: true)
326 ..addFlag('repl-compile',
327 help: 'Compile code more permissively when in REPL mode allowing '
328 'access to private members across library boundaries.',
329 defaultsTo: false,
330 hide: true)
306 ..addFlag('hoist-instance-creation', 331 ..addFlag('hoist-instance-creation',
307 help: 'Hoist the class type from generic instance creations', 332 help: 'Hoist the class type from generic instance creations',
308 defaultsTo: true, 333 defaultsTo: true,
309 hide: true) 334 hide: true)
310 ..addFlag('hoist-signature-types', 335 ..addFlag('hoist-signature-types',
311 help: 'Hoist types from class signatures', 336 help: 'Hoist types from class signatures',
312 defaultsTo: false, 337 defaultsTo: false,
313 hide: true) 338 hide: true)
314 ..addFlag('name-type-tests', 339 ..addFlag('name-type-tests',
315 help: 'Name types used in type tests', defaultsTo: true, hide: true) 340 help: 'Name types used in type tests', defaultsTo: true, hide: true)
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 // Fall back to a relative path. 530 // Fall back to a relative path.
506 return path.toUri(path.relative(path.fromUri(uri), from: dir)).toString(); 531 return path.toUri(path.relative(path.fromUri(uri), from: dir)).toString();
507 } 532 }
508 533
509 for (int i = 0; i < list.length; i++) { 534 for (int i = 0; i < list.length; i++) {
510 list[i] = transformUri(list[i]); 535 list[i] = transformUri(list[i]);
511 } 536 }
512 map['file'] = transformUri(map['file']); 537 map['file'] = transformUri(map['file']);
513 return map; 538 return map;
514 } 539 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698