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 part of dart2js; | 5 part of dart2js; |
6 | 6 |
7 /// A [ConstantEnvironment] provides access for constants compiled for variable | 7 /// A [ConstantEnvironment] provides access for constants compiled for variable |
8 /// initializers. | 8 /// initializers. |
9 abstract class ConstantEnvironment { | 9 abstract class ConstantEnvironment { |
10 /// Returns the constant for the initializer of [element]. | 10 /// Returns the constant for the initializer of [element]. |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 if (initializer == null) { | 144 if (initializer == null) { |
145 // No initial value. | 145 // No initial value. |
146 value = new NullConstant(); | 146 value = new NullConstant(); |
147 } else { | 147 } else { |
148 value = compileNodeWithDefinitions( | 148 value = compileNodeWithDefinitions( |
149 initializer, definitions, isConst: isConst); | 149 initializer, definitions, isConst: isConst); |
150 if (compiler.enableTypeAssertions && | 150 if (compiler.enableTypeAssertions && |
151 value != null && | 151 value != null && |
152 element.isField) { | 152 element.isField) { |
153 DartType elementType = element.type; | 153 DartType elementType = element.type; |
154 if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) { | 154 if (elementType.isMalformed && !value.isNull) { |
155 if (isConst) { | 155 if (isConst) { |
156 ErroneousElement element = elementType.element; | 156 ErroneousElement element = elementType.element; |
157 compiler.reportFatalError( | 157 compiler.reportFatalError( |
158 node, element.messageKind, element.messageArguments); | 158 node, element.messageKind, element.messageArguments); |
159 } else { | 159 } else { |
160 // We need to throw an exception at runtime. | 160 // We need to throw an exception at runtime. |
161 value = null; | 161 value = null; |
162 } | 162 } |
163 } else { | 163 } else { |
164 DartType constantType = value.computeType(compiler); | 164 DartType constantType = value.computeType(compiler); |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 Constant visitLiteralSymbol(LiteralSymbol node) { | 400 Constant visitLiteralSymbol(LiteralSymbol node) { |
401 InterfaceType type = compiler.symbolClass.rawType; | 401 InterfaceType type = compiler.symbolClass.rawType; |
402 List<Constant> createArguments(_) { | 402 List<Constant> createArguments(_) { |
403 return [constantSystem.createString( | 403 return [constantSystem.createString( |
404 new DartString.literal(node.slowNameString))]; | 404 new DartString.literal(node.slowNameString))]; |
405 } | 405 } |
406 return makeConstructedConstant( | 406 return makeConstructedConstant( |
407 node, type, compiler.symbolConstructor, createArguments); | 407 node, type, compiler.symbolConstructor, createArguments); |
408 } | 408 } |
409 | 409 |
410 Constant makeTypeConstant(TypeDeclarationElement element) { | 410 Constant makeTypeConstant(DartType elementType) { |
411 DartType elementType = element.rawType; | |
412 DartType constantType = | 411 DartType constantType = |
413 compiler.backend.typeImplementation.computeType(compiler); | 412 compiler.backend.typeImplementation.computeType(compiler); |
414 return new TypeConstant(elementType, constantType); | 413 return new TypeConstant(elementType, constantType); |
415 } | 414 } |
416 | 415 |
417 /// Returns true if the prefix of the send resolves to a deferred import | 416 /// Returns true if the prefix of the send resolves to a deferred import |
418 /// prefix. | 417 /// prefix. |
419 bool isDeferredUse(Send send) { | 418 bool isDeferredUse(Send send) { |
420 if (send == null) return false; | 419 if (send == null) return false; |
421 return compiler.deferredLoadTask | 420 return compiler.deferredLoadTask |
422 .deferredPrefixElement(send, elements) != null; | 421 .deferredPrefixElement(send, elements) != null; |
423 } | 422 } |
424 | 423 |
425 Constant visitIdentifier(Identifier node) { | 424 Constant visitIdentifier(Identifier node) { |
426 Element element = elements[node]; | 425 Element element = elements[node]; |
427 if (Elements.isClass(element) || Elements.isTypedef(element)) { | 426 if (Elements.isClass(element) || Elements.isTypedef(element)) { |
428 return makeTypeConstant(element); | 427 TypeDeclarationElement typeDeclarationElement = element; |
| 428 return makeTypeConstant(typeDeclarationElement.rawType); |
429 } | 429 } |
430 return signalNotCompileTimeConstant(node); | 430 return signalNotCompileTimeConstant(node); |
431 } | 431 } |
432 | 432 |
433 // TODO(floitsch): provide better error-messages. | 433 // TODO(floitsch): provide better error-messages. |
434 Constant visitSend(Send send) { | 434 Constant visitSend(Send send) { |
435 Element element = elements[send]; | 435 Element element = elements[send]; |
436 if (send.isPropertyAccess) { | 436 if (send.isPropertyAccess) { |
437 if (isDeferredUse(send)) { | 437 if (isDeferredUse(send)) { |
438 return signalNotCompileTimeConstant(send, | 438 return signalNotCompileTimeConstant(send, |
439 message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT); | 439 message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT); |
440 } | 440 } |
441 if (Elements.isStaticOrTopLevelFunction(element)) { | 441 if (Elements.isStaticOrTopLevelFunction(element)) { |
442 return new FunctionConstant(element); | 442 return new FunctionConstant(element); |
443 } else if (Elements.isStaticOrTopLevelField(element)) { | 443 } else if (Elements.isStaticOrTopLevelField(element)) { |
444 Constant result; | 444 Constant result; |
445 if (element.isConst) { | 445 if (element.isConst) { |
446 result = handler.compileConstant(element); | 446 result = handler.compileConstant(element); |
447 } else if (element.isFinal && !isEvaluatingConstant) { | 447 } else if (element.isFinal && !isEvaluatingConstant) { |
448 result = handler.compileVariable(element); | 448 result = handler.compileVariable(element); |
449 } | 449 } |
450 if (result != null) return result; | 450 if (result != null) return result; |
451 } else if (Elements.isClass(element) || Elements.isTypedef(element)) { | 451 } else if (Elements.isClass(element) || Elements.isTypedef(element)) { |
452 assert(elements.isTypeLiteral(send)); | 452 assert(elements.isTypeLiteral(send)); |
453 return makeTypeConstant(element); | 453 return makeTypeConstant(elements.getTypeLiteralType(send)); |
454 } else if (send.receiver != null) { | 454 } else if (send.receiver != null) { |
455 // Fall through to error handling. | 455 // Fall through to error handling. |
456 } else if (!Elements.isUnresolved(element) | 456 } else if (!Elements.isUnresolved(element) |
457 && element.isVariable | 457 && element.isVariable |
458 && element.isConst) { | 458 && element.isConst) { |
459 Constant result = handler.compileConstant(element); | 459 Constant result = handler.compileConstant(element); |
460 if (result != null) return result; | 460 if (result != null) return result; |
461 } | 461 } |
462 return signalNotCompileTimeConstant(send); | 462 return signalNotCompileTimeConstant(send); |
463 } else if (send.isCall) { | 463 } else if (send.isCall) { |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 if (fieldValue == null) { | 968 if (fieldValue == null) { |
969 // Use the default value. | 969 // Use the default value. |
970 fieldValue = handler.compileConstant(field); | 970 fieldValue = handler.compileConstant(field); |
971 } | 971 } |
972 jsNewArguments.add(fieldValue); | 972 jsNewArguments.add(fieldValue); |
973 }, | 973 }, |
974 includeSuperAndInjectedMembers: true); | 974 includeSuperAndInjectedMembers: true); |
975 return jsNewArguments; | 975 return jsNewArguments; |
976 } | 976 } |
977 } | 977 } |
OLD | NEW |