void WatchData::setError(const QString &msg) { setAllUnneeded(); value = msg; setHasChildren(false); valueEnabled = false; valueEditable = false; error = true; }
void WatchData::setType(const QByteArray &str, bool guessChildrenFromType) { type = str.trimmed(); bool changed = true; while (changed) { if (type.endsWith("const")) type.chop(5); else if (type.endsWith(' ')) type.chop(1); else if (type.endsWith('&')) type.chop(1); else if (type.startsWith("const ")) type = type.mid(6); else if (type.startsWith("volatile ")) type = type.mid(9); else if (type.startsWith("class ")) type = type.mid(6); else if (type.startsWith("struct ")) type = type.mid(6); else if (type.startsWith(' ')) type = type.mid(1); else changed = false; } setTypeUnneeded(); if (guessChildrenFromType) { switch (guessChildren(type)) { case HasChildren: setHasChildren(true); break; case HasNoChildren: setHasChildren(false); break; case HasPossiblyChildren: setHasChildren(true); // FIXME: bold assumption break; } } }
void WatchData::setValue(const QString &value0) { value = value0; if (value == "{...}") { value.clear(); hasChildren = true; // at least one... } // strip off quoted characters for chars. if (value.endsWith(QLatin1Char('\'')) && type.endsWith("char")) { const int blankPos = value.indexOf(QLatin1Char(' ')); if (blankPos != -1) value.truncate(blankPos); } // avoid duplicated information if (value.startsWith(QLatin1Char('(')) && value.contains(") 0x")) value = value.mid(value.lastIndexOf(") 0x") + 2); // doubles are sometimes displayed as "@0x6141378: 1.2". // I don't want that. if (/*isIntOrFloatType(type) && */ value.startsWith("@0x") && value.contains(':')) { value = value.mid(value.indexOf(':') + 2); setHasChildren(false); } // "numchild" is sometimes lying //MODEL_DEBUG("\n\n\nPOINTER: " << type << value); if (isPointerType(type)) setHasChildren(value != "0x0" && value != "<null>" && !isCharPointerType(type)); // pointer type information is available in the 'type' // column. No need to duplicate it here. if (value.startsWith(QLatin1Char('(') + type + ") 0x")) value = value.section(QLatin1Char(' '), -1, -1); setValueUnneeded(); }
CodeStructureStatementTreeItem::CodeStructureStatementTreeItem(ParseTreeNode *node) : CodeStructureTreeItem(node) { ParseTreeNode *statementTypeNode = PlSqlTreeBuilder::findNode(node, R_STATEMENT_TYPE, false); PlSqlParsingTable *parsingTable = PlSqlParsingTable::getInstance(); if(statementTypeNode){ statementTypeNode = statementTypeNode->children[0]; Q_ASSERT(statementTypeNode->tokenInfo->tokenType == TokenInfo::Rule); if(statementTypeNode->tokenInfo->tokenOrRuleId == R_SQL_STATEMENT){ statementTypeNode = statementTypeNode->children[0]; } this->node = statementTypeNode; QString ruleName = parsingTable->getRuleName(this->node->tokenInfo->tokenOrRuleId); ruleName.replace("_statement", "").replace('_', ' '); setItemText(ruleName); }else{ //constructed as a result of error recovery routine setItemText("statement"); } BNFRuleOption *options = parsingTable->ruleOptions.value(this->node->tokenInfo->tokenOrRuleId, 0); if(options && !options->guiIconName.isEmpty()){ setIconName(options->guiIconName); }else{ setIconName("statement"); } int ruleId = this->node->tokenInfo->tokenOrRuleId; setHasChildren(ruleId == R_BASIC_LOOP_STATEMENT || ruleId == R_CASE_STATEMENT || ruleId == R_FOR_LOOP_STATEMENT || ruleId == R_IF_STATEMENT || ruleId == R_PLSQL_BLOCK || ruleId == R_WHILE_LOOP_STATEMENT); }
CRootTreeItem::CRootTreeItem(const QString &path, CTreeItem *parent): CTreeItem(path, "ROOT", parent) { setHasChildren(true); }
void WatchItem::parseHelper(const GdbMi &input) { setChildrenUnneeded(); GdbMi mi = input["type"]; if (mi.isValid()) setType(mi.data()); editvalue = input["editvalue"].data(); editformat = DebuggerDisplay(input["editformat"].toInt()); editencoding = DebuggerEncoding(input["editencoding"].data()); mi = input["valueelided"]; if (mi.isValid()) elided = mi.toInt(); mi = input["bitpos"]; if (mi.isValid()) bitpos = mi.toInt(); mi = input["bitsize"]; if (mi.isValid()) bitsize = mi.toInt(); mi = input["origaddr"]; if (mi.isValid()) origaddr = mi.toAddress(); mi = input["address"]; if (mi.isValid()) { address = mi.toAddress(); if (exp.isEmpty()) { if (iname.startsWith("local.") && iname.count('.') == 1) // Solve one common case of adding 'class' in // *(class X*)0xdeadbeef for gdb. exp = name.toLatin1(); else exp = "*(" + gdbQuoteTypes(type) + "*)" + hexAddress(); } } mi = input["value"]; QByteArray enc = input["valueencoded"].data(); if (mi.isValid() || !enc.isEmpty()) { setValue(decodeData(mi.data(), enc)); } else { setValueNeeded(); } mi = input["size"]; if (mi.isValid()) size = mi.toInt(); mi = input["exp"]; if (mi.isValid()) exp = mi.data(); mi = input["valueenabled"]; if (mi.data() == "true") valueEnabled = true; else if (mi.data() == "false") valueEnabled = false; mi = input["valueeditable"]; if (mi.data() == "true") valueEditable = true; else if (mi.data() == "false") valueEditable = false; mi = input["numchild"]; // GDB/MI if (mi.isValid()) setHasChildren(mi.toInt() > 0); mi = input["haschild"]; // native-mixed if (mi.isValid()) setHasChildren(mi.toInt() > 0); mi = input["arraydata"]; if (mi.isValid()) { DebuggerEncoding encoding(input["arrayencoding"].data()); QByteArray childType = input["childtype"].data(); decodeArrayData(this, mi.data(), encoding, childType); } else { const GdbMi children = input["children"]; if (children.isValid()) { bool ok = false; // Try not to repeat data too often. const GdbMi childType = input["childtype"]; const GdbMi childNumChild = input["childnumchild"]; qulonglong addressBase = input["addrbase"].data().toULongLong(&ok, 0); qulonglong addressStep = input["addrstep"].data().toULongLong(&ok, 0); for (int i = 0, n = int(children.children().size()); i != n; ++i) { const GdbMi &subinput = children.children().at(i); WatchItem *child = new WatchItem; if (childType.isValid()) child->setType(childType.data()); if (childNumChild.isValid()) child->setHasChildren(childNumChild.toInt() > 0); GdbMi name = subinput["name"]; QByteArray nn; if (name.isValid()) { nn = name.data(); child->name = QString::fromLatin1(nn); } else { nn.setNum(i); child->name = QString::fromLatin1("[%1]").arg(i); } GdbMi iname = subinput["iname"]; if (iname.isValid()) child->iname = iname.data(); else child->iname = this->iname + '.' + nn; if (addressStep) { child->address = addressBase + i * addressStep; child->exp = "*(" + gdbQuoteTypes(child->type) + "*)" + child->hexAddress(); } QByteArray key = subinput["key"].data(); if (!key.isEmpty()) child->name = decodeData(key, subinput["keyencoded"].data()); child->parseHelper(subinput); appendChild(child); } } } }