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 | 43b6168b3bf433d28999dfd614d37dafbc3c38e9 (patch) | |
tree | 97195ce6cb5c5579acac9306821c2c736316be7c /clang/lib/Basic/Diagnostic.cpp | |
parent | c066ab43851559207f7ac83420e10bbd5fd16d8c (diff) | |
download | bcm5719-llvm-43b6168b3bf433d28999dfd614d37dafbc3c38e9.tar.gz bcm5719-llvm-43b6168b3bf433d28999dfd614d37dafbc3c38e9.zip |
Teach Diagnostic to recursively expand inside %plural formats.
llvm-svn: 116468
Diffstat (limited to 'clang/lib/Basic/Diagnostic.cpp')
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 102086b69d1..cbc340e0dab 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/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 { |