Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 13630) |
+++ runtime/vm/parser.cc (working copy) |
@@ -31,6 +31,8 @@ |
DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings."); |
DEFINE_FLAG(bool, warn_legacy_map_literal, false, |
"Warning on legacy map literal syntax (single type argument)"); |
+DEFINE_FLAG(bool, warn_legacy_dynamic, false, |
+ "Warning on legacy type Dynamic)"); |
static void CheckedModeHandler(bool value) { |
FLAG_enable_asserts = value; |
@@ -1014,7 +1016,7 @@ |
} else if (CurrentToken() == Token::kVAR) { |
ConsumeToken(); |
var_seen = true; |
- // The parameter type is the 'Dynamic' type. |
+ // The parameter type is the 'dynamic' type. |
parameter.type = &Type::ZoneHandle(Type::DynamicType()); |
} |
if (CurrentToken() == Token::kTHIS) { |
@@ -2872,7 +2874,7 @@ |
} |
ConsumeToken(); |
member.has_var = true; |
- // The member type is the 'Dynamic' type. |
+ // The member type is the 'dynamic' type. |
member.type = &Type::ZoneHandle(Type::DynamicType()); |
} else if (CurrentToken() == Token::kFACTORY) { |
ConsumeToken(); |
@@ -2996,7 +2998,7 @@ |
ErrorMsg("'(' expected"); |
} |
// The grammar allows a return type, so member.type is not always NULL here. |
- // If no return type is specified, the return type of the setter is Dynamic. |
+ // If no return type is specified, the return type of the setter is dynamic. |
if (member.type == NULL) { |
member.type = &Type::ZoneHandle(Type::DynamicType()); |
} |
@@ -3673,7 +3675,7 @@ |
if (malformed_error->IsNull() && type.IsMalformed()) { |
*malformed_error = type.malformed_error(); |
} |
- // Map a malformed type argument to Dynamic, so that malformed types with |
+ // Map a malformed type argument to dynamic, so that malformed types with |
// a resolved type class are handled properly in production mode. |
if (type.IsMalformed()) { |
ASSERT(finalization != ClassFinalizer::kCanonicalizeWellFormed); |
@@ -5163,7 +5165,7 @@ |
bool have_type = false; |
if (CurrentToken() == Token::kCONST) { |
ConsumeToken(); |
- have_type = true; // Type is Dynamic. |
+ have_type = true; // Type is dynamic. |
} |
if (IsIdentifier()) { // Type or variable name. |
Token::Kind follower = LookaheadToken(1); |
@@ -6078,7 +6080,7 @@ |
exception_param.var = ExpectIdentifier("identifier expected"); |
if (CurrentToken() == Token::kCOMMA) { |
ConsumeToken(); |
- // TODO(hausner): Make implicit type be StackTrace, not Dynamic. |
+ // TODO(hausner): Make implicit type be StackTrace, not dynamic. |
stack_trace_param.type = |
&AbstractType::ZoneHandle(Type::DynamicType()); |
stack_trace_param.token_pos = TokenPos(); |
@@ -6587,7 +6589,9 @@ |
ErrorMsg("%s", msg); |
} |
String* ident = CurrentLiteral(); |
- if (ident->Equals("Dynamic")) { |
+ // TODO(hausner): Remove check for 'Dynamic' once support for upper-case |
+ // type dynamic is gone. |
+ if (ident->Equals("Dynamic") || ident->Equals("dynamic")) { |
ErrorMsg("%s", msg); |
} |
ConsumeToken(); |
@@ -8372,6 +8376,16 @@ |
SkipQualIdent(); |
} else { |
ParseQualIdent(&type_name); |
+ // TODO(hausner): Remove this once support for legacy type 'Dynamic' |
+ // is removed. |
+ if ((type_name.lib_prefix == NULL) && type_name.ident->Equals("Dynamic")) { |
+ if (FLAG_warn_legacy_dynamic) { |
+ Warning(type_name.ident_pos, |
+ "legacy type 'Dynamic' found; auto-converting to 'dynamic'"); |
+ } |
+ // Replace with lower-case 'dynamic'. |
+ *type_name.ident ^= Symbols::Dynamic(); |
+ } |
// An identifier cannot be resolved in a local scope when top level parsing. |
if (!is_top_level_ && |
(type_name.lib_prefix == NULL) && |
@@ -8400,7 +8414,7 @@ |
} |
AbstractType& type = AbstractType::Handle( |
Type::New(type_class, type_arguments, type_name.ident_pos)); |
- // In production mode, malformed type arguments are mapped to Dynamic. |
+ // In production mode, malformed type arguments are mapped to dynamic. |
// In checked mode, a type with malformed type arguments is malformed. |
if (FLAG_enable_type_checks && !malformed_error.IsNull()) { |
Type& parameterized_type = Type::Handle(); |
@@ -8451,7 +8465,7 @@ |
AbstractType& element_type = Type::ZoneHandle(Type::DynamicType()); |
// If no type argument vector is provided, leave it as null, which is |
- // equivalent to using Dynamic as the type argument for the element type. |
+ // equivalent to using dynamic as the type argument for the element type. |
if (!type_arguments.IsNull()) { |
ASSERT(type_arguments.Length() > 0); |
// List literals take a single type argument. |
@@ -8621,7 +8635,7 @@ |
AbstractTypeArguments& map_type_arguments = |
AbstractTypeArguments::ZoneHandle(type_arguments.raw()); |
// If no type argument vector is provided, leave it as null, which is |
- // equivalent to using Dynamic as the type argument for the value type. |
+ // equivalent to using dynamic as the type argument for the value type. |
if (!map_type_arguments.IsNull()) { |
ASSERT(map_type_arguments.Length() > 0); |
// Map literals take two type arguments. |
@@ -8658,7 +8672,7 @@ |
ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2)); |
map_type_arguments ^= map_type_arguments.Canonicalize(); |
- // The kv_pair array is temporary and of element type Dynamic. It is passed |
+ // The kv_pair array is temporary and of element type dynamic. It is passed |
// to the factory to initialize a properly typed map. |
ArrayNode* kv_pairs = |
new ArrayNode(TokenPos(), Type::ZoneHandle(Type::ListInterface())); |