Changeset 769 for trunk/tools/linguist/lupdate/cpp.cpp
- Timestamp:
- Aug 2, 2010, 9:27:30 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.3 (added) merged: 768 /branches/vendor/nokia/qt/current merged: 767 /branches/vendor/nokia/qt/4.6.2 removed
- Property svn:mergeinfo changed
-
trunk/tools/linguist/lupdate/cpp.cpp
r651 r769 66 66 class HashString { 67 67 public: 68 HashString() : m_hash ed(false) {}69 explicit HashString(const QString &str) : m_str(str), m_hash ed(false) {}70 void setValue(const QString &str) { m_str = str; m_hash ed = false; }68 HashString() : m_hash) {} 69 explicit HashString(const QString &str) : m_str(str), m_hash) {} 70 void setValue(const QString &str) { m_str = str; m_hash; } 71 71 const QString &value() const { return m_str; } 72 72 bool operator==(const HashString &other) const { return m_str == other.m_str; } 73 73 private: 74 74 QString m_str; 75 76 75 77 mutable uint m_hash; 76 mutable bool m_hashed;77 78 friend uint qHash(const HashString &str); 78 79 }; … … 80 81 uint qHash(const HashString &str) 81 82 { 82 if (!str.m_hashed) { 83 str.m_hashed = true; 83 if (str.m_hash & 0x80000000) 84 84 str.m_hash = qHash(str.m_str); 85 }86 85 return str.m_hash; 87 86 } … … 89 88 class HashStringList { 90 89 public: 91 explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hash ed(false) {}90 explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hash) {} 92 91 const QList<HashString> &value() const { return m_list; } 93 92 bool operator==(const HashStringList &other) const { return m_list == other.m_list; } … … 95 94 QList<HashString> m_list; 96 95 mutable uint m_hash; 97 mutable bool m_hashed;98 96 friend uint qHash(const HashStringList &list); 99 97 }; … … 101 99 uint qHash(const HashStringList &list) 102 100 { 103 if (!list.m_hashed) { 104 list.m_hashed = true; 101 if (list.m_hash & 0x80000000) { 105 102 uint hash = 0; 106 103 foreach (const HashString &qs, list.m_list) { 107 hash ^= qHash(qs) ^ 0x a09df22f;108 hash = ( hash << 13) | (hash >> 19);104 hash ^= qHash(qs) ^ 0x; 105 hash = (); 109 106 } 110 107 list.m_hash = hash; … … 216 213 struct IfdefState { 217 214 IfdefState() {} 218 IfdefState(int _braceDepth, int _parenDepth) : 215 IfdefState(int _bracketDepth, int _braceDepth, int _parenDepth) : 216 bracketDepth(_bracketDepth), 219 217 braceDepth(_braceDepth), 220 218 parenDepth(_parenDepth), … … 223 221 224 222 SavedState state; 223 225 224 int braceDepth, braceDepth1st; 226 225 int parenDepth, parenDepth1st; … … 260 259 bool qualifyOneCallbackOwn(const Namespace *ns, void *context) const; 261 260 bool qualifyOneCallbackUsing(const Namespace *ns, void *context) const; 261 262 262 263 bool qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, 263 264 NamespaceList *resolved) const; … … 279 280 enum { 280 281 Tok_Eof, Tok_class, Tok_friend, Tok_namespace, Tok_using, Tok_return, 281 Tok_tr = 10, Tok_trUtf8, Tok_translate, Tok_translateUtf8, Tok_trid,282 Tok_Q_OBJECT = 20, Tok_Q_DECLARE_TR_FUNCTIONS,282 Tok_tr, Tok_trUtf8, Tok_translate, Tok_translateUtf8, Tok_trid, 283 Tok_Q_OBJECT, Tok_Q_DECLARE_TR_FUNCTIONS, 283 284 Tok_Ident, Tok_Comment, Tok_String, Tok_Arrow, Tok_Colon, Tok_ColonColon, 284 Tok_Equals, 285 Tok_LeftBrace = 30, Tok_RightBrace, Tok_LeftParen, Tok_RightParen, Tok_Comma, Tok_Semicolon,286 Tok_Null = 40, Tok_Integer,287 Tok_QuotedInclude = 50, Tok_AngledInclude,288 Tok_Other = 99285 Tok_Equals, 286 Tok_LeftBrace, Tok_RightBrace, Tok_LeftParen, Tok_RightParen, Tok_Comma, Tok_Semicolon, 287 Tok_Null, Tok_Integer, 288 Tok_QuotedInclude, Tok_AngledInclude, 289 Tok_Other 289 290 }; 290 291 … … 298 299 qlonglong yyInteger; 299 300 QStack<IfdefState> yyIfdefStack; 301 300 302 int yyBraceDepth; 301 303 int yyParenDepth; 302 304 int yyLineNo; 303 305 int yyCurLineNo; 306 304 307 int yyBraceLineNo; 305 308 int yyParenLineNo; … … 338 341 directInclude = false; 339 342 } 343 340 344 yyBraceDepth = 0; 341 345 yyParenDepth = 0; 342 346 yyCurLineNo = 1; 347 343 348 yyBraceLineNo = 1; 344 349 yyParenLineNo = 1; … … 567 572 if (yyCh == 'f') { 568 573 // if, ifdef, ifndef 569 yyIfdefStack.push(IfdefState(yyBrac eDepth, yyParenDepth));574 yyIfdefStack.push(IfdefState(yyBraceDepth, yyParenDepth)); 570 575 yyCh = getChar(); 571 576 } else if (yyCh == 'n') { … … 606 611 IfdefState &is = yyIfdefStack.top(); 607 612 if (is.elseLine != -1) { 608 if (yyBraceDepth != is.braceDepth1st || yyParenDepth != is.parenDepth1st) 609 qWarning("%s:%d: Parenthesis/brace mismatch between " 613 if (yyBracketDepth != is.bracketDepth1st 614 || yyBraceDepth != is.braceDepth1st 615 || yyParenDepth != is.parenDepth1st) 616 qWarning("%s:%d: Parenthesis/bracket/brace mismatch between " 610 617 "#if and #else branches; using #if branch\n", 611 618 qPrintable(yyFileName), is.elseLine); 612 619 } else { 620 613 621 is.braceDepth1st = yyBraceDepth; 614 622 is.parenDepth1st = yyParenDepth; … … 616 624 } 617 625 is.elseLine = yyLineNo; 626 618 627 yyBraceDepth = is.braceDepth; 619 628 yyParenDepth = is.parenDepth; … … 625 634 IfdefState is = yyIfdefStack.pop(); 626 635 if (is.elseLine != -1) { 627 if (yyBraceDepth != is.braceDepth1st || yyParenDepth != is.parenDepth1st) 636 if (yyBracketDepth != is.bracketDepth1st 637 || yyBraceDepth != is.braceDepth1st 638 || yyParenDepth != is.parenDepth1st) 628 639 qWarning("%s:%d: Parenthesis/brace mismatch between " 629 640 "#if and #else branches; using #if branch\n", 630 641 qPrintable(yyFileName), is.elseLine); 642 631 643 yyBraceDepth = is.braceDepth1st; 632 644 yyParenDepth = is.parenDepth1st; … … 901 913 yyCh = getChar(); 902 914 return Tok_RightParen; 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 903 930 case ',': 904 931 yyCh = getChar(); … … 1037 1064 1038 1065 struct QualifyOneData { 1039 QualifyOneData(const NamespaceList &ns, int nsc, const HashString &seg, NamespaceList *rslvd) 1040 : namespaces(ns), nsCount(nsc), segment(seg), resolved(rslvd) 1066 QualifyOneData(const NamespaceList &ns, int nsc, const HashString &seg, NamespaceList *rslvd, 1067 QSet<HashStringList> *visited) 1068 : namespaces(ns), nsCount(nsc), segment(seg), resolved(rslvd), visitedUsings(visited) 1041 1069 {} 1042 1070 … … 1045 1073 const HashString &segment; 1046 1074 NamespaceList *resolved; 1047 QSet<HashStringList> visitedUsings;1075 QSet<HashStringList> visitedUsings; 1048 1076 }; 1049 1077 … … 1079 1107 QualifyOneData *data = (QualifyOneData *)context; 1080 1108 foreach (const HashStringList &use, ns->usings) 1081 if (!data->visitedUsings.contains(use)) { 1082 data->visitedUsings.insert(use); 1083 if (qualifyOne(use.value(), use.value().count(), data->segment, data->resolved)) 1109 if (!data->visitedUsings->contains(use)) { 1110 data->visitedUsings->insert(use); 1111 if (qualifyOne(use.value(), use.value().count(), data->segment, data->resolved, 1112 data->visitedUsings)) 1084 1113 return true; 1085 1114 } … … 1088 1117 1089 1118 bool CppParser::qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, 1090 NamespaceList *resolved ) const1091 { 1092 QualifyOneData data(namespaces, nsCnt, segment, resolved );1119 NamespaceList *resolved) const 1120 { 1121 QualifyOneData data(namespaces, nsCnt, segment, resolved); 1093 1122 1094 1123 if (visitNamespace(namespaces, nsCnt, &CppParser::qualifyOneCallbackOwn, &data)) … … 1096 1125 1097 1126 return visitNamespace(namespaces, nsCnt, &CppParser::qualifyOneCallbackUsing, &data); 1127 1128 1129 1130 1131 1132 1133 1134 1098 1135 } 1099 1136 … … 1526 1563 yyTok = getToken(); 1527 1564 while (yyTok != Tok_Eof) { 1565 1566 1567 1568 1569 1570 1528 1571 //qDebug() << "TOKEN: " << yyTok; 1529 1572 switch (yyTok) { … … 1993 2036 context = comment.left(k); 1994 2037 comment.remove(0, k + 1); 1995 recordMessage(yyLineNo, context, QString(), comment, extracomment, 1996 QString(), TranslatorMessage::ExtraData(), false, false); 2038 TranslatorMessage msg( 2039 transcode(context, false), QString(), 2040 transcode(comment, false), QString(), 2041 yyFileName, yyLineNo, QStringList(), 2042 TranslatorMessage::Finished, false); 2043 msg.setExtraComment(transcode(extracomment.simplified(), false)); 1997 2044 extracomment.clear(); 2045 1998 2046 tor->setExtras(extra); 1999 2047 extra.clear(); … … 2066 2114 if (!yyParenDepth) 2067 2115 prospectiveContext.clear(); 2116 2117 2118 2068 2119 case_default: 2069 2120 yyTok = getToken(); … … 2080 2131 " (or abuse of the C++ preprocessor)\n", 2081 2132 qPrintable(yyFileName), yyParenLineNo); 2133 2134 2135 2136 2082 2137 } 2083 2138
Note:
See TracChangeset
for help on using the changeset viewer.