]> granicus.if.org Git - clang/commitdiff
Teach Diagnostic to recursively expand inside %plural formats.
authorJohn McCall <rjmccall@apple.com>
Thu, 14 Oct 2010 01:55:31 +0000 (01:55 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 14 Oct 2010 01:55:31 +0000 (01:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116468 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Diagnostic.cpp

index 102086b69d1c57396fbeae8ffa4a8cfb0da32208..cbc340e0dab9662aa2cb15b89ec14e3c53b283e2 100644 (file)
@@ -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 {