Replace XFA_VT_* defines with enum class.

Turns out they aren't bitfields.

Bug: pdfium:1085
Change-Id: I9a3559172bdb4001ef47e2205146133eee414283
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/80717
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index f42859d..e6e080a 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -328,37 +328,40 @@
   }
 }
 
-std::pair<bool, uint32_t> PatternStringType(ByteStringView bsPattern) {
+std::pair<bool, CXFA_LocaleValue::ValueType> PatternStringType(
+    ByteStringView bsPattern) {
   WideString wsPattern = WideString::FromUTF8(bsPattern);
   if (L"datetime" == wsPattern.First(8))
-    return {true, XFA_VT_DATETIME};
+    return {true, CXFA_LocaleValue::ValueType::kDateTime};
   if (L"date" == wsPattern.First(4)) {
     auto pos = wsPattern.Find(L"time");
-    uint32_t type =
-        pos.has_value() && pos.value() != 0 ? XFA_VT_DATETIME : XFA_VT_DATE;
+    CXFA_LocaleValue::ValueType type =
+        pos.has_value() && pos.value() != 0
+            ? CXFA_LocaleValue::ValueType::kDateTime
+            : CXFA_LocaleValue::ValueType::kDate;
     return {true, type};
   }
   if (L"time" == wsPattern.First(4))
-    return {true, XFA_VT_TIME};
+    return {true, CXFA_LocaleValue::ValueType::kTime};
   if (L"text" == wsPattern.First(4))
-    return {true, XFA_VT_TEXT};
+    return {true, CXFA_LocaleValue::ValueType::kText};
   if (L"num" == wsPattern.First(3)) {
-    uint32_t type;
+    CXFA_LocaleValue::ValueType type;
     if (L"integer" == wsPattern.Substr(4, 7)) {
-      type = XFA_VT_INTEGER;
+      type = CXFA_LocaleValue::ValueType::kInteger;
     } else if (L"decimal" == wsPattern.Substr(4, 7)) {
-      type = XFA_VT_DECIMAL;
+      type = CXFA_LocaleValue::ValueType::kDecimal;
     } else if (L"currency" == wsPattern.Substr(4, 8)) {
-      type = XFA_VT_FLOAT;
+      type = CXFA_LocaleValue::ValueType::kFloat;
     } else if (L"percent" == wsPattern.Substr(4, 7)) {
-      type = XFA_VT_FLOAT;
+      type = CXFA_LocaleValue::ValueType::kFloat;
     } else {
-      type = XFA_VT_FLOAT;
+      type = CXFA_LocaleValue::ValueType::kFloat;
     }
     return {true, type};
   }
 
-  uint32_t type = XFA_VT_NULL;
+  CXFA_LocaleValue::ValueType type = CXFA_LocaleValue::ValueType::kNull;
   wsPattern.MakeLower();
   const wchar_t* pData = wsPattern.c_str();
   int32_t iLength = wsPattern.GetLength();
@@ -377,11 +380,11 @@
     }
 
     if (wsPatternChar == 'h' || wsPatternChar == 'k')
-      return {false, XFA_VT_TIME};
+      return {false, CXFA_LocaleValue::ValueType::kTime};
     if (wsPatternChar == 'x' || wsPatternChar == 'o' || wsPatternChar == '0')
-      return {false, XFA_VT_TEXT};
+      return {false, CXFA_LocaleValue::ValueType::kText};
     if (wsPatternChar == 'v' || wsPatternChar == '8' || wsPatternChar == '$')
-      return {false, XFA_VT_FLOAT};
+      return {false, CXFA_LocaleValue::ValueType::kFloat};
     if (wsPatternChar == 'y' || wsPatternChar == 'j') {
       iIndex++;
       wchar_t timePatternChar;
@@ -393,18 +396,18 @@
           continue;
         }
         if (!bSingleQuotation && timePatternChar == 't')
-          return {false, XFA_VT_DATETIME};
+          return {false, CXFA_LocaleValue::ValueType::kDateTime};
         iIndex++;
       }
-      return {false, XFA_VT_DATE};
+      return {false, CXFA_LocaleValue::ValueType::kDate};
     }
 
     if (wsPatternChar == 'a') {
-      type = XFA_VT_TEXT;
+      type = CXFA_LocaleValue::ValueType::kText;
     } else if (wsPatternChar == 'z' || wsPatternChar == 's' ||
                wsPatternChar == 'e' || wsPatternChar == ',' ||
                wsPatternChar == '.') {
-      type = XFA_VT_FLOAT;
+      type = CXFA_LocaleValue::ValueType::kFloat;
     }
     iIndex++;
   }
@@ -2049,7 +2052,7 @@
   }
   bsArg = bsArg.Last(bsArg.GetLength() - (pos.value() + 1));
 
-  CXFA_LocaleValue timeValue(XFA_VT_TIME,
+  CXFA_LocaleValue timeValue(CXFA_LocaleValue::ValueType::kTime,
                              WideString::FromUTF8(bsArg.AsStringView()), pMgr);
   if (!timeValue.IsValid()) {
     info.GetReturnValue().Set(0);
@@ -2465,7 +2468,7 @@
     wsFormat = WideString::FromUTF8(bsFormat.AsStringView());
   }
   wsFormat = L"time{" + wsFormat + L"}";
-  CXFA_LocaleValue localeValue(XFA_VT_TIME,
+  CXFA_LocaleValue localeValue(CXFA_LocaleValue::ValueType::kTime,
                                WideString::FromUTF8(bsTime.AsStringView()),
                                wsFormat, pLocale, pMgr);
   if (!localeValue.IsValid()) {
@@ -2545,9 +2548,10 @@
     return ByteString();
 
   WideString wsFormat = FormatFromString(pLocale, bsFormat);
-  CFX_DateTime dt = CXFA_LocaleValue(XFA_VT_DATE, WideString::FromUTF8(bsDate),
-                                     wsFormat, pLocale, pMgr)
-                        .GetDate();
+  CFX_DateTime dt =
+      CXFA_LocaleValue(CXFA_LocaleValue::ValueType::kDate,
+                       WideString::FromUTF8(bsDate), wsFormat, pLocale, pMgr)
+          .GetDate();
 
   return ByteString::Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(),
                             dt.GetDay());
@@ -2569,7 +2573,8 @@
 
   WideString wsFormat = FormatFromString(pLocale, bsFormat);
   WideString wsRet;
-  CXFA_LocaleValue(XFA_VT_DATE, WideString::FromUTF8(bsDate), pMgr)
+  CXFA_LocaleValue(CXFA_LocaleValue::ValueType::kDate,
+                   WideString::FromUTF8(bsDate), pMgr)
       .FormatPatterns(wsRet, wsFormat, pLocale, XFA_ValuePicture::kDisplay);
   return wsRet.ToUTF8();
 }
@@ -2590,7 +2595,8 @@
 
   WideString wsFormat = {
       L"time{", FormatFromString(pLocale, bsFormat).AsStringView(), L"}"};
-  CXFA_LocaleValue widgetValue(XFA_VT_TIME, WideString::FromUTF8(bsTime), pMgr);
+  CXFA_LocaleValue widgetValue(CXFA_LocaleValue::ValueType::kTime,
+                               WideString::FromUTF8(bsTime), pMgr);
   WideString wsRet;
   widgetValue.FormatPatterns(wsRet, wsFormat, pLocale,
                              XFA_ValuePicture::kDisplay);
@@ -3781,12 +3787,12 @@
   WideString wsPattern = WideString::FromUTF8(bsPattern.AsStringView());
   WideString wsValue = WideString::FromUTF8(bsValue.AsStringView());
   bool bPatternIsString;
-  uint32_t dwPatternType;
+  CXFA_LocaleValue::ValueType dwPatternType;
   std::tie(bPatternIsString, dwPatternType) =
       PatternStringType(bsPattern.AsStringView());
   if (!bPatternIsString) {
     switch (dwPatternType) {
-      case XFA_VT_DATETIME: {
+      case CXFA_LocaleValue::ValueType::kDateTime: {
         auto iTChar = wsPattern.Find(L'T');
         if (!iTChar.has_value()) {
           info.GetReturnValue().SetEmptyString();
@@ -3800,28 +3806,28 @@
             wsPattern.Last(wsPattern.GetLength() - (iTChar.value() + 1)) + L"}";
         wsPattern = wsDatePattern + wsTimePattern;
       } break;
-      case XFA_VT_DATE: {
+      case CXFA_LocaleValue::ValueType::kDate: {
         wsPattern = L"date{" + wsPattern + L"}";
       } break;
-      case XFA_VT_TIME: {
+      case CXFA_LocaleValue::ValueType::kTime: {
         wsPattern = L"time{" + wsPattern + L"}";
       } break;
-      case XFA_VT_TEXT: {
+      case CXFA_LocaleValue::ValueType::kText: {
         wsPattern = L"text{" + wsPattern + L"}";
       } break;
-      case XFA_VT_FLOAT: {
+      case CXFA_LocaleValue::ValueType::kFloat: {
         wsPattern = L"num{" + wsPattern + L"}";
       } break;
       default: {
         WideString wsTestPattern = L"num{" + wsPattern + L"}";
-        CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
-                                         pLocale, pMgr);
+        CXFA_LocaleValue tempLocaleValue(CXFA_LocaleValue::ValueType::kFloat,
+                                         wsValue, wsTestPattern, pLocale, pMgr);
         if (tempLocaleValue.IsValid()) {
           wsPattern = std::move(wsTestPattern);
-          dwPatternType = XFA_VT_FLOAT;
+          dwPatternType = CXFA_LocaleValue::ValueType::kFloat;
         } else {
           wsPattern = L"text{" + wsPattern + L"}";
-          dwPatternType = XFA_VT_TEXT;
+          dwPatternType = CXFA_LocaleValue::ValueType::kText;
         }
       } break;
     }
@@ -3958,7 +3964,7 @@
   WideString wsPattern = WideString::FromUTF8(bsPattern.AsStringView());
   WideString wsValue = WideString::FromUTF8(bsValue.AsStringView());
   bool bPatternIsString;
-  uint32_t dwPatternType;
+  CXFA_LocaleValue::ValueType dwPatternType;
   std::tie(bPatternIsString, dwPatternType) =
       PatternStringType(bsPattern.AsStringView());
   if (bPatternIsString) {
@@ -3975,7 +3981,7 @@
   }
 
   switch (dwPatternType) {
-    case XFA_VT_DATETIME: {
+    case CXFA_LocaleValue::ValueType::kDateTime: {
       auto iTChar = wsPattern.Find(L'T');
       if (!iTChar.has_value()) {
         info.GetReturnValue().SetEmptyString();
@@ -3998,7 +4004,7 @@
           fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
-    case XFA_VT_DATE: {
+    case CXFA_LocaleValue::ValueType::kDate: {
       wsPattern = L"date{" + wsPattern + L"}";
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
@@ -4011,7 +4017,7 @@
           fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
-    case XFA_VT_TIME: {
+    case CXFA_LocaleValue::ValueType::kTime: {
       wsPattern = L"time{" + wsPattern + L"}";
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
@@ -4024,10 +4030,10 @@
           fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
-    case XFA_VT_TEXT: {
+    case CXFA_LocaleValue::ValueType::kText: {
       wsPattern = L"text{" + wsPattern + L"}";
-      CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale,
-                                   pMgr);
+      CXFA_LocaleValue localeValue(CXFA_LocaleValue::ValueType::kText, wsValue,
+                                   wsPattern, pLocale, pMgr);
       if (!localeValue.IsValid()) {
         info.GetReturnValue().SetEmptyString();
         return;
@@ -4037,10 +4043,10 @@
           fxv8::NewStringHelper(info.GetIsolate(), result.AsStringView()));
       return;
     }
-    case XFA_VT_FLOAT: {
+    case CXFA_LocaleValue::ValueType::kFloat: {
       wsPattern = L"num{" + wsPattern + L"}";
-      CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale,
-                                   pMgr);
+      CXFA_LocaleValue localeValue(CXFA_LocaleValue::ValueType::kFloat, wsValue,
+                                   wsPattern, pLocale, pMgr);
       if (!localeValue.IsValid()) {
         info.GetReturnValue().SetEmptyString();
         return;
@@ -4051,8 +4057,8 @@
     default: {
       {
         WideString wsTestPattern = L"num{" + wsPattern + L"}";
-        CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern,
-                                     pLocale, pMgr);
+        CXFA_LocaleValue localeValue(CXFA_LocaleValue::ValueType::kFloat,
+                                     wsValue, wsTestPattern, pLocale, pMgr);
         if (localeValue.IsValid()) {
           info.GetReturnValue().Set(localeValue.GetDoubleNum());
           return;
@@ -4061,8 +4067,8 @@
 
       {
         WideString wsTestPattern = L"text{" + wsPattern + L"}";
-        CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern,
-                                     pLocale, pMgr);
+        CXFA_LocaleValue localeValue(CXFA_LocaleValue::ValueType::kText,
+                                     wsValue, wsTestPattern, pLocale, pMgr);
         if (localeValue.IsValid()) {
           auto result = localeValue.GetValue().ToUTF8();
           info.GetReturnValue().Set(
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index e6b1806..a8b5f7d 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -188,7 +188,8 @@
                                           int32_t iMonth,
                                           int32_t iDay) {
   WideString wsPicture = m_pNode->GetPictureContent(XFA_ValuePicture::kEdit);
-  CXFA_LocaleValue date(XFA_VT_DATE, GetDoc()->GetXFADoc()->GetLocaleMgr());
+  CXFA_LocaleValue date(CXFA_LocaleValue::ValueType::kDate,
+                        GetDoc()->GetXFADoc()->GetLocaleMgr());
   date.SetDate(CFX_DateTime(iYear, iMonth, iDay, 0, 0, 0, 0));
 
   WideString wsDate;
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 09bf72a..6db92f1 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -25,26 +25,27 @@
 
 CFGAS_StringFormatter::Category ValueCategory(
     CFGAS_StringFormatter::Category eCategory,
-    uint32_t dwValueType) {
+    CXFA_LocaleValue::ValueType eValueType) {
   if (eCategory != CFGAS_StringFormatter::Category::kUnknown)
     return eCategory;
 
-  switch (dwValueType) {
-    case XFA_VT_BOOLEAN:
-    case XFA_VT_INTEGER:
-    case XFA_VT_DECIMAL:
-    case XFA_VT_FLOAT:
+  switch (eValueType) {
+    case CXFA_LocaleValue::ValueType::kBoolean:
+    case CXFA_LocaleValue::ValueType::kInteger:
+    case CXFA_LocaleValue::ValueType::kDecimal:
+    case CXFA_LocaleValue::ValueType::kFloat:
       return CFGAS_StringFormatter::Category::kNum;
-    case XFA_VT_TEXT:
+    case CXFA_LocaleValue::ValueType::kText:
       return CFGAS_StringFormatter::Category::kText;
-    case XFA_VT_DATE:
+    case CXFA_LocaleValue::ValueType::kDate:
       return CFGAS_StringFormatter::Category::kDate;
-    case XFA_VT_TIME:
+    case CXFA_LocaleValue::ValueType::kTime:
       return CFGAS_StringFormatter::Category::kTime;
-    case XFA_VT_DATETIME:
+    case CXFA_LocaleValue::ValueType::kDateTime:
       return CFGAS_StringFormatter::Category::kDateTime;
+    default:
+      return CFGAS_StringFormatter::Category::kUnknown;
   }
-  return CFGAS_StringFormatter::Category::kUnknown;
 }
 
 bool ValueSplitDateTime(const WideString& wsDateTime,
@@ -96,26 +97,26 @@
 
 CXFA_LocaleValue::CXFA_LocaleValue() = default;
 
-CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, CXFA_LocaleMgr* pLocaleMgr)
+CXFA_LocaleValue::CXFA_LocaleValue(ValueType eType, CXFA_LocaleMgr* pLocaleMgr)
     : m_pLocaleMgr(pLocaleMgr),
-      m_dwType(dwType),
-      m_bValid(m_dwType != XFA_VT_NULL) {}
+      m_eType(eType),
+      m_bValid(m_eType != ValueType::kNull) {}
 
-CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType,
+CXFA_LocaleValue::CXFA_LocaleValue(ValueType eType,
                                    const WideString& wsValue,
                                    CXFA_LocaleMgr* pLocaleMgr)
     : m_pLocaleMgr(pLocaleMgr),
       m_wsValue(wsValue),
-      m_dwType(dwType),
-      m_bValid(ValidateCanonicalValue(wsValue, dwType)) {}
+      m_eType(eType),
+      m_bValid(ValidateCanonicalValue(wsValue, eType)) {}
 
-CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType,
+CXFA_LocaleValue::CXFA_LocaleValue(ValueType eType,
                                    const WideString& wsValue,
                                    const WideString& wsFormat,
                                    GCedLocaleIface* pLocale,
                                    CXFA_LocaleMgr* pLocaleMgr)
     : m_pLocaleMgr(pLocaleMgr),
-      m_dwType(dwType),
+      m_eType(eType),
       m_bValid(ParsePatternValue(wsValue, wsFormat, pLocale)) {}
 
 CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& that) = default;
@@ -142,7 +143,7 @@
   for (; !bRet && i < wsPatterns.size(); i++) {
     const WideString& wsFormat = wsPatterns[i];
     auto pFormat = std::make_unique<CFGAS_StringFormatter>(wsFormat);
-    switch (ValueCategory(pFormat->GetCategory(), m_dwType)) {
+    switch (ValueCategory(pFormat->GetCategory(), m_eType)) {
       case CFGAS_StringFormatter::Category::kNull:
         bRet = pFormat->ParseNull(wsValue);
         if (!bRet)
@@ -216,8 +217,10 @@
 }
 
 double CXFA_LocaleValue::GetDoubleNum() const {
-  if (!m_bValid || (m_dwType != XFA_VT_BOOLEAN && m_dwType != XFA_VT_INTEGER &&
-                    m_dwType != XFA_VT_DECIMAL && m_dwType != XFA_VT_FLOAT)) {
+  if (!m_bValid || (m_eType != CXFA_LocaleValue::ValueType::kBoolean &&
+                    m_eType != CXFA_LocaleValue::ValueType::kInteger &&
+                    m_eType != CXFA_LocaleValue::ValueType::kDecimal &&
+                    m_eType != CXFA_LocaleValue::ValueType::kFloat)) {
     return 0;
   }
 
@@ -225,7 +228,7 @@
 }
 
 CFX_DateTime CXFA_LocaleValue::GetDate() const {
-  if (!m_bValid || m_dwType != XFA_VT_DATE)
+  if (!m_bValid || m_eType != CXFA_LocaleValue::ValueType::kDate)
     return CFX_DateTime();
 
   CFX_DateTime dt;
@@ -234,7 +237,7 @@
 }
 
 CFX_DateTime CXFA_LocaleValue::GetTime() const {
-  if (!m_bValid || m_dwType != XFA_VT_TIME)
+  if (!m_bValid || m_eType != CXFA_LocaleValue::ValueType::kTime)
     return CFX_DateTime();
 
   CFX_DateTime dt;
@@ -243,14 +246,14 @@
 }
 
 bool CXFA_LocaleValue::SetDate(const CFX_DateTime& d) {
-  m_dwType = XFA_VT_DATE;
+  m_eType = CXFA_LocaleValue::ValueType::kDate;
   m_wsValue = WideString::Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(),
                                  d.GetDay());
   return true;
 }
 
 bool CXFA_LocaleValue::SetTime(const CFX_DateTime& t) {
-  m_dwType = XFA_VT_TIME;
+  m_eType = CXFA_LocaleValue::ValueType::kTime;
   m_wsValue = WideString::Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(),
                                  t.GetSecond());
   if (t.GetMillisecond() > 0)
@@ -259,7 +262,7 @@
 }
 
 bool CXFA_LocaleValue::SetDateTime(const CFX_DateTime& dt) {
-  m_dwType = XFA_VT_DATETIME;
+  m_eType = CXFA_LocaleValue::ValueType::kDateTime;
   m_wsValue = WideString::Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(),
                                  dt.GetMonth(), dt.GetDay(), dt.GetHour(),
                                  dt.GetMinute(), dt.GetSecond());
@@ -293,7 +296,7 @@
   bool bRet = false;
   auto pFormat = std::make_unique<CFGAS_StringFormatter>(wsFormat);
   CFGAS_StringFormatter::Category eCategory =
-      ValueCategory(pFormat->GetCategory(), m_dwType);
+      ValueCategory(pFormat->GetCategory(), m_eType);
   switch (eCategory) {
     case CFGAS_StringFormatter::Category::kNull:
       if (m_wsValue.IsEmpty())
@@ -337,13 +340,13 @@
 }
 
 bool CXFA_LocaleValue::ValidateCanonicalValue(const WideString& wsValue,
-                                              uint32_t dwVType) {
+                                              ValueType eType) {
   if (wsValue.IsEmpty())
     return true;
 
   CFX_DateTime dt;
-  switch (dwVType) {
-    case XFA_VT_DATE: {
+  switch (eType) {
+    case ValueType::kDate: {
       if (ValidateCanonicalDate(wsValue, &dt))
         return true;
 
@@ -355,7 +358,7 @@
       }
       return false;
     }
-    case XFA_VT_TIME: {
+    case ValueType::kTime: {
       if (ValidateCanonicalTime(wsValue))
         return true;
 
@@ -367,13 +370,16 @@
       }
       return false;
     }
-    case XFA_VT_DATETIME: {
+    case ValueType::kDateTime: {
       WideString wsDate, wsTime;
       if (ValueSplitDateTime(wsValue, wsDate, wsTime) &&
           ValidateCanonicalDate(wsDate, &dt) && ValidateCanonicalTime(wsTime)) {
         return true;
       }
     } break;
+    default: {
+      break;
+    }
   }
   return true;
 }
@@ -570,7 +576,7 @@
   for (size_t i = 0; !bRet && i < wsPatterns.size(); i++) {
     const WideString& wsFormat = wsPatterns[i];
     auto pFormat = std::make_unique<CFGAS_StringFormatter>(wsFormat);
-    switch (ValueCategory(pFormat->GetCategory(), m_dwType)) {
+    switch (ValueCategory(pFormat->GetCategory(), m_eType)) {
       case CFGAS_StringFormatter::Category::kNull:
         bRet = pFormat->ParseNull(wsValue);
         if (bRet)
diff --git a/xfa/fxfa/parser/cxfa_localevalue.h b/xfa/fxfa/parser/cxfa_localevalue.h
index 94a925e..bad3627 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.h
+++ b/xfa/fxfa/parser/cxfa_localevalue.h
@@ -17,26 +17,28 @@
 class CXFA_LocaleMgr;
 class GCedLocaleIface;
 
-#define XFA_VT_NULL 0
-#define XFA_VT_BOOLEAN 1
-#define XFA_VT_INTEGER 2
-#define XFA_VT_DECIMAL 4
-#define XFA_VT_FLOAT 8
-#define XFA_VT_TEXT 16
-#define XFA_VT_DATE 32
-#define XFA_VT_TIME 64
-#define XFA_VT_DATETIME 128
-
 class CXFA_LocaleValue {
   CPPGC_STACK_ALLOCATED();  // Raw/Unowned pointers allowed.
 
  public:
+  enum class ValueType : uint8_t {
+    kNull = 0,
+    kBoolean,
+    kInteger,
+    kDecimal,
+    kFloat,
+    kText,
+    kDate,
+    kTime,
+    kDateTime,
+  };
+
   CXFA_LocaleValue();
-  CXFA_LocaleValue(uint32_t dwType, CXFA_LocaleMgr* pLocaleMgr);
-  CXFA_LocaleValue(uint32_t dwType,
+  CXFA_LocaleValue(ValueType eType, CXFA_LocaleMgr* pLocaleMgr);
+  CXFA_LocaleValue(ValueType eType,
                    const WideString& wsValue,
                    CXFA_LocaleMgr* pLocaleMgr);
-  CXFA_LocaleValue(uint32_t dwType,
+  CXFA_LocaleValue(ValueType dwType,
                    const WideString& wsValue,
                    const WideString& wsFormat,
                    GCedLocaleIface* pLocale,
@@ -63,7 +65,7 @@
 
   bool IsValid() const { return m_bValid; }
   const WideString& GetValue() const { return m_wsValue; }
-  uint32_t GetType() const { return m_dwType; }
+  ValueType GetType() const { return m_eType; }
   double GetDoubleNum() const;
   bool SetDate(const CFX_DateTime& d);
   CFX_DateTime GetDate() const;
@@ -74,7 +76,7 @@
                            const WideString& wsFormat,
                            GCedLocaleIface* pLocale,
                            XFA_ValuePicture eValueType) const;
-  bool ValidateCanonicalValue(const WideString& wsValue, uint32_t dwVType);
+  bool ValidateCanonicalValue(const WideString& wsValue, ValueType eType);
   bool ValidateCanonicalDate(const WideString& wsDate, CFX_DateTime* unDate);
   bool ValidateCanonicalTime(const WideString& wsTime);
 
@@ -87,7 +89,7 @@
 
   UnownedPtr<CXFA_LocaleMgr> m_pLocaleMgr;  // Ok, stack-only.
   WideString m_wsValue;
-  uint32_t m_dwType = XFA_VT_NULL;
+  ValueType m_eType = ValueType::kNull;
   bool m_bValid = true;
 };
 
diff --git a/xfa/fxfa/parser/cxfa_localevalue_unittest.cpp b/xfa/fxfa/parser/cxfa_localevalue_unittest.cpp
index e69b058..8357431 100644
--- a/xfa/fxfa/parser/cxfa_localevalue_unittest.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue_unittest.cpp
@@ -11,7 +11,8 @@
 // We don't expect more precision than a float's worth from this code.
 float MakeDoubleNumAsFloat(const wchar_t* str) {
   return static_cast<float>(
-      CXFA_LocaleValue(XFA_VT_FLOAT, str, nullptr).GetDoubleNum());
+      CXFA_LocaleValue(CXFA_LocaleValue::ValueType::kFloat, str, nullptr)
+          .GetDoubleNum());
 }
 
 }  // namespace
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index f35db20..16335e0 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -4726,22 +4726,21 @@
       if (!pLocale)
         return WideString();
 
-      uint32_t dwType = widgetValue.GetType();
-      switch (dwType) {
-        case XFA_VT_DATE:
+      switch (widgetValue.GetType()) {
+        case CXFA_LocaleValue::ValueType::kDate:
           return pLocale->GetDatePattern(
               LocaleIface::DateTimeSubcategory::kMedium);
-        case XFA_VT_TIME:
+        case CXFA_LocaleValue::ValueType::kTime:
           return pLocale->GetTimePattern(
               LocaleIface::DateTimeSubcategory::kMedium);
-        case XFA_VT_DATETIME:
+        case CXFA_LocaleValue::ValueType::kDateTime:
           return pLocale->GetDatePattern(
                      LocaleIface::DateTimeSubcategory::kMedium) +
                  L"T" +
                  pLocale->GetTimePattern(
                      LocaleIface::DateTimeSubcategory::kMedium);
-        case XFA_VT_DECIMAL:
-        case XFA_VT_FLOAT:
+        case CXFA_LocaleValue::ValueType::kDecimal:
+        case CXFA_LocaleValue::ValueType::kFloat:
         default:
           return WideString();
       }
@@ -4762,15 +4761,14 @@
       if (!pLocale)
         return WideString();
 
-      uint32_t dwType = widgetValue.GetType();
-      switch (dwType) {
-        case XFA_VT_DATE:
+      switch (widgetValue.GetType()) {
+        case CXFA_LocaleValue::ValueType::kDate:
           return pLocale->GetDatePattern(
               LocaleIface::DateTimeSubcategory::kShort);
-        case XFA_VT_TIME:
+        case CXFA_LocaleValue::ValueType::kTime:
           return pLocale->GetTimePattern(
               LocaleIface::DateTimeSubcategory::kShort);
-        case XFA_VT_DATETIME:
+        case CXFA_LocaleValue::ValueType::kDateTime:
           return pLocale->GetDatePattern(
                      LocaleIface::DateTimeSubcategory::kShort) +
                  L"T" +
@@ -4833,19 +4831,21 @@
     CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
     CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
     switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
+      case CXFA_LocaleValue::ValueType::kDate: {
         WideString wsDate, wsTime;
         if (SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocaleMgr);
+          CXFA_LocaleValue date(CXFA_LocaleValue::ValueType::kDate, wsDate,
+                                pLocaleMgr);
           if (date.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
             return wsValue;
         }
         break;
       }
-      case XFA_VT_TIME: {
+      case CXFA_LocaleValue::ValueType::kTime: {
         WideString wsDate, wsTime;
         if (SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocaleMgr);
+          CXFA_LocaleValue time(CXFA_LocaleValue::ValueType::kTime, wsTime,
+                                pLocaleMgr);
           if (time.FormatPatterns(wsValue, wsPicture, pLocale, eValueType))
             return wsValue;
         }
@@ -4897,43 +4897,44 @@
     if (!pValueChild)
       return wsValue;
 
-    int32_t iVTType = XFA_VT_NULL;
+    CXFA_LocaleValue::ValueType iVTType;
     switch (pValueChild->GetElementType()) {
       case XFA_Element::Decimal:
-        iVTType = XFA_VT_DECIMAL;
+        iVTType = CXFA_LocaleValue::ValueType::kDecimal;
         break;
       case XFA_Element::Float:
-        iVTType = XFA_VT_FLOAT;
+        iVTType = CXFA_LocaleValue::ValueType::kFloat;
         break;
       case XFA_Element::Date:
-        iVTType = XFA_VT_DATE;
+        iVTType = CXFA_LocaleValue::ValueType::kDate;
         break;
       case XFA_Element::Time:
-        iVTType = XFA_VT_TIME;
+        iVTType = CXFA_LocaleValue::ValueType::kTime;
         break;
       case XFA_Element::DateTime:
-        iVTType = XFA_VT_DATETIME;
+        iVTType = CXFA_LocaleValue::ValueType::kDateTime;
         break;
       case XFA_Element::Boolean:
-        iVTType = XFA_VT_BOOLEAN;
+        iVTType = CXFA_LocaleValue::ValueType::kBoolean;
         break;
       case XFA_Element::Integer:
-        iVTType = XFA_VT_INTEGER;
+        iVTType = CXFA_LocaleValue::ValueType::kInteger;
         break;
       case XFA_Element::Text:
-        iVTType = XFA_VT_TEXT;
+        iVTType = CXFA_LocaleValue::ValueType::kText;
         break;
       default:
-        iVTType = XFA_VT_NULL;
+        iVTType = CXFA_LocaleValue::ValueType::kNull;
         break;
     }
     CXFA_LocaleMgr* pLocaleMgr = GetDocument()->GetLocaleMgr();
     CXFA_LocaleValue widgetValue(iVTType, wsValue, pLocaleMgr);
     switch (widgetValue.GetType()) {
-      case XFA_VT_DATE: {
+      case CXFA_LocaleValue::ValueType::kDate: {
         WideString wsDate, wsTime;
         if (SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue date(XFA_VT_DATE, wsDate, pLocaleMgr);
+          CXFA_LocaleValue date(CXFA_LocaleValue::ValueType::kDate, wsDate,
+                                pLocaleMgr);
           if (date.FormatPatterns(wsFormattedValue, wsPicture, pLocale,
                                   XFA_ValuePicture::kDataBind)) {
             return wsFormattedValue;
@@ -4941,10 +4942,11 @@
         }
         break;
       }
-      case XFA_VT_TIME: {
+      case CXFA_LocaleValue::ValueType::kTime: {
         WideString wsDate, wsTime;
         if (SplitDateTime(wsValue, wsDate, wsTime)) {
-          CXFA_LocaleValue time(XFA_VT_TIME, wsTime, pLocaleMgr);
+          CXFA_LocaleValue time(CXFA_LocaleValue::ValueType::kTime, wsTime,
+                                pLocaleMgr);
           if (time.FormatPatterns(wsFormattedValue, wsPicture, pLocale,
                                   XFA_ValuePicture::kDataBind)) {
             return wsFormattedValue;
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 098b662..451060a 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -386,34 +386,34 @@
   if (!pValueChild)
     return CXFA_LocaleValue();
 
-  int32_t iVTType = XFA_VT_NULL;
+  CXFA_LocaleValue::ValueType iVTType;
   switch (pValueChild->GetElementType()) {
     case XFA_Element::Decimal:
-      iVTType = XFA_VT_DECIMAL;
+      iVTType = CXFA_LocaleValue::ValueType::kDecimal;
       break;
     case XFA_Element::Float:
-      iVTType = XFA_VT_FLOAT;
+      iVTType = CXFA_LocaleValue::ValueType::kFloat;
       break;
     case XFA_Element::Date:
-      iVTType = XFA_VT_DATE;
+      iVTType = CXFA_LocaleValue::ValueType::kDate;
       break;
     case XFA_Element::Time:
-      iVTType = XFA_VT_TIME;
+      iVTType = CXFA_LocaleValue::ValueType::kTime;
       break;
     case XFA_Element::DateTime:
-      iVTType = XFA_VT_DATETIME;
+      iVTType = CXFA_LocaleValue::ValueType::kDateTime;
       break;
     case XFA_Element::Boolean:
-      iVTType = XFA_VT_BOOLEAN;
+      iVTType = CXFA_LocaleValue::ValueType::kBoolean;
       break;
     case XFA_Element::Integer:
-      iVTType = XFA_VT_INTEGER;
+      iVTType = CXFA_LocaleValue::ValueType::kInteger;
       break;
     case XFA_Element::Text:
-      iVTType = XFA_VT_TEXT;
+      iVTType = CXFA_LocaleValue::ValueType::kText;
       break;
     default:
-      iVTType = XFA_VT_NULL;
+      iVTType = CXFA_LocaleValue::ValueType::kNull;
       break;
   }
   return CXFA_LocaleValue(iVTType, pNode->GetRawValue(),