diff --git a/src/plugins/debugger/name_demangler.cpp b/src/plugins/debugger/name_demangler.cpp index 4e0849b040b0b6fa9593f08d0a1ee62845355f72..8c6fc5e5f16d705fbfe10093d9bfb1906ae8c8dd 100644 --- a/src/plugins/debugger/name_demangler.cpp +++ b/src/plugins/debugger/name_demangler.cpp @@ -29,6 +29,7 @@ #include <QtCore/QChar> #include <QtCore/QCoreApplication> +#include <QtCore/QLatin1String> #include <QtCore/QMap> #include <QtCore/QRegExp> #include <QtCore/QSet> @@ -41,15 +42,16 @@ //#define DO_TRACE #ifdef DO_TRACE #define FUNC_START() \ - qDebug("Function %s has started, input is at position %d.", __func__, pos) + qDebug("Function %s has started, input is at position %d.", Q_FUNC_INFO, pos) #define FUNC_END(result) \ - qDebug("Function %s has finished, result is '%s'.", __func__, qPrintable(result)) + qDebug("Function %s has finished, result is '%s'.", Q_FUNC_INFO, qPrintable(result)) #else #define FUNC_START() #define FUNC_END(result) #endif // DO_TRACE -QT_BEGIN_NAMESPACE +namespace Debugger { +namespace Internal { class NameDemanglerPrivate { @@ -93,11 +95,12 @@ private: class FunctionCallOperator : public UnaryOperator { public: - FunctionCallOperator() : UnaryOperator("cl", "") { } + FunctionCallOperator() : UnaryOperator(QLatin1String("cl"), + QLatin1String("")) { } const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 1); - return exprs.first() + "()"; + return QString::fromLocal8Bit("%1()").arg(exprs.first()); } }; @@ -109,7 +112,8 @@ private: const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 1); - return repr + "(" + exprs.first() + ")"; + return QString::fromLocal8Bit("%1(%2)"). + arg(repr).arg(exprs.first()); } }; @@ -121,7 +125,8 @@ private: virtual const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 2); - return exprs.first() + " " + repr + " " + exprs.at(1); + return QString::fromLocal8Bit("%1 %2 %3"). + arg(exprs.first()).arg(repr).arg(exprs.at(1)); } OpType type() const { return BinaryOp; } }; @@ -129,11 +134,16 @@ private: class ArrayNewOperator : public BinaryOperator { public: - ArrayNewOperator() : BinaryOperator("na", "") { } + ArrayNewOperator() : BinaryOperator(QLatin1String("na"), + QLatin1String("")) + { + } + const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 2); - return "new " + exprs.first() + "[" + exprs.at(1) + "]"; + return QString::fromLocal8Bit("new %1[%2]"). + arg(exprs.first()).arg(exprs.at(1)); } }; @@ -152,22 +162,32 @@ private: class ArrayAccessOperator : public BinaryOperator { public: - ArrayAccessOperator() : BinaryOperator("ix", "") { } + ArrayAccessOperator() : BinaryOperator(QLatin1String("ix"), + QLatin1String("")) + { + } + const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 2); - return exprs.first() + "[" + exprs.at(1) + "]"; + return QString::fromLocal8Bit("%1[%2]"). + arg(exprs.first()).arg(exprs.at(1)); } }; class QuestionMarkOperator : public Operator { public: - QuestionMarkOperator() : Operator("qu", "") { } + QuestionMarkOperator() : Operator(QLatin1String("qu"), + QLatin1String("")) + { + } + virtual const QString makeExpr(const QStringList &exprs) const { Q_ASSERT(exprs.size() == 3); - return exprs.first() + " ? " + exprs.at(1) + " : " + exprs.at(2); + return QString::fromLocal8Bit("%1 ? %2 : %3"). + arg(exprs.first()).arg(exprs.at(1)).arg(exprs.at(2)); } OpType type() const { return TernaryOp; } }; @@ -303,8 +323,9 @@ bool NameDemanglerPrivate::demangle(const QString &mangledName) substitutions.clear(); templateParams.clear(); m_demangledName = parseMangledName(); - m_demangledName.replace(QRegExp("([^a-zA-Z\\d>)])::"), "\\1"); - if (m_demangledName.startsWith("::")) + m_demangledName.replace( + QRegExp(QLatin1String("([^a-zA-Z\\d>)])::")), QLatin1String("\\1")); + if (m_demangledName.startsWith(QLatin1String("::"))) m_demangledName.remove(0, 2); if (!parseError && pos != mangledName.size()) error(tr("Premature end of input")); @@ -327,7 +348,7 @@ const QString NameDemanglerPrivate::parseMangledName() { FUNC_START(); QString name; - if (readAhead(2) != "_Z") { + if (readAhead(2) != QLatin1String("_Z")) { name = mangledName; advance(mangledName.size()); } else { @@ -375,19 +396,19 @@ const QString NameDemanglerPrivate::parseEncoding() int start; if (encoding.endsWith('>')) { // Template instantiation. start = 1; - encoding.prepend(signature.first() + " "); + encoding.prepend(signature.first() + QLatin1String(" ")); } else { // Normal function. start = 0; } - encoding += "("; + encoding += QLatin1String("("); for (int i = start; i < signature.size(); ++i) { if (i > start) - encoding += ", "; + encoding += QLatin1String(", "); const QString &type = signature.at(i); - if (type != "void") + if (type != QLatin1String("void")) encoding += type; } - encoding += ")"; + encoding += QLatin1String(")"); encoding += qualifiers; addSubstitution(encoding); } else { @@ -431,7 +452,8 @@ const QString NameDemanglerPrivate::parseName() Q_ASSERT((firstSetSubstitution & firstSetLocalName).isEmpty()); QString name; - if ((readAhead(2) == "St" && firstSetUnqualifiedName.contains(peek(2))) + if ((readAhead(2) == QLatin1String("St") + && firstSetUnqualifiedName.contains(peek(2))) || firstSetUnscopedName.contains(peek())) { name = parseUnscopedName(); if (!parseError && firstSetTemplateArgs.contains(peek())) { @@ -508,7 +530,7 @@ const QString NameDemanglerPrivate::parseNestedName() * spot them. */ if (!cvQualifiers.isEmpty()) - name += "@" + cvQualifiers; + name += QLatin1String("@") + cvQualifiers; } } @@ -608,13 +630,13 @@ const QString NameDemanglerPrivate::parseTemplateArgs() FUNC_START(); Q_ASSERT(!firstSetTemplateArg.contains('E')); - QString args = "<"; + QString args = QLatin1String("<"); if (advance() != 'I') { error(tr("Invalid template args")); } else { do { if (args.length() > 1) - args += ", "; + args += QLatin1String(", "); args += parseTemplateArg(); } while (!parseError && firstSetTemplateArg.contains(peek())); if (!parseError && advance() != 'E') @@ -667,7 +689,7 @@ const QString NameDemanglerPrivate::parseCvQualifiers() break; } else { volatileFound = true; - qualifiers += " volatile"; + qualifiers += QLatin1String(" volatile"); advance(); } } else if (peek() == 'K') { @@ -676,7 +698,7 @@ const QString NameDemanglerPrivate::parseCvQualifiers() break; } else { constFound = true; - qualifiers += " const"; + qualifiers += QLatin1String(" const"); advance(); } } else { @@ -762,7 +784,7 @@ const QString NameDemanglerPrivate::parseTemplateArg() QString arg; QChar next = peek(); - if (readAhead(2) == "sp") { + if (readAhead(2) == QLatin1String("sp")) { advance(2); arg = parseExpression(); } else if (firstSetType.contains(next)) { @@ -778,7 +800,7 @@ const QString NameDemanglerPrivate::parseTemplateArg() advance(); while (!parseError && firstSetTemplateArg.contains(peek())) { if (!arg.isEmpty()) - arg += ", "; // TODO: is this correct? + arg += QLatin1String(", "); // TODO: is this correct? arg += parseTemplateArg(); } if (!parseError && advance() != 'E') @@ -843,15 +865,15 @@ const QString NameDemanglerPrivate::parseExpression() * them being parsed by parseOperatorName(). */ QString str = readAhead(2); - if (str == "cl") { + if (str == QLatin1String("cl")) { advance(2); while (!parseError && firstSetExpression.contains(peek())) expr += parseExpression(); if (!parseError && advance() != 'E') error(tr("Invalid expression")); - } else if (str == "cv") { + } else if (str == QLatin1String("cv")) { advance(2); - expr = parseType() + "("; + expr = parseType() + QLatin1String("("); if (!parseError) { if (peek() == '_') { advance(); @@ -859,7 +881,7 @@ const QString NameDemanglerPrivate::parseExpression() !parseError && firstSetExpression.contains(peek()); ++numArgs) { if (numArgs > 0) - expr += ", "; + expr += QLatin1String(", "); expr += parseExpression(); } if (!parseError && advance() != 'E') @@ -868,21 +890,21 @@ const QString NameDemanglerPrivate::parseExpression() expr += parseExpression(); } } - expr += ")"; - } else if (str == "st") { + expr += QLatin1String(")"); + } else if (str == QLatin1String("st")) { advance(2); - expr = "sizeof(" + parseType() + ")"; - } else if (str == "at") { + expr = QString::fromLocal8Bit("sizeof(%1)").arg(parseType()); + } else if (str == QLatin1String("at")) { advance(2); - expr = "alignof(" + parseType() + ")"; - } else if (str == "sr") { // TODO: Which syntax to use here? + expr = QString::fromLocal8Bit("alignof(%1)").arg(parseType()); + } else if (str == QLatin1String("sr")) { // TODO: Which syntax to use here? advance(2); expr = parseType(); if (!parseError) expr += parseUnqualifiedName(); if (!parseError && firstSetTemplateArgs.contains(peek())) parseTemplateArgs(); - } else if (str == "sZ") { + } else if (str == QLatin1String("sZ")) { expr = parseTemplateParam(); // TODO: Syntax? } else { QChar next = peek(); @@ -1073,23 +1095,24 @@ const QString NameDemanglerPrivate::parseType() QString type; QString str = readAhead(2); - if (str == "Dp") { + if (str == QLatin1String("Dp")) { advance(2); type = parseType(); // TODO: Probably needs augmentation - } else if (str == "Dt") { + } else if (str == QLatin1String("Dt")) { advance(2); type = parseExpression(); // TODO: See above if (!parseError && advance() != 'E') error(tr("Invalid type")); - } else if (str == "DT") { + } else if (str == QLatin1String("DT")) { advance(2); type = parseExpression(); // TODO: See above if (!parseError && advance() != 'E') error(tr("Invalid type")); } else { QChar next = peek(); - if (str == "Dd" || str == "De" || str == "Df" || str == "Dh" - || str == "Di" || str == "Ds" + if (str == QLatin1String("Dd") || str == QLatin1String("De") + || str == QLatin1String("Df") || str == QLatin1String("Dh") + || str == QLatin1String("Di") || str == QLatin1String("Ds") || (next != 'D' && firstSetBuiltinType.contains(next))) { type = parseBuiltinType(); } else if (firstSetFunctionType.contains(next)) { @@ -1127,16 +1150,16 @@ const QString NameDemanglerPrivate::parseType() } else if (next == 'P') { advance(); type = parseType(); - insertQualifier(type, "*"); + insertQualifier(type, QLatin1String("*")); addSubstitution(type); } else if (next == 'R') { advance(); type = parseType(); - insertQualifier(type, "&"); + insertQualifier(type, QLatin1String("&")); addSubstitution(type); } else if (next == 'O') { advance(); - type = parseType() + "&&"; // TODO: Correct notation? + type = parseType() + QLatin1String("&&"); // TODO: Correct notation? addSubstitution(type); } else if (next == 'C') { advance(); @@ -1212,67 +1235,67 @@ const QString NameDemanglerPrivate::parseBuiltinType() QString type; switch (advance().toAscii()) { case 'v': - type = "void"; + type = QLatin1String("void"); break; case 'w': - type = "wchar_t"; + type = QLatin1String("wchar_t"); break; case 'b': - type = "bool"; + type = QLatin1String("bool"); break; case 'c': - type = "char"; + type = QLatin1String("char"); break; case 'a': - type = "signed char"; + type = QLatin1String("signed char"); break; case 'h': - type = "unsigned char"; + type = QLatin1String("unsigned char"); break; case 's': - type = "short"; + type = QLatin1String("short"); break; case 't': - type = "unsigned short"; + type = QLatin1String("unsigned short"); break; case 'i': - type = "int"; + type = QLatin1String("int"); break; case 'j': - type = "unsigned int"; + type = QLatin1String("unsigned int"); break; case 'l': - type = "long"; + type = QLatin1String("long"); break; case 'm': - type = "unsigned long"; + type = QLatin1String("unsigned long"); break; case 'x': - type = "long long"; + type = QLatin1String("long long"); break; case 'y': - type = "unsigned long long"; + type = QLatin1String("unsigned long long"); break; case 'n': - type = "__int128"; + type = QLatin1String("__int128"); break; case 'o': - type = "unsigned __int128"; + type = QLatin1String("unsigned __int128"); break; case 'f': - type = "float"; + type = QLatin1String("float"); break; case 'd': - type = "double"; + type = QLatin1String("double"); break; case 'e': - type = "long double"; + type = QLatin1String("long double"); break; case 'g': - type = "__float128"; + type = QLatin1String("__float128"); break; case 'z': - type = "..."; + type = QLatin1String("..."); break; case 'D': switch (advance().toAscii()) { @@ -1280,13 +1303,13 @@ const QString NameDemanglerPrivate::parseBuiltinType() case 'e': case 'f': case 'h': - type = "IEEE_special_float"; + type = QLatin1String("IEEE_special_float"); break; case 'i': - type = "char32_t"; + type = QLatin1String("char32_t"); break; case 's': - type = "char16_t"; + type = QLatin1String("char16_t"); break; break; default: @@ -1324,15 +1347,15 @@ const QString NameDemanglerPrivate::parseFunctionType() error(tr("Invalid function type")); if (!parseError) { QString returnType = signature.first(); - QString argList = "("; + QString argList = QLatin1String("("); for (int i = 1; i < signature.size(); ++i) { if (i > 1) - argList.append(", "); + argList.append(QLatin1String(", ")); const QString &type = signature.at(i); - if (type != "void") + if (type != QLatin1String("void")) argList.append(type); } - argList.append(")"); + argList.append(QLatin1String(")")); bool retTypeIsFuncPtr = false; const int firstClosingParenIndex = returnType.indexOf(')'); if (firstClosingParenIndex != -1) { @@ -1346,12 +1369,13 @@ const QString NameDemanglerPrivate::parseFunctionType() } } if (!retTypeIsFuncPtr) - funcType = returnType + " " + argList; + funcType = QString::fromLocal8Bit("%1 %2"). + arg(returnType).arg(argList); } } if (externC) - funcType.prepend("extern \"C\" "); + funcType.prepend(QLatin1String("extern \"C\" ")); FUNC_END(funcType); return funcType; } @@ -1366,7 +1390,7 @@ const QStringList NameDemanglerPrivate::parseBareFunctionType() signature.append(parseType()); while (!parseError && firstSetType.contains(peek())); - FUNC_END(signature.join(":")); + FUNC_END(signature.join(QLatin1String(":"))); return signature; } @@ -1394,11 +1418,11 @@ const QString NameDemanglerPrivate::parseUnqualifiedName() QString name; QChar next = peek(); if (firstSetOperatorName.contains(next)) - name = "::operator" + parseOperatorName().repr; + name = QLatin1String("::operator") + parseOperatorName().repr; else if (firstSetCtorDtorName.contains(next)) - name = "::" + parseCtorDtorName(); + name = QLatin1String("::") + parseCtorDtorName(); else if (firstSetSourceName.contains(next)) - name = "::" + parseSourceName(); + name = QLatin1String("::") + parseSourceName(); else error(tr("Invalid unqualified-name")); @@ -1468,7 +1492,8 @@ const NameDemanglerPrivate::Operator &NameDemanglerPrivate::parseOperatorName() const Operator *op; if (peek() == 'v') { // TODO: Implement vendor-extended operators. - static const UnaryOperator vendorOp("v", "[unimplemented]"); + static const UnaryOperator vendorOp(QLatin1String("v"), + QLatin1String("[unimplemented]")); advance(); int numExprs = parseDigit(); Q_UNUSED(numExprs); @@ -1478,15 +1503,17 @@ const NameDemanglerPrivate::Operator &NameDemanglerPrivate::parseOperatorName() } else { const QString id = readAhead(2); advance(2); - if (id == "cv") { - static UnaryOperator castOp("cv", ""); + if (id == QLatin1String("cv")) { + static UnaryOperator castOp(QLatin1String("cv"), + QLatin1String("")); QString type = parseType(); - castOp.repr = "(" + type + ")"; + castOp.repr = QString::fromLocal8Bit("(%1)").arg(type); op = &castOp; } else { op = ops.value(id); if (op == 0) { - static const UnaryOperator pseudoOp("invalid", "invalid"); + static const UnaryOperator pseudoOp(QLatin1String("invalid"), + QLatin1String("invalid")); op = &pseudoOp; error(tr("Invalid operator-name '%s'").arg(id)); } @@ -1522,7 +1549,8 @@ const QString NameDemanglerPrivate::parseArrayType() if (!parseError && advance() != '_') error(tr("Invalid array-type")); if (!parseError) - type = parseType() + "[" + dimension + "]"; + type = QString::fromLocal8Bit("%1[%2]"). + arg(parseType()).arg(dimension); } FUNC_END(type); @@ -1547,9 +1575,11 @@ const QString NameDemanglerPrivate::parsePointerToMemberType() int parenIndex = memberType.indexOf('('); QString returnType = memberType.left(parenIndex); memberType.remove(0, parenIndex); - type = returnType + "(" + classType + "::*)" + memberType; + type = QString::fromLocal8Bit("%1(%2::*)%3"). + arg(returnType).arg(classType).arg(memberType); } else { - type = memberType + " " + classType + "::*"; + type = QString::fromLocal8Bit("%1 %2::*"). + arg(memberType).arg(classType); } } } @@ -1601,29 +1631,30 @@ const QString NameDemanglerPrivate::parseSubstitution() substitution = substitutions.first(); break; case 't': - substitution = "::std::"; + substitution = QLatin1String("::std::"); break; case 'a': - substitution = "::std::allocator"; + substitution = QLatin1String("::std::allocator"); break; case 'b': - substitution = "::std::basic_string"; + substitution = QLatin1String("::std::basic_string"); break; case 's': - substitution = "::std::basic_string<char, " - "::std::char_traits<char>, ::std::allocator<char> >"; + substitution = QLatin1String( + "::std::basic_string<char, " + "::std::char_traits<char>, ::std::allocator<char> >"); break; case 'i': - substitution = - "::std::basic_istream<char, std::char_traits<char> >"; + substitution = QLatin1String( + "::std::basic_istream<char, std::char_traits<char> >"); break; case 'o': - substitution = - "::std::basic_ostream<char, std::char_traits<char> >"; + substitution = QLatin1String( + "::std::basic_ostream<char, std::char_traits<char> >"); break; case 'd': - substitution = - "::std::basic_iostream<char, std::char_traits<char> >"; + substitution = QLatin1String( + "::std::basic_iostream<char, std::char_traits<char> >"); break; default: error(tr("Invalid substitution")); @@ -1670,22 +1701,23 @@ const QString NameDemanglerPrivate::parseSpecialName() QString name; QString str = readAhead(2); - if (str == "TV") { + if (str == QLatin1String("TV")) { advance(2); - name = "[virtual table of " + parseType() + "]"; - } else if (str == "TT") { + name = QString::fromLocal8Bit("[virtual table of %1]").arg(parseType()); + } else if (str == QLatin1String("TT")) { advance(2); - name = "[VTT struct of " + parseType() + "]"; - } else if (str == "TI") { + name = QString::fromLocal8Bit("[VTT struct of %1]").arg(parseType()); + } else if (str == QLatin1String("TI")) { advance(2); - name = "typeid(" + parseType() + ")"; - } else if (str == "TS") { + name = QString::fromLocal8Bit("typeid(%1)").arg(parseType()); + } else if (str == QLatin1String("TS")) { advance(2); - name = "typeid(" + parseType() + ").name()"; - } else if (str == "GV") { + name = QString::fromLocal8Bit("typeid(%1).name()").arg(parseType()); + } else if (str == QLatin1String("GV")) { advance(2); - name = "guard variable of " + parseName() + "]"; - } else if (str == "Tc") { + name = QString::fromLocal8Bit("[guard variable of %1]"). + arg(parseName()); + } else if (str == QLatin1String("Tc")) { advance(2); parseCallOffset(); if (!parseError) @@ -1714,9 +1746,9 @@ const QString NameDemanglerPrivate::parseUnscopedName() Q_ASSERT(!firstSetUnqualifiedName.contains('S')); QString name; - if (readAhead(2) == "St") { + if (readAhead(2) == QLatin1String("St")) { advance(2); - name = "::std" + parseUnqualifiedName(); + name = QLatin1String("::std") + parseUnqualifiedName(); } else if (firstSetUnqualifiedName.contains(peek())) { name = parseUnqualifiedName(); } else { @@ -1748,12 +1780,14 @@ const QString NameDemanglerPrivate::parseLocalName() } else { QString str = readAhead(2); QChar next = peek(); - if (str == "sp" || str == "sr" || str == "st" || str == "sz" - || str == "sZ" || (next != 's' && firstSetName.contains(next))) + if (str == QLatin1String("sp") || str == QLatin1String("sr") + || str == QLatin1String("st") || str == QLatin1String("sz") + || str == QLatin1String("sZ") + || (next != 's' && firstSetName.contains(next))) name += parseName(); else if (next == 's') { advance(); - name += "::\"string literal\""; + name += QLatin1String("::\"string literal\""); } else { error(tr("Invalid local-name")); } @@ -1827,7 +1861,7 @@ const QString NameDemanglerPrivate::parseCtorDtorName() if (templateArgsStart != -1) name.remove(templateArgsStart, name.indexOf('>') - templateArgsStart + 1); - int lastComponentStart = name.lastIndexOf("::"); + int lastComponentStart = name.lastIndexOf(QLatin1String("::")); if (lastComponentStart != -1) name.remove(0, lastComponentStart + 2); if (destructor) @@ -2018,59 +2052,106 @@ void NameDemanglerPrivate::setupFirstSets() #endif } -void NameDemanglerPrivate::setupOps() -{ - ops["nw"] = new UnaryOperator("nw", "new "); - ops["na"] = new ArrayNewOperator; - ops["dl"] = new UnaryOperator("dl", "delete "); - ops["da"] = new UnaryOperator("da", "delete[] "); - ops["ps"] = new UnaryOperator("ps", "+"); - ops["ng"] = new UnaryOperator("ng", "-"); - ops["ad"] = new UnaryOperator("ad", "&"); - ops["de"] = new UnaryOperator("de", "*"); - ops["co"] = new UnaryOperator("co", "~"); - ops["pl"] = new BinaryOperator("pl", "+"); - ops["mi"] = new BinaryOperator("mi", "-"); - ops["ml"] = new BinaryOperator("ml", "*"); - ops["dv"] = new BinaryOperator("dv", "/"); - ops["rm"] = new BinaryOperator("rm", "%"); - ops["an"] = new BinaryOperator("an", "&"); - ops["or"] = new BinaryOperator("or", "|"); - ops["eo"] = new BinaryOperator("eo", "^"); - ops["aS"] = new BinaryOperator("aS", "="); - ops["pL"] = new BinaryOperator("pl", "+="); - ops["mI"] = new BinaryOperator("mI", "-="); - ops["mL"] = new BinaryOperator("mL", "*="); - ops["dV"] = new BinaryOperator("dV", "/="); - ops["rM"] = new BinaryOperator("rM", "%="); - ops["aN"] = new BinaryOperator("aN", "&="); - ops["oR"] = new BinaryOperator("oR", "|="); - ops["eO"] = new BinaryOperator("eO", "^="); - ops["ls"] = new BinaryOperator("ls", "<<"); - ops["rs"] = new BinaryOperator("rs", ">>"); - ops["lS"] = new BinaryOperator("lS", "<<="); - ops["rS"] = new BinaryOperator("rS", ">>="); - ops["eq"] = new BinaryOperator("eq", "=="); - ops["ne"] = new BinaryOperator("ne", "!="); - ops["lt"] = new BinaryOperator("lt", "<"); - ops["gt"] = new BinaryOperator("gt", ">"); - ops["le"] = new BinaryOperator("le", "<="); - ops["ge"] = new BinaryOperator("ge", ">="); - ops["nt"] = new UnaryOperator("nt", "!"); - ops["aa"] = new BinaryOperator("aa", "&&"); - ops["oo"] = new BinaryOperator("oo", "||"); - ops["pp"] = new UnaryOperator("pp", "++"); // Prefix? - ops["mm"] = new UnaryOperator("mm", "--"); // Prefix? - ops["cm"] = new BinaryOperator("cm", ","); - ops["pm"] = new BinOpWithNoSpaces("pm", "->*"); - ops["pt"] = new BinOpWithNoSpaces("pm", "->"); - ops["cl"] = new FunctionCallOperator; - ops["ix"] = new ArrayAccessOperator; - ops["qu"] = new QuestionMarkOperator; - ops["st"] = new SizeAlignOfOperator("st", "sizeof"); - ops["sz"] = new SizeAlignOfOperator("sz", "sizeof"); - ops["at"] = new SizeAlignOfOperator("at", "alignof"); - ops["az"] = new SizeAlignOfOperator("az", "alignof"); +void NameDemanglerPrivate::setupOps(){ + + ops[QLatin1String("nw")] = + new UnaryOperator(QLatin1String("nw"), QLatin1String("new ")); + ops[QLatin1String("na")] = new ArrayNewOperator; + ops[QLatin1String("dl")] = + new UnaryOperator(QLatin1String("dl"), QLatin1String("delete ")); + ops[QLatin1String("da")] = + new UnaryOperator(QLatin1String("da"), QLatin1String("delete[] ")); + ops[QLatin1String("ps")] = + new UnaryOperator(QLatin1String("ps"), QLatin1String("+")); + ops[QLatin1String("ng")] = + new UnaryOperator(QLatin1String("ng"), QLatin1String("-")); + ops[QLatin1String("ad")] = + new UnaryOperator(QLatin1String("ad"), QLatin1String("&")); + ops[QLatin1String("de")] = + new UnaryOperator(QLatin1String("de"), QLatin1String("*")); + ops[QLatin1String("co")] = + new UnaryOperator(QLatin1String("co"), QLatin1String("~")); + ops[QLatin1String("pl")] = + new BinaryOperator(QLatin1String("pl"), QLatin1String("+")); + ops[QLatin1String("mi")] = + new BinaryOperator(QLatin1String("mi"), QLatin1String("-")); + ops[QLatin1String("ml")] = + new BinaryOperator(QLatin1String("ml"), QLatin1String("*")); + ops[QLatin1String("dv")] = + new BinaryOperator(QLatin1String("dv"), QLatin1String("/")); + ops[QLatin1String("rm")] = + new BinaryOperator(QLatin1String("rm"), QLatin1String("%")); + ops[QLatin1String("an")] = + new BinaryOperator(QLatin1String("an"), QLatin1String("&")); + ops[QLatin1String("or")] = + new BinaryOperator(QLatin1String("or"), QLatin1String("|")); + ops[QLatin1String("eo")] = + new BinaryOperator(QLatin1String("eo"), QLatin1String("^")); + ops[QLatin1String("aS")] = + new BinaryOperator(QLatin1String("aS"), QLatin1String("=")); + ops[QLatin1String("pL")] = + new BinaryOperator(QLatin1String("pl"), QLatin1String("+=")); + ops[QLatin1String("mI")] = + new BinaryOperator(QLatin1String("mI"), QLatin1String("-=")); + ops[QLatin1String("mL")] = + new BinaryOperator(QLatin1String("mL"), QLatin1String("*=")); + ops[QLatin1String("dV")] = + new BinaryOperator(QLatin1String("dV"), QLatin1String("/=")); + ops[QLatin1String("rM")] = + new BinaryOperator(QLatin1String("rM"), QLatin1String("%=")); + ops[QLatin1String("aN")] = + new BinaryOperator(QLatin1String("aN"), QLatin1String("&=")); + ops[QLatin1String("oR")] = + new BinaryOperator(QLatin1String("oR"), QLatin1String("|=")); + ops[QLatin1String("eO")] = + new BinaryOperator(QLatin1String("eO"), QLatin1String("^=")); + ops[QLatin1String("ls")] = + new BinaryOperator(QLatin1String("ls"), QLatin1String("<<")); + ops[QLatin1String("rs")] = + new BinaryOperator(QLatin1String("rs"), QLatin1String(">>")); + ops[QLatin1String("lS")] = + new BinaryOperator(QLatin1String("lS"), QLatin1String("<<=")); + ops[QLatin1String("rS")] = + new BinaryOperator(QLatin1String("rS"), QLatin1String(">>=")); + ops[QLatin1String("eq")] = + new BinaryOperator(QLatin1String("eq"), QLatin1String("==")); + ops[QLatin1String("ne")] = + new BinaryOperator(QLatin1String("ne"), QLatin1String("!=")); + ops[QLatin1String("lt")] = + new BinaryOperator(QLatin1String("lt"), QLatin1String("<")); + ops[QLatin1String("gt")] = + new BinaryOperator(QLatin1String("gt"), QLatin1String(">")); + ops[QLatin1String("le")] = + new BinaryOperator(QLatin1String("le"), QLatin1String("<=")); + ops[QLatin1String("ge")] = + new BinaryOperator(QLatin1String("ge"), QLatin1String(">=")); + ops[QLatin1String("nt")] = + new UnaryOperator(QLatin1String("nt"), QLatin1String("!")); + ops[QLatin1String("aa")] = + new BinaryOperator(QLatin1String("aa"), QLatin1String("&&")); + ops[QLatin1String("oo")] = + new BinaryOperator(QLatin1String("oo"), QLatin1String("||")); + ops[QLatin1String("pp")] = + new UnaryOperator(QLatin1String("pp"), QLatin1String("++")); // Prefix? + ops[QLatin1String("mm")] = + new UnaryOperator(QLatin1String("mm"), QLatin1String("--")); // Prefix? + ops[QLatin1String("cm")] = + new BinaryOperator(QLatin1String("cm"), QLatin1String(",")); + ops[QLatin1String("pm")] = + new BinOpWithNoSpaces(QLatin1String("pm"), QLatin1String("->*")); + ops[QLatin1String("pt")] = + new BinOpWithNoSpaces(QLatin1String("pm"), QLatin1String("->")); + ops[QLatin1String("cl")] = new FunctionCallOperator; + ops[QLatin1String("ix")] = new ArrayAccessOperator; + ops[QLatin1String("qu")] = new QuestionMarkOperator; + ops[QLatin1String("st")] = + new SizeAlignOfOperator(QLatin1String("st"), QLatin1String("sizeof")); + ops[QLatin1String("sz")] = + new SizeAlignOfOperator(QLatin1String("sz"), QLatin1String("sizeof")); + ops[QLatin1String("at")] = + new SizeAlignOfOperator(QLatin1String("at"), QLatin1String("alignof")); + ops[QLatin1String("az")] = + new SizeAlignOfOperator(QLatin1String("az"), QLatin1String("alignof")); } void NameDemanglerPrivate::addSubstitution(const QString &symbol) @@ -2082,8 +2163,9 @@ void NameDemanglerPrivate::addSubstitution(const QString &symbol) void NameDemanglerPrivate::insertQualifier(QString &type, const QString &qualifier) { - const int funcAnchor = type.indexOf(QRegExp("\\([^*&]")); - const int qualAnchor = type.indexOf(QRegExp("(\\*|\\&|const|volatile)\\)")); + const int funcAnchor = type.indexOf(QRegExp(QLatin1String("\\([^*&]"))); + const int qualAnchor = + type.indexOf(QRegExp(QLatin1String("(\\*|\\&|const|volatile)\\)"))); int insertionPos; QString insertionString = qualifier; if (funcAnchor == -1) { @@ -2093,16 +2175,18 @@ void NameDemanglerPrivate::insertQualifier(QString &type, insertionPos = type.indexOf(')', qualAnchor);; } } else if (qualAnchor == -1 || funcAnchor < qualAnchor) { - if (qualifier == "*" || qualifier == "&") { + if (qualifier == QLatin1String("*") + || qualifier == QLatin1String("&")) { insertionPos = funcAnchor; - insertionString = "(" + qualifier + ")"; + insertionString = QString::fromLocal8Bit("(%1)").arg(qualifier); } else { insertionPos = type.size(); // Qualifier for pointer to member. } } else { insertionPos = type.indexOf(')', qualAnchor);; } - if ((insertionString == "*" || insertionString == "&") + if ((insertionString == QLatin1String("*") + || insertionString == QLatin1String("&")) && (type[insertionPos - 1] != '*' && type[insertionPos - 1] != '&')) insertionString.prepend(' '); type.insert(insertionPos, insertionString); @@ -2130,4 +2214,6 @@ const QString &NameDemangler::demangledName() const return pImpl->demangledName(); } -QT_END_NAMESPACE +} // namespace Internal +} // namespace Debugger + diff --git a/src/plugins/debugger/name_demangler.h b/src/plugins/debugger/name_demangler.h index 9c53aa470ed1f75f73fbf5f8973b76362a78a56d..2a13f1e2a84a7a2e8322d279bf3087bd9613932c 100644 --- a/src/plugins/debugger/name_demangler.h +++ b/src/plugins/debugger/name_demangler.h @@ -31,8 +31,11 @@ #define NAME_DEMANGLER_H QT_BEGIN_NAMESPACE - class QString; +QT_END_NAMESPACE + +namespace Debugger { +namespace Internal { class NameDemanglerPrivate; @@ -67,6 +70,7 @@ private: NameDemanglerPrivate *pImpl; }; -QT_END_NAMESPACE +} // namespace Internal +} // namespace Debugger #endif // Include guard.