Chromium Code Reviews| 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 // 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 HashMap, HashSet; | 5 import 'dart:collection' show HashMap, HashSet; |
| 6 import 'dart:math' show min, max; | 6 import 'dart:math' show min, max; |
| 7 | 7 |
| 8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 8 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; | 10 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; |
| (...skipping 2307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2318 if (jsArgs != null) { | 2318 if (jsArgs != null) { |
| 2319 var genericName = _emitTopLevelName(element, suffix: '\$'); | 2319 var genericName = _emitTopLevelName(element, suffix: '\$'); |
| 2320 return js.call('#(#)', [genericName, jsArgs]); | 2320 return js.call('#(#)', [genericName, jsArgs]); |
| 2321 } | 2321 } |
| 2322 } | 2322 } |
| 2323 | 2323 |
| 2324 return _emitTopLevelName(element); | 2324 return _emitTopLevelName(element); |
| 2325 } | 2325 } |
| 2326 | 2326 |
| 2327 JS.PropertyAccess _emitTopLevelName(Element e, {String suffix: ''}) { | 2327 JS.PropertyAccess _emitTopLevelName(Element e, {String suffix: ''}) { |
| 2328 if (e is TopLevelVariableElement && | |
| 2329 e.getter != null && | |
| 2330 findAnnotation(e.getter, isPublicJSAnnotation) != null) { | |
| 2331 var annotationName = getAnnotationName(e.getter, isPublicJSAnnotation); | |
| 2332 var name = js.string(annotationName ?? e.name); | |
| 2333 return new JS.PropertyAccess(new JS.Identifier('self'), name); | |
|
Jennifer Messerly
2016/05/13 23:19:17
Where is "self" coming from?
Harry Terkelsen
2016/05/13 23:34:43
hmm, I've mostly been doing it because dart2js use
Jennifer Messerly
2016/05/13 23:51:07
Hmmmmm ... I don't think we have a reliable way to
Harry Terkelsen
2016/05/16 16:18:13
Done.
| |
| 2334 } | |
| 2328 String name = getJSExportName(e) + suffix; | 2335 String name = getJSExportName(e) + suffix; |
| 2329 return new JS.PropertyAccess( | 2336 return new JS.PropertyAccess( |
| 2330 emitLibraryName(e.library), _propertyName(name)); | 2337 emitLibraryName(e.library), _propertyName(name)); |
| 2331 } | 2338 } |
| 2332 | 2339 |
| 2333 @override | 2340 @override |
| 2334 JS.Expression visitAssignmentExpression(AssignmentExpression node) { | 2341 JS.Expression visitAssignmentExpression(AssignmentExpression node) { |
| 2335 var left = node.leftHandSide; | 2342 var left = node.leftHandSide; |
| 2336 var right = node.rightHandSide; | 2343 var right = node.rightHandSide; |
| 2337 if (node.operator.type == TokenType.EQ) return _emitSet(left, right); | 2344 if (node.operator.type == TokenType.EQ) return _emitSet(left, right); |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2531 [jsTarget, new JS.ArrayInitializer(typeArgs), memberName, args]); | 2538 [jsTarget, new JS.ArrayInitializer(typeArgs), memberName, args]); |
| 2532 } else { | 2539 } else { |
| 2533 return js.call('dart.dsend(#, #, #)', [jsTarget, memberName, args]); | 2540 return js.call('dart.dsend(#, #, #)', [jsTarget, memberName, args]); |
| 2534 } | 2541 } |
| 2535 } | 2542 } |
| 2536 if (_isObjectMemberCall(target, name)) { | 2543 if (_isObjectMemberCall(target, name)) { |
| 2537 assert(typeArgs == null); // Object methods don't take type args. | 2544 assert(typeArgs == null); // Object methods don't take type args. |
| 2538 return js.call('dart.#(#, #)', [name, jsTarget, args]); | 2545 return js.call('dart.#(#, #)', [name, jsTarget, args]); |
| 2539 } | 2546 } |
| 2540 | 2547 |
| 2541 jsTarget = new JS.PropertyAccess(jsTarget, memberName); | |
| 2542 | |
| 2543 if (typeArgs != null) jsTarget = new JS.Call(jsTarget, typeArgs); | |
| 2544 | |
| 2545 if (DynamicInvoke.get(node.methodName)) { | 2548 if (DynamicInvoke.get(node.methodName)) { |
| 2546 // This is a dynamic call to a statically known target. For example: | 2549 // This is a dynamic call to a statically known target. For example: |
| 2547 // class Foo { Function bar; } | 2550 // class Foo { Function bar; } |
| 2548 // new Foo().bar(); // dynamic call | 2551 // new Foo().bar(); // dynamic call |
| 2549 return js.call('dart.dcall(#, #)', [jsTarget, args]); | 2552 if (typeArgs != null) { |
|
Jennifer Messerly
2016/05/13 23:19:16
just curious about the reason for this change?
Ov
Harry Terkelsen
2016/05/13 23:34:43
Basically because of this line: https://github.com
Jennifer Messerly
2016/05/13 23:51:06
Thanks, makes sense :)
| |
| 2553 return js.call('dart.dgsend(#, #, #, #)', | |
|
Jennifer Messerly
2016/05/13 23:19:17
this code looks copy+pasted, can we share it with
Harry Terkelsen
2016/05/13 23:34:43
I merged it with the above
Jennifer Messerly
2016/05/13 23:51:06
Looks great :)
| |
| 2554 [jsTarget, new JS.ArrayInitializer(typeArgs), memberName, args]); | |
| 2555 } else { | |
| 2556 return js.call('dart.dsend(#, #, #)', [jsTarget, memberName, args]); | |
| 2557 } | |
| 2550 } | 2558 } |
| 2551 | 2559 |
| 2560 jsTarget = new JS.PropertyAccess(jsTarget, memberName); | |
| 2561 if (typeArgs != null) jsTarget = new JS.Call(jsTarget, typeArgs); | |
| 2562 | |
| 2552 return new JS.Call(jsTarget, args); | 2563 return new JS.Call(jsTarget, args); |
| 2553 } | 2564 } |
| 2554 | 2565 |
| 2555 /// Emits a function call, to a top-level function, local function, or | 2566 /// Emits a function call, to a top-level function, local function, or |
| 2556 /// an expression. | 2567 /// an expression. |
| 2557 JS.Expression _emitFunctionCall(InvocationExpression node) { | 2568 JS.Expression _emitFunctionCall(InvocationExpression node) { |
| 2558 var fn = _visit(node.function); | 2569 var fn = _visit(node.function); |
| 2559 var args = _visit(node.argumentList); | 2570 var args = _visit(node.argumentList); |
| 2560 if (DynamicInvoke.get(node.function)) { | 2571 if (DynamicInvoke.get(node.function)) { |
| 2561 var typeArgs = _emitInvokeTypeArguments(node); | 2572 var typeArgs = _emitInvokeTypeArguments(node); |
| (...skipping 1902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4464 } | 4475 } |
| 4465 | 4476 |
| 4466 bool isLibraryPrefix(Expression node) => | 4477 bool isLibraryPrefix(Expression node) => |
| 4467 node is SimpleIdentifier && node.staticElement is PrefixElement; | 4478 node is SimpleIdentifier && node.staticElement is PrefixElement; |
| 4468 | 4479 |
| 4469 LibraryElement _getLibrary(AnalysisContext c, String uri) => | 4480 LibraryElement _getLibrary(AnalysisContext c, String uri) => |
| 4470 c.computeLibraryElement(c.sourceFactory.forUri(uri)); | 4481 c.computeLibraryElement(c.sourceFactory.forUri(uri)); |
| 4471 | 4482 |
| 4472 bool _isDartRuntime(LibraryElement l) => | 4483 bool _isDartRuntime(LibraryElement l) => |
| 4473 l.isInSdk && l.source.uri.toString() == 'dart:_runtime'; | 4484 l.isInSdk && l.source.uri.toString() == 'dart:_runtime'; |
| OLD | NEW |