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

Side by Side Diff: lib/src/compiler/code_generator.dart

Issue 1976383002: enable top-level @JS() getters (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 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 unified diff | Download patch
« no previous file with comments | « lib/runtime/dart_sdk.js ('k') | test/browser/language_tests.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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';
OLDNEW
« no previous file with comments | « lib/runtime/dart_sdk.js ('k') | test/browser/language_tests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698