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 7076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7087 // If the name cannot be resolved, turn it into an instance field access | 7087 // If the name cannot be resolved, turn it into an instance field access |
7088 // if we're compiling an instance method, or issue an error message | 7088 // if we're compiling an instance method, or issue an error message |
7089 // if we're compiling a static method. | 7089 // if we're compiling a static method. |
7090 AstNode* Parser::ResolveVarOrField(intptr_t ident_pos, const String& ident) { | 7090 AstNode* Parser::ResolveVarOrField(intptr_t ident_pos, const String& ident) { |
7091 TRACE_PARSER("ResolveVarOrField"); | 7091 TRACE_PARSER("ResolveVarOrField"); |
7092 // First try to find the variable in the local scope (block scope or | 7092 // First try to find the variable in the local scope (block scope or |
7093 // class scope). | 7093 // class scope). |
7094 AstNode* var_or_field = NULL; | 7094 AstNode* var_or_field = NULL; |
7095 ResolveIdentInLocalScope(ident_pos, ident, &var_or_field); | 7095 ResolveIdentInLocalScope(ident_pos, ident, &var_or_field); |
7096 if (var_or_field == NULL) { | 7096 if (var_or_field == NULL) { |
7097 // Not found in the local scope, so try finding the variable in the | 7097 // Check whether the identifier is a type parameter. Type parameters |
7098 // library scope (current library and all libraries imported by it). | 7098 // can never be used in primary expressions. |
| 7099 const Class& scope_class = Class::Handle(TypeParametersScopeClass()); |
| 7100 if (!scope_class.IsNull()) { |
| 7101 TypeParameter& type_param = TypeParameter::Handle( |
| 7102 scope_class.LookupTypeParameter(ident, ident_pos)); |
| 7103 if (!type_param.IsNull()) { |
| 7104 String& type_param_name = String::Handle(type_param.Name()); |
| 7105 ErrorMsg(ident_pos, "illegal use of type parameter %s", |
| 7106 type_param_name.ToCString()); |
| 7107 } |
| 7108 } |
| 7109 // Not found in the local scope, and the name is not a type parameter. |
| 7110 // Try finding the variable in the library scope (current library |
| 7111 // and all libraries imported by it). |
7099 QualIdent qual_ident; | 7112 QualIdent qual_ident; |
7100 qual_ident.lib_prefix = NULL; | 7113 qual_ident.lib_prefix = NULL; |
7101 qual_ident.ident_pos = ident_pos; | 7114 qual_ident.ident_pos = ident_pos; |
7102 qual_ident.ident = &(String::ZoneHandle(ident.raw())); | 7115 qual_ident.ident = &(String::ZoneHandle(ident.raw())); |
7103 var_or_field = ResolveIdentInLibraryScope(library_, | 7116 var_or_field = ResolveIdentInLibraryScope(library_, |
7104 qual_ident, | 7117 qual_ident, |
7105 kResolveIncludingImports); | 7118 kResolveIncludingImports); |
7106 } | 7119 } |
7107 if (var_or_field->IsPrimaryNode()) { | 7120 if (var_or_field->IsPrimaryNode()) { |
7108 PrimaryNode* primary = var_or_field->AsPrimaryNode(); | 7121 PrimaryNode* primary = var_or_field->AsPrimaryNode(); |
(...skipping 1266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8375 void Parser::SkipQualIdent() { | 8388 void Parser::SkipQualIdent() { |
8376 ASSERT(IsIdentifier()); | 8389 ASSERT(IsIdentifier()); |
8377 ConsumeToken(); | 8390 ConsumeToken(); |
8378 if (CurrentToken() == Token::kPERIOD) { | 8391 if (CurrentToken() == Token::kPERIOD) { |
8379 ConsumeToken(); // Consume the kPERIOD token. | 8392 ConsumeToken(); // Consume the kPERIOD token. |
8380 ExpectIdentifier("identifier expected after '.'"); | 8393 ExpectIdentifier("identifier expected after '.'"); |
8381 } | 8394 } |
8382 } | 8395 } |
8383 | 8396 |
8384 } // namespace dart | 8397 } // namespace dart |
OLD | NEW |