/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.runtime.internal;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* Wrapper class for {@link ResourceBundle} to provide localized messages.
*/
public final class Messages {
private static final PropertiesReaderControl UTF8_RESOURCE_CONTROL = new PropertiesReaderControl(
StandardCharsets.UTF_8);
private static final String BUNDLE_NAME = "com.github.anba.es6draft.runtime.internal.messages";
private final ResourceBundle resourceBundle;
private Messages(ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
}
/**
* Creates a new instance of this class.
*
* @param locale
* the requested locale
* @return the new messages instance
*/
public static Messages create(Locale locale) {
ResourceBundle.Control control = UTF8_RESOURCE_CONTROL;
ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, locale, control);
return new Messages(resourceBundle);
}
/**
* Returns the resource bundle.
*
* @return the resource bundle
*/
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
/**
* Returns the localized message for {@code key} from the resource bundle.
*
* @param key
* the message key
* @return the localized message string
*/
public String getMessage(Key key) {
try {
return resourceBundle.getString(key.id);
} catch (MissingResourceException e) {
return '!' + key.id + '!';
}
}
/**
* Returns the localized message for {@code key} from the resource bundle.
*
* @param key
* the message key
* @param args
* the message arguments
* @return the localized message string
*/
public String getMessage(Key key, String... args) {
try {
return format(resourceBundle.getString(key.id), resourceBundle.getLocale(), args);
} catch (MissingResourceException e) {
return '!' + key.id + '!';
}
}
private String format(String pattern, Locale locale, String... messageArguments) {
return new MessageFormat(pattern, locale).format(messageArguments);
}
/**
* Message key enumeration
*/
public enum Key {/* @formatter:off */
// internal
InternalError("internal.error"),
StackOverflow("internal.stackoverflow"),
ToStringFailed("internal.tostring_failed"),
// TokenStream
InvalidNumberLiteral("parser.invalid_number_literal"),
InvalidBinaryIntegerLiteral("parser.invalid_binary_integer_literal"),
InvalidOctalIntegerLiteral("parser.invalid_octal_integer_literal"),
InvalidHexIntegerLiteral("parser.invalid_hex_integer_literal"),
InvalidNULLEscape("parser.invalid_null_escape"),
InvalidHexEscape("parser.invalid_hex_escape"),
InvalidUnicodeEscape("parser.invalid_unicode_escape"),
UnterminatedStringLiteral("parser.unterminated_string_literal"),
UnterminatedComment("parser.unterminated_comment"),
UnterminatedTemplateLiteral("parser.unterminated_template_literal"),
UnterminatedRegExpLiteral("parser.unterminated_regexp_literal"),
InvalidRegExpLiteral("parser.invalid_regexp_literal"),
InvalidUnicodeEscapedIdentifierStart("parser.invalid_unicode_escaped_identifierstart"),
InvalidUnicodeEscapedIdentifierPart("parser.invalid_unicode_escaped_identifierpart"),
InvalidToken("parser.invalid_token"),
IllegalCharacter("parser.illegal_character"),
UnexpectedToken("parser.unexpected_token"),
UnexpectedEndOfFile("parser.unexpected_eof"),
UnexpectedName("parser.unexpected_name"),
UnexpectedCharacter("parser.unexpected_character"),
UnicodeEscapeInRegExpFlags("parser.unicode_escape_in_regexp_flags"),
OctalEscapeSequence("parser.octal_escape_sequence"),
// Parser
InvalidFormalParameterList("parser.invalid_formal_parameter_list"),
InvalidFunctionBody("parser.invalid_function_body"),
FormalParameterRedeclaration("parser.formal_parameter_redeclaration"),
DuplicateFormalParameter("parser.duplicate_formal_parameter"),
UnexpectedEndOfLine("parser.unexpected_end_of_line"),
MissingSemicolon("parser.missing_semicolon"),
EmptyParenthesizedExpression("parser.empty_parenthesized_expression"),
InvalidSpreadExpression("parser.invalid_spread_expression"),
InvalidConstructorMethod("parser.invalid_constructor_method"),
InvalidPrototypeMethod("parser.invalid_prototype_method"),
InvalidSuperExpression("parser.invalid_super_expression"),
InvalidNewSuperExpression("parser.invalid_new_super_expression"),
InvalidSuperCallExpression("parser.invalid_super_call_expression"),
InvalidNewTarget("parser.invalid_new_target"),
MissingColonAfterPropertyId("parser.missing_colon_after_property_id"),
DuplicatePropertyDefinition("parser.duplicate_property_definition"),
DuplicateConstructor("parser.duplicate_constructor"),
DuplicateCallConstructor("parser.duplicate_call_constructor"),
InvalidReturnStatement("parser.invalid_return_statement"),
InvalidYieldExpression("parser.invalid_yield_expression"),
InvalidAwaitExpression("parser.invalid_await_expression"),
DuplicateLabel("parser.duplicate_label"),
LabelTargetNotFound("parser.label_target_not_found"),
InvalidBreakTarget("parser.invalid_break_target"),
InvalidContinueTarget("parser.invalid_continue_target"),
InvalidIncDecTarget("parser.invalid_incdec_target"),
InvalidAssignmentTarget("parser.invalid_assignment_target"),
InvalidDestructuring("parser.invalid_destructuring"),
DestructuringMissingInitializer("parser.destructuring_missing_initializer"),
ConstMissingInitializer("parser.const_missing_initializer"),
InvalidIdentifier("parser.invalid_identifier"),
DuplicateExport("parser.duplicate_export"),
DuplicateImport("parser.duplicate_import"),
MissingExportBinding("parser.missing_export_binding"),
InvalidForStatementLeftHandSide("parser.invalid_for_statement_lhs"),
InvalidForEachStatement("parser.invalid_for_each_statement"),
InvalidFunctionSent("parser.invalid_function_sent"),
InvalidCallConstructorDecorator("parser.invalid_call_constructor_decorator"),
InvalidPropertyDecorator("parser.invalid_property_decorator"),
InvalidPrototypeProperty("parser.invalid_prototype_property"),
InvalidUseStrictDirective("parser.invalid_use_strict_directive"),
// strict mode TokenStream/Parser errors
StrictModeRestrictedIdentifier("parser.strict.restricted_identifier"),
StrictModeWithStatement("parser.strict.with_statement"),
StrictModeInvalidAssignmentTarget("parser.strict.invalid_assignment_target"),
StrictModeInvalidDeleteOperand("parser.strict.invalid_delete_operand"),
StrictModeInvalidIdentifier("parser.strict.invalid_identifier"),
StrictModeOctalIntegerLiteral("parser.strict.octal_integer_literal"),
StrictModeOctalEscapeSequence("parser.strict.octal_escape_sequence"),
StrictModeDecimalLeadingZero("parser.strict.decimal_leading_zero"),
// SyntaxError
VariableRedeclaration("syntax.variable_redeclaration"),
InvalidDeclaration("syntax.invalid_declaration"),
// ReferenceError
MissingSuperBinding("reference.missing_super_binding"),
SuperDelete("reference.super_delete"),
UninitializedBinding("reference.uninitialized_binding"),
UninitializedModuleBinding("reference.uninitialized_module_binding"),
UnresolvableReference("reference.unresolvable_reference"),
InvalidReference("reference.invalid_reference"),
UninitializedThis("reference.uninitialized_this"),
// TypeError
ImmutableBinding("type.immutable_binding"),
PropertyNotModifiable("type.property_not_modifiable"),
PropertyNotCreatable("type.property_not_creatable"),
PropertyNotDeletable("type.property_not_deletable"),
StrictModePoisonPill("type.strict_mode_poison_pill"),
UndefinedOrNull("type.undefined_or_null"),
NotCallable("type.not_callable"),
NotConstructor("type.not_constructor"),
NotPrimitiveType("type.not_primitive_type"),
NotObjectType("type.not_object_type"),
NotObjectOrNull("type.not_object_or_null"),
NotUndefined("type.not_undefined"),
NotSymbol("type.not_symbol"),
NotString("type.not_string"),
NotExtensible("type.not_extensible"),
IncompatibleObject("type.incompatible_object"),
SymbolString("type.symbol_string"),
SymbolNumber("type.symbol_number"),
SymbolCreate("type.symbol_create"),
CyclicProto("type.cyclic_proto"),
FunctionNotCloneable("type.function_not_cloneable"),
PropertyNotObject("type.property_not_object"),
PropertyNotCallable("type.property_not_callable"),
PropertyNotConstructor("type.property_not_constructor"),
InvalidSuperClass("type.invalid_super_class"),
InvalidCall("type.invalid_call"),
InvalidCallClass("type.invalid_call_class"),
MissingNewTarget("type.missing_new_target"),
NotObjectTypeFromConstructor("type.not_object_type_from_constructor"),
InitializedThis("type.initialized_this"),
NotObjectTypeReturned("type.not_object_type_returned"),
InstanceofNotObject("type.instanceof_not_object"),
InstanceofNotCallable("type.instanceof_not_callable"),
InNotObject("type.in_not_object"),
// 6.2.4 The Property Descriptor Specification Type
InvalidGetter("propertydescriptor.invalid_getter"),
InvalidSetter("propertydescriptor.invalid_setter"),
InvalidDescriptor("propertydescriptor.invalid_descriptor"),
// 7.1.1 ToPrimitive
InvalidToPrimitiveHint("abstractops.invalid_to_primitive_hint"),
NoPrimitiveRepresentation("abstractops.no_primitive_representation"),
// 15.2 Modules
ModulesIOException("modules.io_exception"),
ModulesInvalidName("modules.invalid_name"),
ModulesAmbiguousExport("modules.ambiguous_export"),
ModulesAmbiguousImport("modules.ambiguous_import"),
ModulesMissingDefaultExport("modules.missing_default_export"),
ModulesUnresolvedExport("modules.unresolved_export"),
ModulesUnresolvedImport("modules.unresolved_import"),
ModulesUnresolvedModule("modules.unresolved_module"),
// 18 The Global Object
MalformedURI("globalobject.malformed_uri"),
// 19.1 Object Objects
ObjectSealFailed("object.seal_failed"),
ObjectFreezeFailed("object.freeze_failed"),
ObjectPreventExtensionsFailed("object.preventextensions_failed"),
ObjectSetPrototypeFailed("object.setprototype_failed"),
// 19.2 Function Objects
FunctionTooManyArguments("function.too_many_arguments"),
// 20.1 Number Objects
InvalidRadix("number.invalid_radix"),
InvalidPrecision("number.invalid_precision"),
// 20.3 Date Objects
InvalidDateValue("date.invalid_datevalue"),
// 21.1 String Objects
InvalidStringRepeat("string.invalid_string_repeat"),
InvalidCodePoint("string.invalid_codepoint"),
InvalidNormalizationForm("string.invalid_normalization_form"),
InvalidRegExpArgument("string.invalid_regexp_argument"),
InvalidStringPad("string.invalid_string_pad"),
// 21.2 RegExp (Regular Expression) Objects
RegExpInvalidQuantifier("regexp.invalid_quantifier"),
RegExpInvalidCharacterRange("regexp.invalid_character_range"),
RegExpInvalidEscape("regexp.invalid_escape"),
RegExpTrailingSlash("regexp.trailing_slash"),
RegExpUnmatchedCharacter("regexp.unmatched_character"),
RegExpPatternTooComplex("regexp.pattern_too_complex"),
RegExpUnexpectedCharacter("regexp.unexpected_character"),
RegExpDuplicateFlag("regexp.duplicate_flag"),
RegExpInvalidFlag("regexp.invalid_flag"),
// 22.1 Array Objects
InvalidArrayLength("array.invalid_array_length"),
ReduceInitialValue("array.reduce_initial_value"),
// 24.3 The JSON Object
JSONUnterminatedStringLiteral("json.unterminated_string_literal"),
JSONInvalidStringLiteral("json.invalid_string_literal"),
JSONInvalidUnicodeEscape("json.invalid_unicode_escape"),
JSONInvalidNumberLiteral("json.invalid_number_literal"),
JSONInvalidLiteral("json.invalid_json_literal"),
JSONCyclicValue("json.cyclic_value"),
// 24.1 Binary Data Objects
OutOfMemory("binary.out_of_memory"),
OutOfMemoryVM("binary.out_of_memory_vm"),
BufferDetached("binary.buffer_detached"),
BufferInvalid("binary.buffer_invalid"),
ArrayOffsetOutOfRange("binary.array_offset_out_of_range"),
InvalidByteLength("binary.invalid_bytelength"),
InvalidByteOffset("binary.invalid_byteoffset"),
InvalidBufferSize("binary.invalid_buffersize"),
InvalidTypedArrayConstructor("binary.invalid_typed_array_constructor"),
InvalidTypedArrayLength("binary.invalid_typed_array_length"),
TypedArrayCreate("binary.typed_array_create"),
// 25.3 Generator Objects
GeneratorExecuting("generator.executing"),
// 25.4 Promise Objects
PromiseSelfResolution("promise.self_resolution"),
// 26.5 Proxy Objects
ProxyRevoked("proxy.revoked"),
ProxyNew("proxy.new"),
ProxySamePrototype("proxy.same_prototype"),
ProxyNotObject("proxy.not_object"),
ProxyNotObjectOrUndefined("proxy.not_object_or_undefined"),
ProxyIncompatibleDescriptor("proxy.incompatible_descriptor"),
ProxyDeleteNonConfigurable("proxy.delete_non_configurable"),
ProxySameValue("proxy.same_value"),
ProxyNoSetter("proxy.no_setter"),
ProxyNoGetter("proxy.no_getter"),
ProxyExtensible("proxy.extensible"),
ProxyNotExtensible("proxy.not_extensible"),
ProxyNotConfigurable("proxy.not_configurable"),
ProxyAbsentOrConfigurable("proxy.absent_or_configurable"),
ProxyAbsentNotExtensible("proxy.absent_not_extensible"),
ProxyPropertyKey("proxy.property_key"),
// 23 Keyed Collection
MapPairNotObject("collection.map_pair_not_object"),
WeakMapPairNotObject("collection.weakmap_pair_not_object"),
WeakMapKeyNotObject("collection.weakmap_key_not_object"),
WeakSetKeyNotObject("collection.weakset_key_not_object"),
// Intl
IntlStructurallyInvalidLanguageTag("intl.structurally_invalid_language_tag"),
IntlInvalidOption("intl.invalid_option"),
IntlInvalidCurrency("intl.invalid_currency"),
IntlInvalidLanguageTagType("intl.invalid_language_tag_type"),
// SIMD
SIMDCreate("simd.create"),
SIMDInvalidType("simd.invalid_type"),
SIMDInvalidLane("simd.invalid_lane"),
SIMDOutOfRange("simd.out_of_range"),
SIMDNumber("simd.number"),
// Atomics
AtomicsInvalidArrayType("atomics.invalid_array_type"),
AtomicsInt32ArrayType("atomics.int32_array_type"),
AtomicsNotSharedBuffer("atomics.not_shared_buffer"),
AtomicsInvalidArrayIndex("atomics.invalid_array_index"),
;
/* @formatter:on */
private final String id;
private Key(String id) {
this.id = id;
}
public String getId() {
return id;
}
}
}