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

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

Issue 2535273002: Better mirrors support for mixins and private fields (Closed)
Patch Set: Address comments Created 4 years 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) 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 /// The dart:_interceptors JSArray element. 117 /// The dart:_interceptors JSArray element.
118 final ClassElement _jsArray; 118 final ClassElement _jsArray;
119 119
120 final ClassElement boolClass; 120 final ClassElement boolClass;
121 final ClassElement intClass; 121 final ClassElement intClass;
122 final ClassElement interceptorClass; 122 final ClassElement interceptorClass;
123 final ClassElement nullClass; 123 final ClassElement nullClass;
124 final ClassElement numClass; 124 final ClassElement numClass;
125 final ClassElement objectClass; 125 final ClassElement objectClass;
126 final ClassElement stringClass; 126 final ClassElement stringClass;
127 final ClassElement symbolClass;
127 128
128 ConstFieldVisitor _constants; 129 ConstFieldVisitor _constants;
129 130
130 /// The current function body being compiled. 131 /// The current function body being compiled.
131 FunctionBody _currentFunction; 132 FunctionBody _currentFunction;
132 133
133 /// Helper class for emitting elements in the proper order to allow 134 /// Helper class for emitting elements in the proper order to allow
134 /// JS to load the module. 135 /// JS to load the module.
135 ElementLoader _loader; 136 ElementLoader _loader;
136 137
(...skipping 20 matching lines...) Expand all
157 _jsArray = _getLibrary(c, 'dart:_interceptors').getType('JSArray'), 158 _jsArray = _getLibrary(c, 'dart:_interceptors').getType('JSArray'),
158 interceptorClass = 159 interceptorClass =
159 _getLibrary(c, 'dart:_interceptors').getType('Interceptor'), 160 _getLibrary(c, 'dart:_interceptors').getType('Interceptor'),
160 dartCoreLibrary = _getLibrary(c, 'dart:core'), 161 dartCoreLibrary = _getLibrary(c, 'dart:core'),
161 boolClass = _getLibrary(c, 'dart:core').getType('bool'), 162 boolClass = _getLibrary(c, 'dart:core').getType('bool'),
162 intClass = _getLibrary(c, 'dart:core').getType('int'), 163 intClass = _getLibrary(c, 'dart:core').getType('int'),
163 numClass = _getLibrary(c, 'dart:core').getType('num'), 164 numClass = _getLibrary(c, 'dart:core').getType('num'),
164 nullClass = _getLibrary(c, 'dart:core').getType('Null'), 165 nullClass = _getLibrary(c, 'dart:core').getType('Null'),
165 objectClass = _getLibrary(c, 'dart:core').getType('Object'), 166 objectClass = _getLibrary(c, 'dart:core').getType('Object'),
166 stringClass = _getLibrary(c, 'dart:core').getType('String'), 167 stringClass = _getLibrary(c, 'dart:core').getType('String'),
168 symbolClass = _getLibrary(c, 'dart:_internal').getType('Symbol'),
167 dartJSLibrary = _getLibrary(c, 'dart:js'); 169 dartJSLibrary = _getLibrary(c, 'dart:js');
168 170
169 LibraryElement get currentLibrary => _loader.currentElement.library; 171 LibraryElement get currentLibrary => _loader.currentElement.library;
170 172
171 /// The main entry point to JavaScript code generation. 173 /// The main entry point to JavaScript code generation.
172 /// 174 ///
173 /// Takes the metadata for the build unit, as well as resolved trees and 175 /// Takes the metadata for the build unit, as well as resolved trees and
174 /// errors, and computes the output module code and optionally the source map. 176 /// errors, and computes the output module code and optionally the source map.
175 JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits, 177 JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits,
176 List<String> errors) { 178 List<String> errors) {
(...skipping 5008 matching lines...) Expand 10 before | Expand all | Expand 10 after
5185 5187
5186 @override 5188 @override
5187 visitDoubleLiteral(DoubleLiteral node) => js.number(node.value); 5189 visitDoubleLiteral(DoubleLiteral node) => js.number(node.value);
5188 5190
5189 @override 5191 @override
5190 visitNullLiteral(NullLiteral node) => new JS.LiteralNull(); 5192 visitNullLiteral(NullLiteral node) => new JS.LiteralNull();
5191 5193
5192 @override 5194 @override
5193 visitSymbolLiteral(SymbolLiteral node) { 5195 visitSymbolLiteral(SymbolLiteral node) {
5194 JS.Expression emitSymbol() { 5196 JS.Expression emitSymbol() {
5195 // TODO(vsm): When we canonicalize, we need to treat private symbols 5197 // TODO(vsm): Handle qualified symbols correctly.
5196 // correctly. 5198 var last = node.components.last.toString();
5197 var name = js.string(node.components.join('.'), "'"); 5199 var name = js.string(node.components.join('.'), "'");
5198 return js 5200 if (last.startsWith('_')) {
5199 .call('#.new(#)', [_emitConstructorAccess(types.symbolType), name]); 5201 var nativeSymbol = _emitPrivateNameSymbol(currentLibrary, last);
5202 return js.call('new #.es6(#, #)',
5203 [_emitConstructorAccess(symbolClass.type), name, nativeSymbol]);
5204 } else {
5205 return js
5206 .call('#.new(#)', [_emitConstructorAccess(types.symbolType), name]);
5207 }
5200 } 5208 }
5201 5209
5202 return _emitConst(emitSymbol); 5210 return _emitConst(emitSymbol);
5203 } 5211 }
5204 5212
5205 @override 5213 @override
5206 visitListLiteral(ListLiteral node) { 5214 visitListLiteral(ListLiteral node) {
5207 var isConst = node.constKeyword != null; 5215 var isConst = node.constKeyword != null;
5208 JS.Expression emitList() { 5216 JS.Expression emitList() {
5209 JS.Expression list = new JS.ArrayInitializer( 5217 JS.Expression list = new JS.ArrayInitializer(
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
5717 var targetIdentifier = target as SimpleIdentifier; 5725 var targetIdentifier = target as SimpleIdentifier;
5718 5726
5719 if (targetIdentifier.staticElement is! PrefixElement) return false; 5727 if (targetIdentifier.staticElement is! PrefixElement) return false;
5720 var prefix = targetIdentifier.staticElement as PrefixElement; 5728 var prefix = targetIdentifier.staticElement as PrefixElement;
5721 5729
5722 // The library the prefix is referring to must come from a deferred import. 5730 // The library the prefix is referring to must come from a deferred import.
5723 var containingLibrary = (target.root as CompilationUnit).element.library; 5731 var containingLibrary = (target.root as CompilationUnit).element.library;
5724 var imports = containingLibrary.getImportsWithPrefix(prefix); 5732 var imports = containingLibrary.getImportsWithPrefix(prefix);
5725 return imports.length == 1 && imports[0].isDeferred; 5733 return imports.length == 1 && imports[0].isDeferred;
5726 } 5734 }
OLDNEW
« no previous file with comments | « pkg/dev_compiler/lib/sdk/ddc_sdk.sum ('k') | pkg/dev_compiler/test/codegen/lib/mirrors/mixin_simple_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698