Mercurial > projects > dil
view trunk/src/Messages.d @ 309:b4d842b0d2c7
- Added new files Settings.d, config.d and lang_en.d
- Removed redundant break statements from Lexer.d.
- Added function Cast() to SyntaxTree.d.
- Relocated compiler version info to Settings.d.
- Removed messages variable from module Messages. Compiler messages are loaded dynamically now.
- Relocated some functions from module Information to module Messages, and added some format functions to it.
- Message tables are located in their own lang_*.d files.
- Added getString() method to class StringLiteralsExpression.
- Module Settings has a static struct GlobalSettings. It loads global settings from config.d and a language file.
author | aziz |
---|---|
date | Wed, 15 Aug 2007 16:07:05 +0000 |
parents | 0bde32503976 |
children | 6259fb93e3dd |
line wrap: on
line source
/++ Author: Aziz Köksal License: GPL3 +/ module Messages; import Settings; import std.stdarg; /// Index into table of compiler messages. enum MID { // Lexer messages: InvalidUnicodeCharacter, InvalidUTF8Sequence, // '' UnterminatedCharacterLiteral, EmptyCharacterLiteral, // #line ExpectedIdentifierSTLine, ExpectedNormalStringLiteral, ExpectedNumberAfterSTLine, NewlineInSpecialToken, UnterminatedSpecialToken, // "" UnterminatedString, // x"" NonHexCharInHexString, OddNumberOfDigitsInHexString, UnterminatedHexString, // /* */ /+ +/ UnterminatedBlockComment, UnterminatedNestedComment, // `` r"" UnterminatedRawString, UnterminatedBackQuoteString, // \x \u \U UndefinedEscapeSequence, InsufficientHexDigits, // \&[a-zA-Z][a-zA-Z0-9]+; UndefinedHTMLEntity, UnterminatedHTMLEntity, InvalidBeginHTMLEntity, // integer overflows OverflowDecimalSign, OverflowDecimalNumber, OverflowHexNumber, OverflowBinaryNumber, OverflowOctalNumber, OverflowFloatNumber, OctalNumberHasDecimals, NoDigitsInHexNumber, NoDigitsInBinNumber, HexFloatExponentRequired, HexFloatMissingExpDigits, FloatExponentDigitExpected, // Parser messages: ExpectedButFound, RedundantStorageClass, // Help messages: HelpMain, } string GetMsg(MID mid) { assert(mid < GlobalSettings.messages.length); return GlobalSettings.messages[mid]; } char[] format(MID mid, ...) { auto args = arguments(_arguments, _argptr); return format_args(GetMsg(mid), args); } char[] format(char[] format_str, ...) { auto args = arguments(_arguments, _argptr); return format_args(format_str, args); } char[] format_args(char[] format_str, char[][] args) { char[] result = format_str; foreach (i, arg; args) result = std.string.replace(result, std.string.format("{%s}", i+1), arg); return result; } char[][] arguments(TypeInfo[] tinfos, void* argptr) { char[][] args; foreach (ti; tinfos) { if (ti == typeid(char[])) args ~= va_arg!(char[])(argptr); else if (ti == typeid(int)) args ~= std.string.format(va_arg!(int)(argptr)); else if (ti == typeid(dchar)) args ~= std.string.format(va_arg!(dchar)(argptr)); else assert(0, "argument type not supported yet."); } return args; }