summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-11-30 16:30:21 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2009-11-30 17:07:22 +0100
commit527a9bd526d854d3f43b633a94af6dea642297db (patch)
treee334bb57c912b649551493dc985d2f0dd2e62a22 /src/shared
parent5fc8324b8bb72ed5156ce52db2e6e506e568b405 (diff)
downloadqt-creator-527a9bd526d854d3f43b633a94af6dea642297db.tar.gz
Inital support for Q_D/Q_Q declarations.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/cplusplus/AST.cpp14
-rw-r--r--src/shared/cplusplus/AST.h20
-rw-r--r--src/shared/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp19
-rw-r--r--src/shared/cplusplus/ASTMatcher.h1
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp8
-rw-r--r--src/shared/cplusplus/ASTVisitor.h2
-rw-r--r--src/shared/cplusplus/ASTfwd.h1
-rw-r--r--src/shared/cplusplus/CheckStatement.cpp33
-rw-r--r--src/shared/cplusplus/CheckStatement.h1
-rw-r--r--src/shared/cplusplus/Keywords.cpp12
-rw-r--r--src/shared/cplusplus/Parser.cpp10
-rw-r--r--src/shared/cplusplus/Token.cpp2
-rw-r--r--src/shared/cplusplus/Token.h4
14 files changed, 132 insertions, 3 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index b4b1f1a3ef..e901b67e92 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -246,7 +246,21 @@ unsigned QtMethodAST::lastToken() const
return method_token + 1;
}
+unsigned QtMemberDeclarationAST::firstToken() const
+{
+ return q_token;
+}
+unsigned QtMemberDeclarationAST::lastToken() const
+{
+ if (rparen_token)
+ return rparen_token + 1;
+ else if (type_id)
+ return type_id->lastToken();
+ else if (lparen_token)
+ return lparen_token + 1;
+ return q_token + 1;
+}
unsigned BinaryExpressionAST::firstToken() const
{
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index eb64731281..3902fcb5c5 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -246,6 +246,7 @@ public:
virtual PostfixDeclaratorAST *asPostfixDeclarator() { return 0; }
virtual PostfixExpressionAST *asPostfixExpression() { return 0; }
virtual PtrOperatorAST *asPtrOperator() { return 0; }
+ virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return 0; }
virtual QtMethodAST *asQtMethod() { return 0; }
virtual QualifiedNameAST *asQualifiedName() { return 0; }
virtual ReferenceAST *asReference() { return 0; }
@@ -582,6 +583,25 @@ protected:
virtual bool match0(AST *, ASTMatcher *);
};
+class CPLUSPLUS_EXPORT QtMemberDeclarationAST: public StatementAST
+{
+public:
+ unsigned q_token;
+ unsigned lparen_token;
+ ExpressionAST *type_id;
+ unsigned rparen_token;
+
+public:
+ virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
+};
+
class CPLUSPLUS_EXPORT BinaryExpressionAST: public ExpressionAST
{
public:
diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp
index 7c4ff19ae6..e16c078808 100644
--- a/src/shared/cplusplus/ASTMatch0.cpp
+++ b/src/shared/cplusplus/ASTMatch0.cpp
@@ -128,6 +128,14 @@ bool QtMethodAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
+bool QtMemberDeclarationAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (QtMemberDeclarationAST *_other = pattern->asQtMemberDeclaration())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
bool BinaryExpressionAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (BinaryExpressionAST *_other = pattern->asBinaryExpression())
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 9ded92f8ef..b7920f767f 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -274,6 +274,25 @@ bool ASTMatcher::match(QtMethodAST *node, QtMethodAST *pattern)
return true;
}
+bool ASTMatcher::match(QtMemberDeclarationAST *node, QtMemberDeclarationAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ pattern->q_token = node->q_token;
+
+ pattern->lparen_token = node->lparen_token;
+
+ if (! pattern->type_id)
+ pattern->type_id = node->type_id;
+ else if (! AST::match(node->type_id, pattern->type_id, this))
+ return false;
+
+ pattern->rparen_token = node->rparen_token;
+
+ return true;
+}
+
bool ASTMatcher::match(BinaryExpressionAST *node, BinaryExpressionAST *pattern)
{
(void) node;
diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h
index f299dc51bb..c3490ac69b 100644
--- a/src/shared/cplusplus/ASTMatcher.h
+++ b/src/shared/cplusplus/ASTMatcher.h
@@ -135,6 +135,7 @@ public:
virtual bool match(UsingDirectiveAST *node, UsingDirectiveAST *pattern);
virtual bool match(WhileStatementAST *node, WhileStatementAST *pattern);
virtual bool match(QtMethodAST *node, QtMethodAST *pattern);
+ virtual bool match(QtMemberDeclarationAST *node, QtMemberDeclarationAST *pattern);
virtual bool match(ObjCClassDeclarationAST *node, ObjCClassDeclarationAST *pattern);
virtual bool match(ObjCClassForwardDeclarationAST *node, ObjCClassForwardDeclarationAST *pattern);
virtual bool match(ObjCProtocolDeclarationAST *node, ObjCProtocolDeclarationAST *pattern);
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 6e26f772b2..877dd8df74 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -131,6 +131,14 @@ void QtMethodAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
+void QtMemberDeclarationAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(type_id, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void BinaryExpressionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 0a42b6f4d4..7d73ba3ed5 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -198,6 +198,7 @@ public:
virtual bool visit(UsingDirectiveAST *) { return true; }
virtual bool visit(WhileStatementAST *) { return true; }
virtual bool visit(QtMethodAST *) { return true; }
+ virtual bool visit(QtMemberDeclarationAST *) { return true; }
// ObjC++
virtual bool visit(ObjCClassDeclarationAST *) { return true; }
@@ -323,6 +324,7 @@ public:
virtual void endVisit(UsingDirectiveAST *) { }
virtual void endVisit(WhileStatementAST *) { }
virtual void endVisit(QtMethodAST *) { }
+ virtual void endVisit(QtMemberDeclarationAST *) { }
// ObjC++
virtual void endVisit(ObjCClassDeclarationAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 18f1987d5e..cefdfdc381 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -162,6 +162,7 @@ class PostfixAST;
class PostfixDeclaratorAST;
class PostfixExpressionAST;
class PtrOperatorAST;
+class QtMemberDeclarationAST;
class QtMethodAST;
class QualifiedNameAST;
class ReferenceAST;
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index 1273f81610..dec68b1ea4 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -54,6 +54,9 @@
#include "CoreTypes.h"
#include "Control.h"
#include "Symbols.h"
+#include "Names.h"
+#include "Literals.h"
+#include <string>
using namespace CPlusPlus;
@@ -307,4 +310,34 @@ bool CheckStatement::visit(WhileStatementAST *ast)
return false;
}
+bool CheckStatement::visit(QtMemberDeclarationAST *ast)
+{
+ Name *name = 0;
+
+ if (tokenKind(ast->q_token) == T_Q_D)
+ name = control()->nameId(control()->findOrInsertIdentifier("d"));
+ else
+ name = control()->nameId(control()->findOrInsertIdentifier("q"));
+
+ FullySpecifiedType declTy = semantic()->check(ast->type_id, _scope);
+
+ if (tokenKind(ast->q_token) == T_Q_D) {
+ if (NamedType *namedTy = declTy->asNamedType()) {
+ if (NameId *nameId = namedTy->name()->asNameId()) {
+ std::string privateClass;
+ privateClass += nameId->identifier()->chars();
+ privateClass += "Private";
+
+ Name *privName = control()->nameId(control()->findOrInsertIdentifier(privateClass.c_str(), privateClass.size()));
+ declTy.setType(control()->namedType(privName));
+ }
+ }
+ }
+
+ Declaration *symbol = control()->newDeclaration(/*generated*/ 0, name);
+ symbol->setType(control()->pointerType(declTy));
+
+ _scope->enterSymbol(symbol);
+ return false;
+}
diff --git a/src/shared/cplusplus/CheckStatement.h b/src/shared/cplusplus/CheckStatement.h
index 6bd0c868ab..e31d507a5e 100644
--- a/src/shared/cplusplus/CheckStatement.h
+++ b/src/shared/cplusplus/CheckStatement.h
@@ -88,6 +88,7 @@ protected:
virtual bool visit(TryBlockStatementAST *ast);
virtual bool visit(CatchClauseAST *ast);
virtual bool visit(WhileStatementAST *ast);
+ virtual bool visit(QtMemberDeclarationAST *ast);
private:
StatementAST *_statement;
diff --git a/src/shared/cplusplus/Keywords.cpp b/src/shared/cplusplus/Keywords.cpp
index 48af124473..6da25125f7 100644
--- a/src/shared/cplusplus/Keywords.cpp
+++ b/src/shared/cplusplus/Keywords.cpp
@@ -65,7 +65,7 @@ static inline int classify2(const char *s, bool) {
return T_IDENTIFIER;
}
-static inline int classify3(const char *s, bool) {
+static inline int classify3(const char *s, bool q) {
if (s[0] == 'a') {
if (s[1] == 's') {
if (s[2] == 'm') {
@@ -101,6 +101,16 @@ static inline int classify3(const char *s, bool) {
}
}
}
+ else if (q && s[0] == 'Q') {
+ if (s[1] == '_') {
+ if (s[2] == 'D') {
+ return T_Q_D;
+ }
+ else if (s[2] == 'Q') {
+ return T_Q_Q;
+ }
+ }
+ }
return T_IDENTIFIER;
}
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 7e464b7d8b..a4be22f5b4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2104,6 +2104,16 @@ bool Parser::parseStatement(StatementAST *&node)
if (objCEnabled())
return parseObjCSynchronizedStatement(node);
+ case T_Q_D:
+ case T_Q_Q: {
+ QtMemberDeclarationAST *ast = new (_pool) QtMemberDeclarationAST;
+ ast->q_token = consumeToken();
+ match(T_LPAREN, &ast->lparen_token);
+ parseTypeId(ast->type_id);
+ match(T_RPAREN, &ast->rparen_token);
+ node = ast;
+ } return true;
+
default:
if (LA() == T_IDENTIFIER && LA(2) == T_COLON)
return parseLabeledStatement(node);
diff --git a/src/shared/cplusplus/Token.cpp b/src/shared/cplusplus/Token.cpp
index 48bf61354f..ce661e43b0 100644
--- a/src/shared/cplusplus/Token.cpp
+++ b/src/shared/cplusplus/Token.cpp
@@ -91,7 +91,7 @@ static const char *token_names[] = {
("@protected"), ("@protocol"), ("@public"), ("@required"), ("@selector"),
("@synchronized"), ("@synthesize"), ("@throw"), ("@try"),
- ("SIGNAL"), ("SLOT"), ("Q_SIGNAL"), ("Q_SLOT"), ("signals"), ("slots"), ("Q_FOREACH")
+ ("SIGNAL"), ("SLOT"), ("Q_SIGNAL"), ("Q_SLOT"), ("signals"), ("slots"), ("Q_FOREACH"), ("Q_D"), ("Q_Q")
};
Token::Token() :
diff --git a/src/shared/cplusplus/Token.h b/src/shared/cplusplus/Token.h
index 3829baa651..acbe3927ba 100644
--- a/src/shared/cplusplus/Token.h
+++ b/src/shared/cplusplus/Token.h
@@ -236,8 +236,10 @@ enum Kind {
T_Q_SIGNALS,
T_Q_SLOTS,
T_Q_FOREACH,
+ T_Q_D,
+ T_Q_Q,
- T_LAST_KEYWORD = T_Q_FOREACH,
+ T_LAST_KEYWORD = T_Q_Q,
// aliases
T_OR = T_PIPE_PIPE,