diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2012-11-15 14:34:52 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2012-11-15 17:19:55 +0100 |
commit | 16665154b5372034bb432ca0873b865e4c94e5b8 (patch) | |
tree | 51e1a7a5e018f77a6931d4d49062f727171bea56 /tests/auto/language | |
parent | 24015ab1a424c78c49d9be080ad5728834ee1b64 (diff) |
Loader: search for identifiers by traversing the AST
Replace the naive sourceCode.contains(...) calls with a proper AST
traversal when looking for the use of "base" or "outer" identifiers.
Introduced the class IdentifierSearch.
Change-Id: I5892002ed061b8bb3ff724470c6ab1f09ddb8018
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'tests/auto/language')
-rw-r--r-- | tests/auto/language/tst_language.cpp | 65 | ||||
-rw-r--r-- | tests/auto/language/tst_language.h | 2 |
2 files changed, 67 insertions, 0 deletions
diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index 3479c8d0f..11572c50b 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -29,7 +29,10 @@ #include "tst_language.h" +#include <language/identifiersearch.h> #include <language/scriptengine.h> +#include <parser/qmljslexer_p.h> +#include <parser/qmljsparser_p.h> #include <tools/error.h> QHash<QString, ResolvedProduct::Ptr> TestLanguage::productsFromProject(ResolvedProject::Ptr project) @@ -184,6 +187,68 @@ void TestLanguage::groupName() QCOMPARE(exceptionCaught, false); } +void TestLanguage::identifierSearch_data() +{ + QTest::addColumn<bool>("expectedHasNarf"); + QTest::addColumn<bool>("expectedHasZort"); + QTest::addColumn<QString>("sourceCode"); + QTest::newRow("no narf, no zort") << false << false << QString( + "Product {\n" + " name: {\n" + " var foo = 'bar';\n" + " print(foo);\n" + " return foo;\n" + " }\n" + "}\n"); + QTest::newRow("narf, no zort") << true << false << QString( + "Product {\n" + " name: {\n" + " var foo = 'zort';\n" + " print(narf + foo);\n" + " return foo;\n" + " }\n" + "}\n"); + QTest::newRow("no narf, zort") << false << true << QString( + "Product {\n" + " name: {\n" + " var foo = 'narf';\n" + " print(zort + foo);\n" + " return foo;\n" + " }\n" + "}\n"); + QTest::newRow("narf, zort") << true << true << QString( + "Product {\n" + " name: {\n" + " var foo = narf;\n" + " foo = foo + zort;\n" + " return foo;\n" + " }\n" + "}\n"); +} + +void TestLanguage::identifierSearch() +{ + QFETCH(bool, expectedHasNarf); + QFETCH(bool, expectedHasZort); + QFETCH(QString, sourceCode); + + bool hasNarf = !expectedHasNarf; + bool hasZort = !expectedHasZort; + IdentifierSearch isearch; + isearch.add("narf", &hasNarf); + isearch.add("zort", &hasZort); + + QmlJS::Engine engine; + QmlJS::Lexer lexer(&engine); + lexer.setCode(sourceCode, 1); + QmlJS::Parser parser(&engine); + QVERIFY(parser.parse()); + QVERIFY(parser.ast()); + isearch.start(parser.ast()); + QCOMPARE(hasNarf, expectedHasNarf); + QCOMPARE(hasZort, expectedHasZort); +} + void TestLanguage::jsImportUsedInMultipleScopes_data() { QTest::addColumn<QString>("buildVariant"); diff --git a/tests/auto/language/tst_language.h b/tests/auto/language/tst_language.h index 5b728e25d..637030dcc 100644 --- a/tests/auto/language/tst_language.h +++ b/tests/auto/language/tst_language.h @@ -54,6 +54,8 @@ private slots: void cleanupTestCase(); void conditionalDepends(); void groupName(); + void identifierSearch_data(); + void identifierSearch(); void jsImportUsedInMultipleScopes_data(); void jsImportUsedInMultipleScopes(); void productConditions(); |