diff options
Diffstat (limited to 'tests/manual/cplusplus/main.cpp')
-rw-r--r-- | tests/manual/cplusplus/main.cpp | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp index 6c2596eeee..a1054afee8 100644 --- a/tests/manual/cplusplus/main.cpp +++ b/tests/manual/cplusplus/main.cpp @@ -38,6 +38,7 @@ #include <Symbols.h> #include <Names.h> #include <CoreTypes.h> +#include <CppDocument.h> #include <QFile> #include <QList> @@ -50,54 +51,62 @@ #include <cstdio> #include <cstdlib> #include <iostream> -#include <sstream> using namespace CPlusPlus; -int main(int argc, char *argv[]) +class ForEachBinaryExpression: protected ASTVisitor { - QCoreApplication app(argc, argv); + Document::Ptr doc; + Document::Ptr pattern; - QStringList args = app.arguments(); - const QString appName = args.first(); - args.removeFirst(); +public: + ForEachBinaryExpression(Document::Ptr doc, Document::Ptr pattern) + : ASTVisitor(doc->control()), doc(doc), pattern(pattern) {} - foreach (const QString &arg, args) { - if (arg == QLatin1String("--help")) { - const QFileInfo appInfo(appName); - const QByteArray appFileName = QFile::encodeName(appInfo.fileName()); + void operator()() { accept(doc->translationUnit()->ast()); } - printf("Usage: %s [options]\n" - " --help Display this information\n", - appFileName.constData()); +protected: + using ASTVisitor::visit; - return EXIT_SUCCESS; + virtual bool visit(BinaryExpressionAST *ast) + { + ASTMatcher matcher(doc->translationUnit(), pattern->translationUnit()); + + if (ast->match(ast, pattern->translationUnit()->ast(), &matcher)) { + translationUnit()->warning(ast->binary_op_token, "binary expression"); } + + return true; } +}; + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + QStringList files = app.arguments(); + files.removeFirst(); + + Document::Ptr pattern = Document::create("<pattern>"); + pattern->setSource("__y < __x"); + pattern->parse(Document::ParseExpression); + + foreach (const QString &fileName, files) { + QFile file(fileName); + if (! file.open(QFile::ReadOnly)) + continue; + + const QByteArray source = file.readAll(); + file.close(); + + Document::Ptr doc = Document::create(fileName); + doc->control()->setDiagnosticClient(0); + doc->setSource(source); + doc->parse(); + + ForEachBinaryExpression forEachBinaryExpression(doc, pattern); - QFile in; - if (! in.open(stdin, QFile::ReadOnly)) - return EXIT_FAILURE; - - const QByteArray source = in.readAll(); - - Control control; - StringLiteral *fileId = control.findOrInsertStringLiteral("<stdin>"); - TranslationUnit unit(&control, fileId); - unit.setObjCEnabled(true); - unit.setSource(source.constData(), source.size()); - unit.parse(); - if (! unit.ast()) - return EXIT_FAILURE; - - TranslationUnitAST *ast = unit.ast()->asTranslationUnit(); - Q_ASSERT(ast != 0); - - Namespace *globalNamespace = control.newNamespace(0, 0); - Semantic sem(&control); - for (DeclarationListAST *it = ast->declaration_list; it; it = it->next) { - DeclarationAST *declaration = it->value; - sem.check(declaration, globalNamespace->members()); + forEachBinaryExpression(); } return EXIT_SUCCESS; |