| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #library('mirrors.dart2js'); | 5 #library('mirrors.dart2js'); |
| 6 | 6 |
| 7 #import('../../../lib/compiler/compiler.dart', prefix: 'diagnostics'); | 7 #import('../../../lib/compiler/compiler.dart', prefix: 'diagnostics'); |
| 8 #import('../../../lib/compiler/implementation/elements/elements.dart'); | 8 #import('../../../lib/compiler/implementation/elements/elements.dart'); |
| 9 #import('../../../lib/compiler/implementation/apiimpl.dart', prefix: 'api'); | 9 #import('../../../lib/compiler/implementation/apiimpl.dart', prefix: 'api'); |
| 10 #import('../../../lib/compiler/implementation/scanner/scannerlib.dart'); | 10 #import('../../../lib/compiler/implementation/scanner/scannerlib.dart'); |
| 11 #import('../../../lib/compiler/implementation/leg.dart'); | 11 #import('../../../lib/compiler/implementation/leg.dart'); |
| 12 #import('../../../lib/compiler/implementation/filenames.dart'); | 12 #import('../../../lib/compiler/implementation/filenames.dart'); |
| 13 #import('../../../lib/compiler/implementation/source_file.dart'); | 13 #import('../../../lib/compiler/implementation/source_file.dart'); |
| 14 #import('../../../lib/compiler/implementation/tree/tree.dart'); | 14 #import('../../../lib/compiler/implementation/tree/tree.dart'); |
| 15 #import('../../../lib/compiler/implementation/util/util.dart'); | 15 #import('../../../lib/compiler/implementation/util/util.dart'); |
| 16 #import('../../../lib/compiler/implementation/util/uri_extras.dart'); | 16 #import('../../../lib/compiler/implementation/util/uri_extras.dart'); |
| 17 #import('../../../lib/compiler/implementation/dart2js.dart'); | 17 #import('../../../lib/compiler/implementation/dart2js.dart'); |
| 18 #import('../../../lib/compiler/implementation/ssa/ssa.dart'); |
| 18 #import('mirrors.dart'); | 19 #import('mirrors.dart'); |
| 19 #import('util.dart'); | 20 #import('util.dart'); |
| 20 #import('dart:io'); | 21 #import('dart:io'); |
| 21 #import('dart:uri'); | 22 #import('dart:uri'); |
| 22 | 23 |
| 23 | 24 |
| 24 //------------------------------------------------------------------------------ | 25 //------------------------------------------------------------------------------ |
| 25 // Utility types and functions for the dart2js mirror system | 26 // Utility types and functions for the dart2js mirror system |
| 26 //------------------------------------------------------------------------------ | 27 //------------------------------------------------------------------------------ |
| 27 | 28 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 Dart2JsObjectMirror library, Element element) { | 75 Dart2JsObjectMirror library, Element element) { |
| 75 if (element is SynthesizedConstructorElement) { | 76 if (element is SynthesizedConstructorElement) { |
| 76 return const <Dart2JsMemberMirror>[]; | 77 return const <Dart2JsMemberMirror>[]; |
| 77 } else if (element is VariableElement) { | 78 } else if (element is VariableElement) { |
| 78 return <Dart2JsMemberMirror>[new Dart2JsFieldMirror(library, element)]; | 79 return <Dart2JsMemberMirror>[new Dart2JsFieldMirror(library, element)]; |
| 79 } else if (element is FunctionElement) { | 80 } else if (element is FunctionElement) { |
| 80 return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)]; | 81 return <Dart2JsMemberMirror>[new Dart2JsMethodMirror(library, element)]; |
| 81 } else if (element is AbstractFieldElement) { | 82 } else if (element is AbstractFieldElement) { |
| 82 var members = <Dart2JsMemberMirror>[]; | 83 var members = <Dart2JsMemberMirror>[]; |
| 83 if (element.getter !== null) { | 84 if (element.getter !== null) { |
| 84 members.add(new Dart2JsMethodMirror(library, element.getter, | 85 members.add(new Dart2JsMethodMirror(library, element.getter)); |
| 85 Dart2JsMethodKind.GETTER)); | |
| 86 } | 86 } |
| 87 if (element.setter !== null) { | 87 if (element.setter !== null) { |
| 88 members.add(new Dart2JsMethodMirror(library, element.setter, | 88 members.add(new Dart2JsMethodMirror(library, element.setter)); |
| 89 Dart2JsMethodKind.SETTER)); | |
| 90 } | 89 } |
| 91 return members; | 90 return members; |
| 92 } | 91 } |
| 93 throw new IllegalArgumentException( | 92 throw new IllegalArgumentException( |
| 94 "Unexpected member type $element ${element.kind}"); | 93 "Unexpected member type $element ${element.kind}"); |
| 95 } | 94 } |
| 96 | 95 |
| 97 MethodMirror _convertElementMethodToMethodMirror(Dart2JsObjectMirror library, | 96 MethodMirror _convertElementMethodToMethodMirror(Dart2JsObjectMirror library, |
| 98 Element element) { | 97 Element element) { |
| 99 if (element is FunctionElement) { | 98 if (element is FunctionElement) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 class Dart2JsDiagnosticListener implements DiagnosticListener { | 156 class Dart2JsDiagnosticListener implements DiagnosticListener { |
| 158 const Dart2JsDiagnosticListener(); | 157 const Dart2JsDiagnosticListener(); |
| 159 | 158 |
| 160 void cancel([String reason, node, token, instruction, element]) { | 159 void cancel([String reason, node, token, instruction, element]) { |
| 161 print(reason); | 160 print(reason); |
| 162 } | 161 } |
| 163 | 162 |
| 164 void log(message) { | 163 void log(message) { |
| 165 print(message); | 164 print(message); |
| 166 } | 165 } |
| 166 |
| 167 void internalError(String message, |
| 168 [Node node, Token token, HInstruction instruction, |
| 169 Element element]) { |
| 170 cancel('Internal error: $message', node, token, instruction, element); |
| 171 } |
| 172 |
| 173 void internalErrorOnElement(Element element, String message) { |
| 174 internalError(message, element: element); |
| 175 } |
| 167 } | 176 } |
| 168 | 177 |
| 169 //------------------------------------------------------------------------------ | 178 //------------------------------------------------------------------------------ |
| 170 // Compiler extension for apidoc. | 179 // Compiler extension for apidoc. |
| 171 //------------------------------------------------------------------------------ | 180 //------------------------------------------------------------------------------ |
| 172 | 181 |
| 173 /** | 182 /** |
| 174 * Extension of the compiler that enables the analysis of several libraries with | 183 * Extension of the compiler that enables the analysis of several libraries with |
| 175 * no particular entry point. | 184 * no particular entry point. |
| 176 */ | 185 */ |
| (...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 class Dart2JsMethodMirror extends Dart2JsElementMirror | 1210 class Dart2JsMethodMirror extends Dart2JsElementMirror |
| 1202 implements Dart2JsMemberMirror, MethodMirror { | 1211 implements Dart2JsMemberMirror, MethodMirror { |
| 1203 final Dart2JsObjectMirror _objectMirror; | 1212 final Dart2JsObjectMirror _objectMirror; |
| 1204 String _name; | 1213 String _name; |
| 1205 String _constructorName; | 1214 String _constructorName; |
| 1206 String _operatorName; | 1215 String _operatorName; |
| 1207 Dart2JsMethodKind _kind; | 1216 Dart2JsMethodKind _kind; |
| 1208 String _canonicalName; | 1217 String _canonicalName; |
| 1209 | 1218 |
| 1210 Dart2JsMethodMirror(Dart2JsObjectMirror objectMirror, | 1219 Dart2JsMethodMirror(Dart2JsObjectMirror objectMirror, |
| 1211 FunctionElement function, | 1220 FunctionElement function) |
| 1212 [Dart2JsMethodKind kind = null]) | |
| 1213 : this._objectMirror = objectMirror, | 1221 : this._objectMirror = objectMirror, |
| 1214 this._kind = kind, | |
| 1215 super(objectMirror.system, function) { | 1222 super(objectMirror.system, function) { |
| 1216 _name = _element.name.slowToString(); | 1223 _name = _element.name.slowToString(); |
| 1217 if (kind == null) { | 1224 if (_function.kind == ElementKind.GETTER) { |
| 1218 if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) { | 1225 _kind = Dart2JsMethodKind.GETTER; |
| 1219 _constructorName = ''; | 1226 _canonicalName = _name; |
| 1220 int dollarPos = _name.indexOf('\$'); | 1227 } else if (_function.kind == ElementKind.SETTER) { |
| 1221 if (dollarPos != -1) { | 1228 _kind = Dart2JsMethodKind.SETTER; |
| 1222 _constructorName = _name.substring(dollarPos+1); | 1229 _canonicalName = '$_name='; |
| 1223 _name = _name.substring(0, dollarPos); | 1230 } else if (_function.kind == ElementKind.GENERATIVE_CONSTRUCTOR) { |
| 1224 // canonical name is TypeName.constructorName | 1231 _constructorName = ''; |
| 1225 _canonicalName = '$_name.$_constructorName'; | 1232 int dollarPos = _name.indexOf('\$'); |
| 1226 } else { | 1233 if (dollarPos != -1) { |
| 1227 // canonical name is TypeName | 1234 _constructorName = _name.substring(dollarPos + 1); |
| 1228 _canonicalName = _name; | 1235 _name = _name.substring(0, dollarPos); |
| 1229 } | |
| 1230 if (_function.modifiers !== null && _function.modifiers.isConst()) { | |
| 1231 _kind = Dart2JsMethodKind.CONST; | |
| 1232 } else { | |
| 1233 _kind = Dart2JsMethodKind.CONSTRUCTOR; | |
| 1234 } | |
| 1235 } else if (_function.modifiers !== null | |
| 1236 && _function.modifiers.isFactory()) { | |
| 1237 _constructorName = ''; | |
| 1238 int dollarPos = _name.indexOf('\$'); | |
| 1239 if (dollarPos != -1) { | |
| 1240 _constructorName = _name.substring(dollarPos+1); | |
| 1241 _name = _name.substring(0, dollarPos); | |
| 1242 } | |
| 1243 _kind = Dart2JsMethodKind.FACTORY; | |
| 1244 // canonical name is TypeName.constructorName | 1236 // canonical name is TypeName.constructorName |
| 1245 _canonicalName = '$_name.$_constructorName'; | 1237 _canonicalName = '$_name.$_constructorName'; |
| 1246 } else if (_name == 'negate') { | 1238 } else if (_name == 'negate') { |
| 1247 _operatorName = _name; | 1239 _operatorName = _name; |
| 1248 _name = 'operator'; | 1240 _name = 'operator'; |
| 1249 _kind = Dart2JsMethodKind.OPERATOR; | 1241 _kind = Dart2JsMethodKind.OPERATOR; |
| 1250 // canonical name is 'operator operatorName' | 1242 // canonical name is 'operator operatorName' |
| 1251 _canonicalName = 'operator $_operatorName'; | 1243 _canonicalName = 'operator $_operatorName'; |
| 1252 } else if (_name.startsWith('operator\$')) { | 1244 } else if (_name.startsWith('operator\$')) { |
| 1253 String str = _name.substring(9); | 1245 String str = _name.substring(9); |
| 1254 _name = 'operator'; | 1246 _name = 'operator'; |
| 1255 _kind = Dart2JsMethodKind.OPERATOR; | 1247 _kind = Dart2JsMethodKind.OPERATOR; |
| 1256 _operatorName = _getOperatorFromOperatorName(str); | 1248 _operatorName = _getOperatorFromOperatorName(str); |
| 1257 // canonical name is 'operator operatorName' | 1249 // canonical name is 'operator operatorName' |
| 1258 _canonicalName = 'operator $_operatorName'; | 1250 _canonicalName = 'operator $_operatorName'; |
| 1259 } else { | 1251 } else { |
| 1260 _kind = Dart2JsMethodKind.NORMAL; | 1252 // canonical name is TypeName |
| 1261 _canonicalName = _name; | 1253 _canonicalName = _name; |
| 1262 } | 1254 } |
| 1263 } else if (kind == Dart2JsMethodKind.GETTER) { | 1255 if (_function.modifiers !== null && _function.modifiers.isConst()) { |
| 1256 _kind = Dart2JsMethodKind.CONST; |
| 1257 } else { |
| 1258 _kind = Dart2JsMethodKind.CONSTRUCTOR; |
| 1259 } |
| 1260 } else if (_function.modifiers !== null && |
| 1261 _function.modifiers.isFactory()) { |
| 1262 _kind = Dart2JsMethodKind.FACTORY; |
| 1263 _constructorName = ''; |
| 1264 int dollarPos = _name.indexOf('\$'); |
| 1265 if (dollarPos != -1) { |
| 1266 _constructorName = _name.substring(dollarPos+1); |
| 1267 _name = _name.substring(0, dollarPos); |
| 1268 } |
| 1269 // canonical name is TypeName.constructorName |
| 1270 _canonicalName = '$_name.$_constructorName'; |
| 1271 } else if (_name.startsWith('operator\$')) { |
| 1272 String str = _name.substring(9); |
| 1273 _name = 'operator'; |
| 1274 _kind = Dart2JsMethodKind.OPERATOR; |
| 1275 _operatorName = _getOperatorFromOperatorName(str); |
| 1276 // canonical name is 'operator operatorName' |
| 1277 _canonicalName = 'operator $_operatorName'; |
| 1278 } else { |
| 1279 _kind = Dart2JsMethodKind.NORMAL; |
| 1264 _canonicalName = _name; | 1280 _canonicalName = _name; |
| 1265 } else if (kind == Dart2JsMethodKind.SETTER) { | |
| 1266 _canonicalName = '$_name='; | |
| 1267 } else { | |
| 1268 assert(false); | |
| 1269 } | 1281 } |
| 1270 } | 1282 } |
| 1271 | 1283 |
| 1272 FunctionElement get _function() => _element; | 1284 FunctionElement get _function() => _element; |
| 1273 | 1285 |
| 1274 String get simpleName() => _name; | 1286 String get simpleName() => _name; |
| 1275 | 1287 |
| 1276 String get qualifiedName() | 1288 String get qualifiedName() |
| 1277 => '${surroundingDeclaration.qualifiedName}.$canonicalName'; | 1289 => '${surroundingDeclaration.qualifiedName}.$canonicalName'; |
| 1278 | 1290 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 if (node !== null) { | 1389 if (node !== null) { |
| 1378 var span = system.compiler.spanFromNode(node, script.uri); | 1390 var span = system.compiler.spanFromNode(node, script.uri); |
| 1379 return new Dart2JsLocation(script, span); | 1391 return new Dart2JsLocation(script, span); |
| 1380 } else { | 1392 } else { |
| 1381 var span = system.compiler.spanFromElement(_variable); | 1393 var span = system.compiler.spanFromElement(_variable); |
| 1382 return new Dart2JsLocation(script, span); | 1394 return new Dart2JsLocation(script, span); |
| 1383 } | 1395 } |
| 1384 } | 1396 } |
| 1385 } | 1397 } |
| 1386 | 1398 |
| OLD | NEW |