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 dart2js.resolution.members; | 5 library dart2js.resolution.members; |
6 | 6 |
7 import '../common/names.dart' show | 7 import '../common/names.dart' show |
8 Selectors; | 8 Selectors; |
9 import '../compiler.dart' show | 9 import '../compiler.dart' show |
10 Compiler; | 10 Compiler; |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 } | 406 } |
407 return new ElementResult(element); | 407 return new ElementResult(element); |
408 } | 408 } |
409 return const NoneResult(); | 409 return const NoneResult(); |
410 } | 410 } |
411 } | 411 } |
412 | 412 |
413 TypeResult visitTypeAnnotation(TypeAnnotation node) { | 413 TypeResult visitTypeAnnotation(TypeAnnotation node) { |
414 DartType type = resolveTypeAnnotation(node); | 414 DartType type = resolveTypeAnnotation(node); |
415 if (inCheckContext) { | 415 if (inCheckContext) { |
416 registry.registerIsCheck(type); | 416 registry.registerCheckedModeCheck(type); |
417 } | 417 } |
418 return new TypeResult(type); | 418 return new TypeResult(type); |
419 } | 419 } |
420 | 420 |
421 bool isNamedConstructor(Send node) => node.receiver != null; | 421 bool isNamedConstructor(Send node) => node.receiver != null; |
422 | 422 |
423 Selector getRedirectingThisOrSuperConstructorSelector(Send node) { | 423 Selector getRedirectingThisOrSuperConstructorSelector(Send node) { |
424 if (isNamedConstructor(node)) { | 424 if (isNamedConstructor(node)) { |
425 String constructorName = node.selector.asIdentifier().source; | 425 String constructorName = node.selector.asIdentifier().source; |
426 return new Selector.callConstructor( | 426 return new Selector.callConstructor( |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 }); | 492 }); |
493 addDeferredAction(enclosingElement, () { | 493 addDeferredAction(enclosingElement, () { |
494 functionParameters.forEachOptionalParameter( | 494 functionParameters.forEachOptionalParameter( |
495 (ParameterElementX parameter) { | 495 (ParameterElementX parameter) { |
496 parameter.constant = | 496 parameter.constant = |
497 compiler.resolver.constantCompiler.compileConstant(parameter); | 497 compiler.resolver.constantCompiler.compileConstant(parameter); |
498 }); | 498 }); |
499 }); | 499 }); |
500 if (inCheckContext) { | 500 if (inCheckContext) { |
501 functionParameters.forEachParameter((ParameterElement element) { | 501 functionParameters.forEachParameter((ParameterElement element) { |
502 registry.registerIsCheck(element.type); | 502 registry.registerCheckedModeCheck(element.type); |
503 }); | 503 }); |
504 } | 504 } |
505 } | 505 } |
506 | 506 |
507 ResolutionResult visitAssert(Assert node) { | 507 ResolutionResult visitAssert(Assert node) { |
508 if (!compiler.enableAssertMessage) { | 508 if (!compiler.enableAssertMessage) { |
509 if (node.hasMessage) { | 509 if (node.hasMessage) { |
510 compiler.reportErrorMessage( | 510 compiler.reportErrorMessage( |
511 node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); | 511 node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE); |
512 } | 512 } |
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1182 return const NoneResult(); | 1182 return const NoneResult(); |
1183 } | 1183 } |
1184 | 1184 |
1185 /// Handle a type cast expression, like `a as T`. | 1185 /// Handle a type cast expression, like `a as T`. |
1186 ResolutionResult handleAs(Send node) { | 1186 ResolutionResult handleAs(Send node) { |
1187 Node expression = node.receiver; | 1187 Node expression = node.receiver; |
1188 visitExpression(expression); | 1188 visitExpression(expression); |
1189 | 1189 |
1190 Node typeNode = node.arguments.head; | 1190 Node typeNode = node.arguments.head; |
1191 DartType type = resolveTypeAnnotation(typeNode); | 1191 DartType type = resolveTypeAnnotation(typeNode); |
1192 registry.registerAsCheck(type); | 1192 registry.registerAsCast(type); |
1193 registry.registerSendStructure(node, new AsStructure(type)); | 1193 registry.registerSendStructure(node, new AsStructure(type)); |
1194 return const NoneResult(); | 1194 return const NoneResult(); |
1195 } | 1195 } |
1196 | 1196 |
1197 /// Handle the unary expression of an unresolved unary operator [text], like | 1197 /// Handle the unary expression of an unresolved unary operator [text], like |
1198 /// the no longer supported `+a`. | 1198 /// the no longer supported `+a`. |
1199 ResolutionResult handleUnresolvedUnary(Send node, String text) { | 1199 ResolutionResult handleUnresolvedUnary(Send node, String text) { |
1200 Node expression = node.receiver; | 1200 Node expression = node.receiver; |
1201 if (node.isSuperCall) { | 1201 if (node.isSuperCall) { |
1202 checkSuperAccess(node); | 1202 checkSuperAccess(node); |
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1944 MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, | 1944 MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, |
1945 {'typeVariableName': name}, | 1945 {'typeVariableName': name}, |
1946 isError: true); | 1946 isError: true); |
1947 registry.registerCompileTimeError(error); | 1947 registry.registerCompileTimeError(error); |
1948 semantics = new StaticAccess.invalid(error); | 1948 semantics = new StaticAccess.invalid(error); |
1949 // TODO(johnniwinther): Clean up registration of elements and selectors | 1949 // TODO(johnniwinther): Clean up registration of elements and selectors |
1950 // for this case. | 1950 // for this case. |
1951 } else { | 1951 } else { |
1952 semantics = new StaticAccess.typeParameterTypeLiteral(element); | 1952 semantics = new StaticAccess.typeParameterTypeLiteral(element); |
1953 } | 1953 } |
1954 registry.registerTypeVariableExpression(element); | |
1955 | 1954 |
1956 registry.useElement(node, element); | 1955 registry.useElement(node, element); |
1957 registry.registerTypeLiteral(node, element.type); | 1956 registry.registerTypeLiteral(node, element.type); |
1958 | 1957 |
1959 if (node.isCall) { | 1958 if (node.isCall) { |
1960 CallStructure callStructure = | 1959 CallStructure callStructure = |
1961 resolveArguments(node.argumentsNode).callStructure; | 1960 resolveArguments(node.argumentsNode).callStructure; |
1962 Selector selector = callStructure.callSelector; | 1961 Selector selector = callStructure.callSelector; |
1963 // TODO(23998): Remove this when all information goes through | 1962 // TODO(23998): Remove this when all information goes through |
1964 // the [SendStructure]. | 1963 // the [SendStructure]. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1997 MessageKind.IF_NULL_ASSIGNING_TYPE, const {}); | 1996 MessageKind.IF_NULL_ASSIGNING_TYPE, const {}); |
1998 // TODO(23998): Remove these when all information goes through | 1997 // TODO(23998): Remove these when all information goes through |
1999 // the [SendStructure]. | 1998 // the [SendStructure]. |
2000 registry.useElement(node.selector, element); | 1999 registry.useElement(node.selector, element); |
2001 } else { | 2000 } else { |
2002 error = reportAndCreateErroneousElement( | 2001 error = reportAndCreateErroneousElement( |
2003 node.selector, name.text, | 2002 node.selector, name.text, |
2004 MessageKind.ASSIGNING_TYPE, const {}); | 2003 MessageKind.ASSIGNING_TYPE, const {}); |
2005 } | 2004 } |
2006 | 2005 |
2007 if (node.isComplex) { | |
2008 // We read the type variable before trying write to it. | |
2009 registry.registerTypeVariableExpression(element); | |
2010 } | |
2011 | |
2012 // TODO(23998): Remove this when all information goes through | 2006 // TODO(23998): Remove this when all information goes through |
2013 // the [SendStructure]. | 2007 // the [SendStructure]. |
2014 registry.useElement(node, error); | 2008 registry.useElement(node, error); |
| 2009 // TODO(johnniwinther): Register only on read? |
2015 registry.registerTypeLiteral(node, element.type); | 2010 registry.registerTypeLiteral(node, element.type); |
2016 registry.registerThrowNoSuchMethod(); | 2011 registry.registerThrowNoSuchMethod(); |
2017 semantics = new StaticAccess.typeParameterTypeLiteral(element); | 2012 semantics = new StaticAccess.typeParameterTypeLiteral(element); |
2018 } | 2013 } |
2019 return handleUpdate(node, name, semantics); | 2014 return handleUpdate(node, name, semantics); |
2020 } | 2015 } |
2021 | 2016 |
2022 /// Handle access to a constant type literal of [type]. | 2017 /// Handle access to a constant type literal of [type]. |
2023 // TODO(johnniwinther): Remove [name] when [Selector] is not required for the | 2018 // TODO(johnniwinther): Remove [name] when [Selector] is not required for the |
2024 // the [GetStructure]. | 2019 // the [GetStructure]. |
(...skipping 1975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4000 compiler, this, inConstContext: inConstContext)); | 3995 compiler, this, inConstContext: inConstContext)); |
4001 } | 3996 } |
4002 | 3997 |
4003 DartType resolveTypeAnnotation(TypeAnnotation node, | 3998 DartType resolveTypeAnnotation(TypeAnnotation node, |
4004 {bool malformedIsError: false, | 3999 {bool malformedIsError: false, |
4005 bool deferredIsMalformed: true}) { | 4000 bool deferredIsMalformed: true}) { |
4006 DartType type = typeResolver.resolveTypeAnnotation( | 4001 DartType type = typeResolver.resolveTypeAnnotation( |
4007 this, node, malformedIsError: malformedIsError, | 4002 this, node, malformedIsError: malformedIsError, |
4008 deferredIsMalformed: deferredIsMalformed); | 4003 deferredIsMalformed: deferredIsMalformed); |
4009 if (inCheckContext) { | 4004 if (inCheckContext) { |
4010 registry.registerIsCheck(type); | 4005 registry.registerCheckedModeCheck(type); |
4011 registry.registerRequiredType(type, enclosingElement); | 4006 registry.registerRequiredType(type, enclosingElement); |
4012 } | 4007 } |
4013 return type; | 4008 return type; |
4014 } | 4009 } |
4015 | 4010 |
4016 ResolutionResult visitLiteralList(LiteralList node) { | 4011 ResolutionResult visitLiteralList(LiteralList node) { |
4017 bool isValidAsConstant = true; | 4012 bool isValidAsConstant = true; |
4018 sendIsMemberAccess = false; | 4013 sendIsMemberAccess = false; |
4019 | 4014 |
4020 NodeList arguments = node.typeArguments; | 4015 NodeList arguments = node.typeArguments; |
(...skipping 19 matching lines...) Expand all Loading... |
4040 if (node.isConst && typeArgument.containsTypeVariables) { | 4035 if (node.isConst && typeArgument.containsTypeVariables) { |
4041 compiler.reportErrorMessage( | 4036 compiler.reportErrorMessage( |
4042 arguments.nodes.head, | 4037 arguments.nodes.head, |
4043 MessageKind.TYPE_VARIABLE_IN_CONSTANT); | 4038 MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
4044 isValidAsConstant = false; | 4039 isValidAsConstant = false; |
4045 } | 4040 } |
4046 listType = coreTypes.listType(typeArgument); | 4041 listType = coreTypes.listType(typeArgument); |
4047 } else { | 4042 } else { |
4048 listType = coreTypes.listType(); | 4043 listType = coreTypes.listType(); |
4049 } | 4044 } |
4050 registry.setType(node, listType); | 4045 registry.registerLiteralList( |
4051 registry.registerInstantiatedType(listType); | 4046 node, |
| 4047 listType, |
| 4048 isConstant: node.isConst, |
| 4049 isEmpty: node.elements.isEmpty); |
4052 registry.registerRequiredType(listType, enclosingElement); | 4050 registry.registerRequiredType(listType, enclosingElement); |
4053 if (node.isConst) { | 4051 if (node.isConst) { |
4054 List<ConstantExpression> constantExpressions = <ConstantExpression>[]; | 4052 List<ConstantExpression> constantExpressions = <ConstantExpression>[]; |
4055 inConstantContext(() { | 4053 inConstantContext(() { |
4056 for (Node element in node.elements) { | 4054 for (Node element in node.elements) { |
4057 ResolutionResult elementResult = visit(element); | 4055 ResolutionResult elementResult = visit(element); |
4058 if (isValidAsConstant && elementResult.isConstant) { | 4056 if (isValidAsConstant && elementResult.isConstant) { |
4059 constantExpressions.add(elementResult.constant); | 4057 constantExpressions.add(elementResult.constant); |
4060 } else { | 4058 } else { |
4061 isValidAsConstant = false; | 4059 isValidAsConstant = false; |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4361 mapType = coreTypes.mapType(keyTypeArgument, valueTypeArgument); | 4359 mapType = coreTypes.mapType(keyTypeArgument, valueTypeArgument); |
4362 } else { | 4360 } else { |
4363 mapType = coreTypes.mapType(); | 4361 mapType = coreTypes.mapType(); |
4364 } | 4362 } |
4365 if (node.isConst && mapType.containsTypeVariables) { | 4363 if (node.isConst && mapType.containsTypeVariables) { |
4366 compiler.reportErrorMessage( | 4364 compiler.reportErrorMessage( |
4367 arguments, | 4365 arguments, |
4368 MessageKind.TYPE_VARIABLE_IN_CONSTANT); | 4366 MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
4369 isValidAsConstant = false; | 4367 isValidAsConstant = false; |
4370 } | 4368 } |
4371 registry.registerMapLiteral(node, mapType, node.isConst); | 4369 registry.registerMapLiteral( |
| 4370 node, |
| 4371 mapType, |
| 4372 isConstant: node.isConst, |
| 4373 isEmpty: node.entries.isEmpty); |
4372 registry.registerRequiredType(mapType, enclosingElement); | 4374 registry.registerRequiredType(mapType, enclosingElement); |
4373 if (node.isConst) { | 4375 if (node.isConst) { |
4374 | 4376 |
4375 List<ConstantExpression> keyExpressions = <ConstantExpression>[]; | 4377 List<ConstantExpression> keyExpressions = <ConstantExpression>[]; |
4376 List<ConstantExpression> valueExpressions = <ConstantExpression>[]; | 4378 List<ConstantExpression> valueExpressions = <ConstantExpression>[]; |
4377 inConstantContext(() { | 4379 inConstantContext(() { |
4378 for (LiteralMapEntry entry in node.entries) { | 4380 for (LiteralMapEntry entry in node.entries) { |
4379 ResolutionResult keyResult = visit(entry.key); | 4381 ResolutionResult keyResult = visit(entry.key); |
4380 ResolutionResult valueResult = visit(entry.value); | 4382 ResolutionResult valueResult = visit(entry.value); |
4381 if (isValidAsConstant && | 4383 if (isValidAsConstant && |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4688 } | 4690 } |
4689 return const NoneResult(); | 4691 return const NoneResult(); |
4690 } | 4692 } |
4691 } | 4693 } |
4692 | 4694 |
4693 /// Looks up [name] in [scope] and unwraps the result. | 4695 /// Looks up [name] in [scope] and unwraps the result. |
4694 Element lookupInScope(Compiler compiler, Node node, | 4696 Element lookupInScope(Compiler compiler, Node node, |
4695 Scope scope, String name) { | 4697 Scope scope, String name) { |
4696 return Elements.unwrap(scope.lookup(name), compiler, node); | 4698 return Elements.unwrap(scope.lookup(name), compiler, node); |
4697 } | 4699 } |
OLD | NEW |