Chromium Code Reviews| 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 #include "vm/parser.h" | 5 #include "vm/parser.h" |
| 6 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 namespace dart { | 22 namespace dart { |
| 23 | 23 |
| 24 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements."); | 24 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements."); |
| 25 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks."); | 25 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks."); |
| 26 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); | 26 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations."); |
| 27 DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors."); | 27 DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors."); |
| 28 DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings."); | 28 DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings."); |
| 29 | 29 |
| 30 // All references to Dart names are listed here. | 30 // All references to Dart names are listed here. |
| 31 static const char* kAssertionErrorName = "AssertionError"; | 31 static const char* kAssertionErrorName = "AssertionError"; |
| 32 static const char* kTypeErrorName = "TypeError"; | |
| 32 static const char* kFallThroughErrorName = "FallThroughError"; | 33 static const char* kFallThroughErrorName = "FallThroughError"; |
| 33 static const char* kStaticResolutionExceptionName = "StaticResolutionException"; | 34 static const char* kStaticResolutionExceptionName = "StaticResolutionException"; |
| 34 static const char* kThrowNewName = "_throwNew"; | 35 static const char* kThrowNewName = "_throwNew"; |
| 35 static const char* kListLiteralFactoryClassName = "_ListLiteralFactory"; | 36 static const char* kListLiteralFactoryClassName = "_ListLiteralFactory"; |
| 36 static const char* kListLiteralFactoryName = "List.fromLiteral"; | 37 static const char* kListLiteralFactoryName = "List.fromLiteral"; |
| 37 static const char* kMapLiteralFactoryClassName = "_MapLiteralFactory"; | 38 static const char* kMapLiteralFactoryClassName = "_MapLiteralFactory"; |
| 38 static const char* kMapLiteralFactoryName = "Map.fromLiteral"; | 39 static const char* kMapLiteralFactoryName = "Map.fromLiteral"; |
| 39 static const char* kImmutableMapName = "ImmutableMap"; | 40 static const char* kImmutableMapName = "ImmutableMap"; |
| 40 static const char* kImmutableMapConstructorName = "ImmutableMap._create"; | 41 static const char* kImmutableMapConstructorName = "ImmutableMap._create"; |
| 41 static const char* kStringClassName = "StringBase"; | 42 static const char* kStringClassName = "StringBase"; |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 811 // We have an identifier followed by a 'follower' token. | 812 // We have an identifier followed by a 'follower' token. |
| 812 // We either parse a type or assume that no type is specified. | 813 // We either parse a type or assume that no type is specified. |
| 813 if ((follower == Token::kLT) || // Parameterized type. | 814 if ((follower == Token::kLT) || // Parameterized type. |
| 814 (follower == Token::kPERIOD) || // Qualified class name of type. | 815 (follower == Token::kPERIOD) || // Qualified class name of type. |
| 815 Token::IsIdentifier(follower) || // Parameter name following a type. | 816 Token::IsIdentifier(follower) || // Parameter name following a type. |
| 816 (follower == Token::kTHIS)) { // Field parameter following a type. | 817 (follower == Token::kTHIS)) { // Field parameter following a type. |
| 817 // The types of formal parameters are never ignored, even in unchecked | 818 // The types of formal parameters are never ignored, even in unchecked |
| 818 // mode, because they are part of the function type of closurized | 819 // mode, because they are part of the function type of closurized |
| 819 // functions appearing in type tests with typedefs. | 820 // functions appearing in type tests with typedefs. |
| 820 parameter.type = &AbstractType::ZoneHandle( | 821 parameter.type = &AbstractType::ZoneHandle( |
| 821 ParseType(is_top_level_ ? kCanResolve : kMustResolve)); | 822 ParseType(is_top_level_ ? ClassFinalizer::kTryResolve : |
| 823 ClassFinalizer::kFinalize)); | |
| 822 } else { | 824 } else { |
| 823 parameter.type = &Type::ZoneHandle(Type::DynamicType()); | 825 parameter.type = &Type::ZoneHandle(Type::DynamicType()); |
| 824 } | 826 } |
| 825 } | 827 } |
| 826 if (!this_seen && (CurrentToken() == Token::kTHIS)) { | 828 if (!this_seen && (CurrentToken() == Token::kTHIS)) { |
| 827 ConsumeToken(); | 829 ConsumeToken(); |
| 828 ExpectToken(Token::kPERIOD); | 830 ExpectToken(Token::kPERIOD); |
| 829 this_seen = true; | 831 this_seen = true; |
| 830 parameter.is_field_initializer = true; | 832 parameter.is_field_initializer = true; |
| 831 } | 833 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 873 signature_function, | 875 signature_function, |
| 874 script_); | 876 script_); |
| 875 // Record the function signature class in the current library. | 877 // Record the function signature class in the current library. |
| 876 library_.AddClass(signature_class); | 878 library_.AddClass(signature_class); |
| 877 } else { | 879 } else { |
| 878 signature_function.set_signature_class(signature_class); | 880 signature_function.set_signature_class(signature_class); |
| 879 } | 881 } |
| 880 ASSERT(signature_function.signature_class() == signature_class.raw()); | 882 ASSERT(signature_function.signature_class() == signature_class.raw()); |
| 881 Type& signature_type = Type::ZoneHandle(signature_class.SignatureType()); | 883 Type& signature_type = Type::ZoneHandle(signature_class.SignatureType()); |
| 882 if (!is_top_level_ && !signature_type.IsFinalized()) { | 884 if (!is_top_level_ && !signature_type.IsFinalized()) { |
| 883 signature_type ^= | 885 signature_type ^= ClassFinalizer::FinalizeType( |
| 884 ClassFinalizer::FinalizeType(signature_class, signature_type); | 886 signature_class, signature_type, ClassFinalizer::kFinalize); |
| 885 } | 887 } |
| 886 // The type of the parameter is now the signature type. | 888 // The type of the parameter is now the signature type. |
| 887 parameter.type = &signature_type; | 889 parameter.type = &signature_type; |
| 888 } | 890 } |
| 889 } | 891 } |
| 890 | 892 |
| 891 if (CurrentToken() == Token::kASSIGN) { | 893 if (CurrentToken() == Token::kASSIGN) { |
| 892 if (!params->has_named_optional_parameters || | 894 if (!params->has_named_optional_parameters || |
| 893 !allow_explicit_default_value) { | 895 !allow_explicit_default_value) { |
| 894 ErrorMsg("parameter must not specify a default value"); | 896 ErrorMsg("parameter must not specify a default value"); |
| (...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2338 (follower == Token::kGET) || // Getter following a type. | 2340 (follower == Token::kGET) || // Getter following a type. |
| 2339 (follower == Token::kSET) || // Setter following a type. | 2341 (follower == Token::kSET) || // Setter following a type. |
| 2340 (follower == Token::kOPERATOR) || // Operator following a type. | 2342 (follower == Token::kOPERATOR) || // Operator following a type. |
| 2341 (Token::IsIdentifier(follower)) || // Member name following a type. | 2343 (Token::IsIdentifier(follower)) || // Member name following a type. |
| 2342 ((follower == Token::kPERIOD) && // Qualified class name of type, | 2344 ((follower == Token::kPERIOD) && // Qualified class name of type, |
| 2343 (LookaheadToken(3) != Token::kLPAREN))) { // but not a named constr. | 2345 (LookaheadToken(3) != Token::kLPAREN))) { // but not a named constr. |
| 2344 ASSERT(is_top_level_); | 2346 ASSERT(is_top_level_); |
| 2345 // The declared type of fields is never ignored, even in unchecked mode, | 2347 // The declared type of fields is never ignored, even in unchecked mode, |
| 2346 // because getters and setters could be closurized at some time (not | 2348 // because getters and setters could be closurized at some time (not |
| 2347 // supported yet). | 2349 // supported yet). |
| 2348 member.type = &AbstractType::ZoneHandle(ParseType(kCanResolve)); | 2350 member.type = &AbstractType::ZoneHandle( |
| 2351 ParseType(ClassFinalizer::kTryResolve)); | |
| 2349 } | 2352 } |
| 2350 } | 2353 } |
| 2351 } | 2354 } |
| 2352 Token::Kind operator_token = Token::kILLEGAL; | 2355 Token::Kind operator_token = Token::kILLEGAL; |
| 2353 // Optionally parse a (possibly named) constructor name or factory. | 2356 // Optionally parse a (possibly named) constructor name or factory. |
| 2354 if (IsIdentifier() && | 2357 if (IsIdentifier() && |
| 2355 (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) { | 2358 (CurrentLiteral()->Equals(members->class_name()) || member.has_factory)) { |
| 2356 if (member.has_factory) { | 2359 if (member.has_factory) { |
| 2357 // The factory name may be qualified. | 2360 // The factory name may be qualified. |
| 2358 QualIdent factory_name; | 2361 QualIdent factory_name; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2523 } | 2526 } |
| 2524 } | 2527 } |
| 2525 ASSERT(!cls.IsNull()); | 2528 ASSERT(!cls.IsNull()); |
| 2526 ASSERT(cls.functions() == Array::Empty()); | 2529 ASSERT(cls.functions() == Array::Empty()); |
| 2527 set_current_class(cls); | 2530 set_current_class(cls); |
| 2528 ParseTypeParameters(cls); | 2531 ParseTypeParameters(cls); |
| 2529 Type& super_type = Type::Handle(); | 2532 Type& super_type = Type::Handle(); |
| 2530 if (CurrentToken() == Token::kEXTENDS) { | 2533 if (CurrentToken() == Token::kEXTENDS) { |
| 2531 ConsumeToken(); | 2534 ConsumeToken(); |
| 2532 const intptr_t type_pos = token_index_; | 2535 const intptr_t type_pos = token_index_; |
| 2533 const AbstractType& type = AbstractType::Handle(ParseType(kCanResolve)); | 2536 const AbstractType& type = AbstractType::Handle( |
| 2537 ParseType(ClassFinalizer::kTryResolve)); | |
| 2534 if (type.IsTypeParameter()) { | 2538 if (type.IsTypeParameter()) { |
| 2535 ErrorMsg(type_pos, | 2539 ErrorMsg(type_pos, |
| 2536 "class '%s' may not extend type parameter '%s'", | 2540 "class '%s' may not extend type parameter '%s'", |
| 2537 class_name.ToCString(), | 2541 class_name.ToCString(), |
| 2538 String::Handle(type.Name()).ToCString()); | 2542 String::Handle(type.Name()).ToCString()); |
| 2539 } | 2543 } |
| 2540 super_type ^= type.raw(); | 2544 super_type ^= type.raw(); |
| 2541 if (super_type.IsInterfaceType()) { | 2545 if (super_type.IsInterfaceType()) { |
| 2542 ErrorMsg(type_pos, | 2546 ErrorMsg(type_pos, |
| 2543 "class '%s' may implement, but cannot extend interface '%s'", | 2547 "class '%s' may implement, but cannot extend interface '%s'", |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2672 set_current_class(alias_owner); | 2676 set_current_class(alias_owner); |
| 2673 | 2677 |
| 2674 // Parse the result type of the function type. | 2678 // Parse the result type of the function type. |
| 2675 AbstractType& result_type = Type::Handle(Type::DynamicType()); | 2679 AbstractType& result_type = Type::Handle(Type::DynamicType()); |
| 2676 if (CurrentToken() == Token::kVOID) { | 2680 if (CurrentToken() == Token::kVOID) { |
| 2677 ConsumeToken(); | 2681 ConsumeToken(); |
| 2678 result_type = Type::VoidType(); | 2682 result_type = Type::VoidType(); |
| 2679 } else if (!IsFunctionTypeAliasName()) { | 2683 } else if (!IsFunctionTypeAliasName()) { |
| 2680 // Type annotations in typedef are never ignored, even in unchecked mode. | 2684 // Type annotations in typedef are never ignored, even in unchecked mode. |
| 2681 // Wait until we have an owner class before resolving the result type. | 2685 // Wait until we have an owner class before resolving the result type. |
| 2682 result_type = ParseType(kDoNotResolve); | 2686 result_type = ParseType(ClassFinalizer::kDoNotResolve); |
| 2683 } | 2687 } |
| 2684 | 2688 |
| 2685 const intptr_t alias_name_pos = token_index_; | 2689 const intptr_t alias_name_pos = token_index_; |
| 2686 const String* alias_name = | 2690 const String* alias_name = |
| 2687 ExpectTypeIdentifier("function alias name expected"); | 2691 ExpectTypeIdentifier("function alias name expected"); |
| 2688 | 2692 |
| 2689 // Parse the type parameters of the function type. | 2693 // Parse the type parameters of the function type. |
| 2690 ParseTypeParameters(alias_owner); | 2694 ParseTypeParameters(alias_owner); |
| 2691 // At this point, the type parameters have been parsed, so we can resolve the | 2695 // At this point, the type parameters have been parsed, so we can resolve the |
| 2692 // result type. | 2696 // result type. |
| 2693 if (!result_type.IsNull()) { | 2697 if (!result_type.IsNull()) { |
| 2694 ResolveTypeFromClass(alias_owner, kCanResolve, &result_type); | 2698 ResolveTypeFromClass(alias_owner, |
| 2699 ClassFinalizer::kTryResolve, | |
| 2700 &result_type); | |
| 2695 } | 2701 } |
| 2696 // Parse the formal parameters of the function type. | 2702 // Parse the formal parameters of the function type. |
| 2697 if (CurrentToken() != Token::kLPAREN) { | 2703 if (CurrentToken() != Token::kLPAREN) { |
| 2698 ErrorMsg("formal parameter list expected"); | 2704 ErrorMsg("formal parameter list expected"); |
| 2699 } | 2705 } |
| 2700 ParamList func_params; | 2706 ParamList func_params; |
| 2701 const bool no_explicit_default_values = false; | 2707 const bool no_explicit_default_values = false; |
| 2702 ParseFormalParameterList(no_explicit_default_values, &func_params); | 2708 ParseFormalParameterList(no_explicit_default_values, &func_params); |
| 2703 // The field 'is_static' has no meaning for signature functions. | 2709 // The field 'is_static' has no meaning for signature functions. |
| 2704 Function& signature_function = Function::Handle( | 2710 Function& signature_function = Function::Handle( |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2913 if (CurrentToken() != Token::kIDENT) { | 2919 if (CurrentToken() != Token::kIDENT) { |
| 2914 ErrorMsg("type parameter name expected"); | 2920 ErrorMsg("type parameter name expected"); |
| 2915 } | 2921 } |
| 2916 String& type_parameter_name = *CurrentLiteral(); | 2922 String& type_parameter_name = *CurrentLiteral(); |
| 2917 AbstractType& type_parameter = TypeParameter::ZoneHandle( | 2923 AbstractType& type_parameter = TypeParameter::ZoneHandle( |
| 2918 TypeParameter::New(index, type_parameter_name, token_index_)); | 2924 TypeParameter::New(index, type_parameter_name, token_index_)); |
| 2919 ConsumeToken(); | 2925 ConsumeToken(); |
| 2920 AbstractType& bound = Type::ZoneHandle(Type::DynamicType()); | 2926 AbstractType& bound = Type::ZoneHandle(Type::DynamicType()); |
| 2921 if (CurrentToken() == Token::kEXTENDS) { | 2927 if (CurrentToken() == Token::kEXTENDS) { |
| 2922 ConsumeToken(); | 2928 ConsumeToken(); |
| 2923 bound = ParseType(kCanResolve); | 2929 bound = ParseType(ClassFinalizer::kTryResolve); |
| 2924 } | 2930 } |
| 2925 type_parameters_array.Add(&type_parameter); | 2931 type_parameters_array.Add(&type_parameter); |
| 2926 bounds_array.Add(&bound); | 2932 bounds_array.Add(&bound); |
| 2927 index++; | 2933 index++; |
| 2928 } while (CurrentToken() == Token::kCOMMA); | 2934 } while (CurrentToken() == Token::kCOMMA); |
| 2929 Token::Kind token = CurrentToken(); | 2935 Token::Kind token = CurrentToken(); |
| 2930 if ((token == Token::kGT) || (token == Token::kSHR)) { | 2936 if ((token == Token::kGT) || (token == Token::kSHR)) { |
| 2931 ConsumeRightAngleBracket(); | 2937 ConsumeRightAngleBracket(); |
| 2932 } else { | 2938 } else { |
| 2933 ErrorMsg("right angle bracket expected"); | 2939 ErrorMsg("right angle bracket expected"); |
| 2934 } | 2940 } |
| 2935 const TypeArguments& type_parameters = | 2941 const TypeArguments& type_parameters = |
| 2936 TypeArguments::Handle(NewTypeArguments(type_parameters_array)); | 2942 TypeArguments::Handle(NewTypeArguments(type_parameters_array)); |
| 2937 const TypeArguments& bounds = | 2943 const TypeArguments& bounds = |
| 2938 TypeArguments::Handle(NewTypeArguments(bounds_array)); | 2944 TypeArguments::Handle(NewTypeArguments(bounds_array)); |
| 2939 cls.set_type_parameters(type_parameters); | 2945 cls.set_type_parameters(type_parameters); |
| 2940 cls.set_type_parameter_bounds(bounds); | 2946 cls.set_type_parameter_bounds(bounds); |
| 2941 // Try to resolve the upper bounds, which will at least resolve the | 2947 // Try to resolve the upper bounds, which will at least resolve the |
| 2942 // referenced type parameters. | 2948 // referenced type parameters. |
| 2943 AbstractType& bound = AbstractType::Handle(); | 2949 AbstractType& bound = AbstractType::Handle(); |
| 2944 const intptr_t num_types = bounds.Length(); | 2950 const intptr_t num_types = bounds.Length(); |
| 2945 for (intptr_t i = 0; i < num_types; i++) { | 2951 for (intptr_t i = 0; i < num_types; i++) { |
| 2946 bound = bounds.TypeAt(i); | 2952 bound = bounds.TypeAt(i); |
| 2947 ResolveTypeFromClass(cls, kCanResolve, &bound); | 2953 ResolveTypeFromClass(cls, ClassFinalizer::kTryResolve, &bound); |
| 2948 bounds.SetTypeAt(i, bound); | 2954 bounds.SetTypeAt(i, bound); |
| 2949 } | 2955 } |
| 2950 } | 2956 } |
| 2951 } | 2957 } |
| 2952 | 2958 |
| 2953 | 2959 |
| 2954 RawAbstractTypeArguments* Parser::ParseTypeArguments( | 2960 RawAbstractTypeArguments* Parser::ParseTypeArguments( |
| 2955 TypeResolution type_resolution) { | 2961 Error* malformed_error, |
| 2962 ClassFinalizer::TypeFinalization finalization) { | |
| 2956 TRACE_PARSER("ParseTypeArguments"); | 2963 TRACE_PARSER("ParseTypeArguments"); |
| 2957 if (CurrentToken() == Token::kLT) { | 2964 if (CurrentToken() == Token::kLT) { |
| 2958 GrowableArray<AbstractType*> types; | 2965 GrowableArray<AbstractType*> types; |
| 2959 do { | 2966 do { |
| 2960 ConsumeToken(); | 2967 ConsumeToken(); |
| 2961 AbstractType& type = AbstractType::ZoneHandle(ParseType(type_resolution)); | 2968 AbstractType& type = AbstractType::ZoneHandle(ParseType(finalization)); |
| 2962 types.Add(&type); | 2969 types.Add(&type); |
| 2970 // Only keep the error for the first malformed type argument. | |
| 2971 if (malformed_error->IsNull() && type.IsMalformed()) { | |
| 2972 *malformed_error = type.malformed_error(); | |
| 2973 } | |
| 2963 } while (CurrentToken() == Token::kCOMMA); | 2974 } while (CurrentToken() == Token::kCOMMA); |
| 2964 Token::Kind token = CurrentToken(); | 2975 Token::Kind token = CurrentToken(); |
| 2965 if ((token == Token::kGT) || (token == Token::kSHR)) { | 2976 if ((token == Token::kGT) || (token == Token::kSHR)) { |
| 2966 ConsumeRightAngleBracket(); | 2977 ConsumeRightAngleBracket(); |
| 2967 } else { | 2978 } else { |
| 2968 ErrorMsg("right angle bracket expected"); | 2979 ErrorMsg("right angle bracket expected"); |
| 2969 } | 2980 } |
| 2970 if (type_resolution != kIgnore) { | 2981 if (finalization != ClassFinalizer::kIgnore) { |
| 2971 return NewTypeArguments(types); | 2982 return NewTypeArguments(types); |
| 2972 } | 2983 } |
| 2973 } | 2984 } |
| 2974 return TypeArguments::null(); | 2985 return TypeArguments::null(); |
| 2975 } | 2986 } |
| 2976 | 2987 |
| 2977 | 2988 |
| 2978 // Parse and return an array of interface types. | 2989 // Parse and return an array of interface types. |
| 2979 RawArray* Parser::ParseInterfaceList() { | 2990 RawArray* Parser::ParseInterfaceList() { |
| 2980 TRACE_PARSER("ParseInterfaceList"); | 2991 TRACE_PARSER("ParseInterfaceList"); |
| 2981 ASSERT((CurrentToken() == Token::kIMPLEMENTS) || | 2992 ASSERT((CurrentToken() == Token::kIMPLEMENTS) || |
| 2982 (CurrentToken() == Token::kEXTENDS)); | 2993 (CurrentToken() == Token::kEXTENDS)); |
| 2983 GrowableArray<AbstractType*> interfaces; | 2994 GrowableArray<AbstractType*> interfaces; |
| 2984 String& interface_name = String::Handle(); | 2995 String& interface_name = String::Handle(); |
| 2985 do { | 2996 do { |
| 2986 ConsumeToken(); | 2997 ConsumeToken(); |
| 2987 intptr_t supertype_pos = token_index_; | 2998 intptr_t supertype_pos = token_index_; |
| 2988 AbstractType& interface = AbstractType::ZoneHandle(ParseType(kCanResolve)); | 2999 AbstractType& interface = AbstractType::ZoneHandle( |
| 3000 ParseType(ClassFinalizer::kTryResolve)); | |
| 2989 interface_name = interface.Name(); | 3001 interface_name = interface.Name(); |
| 2990 for (int i = 0; i < interfaces.length(); i++) { | 3002 for (int i = 0; i < interfaces.length(); i++) { |
| 2991 String& other_name = String::Handle(interfaces[i]->Name()); | 3003 String& other_name = String::Handle(interfaces[i]->Name()); |
| 2992 if (interface_name.Equals(other_name)) { | 3004 if (interface_name.Equals(other_name)) { |
| 2993 ErrorMsg(supertype_pos, "Duplicate supertype '%s'", | 3005 ErrorMsg(supertype_pos, "Duplicate supertype '%s'", |
| 2994 interface_name.ToCString()); | 3006 interface_name.ToCString()); |
| 2995 } | 3007 } |
| 2996 } | 3008 } |
| 2997 interfaces.Add(&interface); | 3009 interfaces.Add(&interface); |
| 2998 } while (CurrentToken() == Token::kCOMMA); | 3010 } while (CurrentToken() == Token::kCOMMA); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3042 cls_interfaces = NewArray<AbstractType>(all_interfaces); | 3054 cls_interfaces = NewArray<AbstractType>(all_interfaces); |
| 3043 cls.set_interfaces(cls_interfaces); | 3055 cls.set_interfaces(cls_interfaces); |
| 3044 } | 3056 } |
| 3045 | 3057 |
| 3046 | 3058 |
| 3047 void Parser::ParseTopLevelVariable(TopLevel* top_level) { | 3059 void Parser::ParseTopLevelVariable(TopLevel* top_level) { |
| 3048 TRACE_PARSER("ParseTopLevelVariable"); | 3060 TRACE_PARSER("ParseTopLevelVariable"); |
| 3049 const bool is_final = (CurrentToken() == Token::kFINAL); | 3061 const bool is_final = (CurrentToken() == Token::kFINAL); |
| 3050 const bool is_static = true; | 3062 const bool is_static = true; |
| 3051 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( | 3063 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( |
| 3052 FLAG_enable_type_checks ? kCanResolve : kIgnore)); | 3064 FLAG_enable_type_checks ? ClassFinalizer::kTryResolve : |
| 3053 | 3065 ClassFinalizer::kIgnore)); |
| 3054 while (true) { | 3066 while (true) { |
| 3055 const intptr_t name_pos = token_index_; | 3067 const intptr_t name_pos = token_index_; |
| 3056 String& var_name = *ExpectIdentifier("variable name expected"); | 3068 String& var_name = *ExpectIdentifier("variable name expected"); |
| 3057 | 3069 |
| 3058 if (library_.LookupObject(var_name) != Object::null()) { | 3070 if (library_.LookupObject(var_name) != Object::null()) { |
| 3059 ErrorMsg(name_pos, "'%s' is already defined", var_name.ToCString()); | 3071 ErrorMsg(name_pos, "'%s' is already defined", var_name.ToCString()); |
| 3060 } | 3072 } |
| 3061 String& accessor_name = String::Handle(Field::GetterName(var_name)); | 3073 String& accessor_name = String::Handle(Field::GetterName(var_name)); |
| 3062 if (library_.LookupObject(accessor_name) != Object::null()) { | 3074 if (library_.LookupObject(accessor_name) != Object::null()) { |
| 3063 ErrorMsg(name_pos, "getter for '%s' is already defined", | 3075 ErrorMsg(name_pos, "getter for '%s' is already defined", |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3106 TRACE_PARSER("ParseTopLevelFunction"); | 3118 TRACE_PARSER("ParseTopLevelFunction"); |
| 3107 AbstractType& result_type = Type::Handle(Type::DynamicType()); | 3119 AbstractType& result_type = Type::Handle(Type::DynamicType()); |
| 3108 const bool is_static = true; | 3120 const bool is_static = true; |
| 3109 if (CurrentToken() == Token::kVOID) { | 3121 if (CurrentToken() == Token::kVOID) { |
| 3110 ConsumeToken(); | 3122 ConsumeToken(); |
| 3111 result_type = Type::VoidType(); | 3123 result_type = Type::VoidType(); |
| 3112 } else { | 3124 } else { |
| 3113 // Parse optional type. | 3125 // Parse optional type. |
| 3114 if ((CurrentToken() == Token::kIDENT) && | 3126 if ((CurrentToken() == Token::kIDENT) && |
| 3115 (LookaheadToken(1) != Token::kLPAREN)) { | 3127 (LookaheadToken(1) != Token::kLPAREN)) { |
| 3116 result_type = ParseType(kCanResolve); | 3128 result_type = ParseType(ClassFinalizer::kTryResolve); |
| 3117 } | 3129 } |
| 3118 } | 3130 } |
| 3119 const intptr_t name_pos = token_index_; | 3131 const intptr_t name_pos = token_index_; |
| 3120 const String& func_name = *ExpectIdentifier("function name expected"); | 3132 const String& func_name = *ExpectIdentifier("function name expected"); |
| 3121 | 3133 |
| 3122 if (library_.LookupObject(func_name) != Object::null()) { | 3134 if (library_.LookupObject(func_name) != Object::null()) { |
| 3123 ErrorMsg(name_pos, "'%s' is already defined", func_name.ToCString()); | 3135 ErrorMsg(name_pos, "'%s' is already defined", func_name.ToCString()); |
| 3124 } | 3136 } |
| 3125 String& accessor_name = String::Handle(Field::GetterName(func_name)); | 3137 String& accessor_name = String::Handle(Field::GetterName(func_name)); |
| 3126 if (library_.LookupObject(accessor_name) != Object::null()) { | 3138 if (library_.LookupObject(accessor_name) != Object::null()) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3173 bool is_getter = (CurrentToken() == Token::kGET); | 3185 bool is_getter = (CurrentToken() == Token::kGET); |
| 3174 if (CurrentToken() == Token::kGET || | 3186 if (CurrentToken() == Token::kGET || |
| 3175 CurrentToken() == Token::kSET) { | 3187 CurrentToken() == Token::kSET) { |
| 3176 ConsumeToken(); | 3188 ConsumeToken(); |
| 3177 result_type = Type::DynamicType(); | 3189 result_type = Type::DynamicType(); |
| 3178 } else { | 3190 } else { |
| 3179 if (CurrentToken() == Token::kVOID) { | 3191 if (CurrentToken() == Token::kVOID) { |
| 3180 ConsumeToken(); | 3192 ConsumeToken(); |
| 3181 result_type = Type::VoidType(); | 3193 result_type = Type::VoidType(); |
| 3182 } else { | 3194 } else { |
| 3183 result_type = ParseType(kCanResolve); | 3195 result_type = ParseType(ClassFinalizer::kTryResolve); |
| 3184 } | 3196 } |
| 3185 is_getter = (CurrentToken() == Token::kGET); | 3197 is_getter = (CurrentToken() == Token::kGET); |
| 3186 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { | 3198 if (CurrentToken() == Token::kGET || CurrentToken() == Token::kSET) { |
| 3187 ConsumeToken(); | 3199 ConsumeToken(); |
| 3188 } else { | 3200 } else { |
| 3189 UnexpectedToken(); | 3201 UnexpectedToken(); |
| 3190 } | 3202 } |
| 3191 } | 3203 } |
| 3192 const intptr_t name_pos = token_index_; | 3204 const intptr_t name_pos = token_index_; |
| 3193 const String* field_name = ExpectIdentifier("accessor name expected"); | 3205 const String* field_name = ExpectIdentifier("accessor name expected"); |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3700 } | 3712 } |
| 3701 if (is_final) { | 3713 if (is_final) { |
| 3702 variable->set_is_final(); | 3714 variable->set_is_final(); |
| 3703 } | 3715 } |
| 3704 return initialization; | 3716 return initialization; |
| 3705 } | 3717 } |
| 3706 | 3718 |
| 3707 | 3719 |
| 3708 // Parses ('var' | 'final' [type] | type). | 3720 // Parses ('var' | 'final' [type] | type). |
| 3709 // The presence of 'final' must be detected and remembered before the call. | 3721 // The presence of 'final' must be detected and remembered before the call. |
| 3710 // If a type is parsed, it is resolved (or not) according to type_resolution. | 3722 // If a type is parsed, it may be resolved and finalized according to the given |
| 3711 RawAbstractType* Parser::ParseFinalVarOrType(TypeResolution type_resolution) { | 3723 // type finalization mode. |
| 3724 RawAbstractType* Parser::ParseFinalVarOrType( | |
| 3725 ClassFinalizer::TypeFinalization finalization) { | |
| 3712 TRACE_PARSER("ParseFinalVarOrType"); | 3726 TRACE_PARSER("ParseFinalVarOrType"); |
| 3713 if (CurrentToken() == Token::kVAR) { | 3727 if (CurrentToken() == Token::kVAR) { |
| 3714 ConsumeToken(); | 3728 ConsumeToken(); |
| 3715 return Type::DynamicType(); | 3729 return Type::DynamicType(); |
| 3716 } | 3730 } |
| 3717 bool type_is_optional = false; | 3731 bool type_is_optional = false; |
| 3718 if (CurrentToken() == Token::kFINAL) { | 3732 if (CurrentToken() == Token::kFINAL) { |
| 3719 ConsumeToken(); | 3733 ConsumeToken(); |
| 3720 type_is_optional = true; | 3734 type_is_optional = true; |
| 3721 } | 3735 } |
| 3722 if (CurrentToken() != Token::kIDENT) { | 3736 if (CurrentToken() != Token::kIDENT) { |
| 3723 if (type_is_optional) { | 3737 if (type_is_optional) { |
| 3724 return Type::DynamicType(); | 3738 return Type::DynamicType(); |
| 3725 } else { | 3739 } else { |
| 3726 ErrorMsg("type name expected"); | 3740 ErrorMsg("type name expected"); |
| 3727 } | 3741 } |
| 3728 } | 3742 } |
| 3729 if (type_is_optional) { | 3743 if (type_is_optional) { |
| 3730 Token::Kind follower = LookaheadToken(1); | 3744 Token::Kind follower = LookaheadToken(1); |
| 3731 // We have an identifier followed by a 'follower' token. | 3745 // We have an identifier followed by a 'follower' token. |
| 3732 // We either parse a type or return now. | 3746 // We either parse a type or return now. |
| 3733 if ((follower != Token::kLT) && // Parameterized type. | 3747 if ((follower != Token::kLT) && // Parameterized type. |
| 3734 (follower != Token::kPERIOD) && // Qualified class name of type. | 3748 (follower != Token::kPERIOD) && // Qualified class name of type. |
| 3735 !Token::IsIdentifier(follower) && // Variable name following a type. | 3749 !Token::IsIdentifier(follower) && // Variable name following a type. |
| 3736 (follower != Token::kTHIS)) { // Field parameter following a type. | 3750 (follower != Token::kTHIS)) { // Field parameter following a type. |
| 3737 return Type::DynamicType(); | 3751 return Type::DynamicType(); |
| 3738 } | 3752 } |
| 3739 } | 3753 } |
| 3740 return ParseType(type_resolution); | 3754 return ParseType(finalization); |
| 3741 } | 3755 } |
| 3742 | 3756 |
| 3743 | 3757 |
| 3744 // Returns ast nodes of the variable initialization. Variables without an | 3758 // Returns ast nodes of the variable initialization. Variables without an |
| 3745 // explicit initializer are initialized to null. If several variables are | 3759 // explicit initializer are initialized to null. If several variables are |
| 3746 // declared, the individual initializers are collected in a sequence node. | 3760 // declared, the individual initializers are collected in a sequence node. |
| 3747 AstNode* Parser::ParseVariableDeclarationList() { | 3761 AstNode* Parser::ParseVariableDeclarationList() { |
| 3748 TRACE_PARSER("ParseVariableDeclarationList"); | 3762 TRACE_PARSER("ParseVariableDeclarationList"); |
| 3749 bool is_final = (CurrentToken() == Token::kFINAL); | 3763 bool is_final = (CurrentToken() == Token::kFINAL); |
| 3750 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( | 3764 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( |
| 3751 FLAG_enable_type_checks ? kMustResolve : kIgnore)); | 3765 FLAG_enable_type_checks ? ClassFinalizer::kFinalize : |
| 3766 ClassFinalizer::kIgnore)); | |
| 3752 if (!IsIdentifier()) { | 3767 if (!IsIdentifier()) { |
| 3753 ErrorMsg("identifier expected"); | 3768 ErrorMsg("identifier expected"); |
| 3754 } | 3769 } |
| 3755 | 3770 |
| 3756 AstNode* initializers = ParseVariableDeclaration(type, is_final); | 3771 AstNode* initializers = ParseVariableDeclaration(type, is_final); |
| 3757 ASSERT(initializers != NULL); | 3772 ASSERT(initializers != NULL); |
| 3758 while (CurrentToken() == Token::kCOMMA) { | 3773 while (CurrentToken() == Token::kCOMMA) { |
| 3759 ConsumeToken(); | 3774 ConsumeToken(); |
| 3760 if (!IsIdentifier()) { | 3775 if (!IsIdentifier()) { |
| 3761 ErrorMsg("identifier expected after comma"); | 3776 ErrorMsg("identifier expected after comma"); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 3777 AbstractType& result_type = AbstractType::Handle(); | 3792 AbstractType& result_type = AbstractType::Handle(); |
| 3778 const String* variable_name = NULL; | 3793 const String* variable_name = NULL; |
| 3779 const String* function_name = NULL; | 3794 const String* function_name = NULL; |
| 3780 | 3795 |
| 3781 result_type = Type::DynamicType(); | 3796 result_type = Type::DynamicType(); |
| 3782 if (CurrentToken() == Token::kVOID) { | 3797 if (CurrentToken() == Token::kVOID) { |
| 3783 ConsumeToken(); | 3798 ConsumeToken(); |
| 3784 result_type = Type::VoidType(); | 3799 result_type = Type::VoidType(); |
| 3785 } else if ((CurrentToken() == Token::kIDENT) && | 3800 } else if ((CurrentToken() == Token::kIDENT) && |
| 3786 (LookaheadToken(1) != Token::kLPAREN)) { | 3801 (LookaheadToken(1) != Token::kLPAREN)) { |
| 3787 result_type = ParseType(kMustResolve); | 3802 result_type = ParseType(ClassFinalizer::kFinalize); |
| 3788 } | 3803 } |
| 3789 const intptr_t ident_pos = token_index_; | 3804 const intptr_t ident_pos = token_index_; |
| 3790 if (IsIdentifier()) { | 3805 if (IsIdentifier()) { |
| 3791 variable_name = CurrentLiteral(); | 3806 variable_name = CurrentLiteral(); |
| 3792 function_name = variable_name; | 3807 function_name = variable_name; |
| 3793 ConsumeToken(); | 3808 ConsumeToken(); |
| 3794 } else { | 3809 } else { |
| 3795 if (!is_literal) { | 3810 if (!is_literal) { |
| 3796 ErrorMsg("function name expected"); | 3811 ErrorMsg("function name expected"); |
| 3797 } | 3812 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3878 // Patch the function type now that the signature is known. | 3893 // Patch the function type now that the signature is known. |
| 3879 // We need to create a new type for proper finalization, since the existing | 3894 // We need to create a new type for proper finalization, since the existing |
| 3880 // type is already marked as finalized. | 3895 // type is already marked as finalized. |
| 3881 Type& signature_type = Type::Handle(signature_class.SignatureType()); | 3896 Type& signature_type = Type::Handle(signature_class.SignatureType()); |
| 3882 const AbstractTypeArguments& signature_type_arguments = | 3897 const AbstractTypeArguments& signature_type_arguments = |
| 3883 AbstractTypeArguments::Handle(signature_type.arguments()); | 3898 AbstractTypeArguments::Handle(signature_type.arguments()); |
| 3884 | 3899 |
| 3885 // Since the signature type is cached by the signature class, it may have | 3900 // Since the signature type is cached by the signature class, it may have |
| 3886 // been finalized already. | 3901 // been finalized already. |
| 3887 if (!signature_type.IsFinalized()) { | 3902 if (!signature_type.IsFinalized()) { |
| 3888 signature_type ^= | 3903 signature_type ^= ClassFinalizer::FinalizeType( |
| 3889 ClassFinalizer::FinalizeType(signature_class, signature_type); | 3904 signature_class, signature_type, ClassFinalizer::kFinalize); |
| 3890 // The call to ClassFinalizer::FinalizeType may have | 3905 // The call to ClassFinalizer::FinalizeType may have |
| 3891 // extended the vector of type arguments. | 3906 // extended the vector of type arguments. |
| 3892 ASSERT(signature_type_arguments.IsNull() || | 3907 ASSERT(signature_type_arguments.IsNull() || |
| 3893 (signature_type_arguments.Length() == | 3908 (signature_type_arguments.Length() == |
| 3894 signature_class.NumTypeArguments())); | 3909 signature_class.NumTypeArguments())); |
| 3895 // The signature_class should not have changed. | 3910 // The signature_class should not have changed. |
| 3896 ASSERT(signature_type.type_class() == signature_class.raw()); | 3911 ASSERT(signature_type.type_class() == signature_class.raw()); |
| 3897 } | 3912 } |
| 3898 | 3913 |
| 3899 // Now patch the function type of the variable. | 3914 // Now patch the function type of the variable. |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4424 bool is_final = (CurrentToken() == Token::kFINAL); | 4439 bool is_final = (CurrentToken() == Token::kFINAL); |
| 4425 const String* loop_var_name = NULL; | 4440 const String* loop_var_name = NULL; |
| 4426 LocalVariable* loop_var = NULL; | 4441 LocalVariable* loop_var = NULL; |
| 4427 intptr_t loop_var_pos = 0; | 4442 intptr_t loop_var_pos = 0; |
| 4428 if (LookaheadToken(1) == Token::kIN) { | 4443 if (LookaheadToken(1) == Token::kIN) { |
| 4429 loop_var_pos = token_index_; | 4444 loop_var_pos = token_index_; |
| 4430 loop_var_name = ExpectIdentifier("variable name expected"); | 4445 loop_var_name = ExpectIdentifier("variable name expected"); |
| 4431 } else { | 4446 } else { |
| 4432 // The case without a type is handled above, so require a type here. | 4447 // The case without a type is handled above, so require a type here. |
| 4433 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( | 4448 const AbstractType& type = AbstractType::ZoneHandle(ParseFinalVarOrType( |
| 4434 FLAG_enable_type_checks ? kMustResolve : kIgnore)); | 4449 FLAG_enable_type_checks ? ClassFinalizer::kFinalize : |
| 4450 ClassFinalizer::kIgnore)); | |
| 4435 loop_var_pos = token_index_; | 4451 loop_var_pos = token_index_; |
| 4436 loop_var_name = ExpectIdentifier("variable name expected"); | 4452 loop_var_name = ExpectIdentifier("variable name expected"); |
| 4437 loop_var = new LocalVariable(loop_var_pos, *loop_var_name, type); | 4453 loop_var = new LocalVariable(loop_var_pos, *loop_var_name, type); |
| 4438 if (is_final) { | 4454 if (is_final) { |
| 4439 loop_var->set_is_final(); | 4455 loop_var->set_is_final(); |
| 4440 } | 4456 } |
| 4441 } | 4457 } |
| 4442 ExpectToken(Token::kIN); | 4458 ExpectToken(Token::kIN); |
| 4443 const intptr_t collection_pos = token_index_; | 4459 const intptr_t collection_pos = token_index_; |
| 4444 AstNode* collection_expr = ParseExpr(kAllowConst); | 4460 AstNode* collection_expr = ParseExpr(kAllowConst); |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4683 | 4699 |
| 4684 | 4700 |
| 4685 // Parse the parameter specified in the catch clause. | 4701 // Parse the parameter specified in the catch clause. |
| 4686 void Parser::ParseCatchParameter(CatchParamDesc* catch_param) { | 4702 void Parser::ParseCatchParameter(CatchParamDesc* catch_param) { |
| 4687 TRACE_PARSER("ParseCatchParameter"); | 4703 TRACE_PARSER("ParseCatchParameter"); |
| 4688 ASSERT(catch_param != NULL); | 4704 ASSERT(catch_param != NULL); |
| 4689 catch_param->is_final = (CurrentToken() == Token::kFINAL); | 4705 catch_param->is_final = (CurrentToken() == Token::kFINAL); |
| 4690 // The type of the catch parameter must always be resolved, even in unchecked | 4706 // The type of the catch parameter must always be resolved, even in unchecked |
| 4691 // mode. | 4707 // mode. |
| 4692 catch_param->type = &AbstractType::ZoneHandle( | 4708 catch_param->type = &AbstractType::ZoneHandle( |
| 4693 ParseFinalVarOrType(kMustResolve)); | 4709 ParseFinalVarOrType(ClassFinalizer::kFinalizeWellFormed)); |
| 4694 catch_param->token_index = token_index_; | 4710 catch_param->token_index = token_index_; |
| 4695 catch_param->var = ExpectIdentifier("identifier expected"); | 4711 catch_param->var = ExpectIdentifier("identifier expected"); |
| 4696 } | 4712 } |
| 4697 | 4713 |
| 4698 | 4714 |
| 4699 // Populate local scope of the catch block with the catch parameters. | 4715 // Populate local scope of the catch block with the catch parameters. |
| 4700 void Parser::AddCatchParamsToScope(const CatchParamDesc& exception_param, | 4716 void Parser::AddCatchParamsToScope(const CatchParamDesc& exception_param, |
| 4701 const CatchParamDesc& stack_trace_param, | 4717 const CatchParamDesc& stack_trace_param, |
| 4702 LocalScope* scope) { | 4718 LocalScope* scope) { |
| 4703 ASSERT(exception_param.var != NULL); | 4719 ASSERT(exception_param.var != NULL); |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5215 new LoadLocalNode(statement_pos, *trace_var)); | 5231 new LoadLocalNode(statement_pos, *trace_var)); |
| 5216 } | 5232 } |
| 5217 } else { | 5233 } else { |
| 5218 statement = ParseExpr(kAllowConst); | 5234 statement = ParseExpr(kAllowConst); |
| 5219 ExpectSemicolon(); | 5235 ExpectSemicolon(); |
| 5220 } | 5236 } |
| 5221 return statement; | 5237 return statement; |
| 5222 } | 5238 } |
| 5223 | 5239 |
| 5224 | 5240 |
| 5225 // Static | |
| 5226 RawError* Parser::FormatError(const Script& script, | 5241 RawError* Parser::FormatError(const Script& script, |
| 5227 intptr_t token_index, | 5242 intptr_t token_index, |
| 5228 const char* message_header, | 5243 const char* message_header, |
| 5229 const char* format, | 5244 const char* format, |
| 5230 va_list args) { | 5245 va_list args) { |
| 5231 const intptr_t kMessageBufferSize = 512; | 5246 const intptr_t kMessageBufferSize = 512; |
| 5232 char message_buffer[kMessageBufferSize]; | 5247 char message_buffer[kMessageBufferSize]; |
| 5233 FormatMessage(script, token_index, message_header, | 5248 FormatMessage(script, token_index, message_header, |
| 5234 message_buffer, kMessageBufferSize, | 5249 message_buffer, kMessageBufferSize, |
| 5235 format, args); | 5250 format, args); |
| 5236 const String& msg = String::Handle(String::New(message_buffer)); | 5251 const String& msg = String::Handle(String::New(message_buffer)); |
| 5237 return LanguageError::New(msg); | 5252 return LanguageError::New(msg); |
| 5238 } | 5253 } |
| 5239 | 5254 |
| 5240 | 5255 |
| 5241 // Static. | |
| 5242 void Parser::FormatMessage(const Script& script, | 5256 void Parser::FormatMessage(const Script& script, |
| 5243 intptr_t token_index, | 5257 intptr_t token_index, |
| 5244 const char* message_header, | 5258 const char* message_header, |
| 5245 char* message_buffer, | 5259 char* message_buffer, |
| 5246 intptr_t message_buffer_size, | 5260 intptr_t message_buffer_size, |
| 5247 const char* format, va_list args) { | 5261 const char* format, va_list args) { |
| 5248 intptr_t msg_len = 0; | 5262 intptr_t msg_len = 0; |
| 5249 if (!script.IsNull()) { | 5263 if (!script.IsNull()) { |
| 5250 const String& script_url = String::CheckedHandle(script.url()); | 5264 const String& script_url = String::CheckedHandle(script.url()); |
| 5251 if (token_index >= 0) { | 5265 if (token_index >= 0) { |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5455 if (op_kind != Token::kIS) { | 5469 if (op_kind != Token::kIS) { |
| 5456 right_operand = ParseBinaryExpr(current_preced + 1); | 5470 right_operand = ParseBinaryExpr(current_preced + 1); |
| 5457 } else { | 5471 } else { |
| 5458 // For 'is' we expect the right operand to be a type. | 5472 // For 'is' we expect the right operand to be a type. |
| 5459 if (CurrentToken() == Token::kNOT) { | 5473 if (CurrentToken() == Token::kNOT) { |
| 5460 ConsumeToken(); | 5474 ConsumeToken(); |
| 5461 op_kind = Token::kISNOT; | 5475 op_kind = Token::kISNOT; |
| 5462 } | 5476 } |
| 5463 const intptr_t type_pos = token_index_; | 5477 const intptr_t type_pos = token_index_; |
| 5464 const AbstractType& type = | 5478 const AbstractType& type = |
| 5465 AbstractType::ZoneHandle(ParseType(kMustResolve)); | 5479 AbstractType::ZoneHandle(ParseType(ClassFinalizer::kFinalize)); |
| 5466 if (!type.IsInstantiated() && | 5480 if (!type.IsInstantiated() && |
| 5467 (current_block_->scope->function_level() > 0)) { | 5481 (current_block_->scope->function_level() > 0)) { |
| 5468 // Make sure that the instantiator is captured. | 5482 // Make sure that the instantiator is captured. |
| 5469 CaptureReceiver(); | 5483 CaptureReceiver(); |
| 5470 } | 5484 } |
| 5471 right_operand = new TypeNode(type_pos, type); | 5485 right_operand = new TypeNode(type_pos, type); |
| 5486 if (type.IsMalformed()) { | |
|
srdjan
2012/02/29 00:15:54
Could you factor this code out please.
regis
2012/02/29 02:10:01
Done.
| |
| 5487 // Throw a new TypeError. | |
| 5488 ArgumentListNode* arguments = new ArgumentListNode(op_pos); | |
| 5489 // Location argument. | |
| 5490 arguments->Add(new LiteralNode( | |
| 5491 type_pos, Integer::ZoneHandle(Integer::New(type_pos)))); | |
| 5492 // Src value argument. | |
| 5493 arguments->Add(new LiteralNode(type_pos, Instance::ZoneHandle())); | |
| 5494 // Dst type name argument. | |
| 5495 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( | |
| 5496 String::NewSymbol("malformed type")))); | |
| 5497 // Dst type name argument. | |
| 5498 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( | |
| 5499 String::NewSymbol("")))); | |
| 5500 // Malformed type error. | |
| 5501 const Error& error = Error::Handle(type.malformed_error()); | |
| 5502 arguments->Add(new LiteralNode(type_pos, String::ZoneHandle( | |
| 5503 String::NewSymbol(error.ToErrorCString())))); | |
| 5504 return MakeStaticCall(kTypeErrorName, kThrowNewName, arguments); | |
| 5505 break; | |
| 5506 } | |
| 5472 } | 5507 } |
| 5473 if (Token::IsRelationalOperator(op_kind) | 5508 if (Token::IsRelationalOperator(op_kind) |
| 5474 || Token::IsInstanceofOperator(op_kind) | 5509 || Token::IsInstanceofOperator(op_kind) |
| 5475 || Token::IsEqualityOperator(op_kind)) { | 5510 || Token::IsEqualityOperator(op_kind)) { |
| 5476 left_operand = new ComparisonNode( | 5511 left_operand = new ComparisonNode( |
| 5477 op_pos, op_kind, left_operand, right_operand); | 5512 op_pos, op_kind, left_operand, right_operand); |
| 5478 break; // Equality and relational operators cannot be chained. | 5513 break; // Equality and relational operators cannot be chained. |
| 5479 } else { | 5514 } else { |
| 5480 StringConcatNode* str_concat = NULL; | 5515 StringConcatNode* str_concat = NULL; |
| 5481 if (op_kind == Token::kADD) { | 5516 if (op_kind == Token::kADD) { |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6243 if (incr_op_node == NULL) { | 6278 if (incr_op_node == NULL) { |
| 6244 Unimplemented("incr op not implemented"); | 6279 Unimplemented("incr op not implemented"); |
| 6245 } | 6280 } |
| 6246 postfix_expr = incr_op_node; | 6281 postfix_expr = incr_op_node; |
| 6247 } | 6282 } |
| 6248 return postfix_expr; | 6283 return postfix_expr; |
| 6249 } | 6284 } |
| 6250 | 6285 |
| 6251 | 6286 |
| 6252 // Resolve the given type and its type arguments from the given scope class | 6287 // Resolve the given type and its type arguments from the given scope class |
| 6253 // according to the given type_resolution. | 6288 // according to the given type finalization mode. |
| 6254 // If the given scope class is null, use the current library, but do not try to | 6289 // If the given scope class is null, use the current library, but do not try to |
| 6255 // resolve type parameters. | 6290 // resolve type parameters. |
| 6256 // Not all involved type classes may get resolved yet, but at least the type | 6291 // Not all involved type classes may get resolved yet, but at least the type |
| 6257 // parameters of the given class will get resolved, thereby relieving the class | 6292 // parameters of the given class will get resolved, thereby relieving the class |
| 6258 // finalizer from resolving type parameters out of context. | 6293 // finalizer from resolving type parameters out of context. |
| 6259 void Parser::ResolveTypeFromClass(const Class& scope_class, | 6294 void Parser::ResolveTypeFromClass(const Class& scope_class, |
| 6260 TypeResolution type_resolution, | 6295 ClassFinalizer::TypeFinalization finalization, |
| 6261 AbstractType* type) { | 6296 AbstractType* type) { |
| 6262 ASSERT((type_resolution == kCanResolve) || (type_resolution == kMustResolve)); | 6297 ASSERT(finalization >= ClassFinalizer::kTryResolve); |
| 6263 ASSERT(type != NULL); | 6298 ASSERT(type != NULL); |
| 6264 if (type->IsResolved()) { | 6299 if (type->IsResolved()) { |
| 6265 return; | 6300 return; |
| 6266 } | 6301 } |
| 6267 // Resolve class. | 6302 // Resolve class. |
| 6268 if (!type->HasResolvedTypeClass()) { | 6303 if (!type->HasResolvedTypeClass()) { |
| 6269 const UnresolvedClass& unresolved_class = | 6304 const UnresolvedClass& unresolved_class = |
| 6270 UnresolvedClass::Handle(type->unresolved_class()); | 6305 UnresolvedClass::Handle(type->unresolved_class()); |
| 6271 const String& unresolved_class_name = | 6306 const String& unresolved_class_name = |
| 6272 String::Handle(unresolved_class.ident()); | 6307 String::Handle(unresolved_class.ident()); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 6290 } | 6325 } |
| 6291 } | 6326 } |
| 6292 // Global lookup in current library. | 6327 // Global lookup in current library. |
| 6293 resolved_type_class = library_.LookupClass(unresolved_class_name); | 6328 resolved_type_class = library_.LookupClass(unresolved_class_name); |
| 6294 } else { | 6329 } else { |
| 6295 LibraryPrefix& lib_prefix = | 6330 LibraryPrefix& lib_prefix = |
| 6296 LibraryPrefix::Handle(unresolved_class.library_prefix()); | 6331 LibraryPrefix::Handle(unresolved_class.library_prefix()); |
| 6297 // Local lookup in library prefix scope. | 6332 // Local lookup in library prefix scope. |
| 6298 resolved_type_class = lib_prefix.LookupLocalClass(unresolved_class_name); | 6333 resolved_type_class = lib_prefix.LookupLocalClass(unresolved_class_name); |
| 6299 } | 6334 } |
| 6335 // At this point, we can only have a parameterized_type. | |
| 6336 Type& parameterized_type = Type::Handle(); | |
| 6337 parameterized_type ^= type->raw(); | |
| 6300 if (!resolved_type_class.IsNull()) { | 6338 if (!resolved_type_class.IsNull()) { |
| 6301 Object& type_class = Object::Handle(resolved_type_class.raw()); | 6339 Object& type_class = Object::Handle(resolved_type_class.raw()); |
| 6302 ASSERT(type->IsType()); | |
| 6303 // Replace unresolved class with resolved type class. | 6340 // Replace unresolved class with resolved type class. |
| 6304 Type& parameterized_type = Type::Handle(); | |
| 6305 parameterized_type ^= type->raw(); | |
| 6306 parameterized_type.set_type_class(type_class); | 6341 parameterized_type.set_type_class(type_class); |
| 6307 } else if (type_resolution == kMustResolve) { | 6342 } else if (finalization >= ClassFinalizer::kFinalize) { |
| 6308 ErrorMsg(type->token_index(), "type '%s' is not loaded", | 6343 // The type is malformed. |
| 6309 String::Handle(type->Name()).ToCString()); | 6344 ClassFinalizer::FinalizeMalformedType( |
| 6345 current_class(), parameterized_type, finalization, | |
| 6346 "type '%s' is not loaded", | |
| 6347 String::Handle(parameterized_type.Name()).ToCString()); | |
| 6310 } | 6348 } |
| 6311 } | 6349 } |
| 6312 // Resolve type arguments, if any. | 6350 // Resolve type arguments, if any. |
| 6313 const AbstractTypeArguments& arguments = | 6351 const AbstractTypeArguments& arguments = |
| 6314 AbstractTypeArguments::Handle(type->arguments()); | 6352 AbstractTypeArguments::Handle(type->arguments()); |
| 6315 if (!arguments.IsNull()) { | 6353 if (!arguments.IsNull()) { |
| 6316 const intptr_t num_arguments = arguments.Length(); | 6354 const intptr_t num_arguments = arguments.Length(); |
| 6317 for (intptr_t i = 0; i < num_arguments; i++) { | 6355 for (intptr_t i = 0; i < num_arguments; i++) { |
| 6318 AbstractType& type_argument = AbstractType::Handle(arguments.TypeAt(i)); | 6356 AbstractType& type_argument = AbstractType::Handle(arguments.TypeAt(i)); |
| 6319 ResolveTypeFromClass(scope_class, | 6357 ResolveTypeFromClass(scope_class, finalization, &type_argument); |
| 6320 type_resolution, | |
| 6321 &type_argument); | |
| 6322 arguments.SetTypeAt(i, type_argument); | 6358 arguments.SetTypeAt(i, type_argument); |
| 6323 } | 6359 } |
| 6324 } | 6360 } |
| 6325 } | 6361 } |
| 6326 | 6362 |
| 6327 | 6363 |
| 6328 LocalVariable* Parser::LookupLocalScope(const String& ident) { | 6364 LocalVariable* Parser::LookupLocalScope(const String& ident) { |
| 6329 if (current_block_ == NULL) { | 6365 if (current_block_ == NULL) { |
| 6330 return NULL; | 6366 return NULL; |
| 6331 } | 6367 } |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6747 String& map_name = String::Handle(library_.LookupImportMap(ident)); | 6783 String& map_name = String::Handle(library_.LookupImportMap(ident)); |
| 6748 if (!map_name.IsNull()) { | 6784 if (!map_name.IsNull()) { |
| 6749 return map_name.raw(); | 6785 return map_name.raw(); |
| 6750 } | 6786 } |
| 6751 ErrorMsg(ident_pos, "import variable '%s' has not been defined", | 6787 ErrorMsg(ident_pos, "import variable '%s' has not been defined", |
| 6752 ident.ToCString()); | 6788 ident.ToCString()); |
| 6753 return String::null(); | 6789 return String::null(); |
| 6754 } | 6790 } |
| 6755 | 6791 |
| 6756 | 6792 |
| 6757 // Parses type = [ident "."] ident ["<" type { "," type } ">"] and resolve it | 6793 // Parses type = [ident "."] ident ["<" type { "," type } ">"], then resolve and |
| 6758 // according to the given type_resolution. | 6794 // finalize it according to the given type finalization mode. |
| 6759 RawAbstractType* Parser::ParseType(TypeResolution type_resolution) { | 6795 RawAbstractType* Parser::ParseType( |
| 6796 ClassFinalizer::TypeFinalization finalization) { | |
| 6760 TRACE_PARSER("ParseType"); | 6797 TRACE_PARSER("ParseType"); |
| 6761 if (CurrentToken() != Token::kIDENT) { | 6798 if (CurrentToken() != Token::kIDENT) { |
| 6762 ErrorMsg("type name expected"); | 6799 ErrorMsg("type name expected"); |
| 6763 } | 6800 } |
| 6764 QualIdent type_name; | 6801 QualIdent type_name; |
| 6765 if (type_resolution == kIgnore) { | 6802 if (finalization == ClassFinalizer::kIgnore) { |
| 6766 SkipQualIdent(); | 6803 SkipQualIdent(); |
| 6767 } else { | 6804 } else { |
| 6768 ParseQualIdent(&type_name); | 6805 ParseQualIdent(&type_name); |
| 6769 // An identifier cannot be resolved in a local scope when top level parsing. | 6806 // An identifier cannot be resolved in a local scope when top level parsing. |
| 6770 if (!is_top_level_ && | 6807 if (!is_top_level_ && |
| 6771 (type_name.lib_prefix == NULL) && | 6808 (type_name.lib_prefix == NULL) && |
| 6772 ResolveIdentInLocalScope(type_name.ident_pos, *type_name.ident, NULL)) { | 6809 ResolveIdentInLocalScope(type_name.ident_pos, *type_name.ident, NULL)) { |
| 6773 ErrorMsg(type_name.ident_pos, "using '%s' in this context is invalid", | 6810 ErrorMsg(type_name.ident_pos, "using '%s' in this context is invalid", |
| 6774 type_name.ident->ToCString()); | 6811 type_name.ident->ToCString()); |
| 6775 } | 6812 } |
| 6776 } | 6813 } |
| 6777 Object& type_class = Object::Handle(); | 6814 Object& type_class = Object::Handle(); |
| 6778 // Leave type_class as null if type_resolution equals kIgnore. | 6815 // Leave type_class as null if type finalization mode is kIgnore. |
| 6779 if (type_resolution != kIgnore) { | 6816 if (finalization != ClassFinalizer::kIgnore) { |
| 6780 LibraryPrefix& lib_prefix = LibraryPrefix::Handle(); | 6817 LibraryPrefix& lib_prefix = LibraryPrefix::Handle(); |
| 6781 if (type_name.lib_prefix != NULL) { | 6818 if (type_name.lib_prefix != NULL) { |
| 6782 lib_prefix = type_name.lib_prefix->raw(); | 6819 lib_prefix = type_name.lib_prefix->raw(); |
| 6783 } | 6820 } |
| 6784 type_class = UnresolvedClass::New(lib_prefix, | 6821 type_class = UnresolvedClass::New(lib_prefix, |
| 6785 *type_name.ident, | 6822 *type_name.ident, |
| 6786 type_name.ident_pos); | 6823 type_name.ident_pos); |
| 6787 } | 6824 } |
| 6825 Error& malformed_error = Error::Handle(); | |
| 6788 AbstractTypeArguments& type_arguments = | 6826 AbstractTypeArguments& type_arguments = |
| 6789 AbstractTypeArguments::Handle(ParseTypeArguments(type_resolution)); | 6827 AbstractTypeArguments::Handle(ParseTypeArguments(&malformed_error, |
| 6790 if (type_resolution == kIgnore) { | 6828 finalization)); |
| 6829 if (finalization == ClassFinalizer::kIgnore) { | |
| 6791 return Type::DynamicType(); | 6830 return Type::DynamicType(); |
| 6792 } | 6831 } |
| 6793 AbstractType& type = AbstractType::Handle( | 6832 AbstractType& type = AbstractType::Handle( |
| 6794 Type::New(type_class, type_arguments, type_name.ident_pos)); | 6833 Type::New(type_class, type_arguments, type_name.ident_pos)); |
| 6795 if ((type_resolution == kCanResolve) || (type_resolution == kMustResolve)) { | 6834 if (!malformed_error.IsNull()) { |
| 6835 Type& parameterized_type = Type::Handle(); | |
| 6836 parameterized_type ^= type.raw(); | |
| 6837 parameterized_type.set_type_class(Class::Handle(Object::dynamic_class())); | |
| 6838 parameterized_type.set_arguments(AbstractTypeArguments::Handle()); | |
| 6839 parameterized_type.set_malformed_error(malformed_error); | |
| 6840 } | |
| 6841 if (finalization >= ClassFinalizer::kTryResolve) { | |
| 6796 const Class& scope_class = Class::Handle(TypeParametersScopeClass()); | 6842 const Class& scope_class = Class::Handle(TypeParametersScopeClass()); |
| 6797 ResolveTypeFromClass(scope_class, type_resolution, &type); | 6843 ResolveTypeFromClass(scope_class, finalization, &type); |
| 6798 if (type_resolution == kMustResolve) { | 6844 if (finalization >= ClassFinalizer::kFinalize) { |
| 6799 type ^= ClassFinalizer::FinalizeType(current_class(), type); | 6845 type ^= ClassFinalizer::FinalizeType(current_class(), type, finalization); |
| 6800 } | 6846 } |
| 6801 } | 6847 } |
| 6802 return type.raw(); | 6848 return type.raw(); |
| 6803 } | 6849 } |
| 6804 | 6850 |
| 6805 | 6851 |
| 6806 void Parser::CheckConstructorCallTypeArguments( | 6852 void Parser::CheckConstructorCallTypeArguments( |
| 6807 intptr_t pos, Function& constructor, | 6853 intptr_t pos, Function& constructor, |
| 6808 const AbstractTypeArguments& type_arguments) { | 6854 const AbstractTypeArguments& type_arguments) { |
| 6809 if (!type_arguments.IsNull()) { | 6855 if (!type_arguments.IsNull()) { |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7150 | 7196 |
| 7151 | 7197 |
| 7152 AstNode* Parser::ParseCompoundLiteral() { | 7198 AstNode* Parser::ParseCompoundLiteral() { |
| 7153 TRACE_PARSER("ParseCompoundLiteral"); | 7199 TRACE_PARSER("ParseCompoundLiteral"); |
| 7154 bool is_const = false; | 7200 bool is_const = false; |
| 7155 if (CurrentToken() == Token::kCONST) { | 7201 if (CurrentToken() == Token::kCONST) { |
| 7156 is_const = true; | 7202 is_const = true; |
| 7157 ConsumeToken(); | 7203 ConsumeToken(); |
| 7158 } | 7204 } |
| 7159 const intptr_t type_pos = token_index_; | 7205 const intptr_t type_pos = token_index_; |
| 7160 AbstractTypeArguments& type_arguments = | 7206 Error& malformed_error = Error::Handle(); |
| 7161 AbstractTypeArguments::ZoneHandle(ParseTypeArguments(kMustResolve)); | 7207 AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle( |
| 7208 ParseTypeArguments(&malformed_error, | |
| 7209 ClassFinalizer::kFinalizeWellFormed)); | |
| 7162 AstNode* primary = NULL; | 7210 AstNode* primary = NULL; |
| 7163 if ((CurrentToken() == Token::kLBRACK) || | 7211 if ((CurrentToken() == Token::kLBRACK) || |
| 7164 (CurrentToken() == Token::kINDEX)) { | 7212 (CurrentToken() == Token::kINDEX)) { |
| 7165 primary = ParseListLiteral(type_pos, is_const, type_arguments); | 7213 primary = ParseListLiteral(type_pos, is_const, type_arguments); |
| 7166 } else if (CurrentToken() == Token::kLBRACE) { | 7214 } else if (CurrentToken() == Token::kLBRACE) { |
| 7167 primary = ParseMapLiteral(type_pos, is_const, type_arguments); | 7215 primary = ParseMapLiteral(type_pos, is_const, type_arguments); |
| 7168 } else { | 7216 } else { |
| 7169 ErrorMsg("unexpected token %s", Token::Str(CurrentToken())); | 7217 ErrorMsg("unexpected token %s", Token::Str(CurrentToken())); |
| 7170 } | 7218 } |
| 7171 return primary; | 7219 return primary; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 7192 TRACE_PARSER("ParseNewOperator"); | 7240 TRACE_PARSER("ParseNewOperator"); |
| 7193 const intptr_t new_pos = token_index_; | 7241 const intptr_t new_pos = token_index_; |
| 7194 ASSERT((CurrentToken() == Token::kNEW) || (CurrentToken() == Token::kCONST)); | 7242 ASSERT((CurrentToken() == Token::kNEW) || (CurrentToken() == Token::kCONST)); |
| 7195 bool is_const = (CurrentToken() == Token::kCONST); | 7243 bool is_const = (CurrentToken() == Token::kCONST); |
| 7196 ConsumeToken(); | 7244 ConsumeToken(); |
| 7197 if (!IsIdentifier()) { | 7245 if (!IsIdentifier()) { |
| 7198 ErrorMsg("type name expected"); | 7246 ErrorMsg("type name expected"); |
| 7199 } | 7247 } |
| 7200 intptr_t type_pos = token_index_; | 7248 intptr_t type_pos = token_index_; |
| 7201 | 7249 |
| 7202 const AbstractType& type = AbstractType::Handle(ParseType(kMustResolve)); | 7250 const AbstractType& type = AbstractType::Handle( |
| 7251 ParseType(ClassFinalizer::kFinalizeWellFormed)); | |
| 7203 if (type.IsTypeParameter()) { | 7252 if (type.IsTypeParameter()) { |
| 7204 ErrorMsg(type_pos, | 7253 ErrorMsg(type_pos, |
| 7205 "type parameter '%s' cannot be instantiated", | 7254 "type parameter '%s' cannot be instantiated", |
| 7206 String::Handle(type.Name()).ToCString()); | 7255 String::Handle(type.Name()).ToCString()); |
| 7207 } | 7256 } |
| 7208 Class& type_class = Class::Handle(type.type_class()); | 7257 Class& type_class = Class::Handle(type.type_class()); |
| 7209 String& type_class_name = String::Handle(type_class.Name()); | 7258 String& type_class_name = String::Handle(type_class.Name()); |
| 7210 AbstractTypeArguments& type_arguments = | 7259 AbstractTypeArguments& type_arguments = |
| 7211 AbstractTypeArguments::ZoneHandle(type.arguments()); | 7260 AbstractTypeArguments::ZoneHandle(type.arguments()); |
| 7212 | 7261 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7338 type_argument = type_arguments.TypeAt(i); | 7387 type_argument = type_arguments.TypeAt(i); |
| 7339 } else { | 7388 } else { |
| 7340 type_argument = Type::DynamicType(); | 7389 type_argument = Type::DynamicType(); |
| 7341 } | 7390 } |
| 7342 temp_type_arguments.SetTypeAt(i, type_argument); | 7391 temp_type_arguments.SetTypeAt(i, type_argument); |
| 7343 } | 7392 } |
| 7344 } | 7393 } |
| 7345 // TODO(regis): Temporary type should be allocated in new gen heap. | 7394 // TODO(regis): Temporary type should be allocated in new gen heap. |
| 7346 Type& temp_type = Type::Handle( | 7395 Type& temp_type = Type::Handle( |
| 7347 Type::New(constructor_class, temp_type_arguments, type.token_index())); | 7396 Type::New(constructor_class, temp_type_arguments, type.token_index())); |
| 7348 temp_type ^= ClassFinalizer::FinalizeType(current_class(), temp_type); | 7397 temp_type ^= ClassFinalizer::FinalizeType( |
| 7398 current_class(), temp_type, ClassFinalizer::kFinalize); | |
| 7349 // The type argument vector may have been expanded with the type arguments | 7399 // The type argument vector may have been expanded with the type arguments |
| 7350 // of the super type when finalizing the temporary type. | 7400 // of the super type when finalizing the temporary type. |
| 7351 type_arguments = temp_type.arguments(); | 7401 type_arguments = temp_type.arguments(); |
| 7352 } | 7402 } |
| 7353 | 7403 |
| 7354 type_arguments ^= type_arguments.Canonicalize(); | 7404 type_arguments ^= type_arguments.Canonicalize(); |
| 7355 // Make the constructor call. | 7405 // Make the constructor call. |
| 7356 AstNode* new_object = NULL; | 7406 AstNode* new_object = NULL; |
| 7357 if (is_const) { | 7407 if (is_const) { |
| 7358 if (!constructor.is_const()) { | 7408 if (!constructor.is_const()) { |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7913 void Parser::SkipQualIdent() { | 7963 void Parser::SkipQualIdent() { |
| 7914 ASSERT(IsIdentifier()); | 7964 ASSERT(IsIdentifier()); |
| 7915 ConsumeToken(); | 7965 ConsumeToken(); |
| 7916 if (CurrentToken() == Token::kPERIOD) { | 7966 if (CurrentToken() == Token::kPERIOD) { |
| 7917 ConsumeToken(); // Consume the kPERIOD token. | 7967 ConsumeToken(); // Consume the kPERIOD token. |
| 7918 ExpectIdentifier("identifier expected after '.'"); | 7968 ExpectIdentifier("identifier expected after '.'"); |
| 7919 } | 7969 } |
| 7920 } | 7970 } |
| 7921 | 7971 |
| 7922 } // namespace dart | 7972 } // namespace dart |
| OLD | NEW |