| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 | 2 |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 import 'dart:collection' show HashMap, HashSet; | 6 import 'dart:collection' show HashMap, HashSet; |
| 7 import 'dart:math' show min, max; | 7 import 'dart:math' show min, max; |
| 8 | 8 |
| 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 } | 576 } |
| 577 } | 577 } |
| 578 | 578 |
| 579 @override | 579 @override |
| 580 visitCompilationUnit(CompilationUnit unit) { | 580 visitCompilationUnit(CompilationUnit unit) { |
| 581 // NOTE: this method isn't the right place to initialize | 581 // NOTE: this method isn't the right place to initialize |
| 582 // per-compilation-unit state. Declarations can be visited out of order, | 582 // per-compilation-unit state. Declarations can be visited out of order, |
| 583 // this is only to catch things that haven't been emitted yet. | 583 // this is only to catch things that haven't been emitted yet. |
| 584 // | 584 // |
| 585 // See _emitTypeDeclaration. | 585 // See _emitTypeDeclaration. |
| 586 var library = unit.element.library; | 586 _currentElements.add(unit.element); |
| 587 bool internalSdk = isSdkInternalRuntime(library); | 587 var isInternalSdk = isSdkInternalRuntime(currentLibrary); |
| 588 _currentElements.add(library); | |
| 589 List<VariableDeclaration> fields; | 588 List<VariableDeclaration> fields; |
| 590 for (var declaration in unit.declarations) { | 589 for (var declaration in unit.declarations) { |
| 591 if (declaration is TopLevelVariableDeclaration) { | 590 if (declaration is TopLevelVariableDeclaration) { |
| 592 inferNullableTypes(declaration); | 591 inferNullableTypes(declaration); |
| 593 if (internalSdk && declaration.variables.isFinal) { | 592 if (isInternalSdk && declaration.variables.isFinal) { |
| 594 _emitInternalSdkFields(declaration.variables.variables); | 593 _emitInternalSdkFields(declaration.variables.variables); |
| 595 } else { | 594 } else { |
| 596 (fields ??= []).addAll(declaration.variables.variables); | 595 (fields ??= []).addAll(declaration.variables.variables); |
| 597 } | 596 } |
| 598 continue; | 597 continue; |
| 599 } | 598 } |
| 600 | 599 |
| 601 if (fields != null) { | 600 if (fields != null) { |
| 602 _emitTopLevelFields(fields); | 601 _emitTopLevelFields(fields); |
| 603 fields = null; | 602 fields = null; |
| 604 } | 603 } |
| 605 | 604 |
| 606 var element = declaration.element; | 605 var element = declaration.element; |
| 607 if (element is TypeDefiningElement) { | 606 if (element is TypeDefiningElement) { |
| 608 _emitTypeDeclaration(element); | 607 _emitTypeDeclaration(element); |
| 609 continue; | 608 continue; |
| 610 } | 609 } |
| 611 | 610 |
| 612 inferNullableTypes(declaration); | 611 inferNullableTypes(declaration); |
| 613 var item = _visit(declaration); | 612 var item = _visit(declaration); |
| 614 if (internalSdk && element is FunctionElement) { | 613 if (isInternalSdk && element is FunctionElement) { |
| 615 _internalSdkFunctions.add(item); | 614 _internalSdkFunctions.add(item); |
| 616 } else { | 615 } else { |
| 617 _moduleItems.add(item); | 616 _moduleItems.add(item); |
| 618 } | 617 } |
| 619 } | 618 } |
| 620 | 619 |
| 621 if (fields != null) _emitTopLevelFields(fields); | 620 if (fields != null) _emitTopLevelFields(fields); |
| 622 | 621 |
| 623 _currentElements.removeLast(); | 622 _currentElements.removeLast(); |
| 624 } | 623 } |
| (...skipping 1729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2354 } else { | 2353 } else { |
| 2355 value = new JS.LiteralNull(); | 2354 value = new JS.LiteralNull(); |
| 2356 } | 2355 } |
| 2357 fields[element] = value; | 2356 fields[element] = value; |
| 2358 }); | 2357 }); |
| 2359 | 2358 |
| 2360 var body = <JS.Statement>[]; | 2359 var body = <JS.Statement>[]; |
| 2361 fields.forEach((FieldElement e, JS.Expression initialValue) { | 2360 fields.forEach((FieldElement e, JS.Expression initialValue) { |
| 2362 JS.Expression access = | 2361 JS.Expression access = |
| 2363 _classProperties.virtualFields[e] ?? _declareMemberName(e.getter); | 2362 _classProperties.virtualFields[e] ?? _declareMemberName(e.getter); |
| 2364 body.add(js.statement('this.# = #;', [access, initialValue])); | 2363 body.add(initialValue |
| 2364 .toAssignExpression(js.call('this.#', [access])) |
| 2365 .toStatement()); |
| 2365 }); | 2366 }); |
| 2366 | 2367 |
| 2367 return _statement(body); | 2368 return _statement(body); |
| 2368 } | 2369 } |
| 2369 | 2370 |
| 2370 FormalParameterList _parametersOf(node) { | 2371 FormalParameterList _parametersOf(node) { |
| 2371 // TODO(jmesserly): clean this up. If we can model ES6 spread/rest args, we | 2372 // TODO(jmesserly): clean this up. If we can model ES6 spread/rest args, we |
| 2372 // could handle argument initializers more consistently in a separate | 2373 // could handle argument initializers more consistently in a separate |
| 2373 // lowering pass. | 2374 // lowering pass. |
| 2374 if (node is ConstructorDeclaration) return node.parameters; | 2375 if (node is ConstructorDeclaration) return node.parameters; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2463 fn = _emitNativeFunctionBody(node); | 2464 fn = _emitNativeFunctionBody(node); |
| 2464 } else { | 2465 } else { |
| 2465 fn = _emitFunctionBody(node.element, node.parameters, node.body); | 2466 fn = _emitFunctionBody(node.element, node.parameters, node.body); |
| 2466 } | 2467 } |
| 2467 | 2468 |
| 2468 return annotate( | 2469 return annotate( |
| 2469 new JS.Method(_declareMemberName(node.element), fn, | 2470 new JS.Method(_declareMemberName(node.element), fn, |
| 2470 isGetter: node.isGetter, | 2471 isGetter: node.isGetter, |
| 2471 isSetter: node.isSetter, | 2472 isSetter: node.isSetter, |
| 2472 isStatic: node.isStatic), | 2473 isStatic: node.isStatic), |
| 2473 node, | 2474 null, // don't annotate as this breaks stepping for one-line functions. |
| 2474 node.element); | 2475 node.element); |
| 2475 } | 2476 } |
| 2476 | 2477 |
| 2477 /// Transform the function so the last parameter is always returned. | 2478 /// Transform the function so the last parameter is always returned. |
| 2478 /// | 2479 /// |
| 2479 /// This is useful for indexed set methods, which otherwise would not have | 2480 /// This is useful for indexed set methods, which otherwise would not have |
| 2480 /// the right return value in JS. | 2481 /// the right return value in JS. |
| 2481 JS.Block _alwaysReturnLastParameter(JS.Block body, JS.Parameter lastParam) { | 2482 JS.Block _alwaysReturnLastParameter(JS.Block body, JS.Parameter lastParam) { |
| 2482 JS.Statement blockBody = body; | 2483 JS.Statement blockBody = body; |
| 2483 if (JS.Return.foundIn(body)) { | 2484 if (JS.Return.foundIn(body)) { |
| (...skipping 3491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5975 if (targetIdentifier.staticElement is! PrefixElement) return false; | 5976 if (targetIdentifier.staticElement is! PrefixElement) return false; |
| 5976 var prefix = targetIdentifier.staticElement as PrefixElement; | 5977 var prefix = targetIdentifier.staticElement as PrefixElement; |
| 5977 | 5978 |
| 5978 // The library the prefix is referring to must come from a deferred import. | 5979 // The library the prefix is referring to must come from a deferred import. |
| 5979 var containingLibrary = resolutionMap | 5980 var containingLibrary = resolutionMap |
| 5980 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) | 5981 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) |
| 5981 .library; | 5982 .library; |
| 5982 var imports = containingLibrary.getImportsWithPrefix(prefix); | 5983 var imports = containingLibrary.getImportsWithPrefix(prefix); |
| 5983 return imports.length == 1 && imports[0].isDeferred; | 5984 return imports.length == 1 && imports[0].isDeferred; |
| 5984 } | 5985 } |
| OLD | NEW |