Fix unexpected token messages in expression classifier

Some tokens need special messages because their token corresponds to
many names.

R=arv@chromium.org
BUG=v8:4213
LOG=N

Review URL: https://codereview.chromium.org/1207743004

Cr-Commit-Position: refs/heads/master@{#29262}
This commit is contained in:
wingo 2015-06-24 10:25:08 -07:00 committed by Commit bot
parent 627627b327
commit edcc242a44
3 changed files with 84 additions and 44 deletions

View File

@ -503,6 +503,10 @@ class ParserBase : public Traits {
error_type);
}
void GetUnexpectedTokenMessage(
Token::Value token, MessageTemplate::Template* message, const char** arg,
MessageTemplate::Template default_ = MessageTemplate::kUnexpectedToken);
void ReportUnexpectedToken(Token::Value token);
void ReportUnexpectedTokenAt(
Scanner::Location location, Token::Value token,
@ -572,21 +576,26 @@ class ParserBase : public Traits {
}
void ExpressionUnexpectedToken(ExpressionClassifier* classifier) {
classifier->RecordExpressionError(scanner()->peek_location(),
MessageTemplate::kUnexpectedToken,
Token::String(peek()));
MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
const char* arg;
GetUnexpectedTokenMessage(peek(), &message, &arg);
classifier->RecordExpressionError(scanner()->peek_location(), message, arg);
}
void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) {
classifier->RecordBindingPatternError(scanner()->peek_location(),
MessageTemplate::kUnexpectedToken,
Token::String(peek()));
MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
const char* arg;
GetUnexpectedTokenMessage(peek(), &message, &arg);
classifier->RecordBindingPatternError(scanner()->peek_location(), message,
arg);
}
void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) {
classifier->RecordArrowFormalParametersError(
scanner()->peek_location(), MessageTemplate::kUnexpectedToken,
Token::String(peek()));
MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
const char* arg;
GetUnexpectedTokenMessage(peek(), &message, &arg);
classifier->RecordArrowFormalParametersError(scanner()->peek_location(),
message, arg);
}
// Recursive descent functions:
@ -1830,7 +1839,57 @@ ParserBase<Traits>::FunctionState::~FunctionState() {
}
template<class Traits>
template <class Traits>
void ParserBase<Traits>::GetUnexpectedTokenMessage(
Token::Value token, MessageTemplate::Template* message, const char** arg,
MessageTemplate::Template default_) {
// Four of the tokens are treated specially
switch (token) {
case Token::EOS:
*message = MessageTemplate::kUnexpectedEOS;
*arg = nullptr;
break;
case Token::SMI:
case Token::NUMBER:
*message = MessageTemplate::kUnexpectedTokenNumber;
*arg = nullptr;
break;
case Token::STRING:
*message = MessageTemplate::kUnexpectedTokenString;
*arg = nullptr;
break;
case Token::IDENTIFIER:
*message = MessageTemplate::kUnexpectedTokenIdentifier;
*arg = nullptr;
break;
case Token::FUTURE_RESERVED_WORD:
*message = MessageTemplate::kUnexpectedReserved;
*arg = nullptr;
break;
case Token::LET:
case Token::STATIC:
case Token::YIELD:
case Token::FUTURE_STRICT_RESERVED_WORD:
*message = is_strict(language_mode())
? MessageTemplate::kUnexpectedStrictReserved
: MessageTemplate::kUnexpectedTokenIdentifier;
*arg = nullptr;
break;
case Token::TEMPLATE_SPAN:
case Token::TEMPLATE_TAIL:
*message = MessageTemplate::kUnexpectedTemplateString;
*arg = nullptr;
break;
default:
const char* name = Token::String(token);
DCHECK(name != NULL);
*arg = name;
break;
}
}
template <class Traits>
void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) {
return ReportUnexpectedTokenAt(scanner_->location(), token);
}
@ -1840,40 +1899,9 @@ template <class Traits>
void ParserBase<Traits>::ReportUnexpectedTokenAt(
Scanner::Location source_location, Token::Value token,
MessageTemplate::Template message) {
// Four of the tokens are treated specially
switch (token) {
case Token::EOS:
return ReportMessageAt(source_location, MessageTemplate::kUnexpectedEOS);
case Token::SMI:
case Token::NUMBER:
return ReportMessageAt(source_location,
MessageTemplate::kUnexpectedTokenNumber);
case Token::STRING:
return ReportMessageAt(source_location,
MessageTemplate::kUnexpectedTokenString);
case Token::IDENTIFIER:
return ReportMessageAt(source_location,
MessageTemplate::kUnexpectedTokenIdentifier);
case Token::FUTURE_RESERVED_WORD:
return ReportMessageAt(source_location,
MessageTemplate::kUnexpectedReserved);
case Token::LET:
case Token::STATIC:
case Token::YIELD:
case Token::FUTURE_STRICT_RESERVED_WORD:
return ReportMessageAt(source_location,
is_strict(language_mode())
? MessageTemplate::kUnexpectedStrictReserved
: MessageTemplate::kUnexpectedTokenIdentifier);
case Token::TEMPLATE_SPAN:
case Token::TEMPLATE_TAIL:
return Traits::ReportMessageAt(
source_location, MessageTemplate::kUnexpectedTemplateString);
default:
const char* name = Token::String(token);
DCHECK(name != NULL);
Traits::ReportMessageAt(source_location, message, name);
}
const char* arg;
GetUnexpectedTokenMessage(token, &message, &arg);
Traits::ReportMessageAt(source_location, message, arg);
}

View File

@ -0,0 +1,8 @@
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Flags: --harmony-arrow-functions
"use strict";
eval => 42

View File

@ -0,0 +1,4 @@
*%(basename)s:8: SyntaxError: Unexpected identifier
eval => 42
^^^^
SyntaxError: Unexpected identifier