diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-11-30 16:30:21 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-11-30 17:07:22 +0100 |
commit | 527a9bd526d854d3f43b633a94af6dea642297db (patch) | |
tree | e334bb57c912b649551493dc985d2f0dd2e62a22 /src/shared | |
parent | 5fc8324b8bb72ed5156ce52db2e6e506e568b405 (diff) | |
download | qt-creator-527a9bd526d854d3f43b633a94af6dea642297db.tar.gz |
Inital support for Q_D/Q_Q declarations.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 14 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 20 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatch0.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.cpp | 19 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisitor.h | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckStatement.cpp | 33 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckStatement.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/Keywords.cpp | 12 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 10 | ||||
-rw-r--r-- | src/shared/cplusplus/Token.cpp | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/Token.h | 4 |
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, |