diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-09-28 15:19:06 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-09 19:10:10 -0300 |
commit | 0dd7d12ca18255ec186293bc00918cd68e516fa6 (patch) | |
tree | af555aee35239d622417ee09dcb83820d5ccc9f9 | |
parent | 2bfe59a2b8a588b338da7b9472d4ec6f66c2d10a (diff) |
Fixed AbstractMetaBuilder to handle enum values receiving boolean values.
In other words, this
enum {
Positive = true,
Negative = false
};
is now properly recognized.
Tests were added as usual.
Reviewed by Luciano Wolf <luciano.wolf@openbossa.org>
Reviewed by Renato Araújo <renato.filho@openbossa.org>
-rw-r--r-- | abstractmetabuilder.cpp | 42 | ||||
-rw-r--r-- | tests/testenum.cpp | 43 |
2 files changed, 65 insertions, 20 deletions
diff --git a/abstractmetabuilder.cpp b/abstractmetabuilder.cpp index 9ae66241b..d4c75dc1f 100644 --- a/abstractmetabuilder.cpp +++ b/abstractmetabuilder.cpp @@ -792,16 +792,19 @@ int AbstractMetaBuilder::figureOutEnumValue(const QString &stringValue, AbstractMetaClass* enumEnclosingClass = metaEnum ? metaEnum->enclosingClass() : 0; if (metaEnum) { - if ((ev = metaEnum->values().find(s))) { + matched = true; + if (s == "true" || s == "false") { + v = (s == "true"); + } else if ((ev = metaEnum->values().find(s))) { v = ev->value(); - matched = true; } else if (enumEnclosingClass && (ev = enumEnclosingClass->findEnumValue(s, metaEnum))) { v = ev->value(); - matched = true; } else { + matched = false; ReportHandler::warning("unhandled enum value: " + s + " in " + (enumEnclosingClass ? QString("%1::").arg(enumEnclosingClass->name()) : QString()) - + metaEnum->name()); + + metaEnum->name() + + " from header '" + metaEnum->typeEntry()->include().name() + "'"); } } else { ReportHandler::warning("unhandled enum value: Unknown enum"); @@ -820,6 +823,7 @@ int AbstractMetaBuilder::figureOutEnumValue(const QString &stringValue, .arg(metaFunction->name()) .arg(metaFunction->implementingClass()->name()); } + warn += " from header '" + metaEnum->typeEntry()->include().name() + "'"; ReportHandler::warning(warn); returnValue = oldValuevalue; @@ -1945,23 +1949,27 @@ AbstractMetaType* AbstractMetaBuilder::translateType(const TypeInfo& _typei, boo int elems = s.toInt(&ok); if (!ok) { - AbstractMetaEnumValue* enumValue = m_metaClasses.findEnumValue(s); - if (!enumValue) { - foreach (AbstractMetaEnum* metaEnum, m_globalEnums) { - foreach (AbstractMetaEnumValue* ev, metaEnum->values()) { - if (ev->name() == s) { - enumValue = ev; - break; + if (s == "true" or s == "false") { + elems = (s == "true"); + } else { + AbstractMetaEnumValue* enumValue = m_metaClasses.findEnumValue(s); + if (!enumValue) { + foreach (AbstractMetaEnum* metaEnum, m_globalEnums) { + foreach (AbstractMetaEnumValue* ev, metaEnum->values()) { + if (ev->name() == s) { + enumValue = ev; + break; + } } + if (enumValue) + break; } - if (enumValue) - break; } - } - if (!enumValue) - return 0; - elems = enumValue->value(); + if (!enumValue) + return 0; + elems = enumValue->value(); + } } AbstractMetaType* arrayType = createMetaType(); diff --git a/tests/testenum.cpp b/tests/testenum.cpp index 4df31899f..a55598fb4 100644 --- a/tests/testenum.cpp +++ b/tests/testenum.cpp @@ -104,6 +104,7 @@ void TestEnum::testAnonymousEnum() enum { Global0, Global1 }; \ struct A {\ enum { A0, A1 };\ + enum { isThis = true, isThat = false };\ };\ "; const char* xmlCode = "\ @@ -113,6 +114,7 @@ void TestEnum::testAnonymousEnum() <value-type name='A'> \ <!-- Uses the second value of the enum to identify it. -->\ <enum-type identified-by-value='A1'/>\ + <enum-type identified-by-value='isThis'/>\ </value-type> \ </typesystem>"; @@ -125,9 +127,37 @@ void TestEnum::testAnonymousEnum() AbstractMetaClassList classes = t.builder()->classes(); QCOMPARE(classes.count(), 1); - QCOMPARE(classes[0]->enums().count(), 1); - QCOMPARE(classes[0]->enums().first()->typeEntry()->qualifiedCppName(), QString("A::A1")); - QVERIFY(classes[0]->enums().first()->isAnonymous()); + QCOMPARE(classes[0]->enums().count(), 2); + + AbstractMetaEnum* anonEnumA1 = classes[0]->findEnum("A1"); + QVERIFY(anonEnumA1); + QVERIFY(anonEnumA1->isAnonymous()); + QCOMPARE(anonEnumA1->typeEntry()->qualifiedCppName(), QString("A::A1")); + + AbstractMetaEnumValue* enumValueA0 = anonEnumA1->values().first(); + QCOMPARE(enumValueA0->name(), QString("A0")); + QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->stringValue(), QString("")); + + AbstractMetaEnumValue* enumValueA1 = anonEnumA1->values().last(); + QCOMPARE(enumValueA1->name(), QString("A1")); + QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->stringValue(), QString("")); + + AbstractMetaEnum* anonEnumIsThis = classes[0]->findEnum("isThis"); + QVERIFY(anonEnumIsThis); + QVERIFY(anonEnumIsThis->isAnonymous()); + QCOMPARE(anonEnumIsThis->typeEntry()->qualifiedCppName(), QString("A::isThis")); + + AbstractMetaEnumValue* enumValueIsThis = anonEnumIsThis->values().first(); + QCOMPARE(enumValueIsThis->name(), QString("isThis")); + QCOMPARE(enumValueIsThis->value(), static_cast<int>(true)); + QCOMPARE(enumValueIsThis->stringValue(), QString("true")); + + AbstractMetaEnumValue* enumValueIsThat = anonEnumIsThis->values().last(); + QCOMPARE(enumValueIsThat->name(), QString("isThat")); + QCOMPARE(enumValueIsThat->value(), static_cast<int>(false)); + QCOMPARE(enumValueIsThat->stringValue(), QString("false")); } void TestEnum::testGlobalEnums() @@ -149,12 +179,16 @@ void TestEnum::testGlobalEnums() AbstractMetaEnum* enumA = globalEnums.first(); QCOMPARE(enumA->typeEntry()->qualifiedCppName(), QString("EnumA")); + AbstractMetaEnumValue* enumValueA0 = enumA->values().first(); QCOMPARE(enumValueA0->name(), QString("A0")); QCOMPARE(enumValueA0->value(), 0); + QCOMPARE(enumValueA0->stringValue(), QString("")); + AbstractMetaEnumValue* enumValueA1 = enumA->values().last(); QCOMPARE(enumValueA1->name(), QString("A1")); QCOMPARE(enumValueA1->value(), 1); + QCOMPARE(enumValueA1->stringValue(), QString("")); AbstractMetaEnum* enumB = globalEnums.last(); QCOMPARE(enumB->typeEntry()->qualifiedCppName(), QString("EnumB")); @@ -162,9 +196,12 @@ void TestEnum::testGlobalEnums() AbstractMetaEnumValue* enumValueB0 = enumB->values().first(); QCOMPARE(enumValueB0->name(), QString("B0")); QCOMPARE(enumValueB0->value(), 2); + QCOMPARE(enumValueB0->stringValue(), QString("2")); + AbstractMetaEnumValue* enumValueB1 = enumB->values().last(); QCOMPARE(enumValueB1->name(), QString("B1")); QCOMPARE(enumValueB1->value(), 4); + QCOMPARE(enumValueB1->stringValue(), QString("4")); } QTEST_APPLESS_MAIN(TestEnum) |