static QStringList collectFieldNames(ClassSpecifierAST *classAST, bool onlyTokensAndASTNodes) { QStringList fields; Overview oo; Class *clazz = classAST->symbol; for (unsigned i = 0; i < clazz->memberCount(); ++i) { Symbol *s = clazz->memberAt(i); if (Declaration *decl = s->asDeclaration()) { const QString declName = oo(decl->name()); const FullySpecifiedType ty = decl->type(); if (const PointerType *ptrTy = ty->asPointerType()) { if (onlyTokensAndASTNodes) { if (const NamedType *namedTy = ptrTy->elementType()->asNamedType()) { if (oo(namedTy->name()).endsWith(QLatin1String("AST"))) fields.append(declName); } } else { fields.append(declName); } } else if (ty.isUnsigned()) { fields.append(declName); } } } return fields; }
/// Return all typedefs with given name from given scope up to function scope. static QList<LookupItem> typedefsFromScopeUpToFunctionScope(const Name *name, Scope *scope) { QList<LookupItem> results; if (!scope) return results; Scope *enclosingBlockScope = 0; for (Block *block = scope->asBlock(); block; block = enclosingBlockScope ? enclosingBlockScope->asBlock() : 0) { const unsigned memberCount = block->memberCount(); for (unsigned i = 0; i < memberCount; ++i) { Symbol *symbol = block->memberAt(i); if (Declaration *declaration = symbol->asDeclaration()) { if (isTypedefWithName(declaration, name)) { LookupItem item; item.setDeclaration(declaration); item.setScope(block); item.setType(declaration->type()); results.append(item); } } } enclosingBlockScope = block->enclosingScope(); } return results; }
QList<CppQuickFixOperation::Ptr> InsertQtPropertyMembers::match(const CppQuickFixState &state) { const QList<AST *> &path = state.path(); if (path.isEmpty()) return noResult(); AST * const ast = path.last(); QtPropertyDeclarationAST *qtPropertyDeclaration = ast->asQtPropertyDeclaration(); if (!qtPropertyDeclaration) return noResult(); ClassSpecifierAST *klass = 0; for (int i = path.size() - 2; i >= 0; --i) { klass = path.at(i)->asClassSpecifier(); if (klass) break; } if (!klass) return noResult(); CppRefactoringChanges refactoring(state.snapshot()); const CppRefactoringFile &file = refactoring.file(state.document()->fileName()); const QString propertyName = file.textOf(qtPropertyDeclaration->property_name); QString getterName; QString setterName; QString signalName; int generateFlags = 0; for (QtPropertyDeclarationItemListAST *it = qtPropertyDeclaration->property_declaration_item_list; it; it = it->next) { const QString tokenString = file.tokenAt(it->value->item_name_token).spell(); if (tokenString == QLatin1String("READ")) { getterName = file.textOf(it->value->expression); generateFlags |= GenerateGetter; } else if (tokenString == QLatin1String("WRITE")) { setterName = file.textOf(it->value->expression); generateFlags |= GenerateSetter; } else if (tokenString == QLatin1String("NOTIFY")) { signalName = file.textOf(it->value->expression); generateFlags |= GenerateSignal; } } QString storageName = QString("m_%1").arg(propertyName); generateFlags |= GenerateStorage; Class *c = klass->symbol; Overview overview; for (unsigned i = 0; i < c->memberCount(); ++i) { Symbol *member = c->memberAt(i); FullySpecifiedType type = member->type(); if (member->asFunction() || (type.isValid() && type->asFunctionType())) { const QString name = overview(member->name()); if (name == getterName) { generateFlags &= ~GenerateGetter; } else if (name == setterName) { generateFlags &= ~GenerateSetter; } else if (name == signalName) { generateFlags &= ~GenerateSignal; } } else if (member->asDeclaration()) { const QString name = overview(member->name()); if (name == storageName) generateFlags &= ~GenerateStorage; } } if (getterName.isEmpty() && setterName.isEmpty() && signalName.isEmpty()) return noResult(); return singleResult(new Operation(state, path.size() - 1, qtPropertyDeclaration, c, generateFlags, getterName, setterName, signalName, storageName)); }