Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Unified Diff: runtime/vm/parser.cc

Issue 23224016: Implement ParameterMirror.metadata. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index aafb65592dd7ebf433f229c005c10c4fa15fc158..4963568b905109b763d646ee8e33bc90db967186 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -432,12 +432,14 @@ struct ParamDesc {
name_pos(0),
name(NULL),
default_value(NULL),
+ metadata(NULL),
is_final(false),
is_field_initializer(false) { }
const AbstractType* type;
intptr_t name_pos;
const String* name;
const Object* default_value; // NULL if not an optional parameter.
+ const Object* metadata; // NULL if no metadata or metadata not evaluated.
bool is_final;
bool is_field_initializer;
};
@@ -791,17 +793,24 @@ RawObject* Parser::ParseFunctionParameters(const Function& func) {
parser.set_current_class(owner);
parser.SkipFunctionPreamble();
ParamList params;
- parser.ParseFormalParameterList(true, &params);
+ parser.ParseFormalParameterList(true, true, &params);
ParamDesc* param = params.parameters->data();
const int param_cnt = params.num_fixed_parameters +
params.num_optional_parameters;
- Array& param_descriptor = Array::Handle(isolate, Array::New(param_cnt * 2));
- for (int i = 0, j = 0; i < param_cnt; i++, j += 2) {
+ Array& param_descriptor = Array::Handle(Array::New(param_cnt * 3));
+ for (int i = 0, j = 0; i < param_cnt; i++, j += 3) {
param_descriptor.SetAt(j, param[i].is_final ? Bool::True() :
siva 2013/08/28 23:26:48 Ditto comment about '3' here.
Bool::False());
param_descriptor.SetAt(j + 1,
(param[i].default_value == NULL) ? Object::null_instance() :
*(param[i].default_value));
+ const Object* metadata = param[i].metadata;
+ if ((metadata != NULL) && (*metadata).IsError()) {
+ return (*metadata).raw(); // Error evaluating the metadata.
+ }
+ param_descriptor.SetAt(j + 2,
+ (param[i].metadata == NULL) ? Object::null_instance() :
+ *(param[i].metadata));
}
isolate->set_long_jump_base(base);
return param_descriptor.raw();
@@ -1381,13 +1390,19 @@ void Parser::SkipBlock() {
void Parser::ParseFormalParameter(bool allow_explicit_default_value,
+ bool evaluate_metadata,
ParamList* params) {
TRACE_PARSER("ParseFormalParameter");
ParamDesc parameter;
bool var_seen = false;
bool this_seen = false;
- SkipMetadata();
+ if (evaluate_metadata && (CurrentToken() == Token::kAT)) {
+ parameter.metadata = &Array::ZoneHandle(EvaluateMetadata());
+ } else {
+ SkipMetadata();
+ }
+
if (CurrentToken() == Token::kFINAL) {
ConsumeToken();
parameter.is_final = true;
@@ -1487,7 +1502,7 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value,
&Type::ZoneHandle(Type::DynamicType()));
const bool no_explicit_default_values = false;
- ParseFormalParameterList(no_explicit_default_values, &func_params);
+ ParseFormalParameterList(no_explicit_default_values, false, &func_params);
// The field 'is_static' has no meaning for signature functions.
const Function& signature_function = Function::Handle(
@@ -1571,6 +1586,7 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value,
// Parses a sequence of normal or optional formal parameters.
void Parser::ParseFormalParameters(bool allow_explicit_default_values,
+ bool evaluate_metadata,
ParamList* params) {
TRACE_PARSER("ParseFormalParameters");
do {
@@ -1589,23 +1605,30 @@ void Parser::ParseFormalParameters(bool allow_explicit_default_values,
params->has_optional_named_parameters = true;
return;
}
- ParseFormalParameter(allow_explicit_default_values, params);
+ ParseFormalParameter(allow_explicit_default_values,
+ evaluate_metadata,
+ params);
} while (CurrentToken() == Token::kCOMMA);
}
void Parser::ParseFormalParameterList(bool allow_explicit_default_values,
+ bool evaluate_metadata,
ParamList* params) {
TRACE_PARSER("ParseFormalParameterList");
ASSERT(CurrentToken() == Token::kLPAREN);
if (LookaheadToken(1) != Token::kRPAREN) {
// Parse fixed parameters.
- ParseFormalParameters(allow_explicit_default_values, params);
+ ParseFormalParameters(allow_explicit_default_values,
+ evaluate_metadata,
+ params);
if (params->has_optional_positional_parameters ||
params->has_optional_named_parameters) {
// Parse optional parameters.
- ParseFormalParameters(allow_explicit_default_values, params);
+ ParseFormalParameters(allow_explicit_default_values,
+ evaluate_metadata,
+ params);
if (params->has_optional_positional_parameters) {
if (CurrentToken() != Token::kRBRACK) {
ErrorMsg("',' or ']' expected");
@@ -2496,7 +2519,7 @@ SequenceNode* Parser::ParseConstructor(const Function& func,
if (func.is_const()) {
params.SetImplicitlyFinal();
}
- ParseFormalParameterList(allow_explicit_default_values, &params);
+ ParseFormalParameterList(allow_explicit_default_values, false, &params);
SetupDefaultsForOptionalParams(&params, default_parameter_values);
ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
@@ -2748,7 +2771,7 @@ SequenceNode* Parser::ParseFunc(const Function& func,
ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction());
const bool allow_explicit_default_values = true;
if (!func.IsGetterFunction()) {
- ParseFormalParameterList(allow_explicit_default_values, &params);
+ ParseFormalParameterList(allow_explicit_default_values, false, &params);
} else {
// TODO(hausner): Remove this once we no longer support the old
// getter syntax with explicit empty parameter list.
@@ -2985,7 +3008,9 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
method->params.SetImplicitlyFinal();
}
if (!method->IsGetter()) {
- ParseFormalParameterList(allow_explicit_default_values, &method->params);
+ ParseFormalParameterList(allow_explicit_default_values,
+ false,
+ &method->params);
}
// Now that we know the parameter list, we can distinguish between the
@@ -4037,7 +4062,7 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
&Type::ZoneHandle(Type::DynamicType()));
const bool no_explicit_default_values = false;
- ParseFormalParameterList(no_explicit_default_values, &func_params);
+ ParseFormalParameterList(no_explicit_default_values, false, &func_params);
ExpectSemicolon();
// The field 'is_static' has no meaning for signature functions.
Function& signature_function = Function::Handle(
@@ -4486,7 +4511,7 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
const intptr_t function_pos = TokenPos();
ParamList params;
const bool allow_explicit_default_values = true;
- ParseFormalParameterList(allow_explicit_default_values, &params);
+ ParseFormalParameterList(allow_explicit_default_values, false, &params);
intptr_t function_end_pos = function_pos;
if (is_external) {
@@ -4575,7 +4600,7 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
if (!is_getter) {
const bool allow_explicit_default_values = true;
- ParseFormalParameterList(allow_explicit_default_values, &params);
+ ParseFormalParameterList(allow_explicit_default_values, false, &params);
}
String& accessor_name = String::ZoneHandle();
int expected_num_parameters = -1;
@@ -10183,7 +10208,7 @@ void Parser::SkipFunctionLiteral() {
const bool allow_explicit_default_values = true;
ParamList params;
params.skipped = true;
- ParseFormalParameterList(allow_explicit_default_values, &params);
+ ParseFormalParameterList(allow_explicit_default_values, false, &params);
}
if (CurrentToken() == Token::kLBRACE) {
SkipBlock();

Powered by Google App Engine
This is Rietveld 408576698