diff options
author | John McCall <rjmccall@apple.com> | 2010-10-14 01:55:31 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-10-14 01:55:31 +0000 |
commit | e53a44bcd342e964a3c69bc27734f01e23f5fec8 (patch) | |
tree | 9a88ea8aa680807411580349d6d625577d30992e /lib/Basic | |
parent | c637415a96c16abc7e28ef83c6c105716f7e8936 (diff) |
Teach Diagnostic to recursively expand inside %plural formats.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116468 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic')
-rw-r--r-- | lib/Basic/Diagnostic.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 102086b69d..cbc340e0da 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -859,7 +859,7 @@ static bool EvalPluralExpr(unsigned ValNo, const char *Start, const char *End) { /// {1:form0|[2,4]:form1|:form2} /// Polish (requires repeated form): /// {1:form0|%100=[10,20]:form2|%10=[2,4]:form1|:form2} -static void HandlePluralModifier(unsigned ValNo, +static void HandlePluralModifier(const DiagnosticInfo &DInfo, unsigned ValNo, const char *Argument, unsigned ArgumentLen, llvm::SmallVectorImpl<char> &OutStr) { const char *ArgumentEnd = Argument + ArgumentLen; @@ -873,7 +873,10 @@ static void HandlePluralModifier(unsigned ValNo, if (EvalPluralExpr(ValNo, Argument, ExprEnd)) { Argument = ExprEnd + 1; ExprEnd = ScanFormat(Argument, ArgumentEnd, '|'); - OutStr.append(Argument, ExprEnd); + + // Recursively format the result of the plural clause into the + // output string. + DInfo.FormatDiagnostic(Argument, ExprEnd, OutStr); return; } Argument = ScanFormat(Argument, ArgumentEnd - 1, '|') + 1; @@ -975,11 +978,13 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, int Val = getArgSInt(ArgNo); if (ModifierIs(Modifier, ModifierLen, "select")) { - HandleSelectModifier(*this, (unsigned)Val, Argument, ArgumentLen, OutStr); + HandleSelectModifier(*this, (unsigned)Val, Argument, ArgumentLen, + OutStr); } else if (ModifierIs(Modifier, ModifierLen, "s")) { HandleIntegerSModifier(Val, OutStr); } else if (ModifierIs(Modifier, ModifierLen, "plural")) { - HandlePluralModifier((unsigned)Val, Argument, ArgumentLen, OutStr); + HandlePluralModifier(*this, (unsigned)Val, Argument, ArgumentLen, + OutStr); } else if (ModifierIs(Modifier, ModifierLen, "ordinal")) { HandleOrdinalModifier((unsigned)Val, OutStr); } else { @@ -996,7 +1001,8 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, } else if (ModifierIs(Modifier, ModifierLen, "s")) { HandleIntegerSModifier(Val, OutStr); } else if (ModifierIs(Modifier, ModifierLen, "plural")) { - HandlePluralModifier((unsigned)Val, Argument, ArgumentLen, OutStr); + HandlePluralModifier(*this, (unsigned)Val, Argument, ArgumentLen, + OutStr); } else if (ModifierIs(Modifier, ModifierLen, "ordinal")) { HandleOrdinalModifier(Val, OutStr); } else { |