diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp index cc69cb1681b1fbedf8356d77f24310911a1888d6..1fcf76ce18914a45590400fd2c2394e4841b9037 100644 --- a/tests/manual/cplusplus/main.cpp +++ b/tests/manual/cplusplus/main.cpp @@ -33,7 +33,6 @@ #include <Scope.h> #include <Semantic.h> #include <TranslationUnit.h> -#include <PrettyPrinter.h> #include <Literals.h> #include <Symbols.h> #include <Names.h> @@ -52,171 +51,7 @@ #include <iostream> #include <sstream> -CPLUSPLUS_USE_NAMESPACE - -class Rewrite -{ - QMultiMap<unsigned, QByteArray> _insertBefore; - QMultiMap<unsigned, QByteArray> _insertAfter; - QSet<unsigned> _removed; - -public: - void remove(unsigned index) - { remove(index, index + 1); } - - void remove(unsigned first, unsigned last) - { - Q_ASSERT(first < last); - - for (; first != last; ++first) - _removed.insert(first); - } - - void insertTextBefore(unsigned index, const QByteArray &text) - { _insertBefore.insert(index, text); } - - void insertTextAfter(unsigned index, const QByteArray &text) - { _insertAfter.insert(index, text); } - - void rewrite(const TranslationUnit *unit, - const QByteArray &contents, - QByteArray *out) - { - _source = contents; - const char *source = contents.constData(); - unsigned previousTokenEndPosition = 0; - for (unsigned i = 0; i < unit->tokenCount(); ++i) { - const Token &tk = unit->tokenAt(i); - - if (previousTokenEndPosition != tk.begin()) { - Q_ASSERT(previousTokenEndPosition < tk.begin()); - out->append(source + previousTokenEndPosition, - tk.begin() - previousTokenEndPosition); - } - - QMultiMap<unsigned, QByteArray>::const_iterator it; - - it = _insertBefore.constFind(i); - for (; it != _insertBefore.constEnd() && it.key() == i; ++it) { - out->append(it.value()); - } - - if (! _removed.contains(i)) - out->append(source + tk.begin(), tk.f.length); - - it = _insertAfter.constFind(i); - for (; it != _insertAfter.constEnd() && it.key() == i; ++it) { - out->append(it.value()); - } - - previousTokenEndPosition = tk.end(); - } - } - -protected: - QByteArray _source; -}; - -class SimpleRefactor: protected ASTVisitor, Rewrite { -public: - SimpleRefactor(Control *control) - : ASTVisitor(control) - { } - - void operator()(const TranslationUnit *unit, - const QByteArray &source, - QByteArray *out) - { - accept(unit->ast()); - rewrite(unit, source, out); - } - -protected: - bool isEnumOrTypedefEnum(SpecifierAST *spec) { - if (! spec) - return false; - if (SimpleSpecifierAST *simpleSpec = spec->asSimpleSpecifier()) { - if (tokenKind(simpleSpec->specifier_token) == T_TYPEDEF) - return isEnumOrTypedefEnum(spec->next); - } - return spec->asEnumSpecifier() != 0; - } - virtual bool visit(SimpleDeclarationAST *ast) { - if (isEnumOrTypedefEnum(ast->decl_specifier_seq)) { - //remove(ast->firstToken(), ast->lastToken()); - insertTextBefore(ast->firstToken(), "/* #REF# removed "); - insertTextAfter(ast->lastToken() - 1, "*/"); - return true; - } - return true; - } - - virtual bool visit(AccessDeclarationAST *ast) - { - if (tokenKind(ast->access_specifier_token) == T_PRIVATE) { - // change visibility from `private' to `public'. - remove(ast->access_specifier_token); - insertTextAfter(ast->access_specifier_token, "public /* #REF# private->public */"); - } - return true; - } - - virtual bool visit(FunctionDefinitionAST *ast) - { - bool isInline = false; - for (SpecifierAST *spec = ast->decl_specifier_seq; spec; spec = spec->next) { - if (SimpleSpecifierAST *simpleSpec = spec->asSimpleSpecifier()) { - if (tokenKind(simpleSpec->specifier_token) == T_INLINE) { - isInline = true; - break; - } - } - } - - // force the `inline' specifier. - if (! isInline) - insertTextBefore(ast->firstToken(), "inline /* #REF# made inline */ "); - - return true; - } - - virtual bool visit(ClassSpecifierAST *ast) - { - // export/import the class using the macro MY_EXPORT. - if (ast->name) - insertTextBefore(ast->name->firstToken(), "MY_EXPORT "); - - // add QObject to the base clause. - if (ast->colon_token) - insertTextAfter(ast->colon_token, " public QObject,"); - else if (ast->lbrace_token) - insertTextBefore(ast->lbrace_token, ": public QObject "); - - // mark the class as Q_OBJECT. - if (ast->lbrace_token) - insertTextAfter(ast->lbrace_token, " Q_OBJECT\n"); - - for (DeclarationListAST *it = ast->member_specifiers; it; it = it->next) { - accept(it->declaration); - } - - return false; - } - - virtual bool visit(CppCastExpressionAST *ast) - { - // Replace the C++ cast expression (e.g. static_cast<foo>(a)) with - // the one generated by the pretty printer. - std::ostringstream o; - PrettyPrinter pp(control(), o); - pp(ast, _source); - remove(ast->firstToken(), ast->lastToken()); - const std::string str = o.str(); - insertTextBefore(ast->firstToken(), str.c_str()); - insertTextBefore(ast->firstToken(), "/* #REF# beautiful cast */ "); - return false; - } -}; +using namespace CPlusPlus; class CloneCG: protected ASTVisitor { @@ -513,15 +348,8 @@ int main(int argc, char *argv[]) const QString appName = args.first(); args.removeFirst(); - bool test_rewriter = false; - bool test_pretty_printer = false; - - foreach (QString arg, args) { - if (arg == QLatin1String("--test-rewriter")) - test_rewriter = true; - else if (arg == QLatin1String("--test-pretty-printer")) - test_pretty_printer = true; - else if (arg == QLatin1String("--help")) { + foreach (const QString &arg, args) { + if (arg == QLatin1String("--help")) { const QFileInfo appInfo(appName); const QByteArray appFileName = QFile::encodeName(appInfo.fileName()); @@ -530,6 +358,7 @@ int main(int argc, char *argv[]) " --test-rewriter Test the tree rewriter\n" " --test-pretty-printer Test the pretty printer\n", appFileName.constData()); + return EXIT_SUCCESS; } } @@ -558,18 +387,5 @@ int main(int argc, char *argv[]) sem.check(decl->declaration, globalNamespace->members()); } - // test the rewriter - if (test_rewriter) { - QByteArray out; - SimpleRefactor refactor(&control); - refactor(&unit, source, &out); - printf("%s\n", out.constData()); - } else if (test_pretty_printer) { - MemoryPool pool2; - TranslationUnitAST *other = unit.ast()->clone(&pool2)->asTranslationUnit(); - PrettyPrinter pp(&control, std::cout); - pp(other, source); - } - return EXIT_SUCCESS; } diff --git a/tests/manual/cplusplus/test-pretty-printer b/tests/manual/cplusplus/test-pretty-printer deleted file mode 100755 index 7403721300eddd0440cf5dc632eb0aefd7b34fbc..0000000000000000000000000000000000000000 --- a/tests/manual/cplusplus/test-pretty-printer +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -me=$(dirname $0) -${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0 --test-pretty-printer diff --git a/tests/manual/cplusplus/test-rewriter b/tests/manual/cplusplus/test-rewriter deleted file mode 100755 index c0494257c8f5a81cb382ac603bb4c84edc3b8055..0000000000000000000000000000000000000000 --- a/tests/manual/cplusplus/test-rewriter +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -me=$(dirname $0) -${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0 --test-rewriter