| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <QtTest>
 | 
					
						
							|  |  |  | #include <QtDebug>
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | #include <QTextDocument>
 | 
					
						
							|  |  |  | #include <QTextCursor>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <Control.h>
 | 
					
						
							|  |  |  | #include <Parser.h>
 | 
					
						
							|  |  |  | #include <AST.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | #include <ASTVisitor.h>
 | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  | #include <Bind.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | #include <Scope.h>
 | 
					
						
							|  |  |  | #include <Symbols.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | #include <CoreTypes.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | #include <Names.h>
 | 
					
						
							|  |  |  | #include <Literals.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  | #include <DiagnosticClient.h>
 | 
					
						
							| 
									
										
										
										
											2010-05-20 13:44:38 +02:00
										 |  |  | #include <DeprecatedGenTemplateInstance.h>
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | #include <Overview.h>
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | #include <ExpressionUnderCursor.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | #include <Names.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-02 15:32:04 +10:00
										 |  |  | //TESTED_COMPONENT=src/libs/cplusplus
 | 
					
						
							| 
									
										
										
										
											2009-10-20 11:21:25 +02:00
										 |  |  | using namespace CPlusPlus; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class tst_Semantic: public QObject | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Q_OBJECT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     QSharedPointer<Control> control; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     tst_Semantic() | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |         : control(new Control) | 
					
						
							|  |  |  |     { control->setDiagnosticClient(&diag); } | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     TranslationUnit *parse(const QByteArray &source, | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |                            TranslationUnit::ParseMode mode, | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |                            bool enableObjc, | 
					
						
							|  |  |  |                            bool qtMocRun) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-08-11 15:48:21 +02:00
										 |  |  |         const StringLiteral *fileId = control->stringLiteral("<stdin>"); | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |         TranslationUnit *unit = new TranslationUnit(control.data(), fileId); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         unit->setSource(source.constData(), source.length()); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |         unit->setObjCEnabled(enableObjc); | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |         unit->setQtMocRunEnabled(qtMocRun); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         unit->parse(mode); | 
					
						
							|  |  |  |         return unit; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Document { | 
					
						
							|  |  |  |         Q_DISABLE_COPY(Document) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         Document(TranslationUnit *unit) | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |             : unit(unit), globals(unit->control()->newNamespace(0, 0)), errorCount(0) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ~Document() | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |         { } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         void check() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QVERIFY(unit); | 
					
						
							|  |  |  |             QVERIFY(unit->ast()); | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |             Bind bind(unit); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |             TranslationUnitAST *ast = unit->ast()->asTranslationUnit(); | 
					
						
							|  |  |  |             QVERIFY(ast); | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |             bind(ast, globals); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TranslationUnit *unit; | 
					
						
							| 
									
										
										
										
											2010-08-13 16:22:25 +02:00
										 |  |  |         Namespace *globals; | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |         unsigned errorCount; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Diagnostic: public DiagnosticClient { | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         int errorCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Diagnostic() | 
					
						
							|  |  |  |             : errorCount(0) | 
					
						
							|  |  |  |         { } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |         virtual void report(int /*level*/, | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |                             const StringLiteral *fileName, | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |                             unsigned line, unsigned column, | 
					
						
							|  |  |  |                             const char *format, va_list ap) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             ++errorCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             qDebug() << fileName->chars()<<':'<<line<<':'<<column<<' '<<QString().sprintf(format, ap); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     Diagnostic diag; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |     QSharedPointer<Document> document(const QByteArray &source, bool enableObjc = false, bool qtMocRun = false) | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |         diag.errorCount = 0; // reset the error count.
 | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |         TranslationUnit *unit = parse(source, TranslationUnit::ParseTranlationUnit, enableObjc, qtMocRun); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         QSharedPointer<Document> doc(new Document(unit)); | 
					
						
							|  |  |  |         doc->check(); | 
					
						
							| 
									
										
										
										
											2008-12-30 11:16:45 +01:00
										 |  |  |         doc->errorCount = diag.errorCount; | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |         return doc; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private slots: | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     void function_declaration_1(); | 
					
						
							|  |  |  |     void function_declaration_2(); | 
					
						
							|  |  |  |     void function_definition_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     void nested_class_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     void typedef_1(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     void typedef_2(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     void typedef_3(); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     void const_1(); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     void const_2(); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  |     void pointer_to_function_1(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void template_instance_1(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void expression_under_cursor_1(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     void bracketed_expression_under_cursor_1(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_2(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_3(); | 
					
						
							|  |  |  |     void bracketed_expression_under_cursor_4(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     void objcClass_1(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     void objcSelector_1(); | 
					
						
							|  |  |  |     void objcSelector_2(); | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     void q_enum_1(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | void tst_Semantic::function_declaration_1() | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo();"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = decl->type(); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     Function *funTy = declTy->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 0U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(decl->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = decl->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | void tst_Semantic::function_declaration_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo(const QString &s);"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FullySpecifiedType declTy = decl->type(); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     Function *funTy = declTy->asFunctionType(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the formal argument.
 | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(arg->name()); | 
					
						
							|  |  |  |     QVERIFY(! arg->hasInitializer()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the argument's name.
 | 
					
						
							| 
									
										
										
										
											2010-09-02 11:59:01 +02:00
										 |  |  |     const Identifier *argNameId = arg->name()->asNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(argNameId); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *argId = argNameId->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(argId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(QByteArray(argId->chars(), argId->size()), QByteArray("s")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // check the type of the formal argument
 | 
					
						
							|  |  |  |     FullySpecifiedType argTy = arg->type(); | 
					
						
							|  |  |  |     QVERIFY(argTy->isReferenceType()); | 
					
						
							|  |  |  |     QVERIFY(argTy->asReferenceType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:59:22 +01:00
										 |  |  |     NamedType *namedTy = argTy->asReferenceType()->elementType()->asNamedType(); | 
					
						
							|  |  |  |     QVERIFY(namedTy); | 
					
						
							|  |  |  |     QVERIFY(namedTy->name()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *namedTypeId = namedTy->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:59:22 +01:00
										 |  |  |     QVERIFY(namedTypeId); | 
					
						
							|  |  |  |     QCOMPARE(QByteArray(namedTypeId->chars(), namedTypeId->size()), | 
					
						
							|  |  |  |              QByteArray("QString")); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(decl->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = decl->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::function_definition_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void foo() {}"); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *funTy = doc->globals->memberAt(0)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isVoidType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 0U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QVERIFY(funTy->name()->isNameId()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *funId = funTy->name()->asNameId()->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-22 10:56:29 +01:00
										 |  |  |     QVERIFY(funId); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray foo(funId->chars(), funId->size()); | 
					
						
							|  |  |  |     QCOMPARE(foo, QByteArray("foo")); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | void tst_Semantic::nested_class_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "class Object {\n" | 
					
						
							|  |  |  | "    class Data;\n" | 
					
						
							|  |  |  | "    Data *d;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  | "class Object::Data {\n" | 
					
						
							|  |  |  | "   Object *q;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:35:50 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *classObject = doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObject); | 
					
						
							|  |  |  |     QVERIFY(classObject->name()); | 
					
						
							| 
									
										
										
										
											2010-09-02 11:59:01 +02:00
										 |  |  |     const Identifier *classObjectNameId = classObject->name()->asNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObjectNameId); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const Identifier *objectId = classObjectNameId->identifier(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QCOMPARE(QByteArray(objectId->chars(), objectId->size()), QByteArray("Object")); | 
					
						
							|  |  |  |     QCOMPARE(classObject->baseClassCount(), 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(classObject->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *classObjectData = doc->globals->memberAt(1)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(classObjectData); | 
					
						
							|  |  |  |     QVERIFY(classObjectData->name()); | 
					
						
							| 
									
										
										
										
											2009-12-02 12:45:28 +01:00
										 |  |  |     const QualifiedNameId *q = classObjectData->name()->asQualifiedNameId(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  |     QVERIFY(q); | 
					
						
							| 
									
										
										
										
											2010-07-12 16:18:52 +02:00
										 |  |  |     QVERIFY(q->base()); | 
					
						
							|  |  |  |     QVERIFY(q->base()->asNameId()); | 
					
						
							|  |  |  |     QCOMPARE(q->base(), classObject->name()); | 
					
						
							|  |  |  |     QVERIFY(q->name()); | 
					
						
							|  |  |  |     QVERIFY(q->name()->asNameId()); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->find(q->base()->asNameId()->identifier()), classObject); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:10:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = classObjectData->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     PointerType *ptrTy = decl->type()->asPointerType(); | 
					
						
							|  |  |  |     QVERIFY(ptrTy); | 
					
						
							|  |  |  |     NamedType *namedTy = ptrTy->elementType()->asNamedType(); | 
					
						
							|  |  |  |     QVERIFY(namedTy); | 
					
						
							|  |  |  |     QVERIFY(namedTy->name()->asNameId()); | 
					
						
							|  |  |  |     QCOMPARE(namedTy->name()->asNameId()->identifier(), objectId); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | void tst_Semantic::typedef_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "typedef struct {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "} Point;\n" | 
					
						
							|  |  |  | "int main() {\n" | 
					
						
							|  |  |  | "   Point pt;\n" | 
					
						
							|  |  |  | "   pt.x = 1;\n" | 
					
						
							|  |  |  | "}\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *anonStruct = doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(anonStruct); | 
					
						
							|  |  |  |     QCOMPARE(anonStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     QCOMPARE(typedefPointDecl->type()->asClassType(), anonStruct); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *mainFun = doc->globals->memberAt(2)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:40:30 +01:00
										 |  |  |     QVERIFY(mainFun); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  | void tst_Semantic::typedef_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "struct _Point {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "};\n" | 
					
						
							|  |  |  | "typedef _Point Point;\n" | 
					
						
							|  |  |  | "int main() {\n" | 
					
						
							|  |  |  | "   Point pt;\n" | 
					
						
							|  |  |  | "   pt.x = 1;\n" | 
					
						
							|  |  |  | "}\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 3U); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *_pointStruct= doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(_pointStruct); | 
					
						
							|  |  |  |     QCOMPARE(_pointStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->type()->isNamedType()); | 
					
						
							|  |  |  |     QCOMPARE(typedefPointDecl->type()->asNamedType()->name(), _pointStruct->name()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Function *mainFun = doc->globals->memberAt(2)->asFunction(); | 
					
						
							| 
									
										
										
										
											2008-12-29 09:44:49 +01:00
										 |  |  |     QVERIFY(mainFun); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  | void tst_Semantic::typedef_3() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document( | 
					
						
							|  |  |  | "typedef struct {\n" | 
					
						
							|  |  |  | "   int x, y;\n" | 
					
						
							|  |  |  | "} *PointPtr;\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Class *_pointStruct= doc->globals->memberAt(0)->asClass(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     QVERIFY(_pointStruct); | 
					
						
							|  |  |  |     QCOMPARE(_pointStruct->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *typedefPointDecl = doc->globals->memberAt(1)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |     QVERIFY(typedefPointDecl); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->isTypedef()); | 
					
						
							|  |  |  |     QVERIFY(typedefPointDecl->type()->isPointerType()); | 
					
						
							| 
									
										
										
										
											2009-02-09 17:56:17 +01:00
										 |  |  |     QCOMPARE(typedefPointDecl->type()->asPointerType()->elementType()->asClassType(), | 
					
						
							| 
									
										
										
										
											2008-12-31 10:47:02 +01:00
										 |  |  |              _pointStruct); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | void tst_Semantic::const_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  | "int foo(const int *s);\n" | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->type()->isFunctionType()); | 
					
						
							|  |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isIntegerType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(! arg->type().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->isPointerType()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->isIntegerType()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::const_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  | "int foo(char * const s);\n" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-02-12 10:46:26 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->type()->isFunctionType()); | 
					
						
							|  |  |  |     Function *funTy = decl->type()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy->returnType()->isIntegerType()); | 
					
						
							|  |  |  |     QCOMPARE(funTy->argumentCount(), 1U); | 
					
						
							|  |  |  |     Argument *arg = funTy->argumentAt(0)->asArgument(); | 
					
						
							|  |  |  |     QVERIFY(arg); | 
					
						
							|  |  |  |     QVERIFY(arg->type().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->isPointerType()); | 
					
						
							|  |  |  |     QVERIFY(! arg->type()->asPointerType()->elementType().isConst()); | 
					
						
							|  |  |  |     QVERIFY(arg->type()->asPointerType()->elementType()->isIntegerType()); | 
					
						
							| 
									
										
										
										
											2009-02-11 16:21:17 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | void tst_Semantic::pointer_to_function_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("void (*QtSomething)();"); | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = doc->globals->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PointerType *ptrTy = decl->type()->asPointerType(); | 
					
						
							|  |  |  |     QVERIFY(ptrTy); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Function *funTy = ptrTy->elementType()->asFunctionType(); | 
					
						
							|  |  |  |     QVERIFY(funTy); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 14:45:58 +01:00
										 |  |  |     QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); | 
					
						
							| 
									
										
										
										
											2010-08-26 16:16:22 +02:00
										 |  |  |     QVERIFY(funTy->enclosingScope()); | 
					
						
							| 
									
										
										
										
											2009-10-26 14:45:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); | 
					
						
							| 
									
										
										
										
											2010-08-26 16:16:22 +02:00
										 |  |  |     QCOMPARE(funTy->enclosingScope(), decl->enclosingScope()); | 
					
						
							| 
									
										
										
										
											2009-10-26 11:24:32 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | void tst_Semantic::template_instance_1() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-18 10:33:35 +02:00
										 |  |  |     QSharedPointer<Document> doc = document("template <typename _Tp> class QList { void append(const _Tp &value); };"); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Template *templ = doc->globals->memberAt(0)->asTemplate(); | 
					
						
							|  |  |  |     QVERIFY(templ); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     Declaration *decl = templ->memberAt(1)->asClass()->memberAt(0)->asDeclaration(); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     FullySpecifiedType templArgs[] = { control->integerType(IntegerType::Int) }; | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     const Name *templId = control->templateNameId(control->identifier("QList"), templArgs, 1); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-23 12:45:02 +02:00
										 |  |  |     FullySpecifiedType genTy = DeprecatedGenTemplateInstance::instantiate(templId, decl, control); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Overview oo; | 
					
						
							|  |  |  |     oo.setShowReturnTypes(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QString genDecl = oo.prettyType(genTy); | 
					
						
							| 
									
										
										
										
											2010-05-18 10:33:35 +02:00
										 |  |  |     QCOMPARE(genDecl, QString::fromLatin1("void (const int &)")); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:00:56 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  | void tst_Semantic::expression_under_cursor_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "void *ptr = foo(10, bar"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-10-26 15:07:00 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("bar")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  | void tst_Semantic::bracketed_expression_under_cursor_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "int i = 0, j[1], k = j[i"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("i")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::bracketed_expression_under_cursor_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "[receiver msg"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, plainText); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::bracketed_expression_under_cursor_3() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "if ([receiver message"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("[receiver message")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-12 16:18:52 +02:00
										 |  |  | void tst_Semantic::bracketed_expression_under_cursor_4() | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     const QString plainText = "int i = 0, j[1], k = j[(i == 0) ? 0 : i"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextDocument textDocument; | 
					
						
							|  |  |  |     textDocument.setPlainText(plainText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QTextCursor tc(&textDocument); | 
					
						
							|  |  |  |     tc.movePosition(QTextCursor::End); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-07 09:33:24 +02:00
										 |  |  |     ExpressionUnderCursor expressionUnderCursor; | 
					
						
							| 
									
										
										
										
											2009-11-11 09:35:42 +01:00
										 |  |  |     const QString expression = expressionUnderCursor(tc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(expression, QString("i")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | void tst_Semantic::objcClass_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@interface Zoo {} +(id)alloc;-(id)init;@end\n" | 
					
						
							|  |  |  |                                             "@implementation Zoo\n" | 
					
						
							|  |  |  |                                             "+(id)alloc{}\n" | 
					
						
							|  |  |  |                                             "-(id)init{}\n" | 
					
						
							|  |  |  |                                             "-(void)dealloc{}\n" | 
					
						
							|  |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 2U); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QVERIFY(iface->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 2U); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *impl = doc->globals->memberAt(1)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2009-11-11 09:21:06 +01:00
										 |  |  |     QVERIFY(impl); | 
					
						
							|  |  |  |     QVERIFY(!impl->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(impl->memberCount(), 3U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ObjCMethod *allocMethod = impl->memberAt(0)->asObjCMethod(); | 
					
						
							|  |  |  |     QVERIFY(allocMethod); | 
					
						
							|  |  |  |     QVERIFY(allocMethod->name() && allocMethod->name()->identifier()); | 
					
						
							|  |  |  |     QCOMPARE(QLatin1String(allocMethod->name()->identifier()->chars()), QLatin1String("alloc")); | 
					
						
							|  |  |  |     QVERIFY(allocMethod->isStatic()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ObjCMethod *deallocMethod = impl->memberAt(2)->asObjCMethod(); | 
					
						
							|  |  |  |     QVERIFY(deallocMethod); | 
					
						
							|  |  |  |     QVERIFY(deallocMethod->name() && deallocMethod->name()->identifier()); | 
					
						
							|  |  |  |     QCOMPARE(QLatin1String(deallocMethod->name()->identifier()->chars()), QLatin1String("dealloc")); | 
					
						
							|  |  |  |     QVERIFY(!deallocMethod->isStatic()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | void tst_Semantic::objcSelector_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@interface A {}\n" | 
					
						
							| 
									
										
										
										
											2010-08-13 16:52:59 +02:00
										 |  |  |                                             "-(void) a:(int)a    b:(int)b c:(int)c;\n" | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QVERIFY(iface->isInterface()); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Declaration *decl = iface->memberAt(0)->asDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(decl); | 
					
						
							|  |  |  |     QVERIFY(decl->name()); | 
					
						
							|  |  |  |     const SelectorNameId *selId = decl->name()->asSelectorNameId(); | 
					
						
							|  |  |  |     QVERIFY(selId); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameCount(), 3U); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CollectSelectors: public ASTVisitor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     CollectSelectors(TranslationUnit *xUnit): ASTVisitor(xUnit) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QList<ObjCSelectorAST *> operator()() { | 
					
						
							|  |  |  |         selectors.clear(); | 
					
						
							|  |  |  |         accept(translationUnit()->ast()); | 
					
						
							|  |  |  |         return selectors; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     virtual bool visit(ObjCSelectorAST *ast) {selectors.append(ast); return false;} | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     QList<ObjCSelectorAST *> selectors; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tst_Semantic::objcSelector_2() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "@implementation A {}\n" | 
					
						
							|  |  |  |                                             "-(SEL)x {\n" | 
					
						
							|  |  |  |                                             "  return @selector(a:b:c:);\n" | 
					
						
							|  |  |  |                                             "}\n" | 
					
						
							|  |  |  |                                             "@end\n", | 
					
						
							|  |  |  |                                             true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     ObjCClass *iface = doc->globals->memberAt(0)->asObjCClass(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(iface); | 
					
						
							|  |  |  |     QCOMPARE(iface->memberCount(), 1U); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QList<ObjCSelectorAST*>selectors = CollectSelectors(doc->unit)(); | 
					
						
							|  |  |  |     QCOMPARE(selectors.size(), 2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     ObjCSelectorAST *sel = selectors.at(1)->asObjCSelector(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(sel); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:43:40 +01:00
										 |  |  |     const SelectorNameId *selId = sel->name->asSelectorNameId(); | 
					
						
							| 
									
										
										
										
											2010-02-10 23:15:16 +01:00
										 |  |  |     QVERIFY(selId); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameCount(), 3U); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(1)->identifier()->chars(), "b"); | 
					
						
							|  |  |  |     QCOMPARE(selId->nameAt(2)->identifier()->chars(), "c"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  | void tst_Semantic::q_enum_1() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QSharedPointer<Document> doc = document("\n" | 
					
						
							|  |  |  |                                             "class Tst {\n" | 
					
						
							|  |  |  |                                             "Q_ENUMS(e)\n" | 
					
						
							|  |  |  |                                             "public:\n" | 
					
						
							|  |  |  |                                             "enum e { x, y };\n" | 
					
						
							|  |  |  |                                             "};\n", | 
					
						
							|  |  |  |                                             false, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QCOMPARE(doc->errorCount, 0U); | 
					
						
							| 
									
										
										
										
											2010-08-11 16:06:40 +02:00
										 |  |  |     QCOMPARE(doc->globals->memberCount(), 1U); | 
					
						
							| 
									
										
										
										
											2010-02-06 14:32:25 +01:00
										 |  |  |     QVERIFY(doc->unit); | 
					
						
							|  |  |  |     TranslationUnitAST *xUnit = doc->unit->ast()->asTranslationUnit(); | 
					
						
							|  |  |  |     QVERIFY(xUnit); | 
					
						
							|  |  |  |     SimpleDeclarationAST *tstDecl = xUnit->declaration_list->value->asSimpleDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(tstDecl); | 
					
						
							|  |  |  |     ClassSpecifierAST *tst = tstDecl->decl_specifier_list->value->asClassSpecifier(); | 
					
						
							|  |  |  |     QVERIFY(tst); | 
					
						
							|  |  |  |     QtEnumDeclarationAST *qtEnum = tst->member_specifier_list->value->asQtEnumDeclaration(); | 
					
						
							|  |  |  |     QVERIFY(qtEnum); | 
					
						
							|  |  |  |     SimpleNameAST *e = qtEnum->enumerator_list->value->asSimpleName(); | 
					
						
							|  |  |  |     QVERIFY(e); | 
					
						
							|  |  |  |     QCOMPARE(doc->unit->spell(e->identifier_token), "e"); | 
					
						
							|  |  |  |     QCOMPARE(e->name->identifier()->chars(), "e"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 10:46:15 +01:00
										 |  |  | QTEST_APPLESS_MAIN(tst_Semantic) | 
					
						
							|  |  |  | #include "tst_semantic.moc"
 |