summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-11-11 09:32:05 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-11-11 09:34:10 +0100
commita6bbec2b56f4a07f408bf3213b3b15fa6fc10330 (patch)
treec6a15058f80fd1131df2efa2e446858b30239133 /src/shared/cplusplus
parent72d4493fc21535f1f2720106e28ae3a6980851f5 (diff)
downloadqt-creator-a6bbec2b56f4a07f408bf3213b3b15fa6fc10330.tar.gz
Added symbols for property declarations.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.h3
-rw-r--r--src/shared/cplusplus/CPlusPlusForwardDeclarations.h1
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp77
-rw-r--r--src/shared/cplusplus/Control.cpp12
-rw-r--r--src/shared/cplusplus/Control.h3
-rw-r--r--src/shared/cplusplus/Symbol.cpp3
-rw-r--r--src/shared/cplusplus/Symbol.h5
-rw-r--r--src/shared/cplusplus/SymbolVisitor.h1
-rw-r--r--src/shared/cplusplus/Symbols.cpp19
-rw-r--r--src/shared/cplusplus/Symbols.h69
10 files changed, 157 insertions, 36 deletions
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index aec4083475..2a1c2d6ef0 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -2391,6 +2391,9 @@ public:
unsigned rparen_token;
DeclarationAST *simple_declaration;
+public: // annotations
+ List<ObjCPropertyDeclaration *> *symbols;
+
public:
virtual ObjCPropertyDeclarationAST *asObjCPropertyDeclaration() { return this; }
diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
index 9616f51780..c21d0bbd0e 100644
--- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
+++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h
@@ -130,6 +130,7 @@ class ObjCForwardClassDeclaration;
class ObjCProtocol;
class ObjCForwardProtocolDeclaration;
class ObjCMethod;
+class ObjCPropertyDeclaration;
} // end of namespace CPlusPlus
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 728e87385d..04ee291aef 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -682,21 +682,6 @@ bool CheckDeclaration::visit(ObjCVisibilityDeclarationAST *ast)
return false;
}
-enum PropertyAttributes {
- None = 0,
- Assign = 1 << 0,
- Retain = 1 << 1,
- Copy = 1 << 2,
- ReadOnly = 1 << 3,
- ReadWrite = 1 << 4,
- Getter = 1 << 5,
- Setter = 1 << 6,
- NonAtomic = 1 << 7,
-
- WritabilityMask = ReadOnly | ReadWrite,
- SetterSemanticsMask = Assign | Retain | Copy,
-};
-
bool CheckDeclaration::checkPropertyAttribute(ObjCPropertyAttributeAST *attrAst,
int &flags,
int attr)
@@ -714,7 +699,17 @@ bool CheckDeclaration::checkPropertyAttribute(ObjCPropertyAttributeAST *attrAst,
bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
{
- int propAttrs = None;
+ semantic()->check(ast->simple_declaration, _scope);
+ SimpleDeclarationAST *simpleDecl = ast->simple_declaration->asSimpleDeclaration();
+
+ if (!simpleDecl) {
+ translationUnit()->warning(ast->simple_declaration->firstToken(),
+ "invalid type for property declaration");
+ return false;
+ }
+
+ int propAttrs = ObjCPropertyDeclaration::None;
+ Name *getterName = 0, *setterName = 0;
for (ObjCPropertyAttributeListAST *iter= ast->property_attribute_list; iter; iter = iter->next) {
ObjCPropertyAttributeAST *attrAst = iter->value;
@@ -723,45 +718,57 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
Identifier *attrId = identifier(attrAst->attribute_identifier_token);
if (attrId == control()->objcGetterId()) {
- if (checkPropertyAttribute(attrAst, propAttrs, Getter)) {
- // TODO: find method declaration for getter
+ if (checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::Getter)) {
+ getterName = semantic()->check(attrAst->method_selector, _scope);
}
} else if (attrId == control()->objcSetterId()) {
- if (checkPropertyAttribute(attrAst, propAttrs, Setter)) {
- // TODO: find method declaration for setter
+ if (checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::Setter)) {
+ setterName = semantic()->check(attrAst->method_selector, _scope);
}
} else if (attrId == control()->objcReadwriteId()) {
- checkPropertyAttribute(attrAst, propAttrs, ReadWrite);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::ReadWrite);
} else if (attrId == control()->objcReadonlyId()) {
- checkPropertyAttribute(attrAst, propAttrs, ReadOnly);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::ReadOnly);
} else if (attrId == control()->objcAssignId()) {
- checkPropertyAttribute(attrAst, propAttrs, Assign);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::Assign);
} else if (attrId == control()->objcRetainId()) {
- checkPropertyAttribute(attrAst, propAttrs, Retain);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::Retain);
} else if (attrId == control()->objcCopyId()) {
- checkPropertyAttribute(attrAst, propAttrs, Copy);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::Copy);
} else if (attrId == control()->objcNonatomicId()) {
- checkPropertyAttribute(attrAst, propAttrs, NonAtomic);
+ checkPropertyAttribute(attrAst, propAttrs, ObjCPropertyDeclaration::NonAtomic);
}
}
- if (propAttrs & ReadOnly && propAttrs & ReadWrite)
+ if (propAttrs & ObjCPropertyDeclaration::ReadOnly &&
+ propAttrs & ObjCPropertyDeclaration::ReadWrite)
// Should this be an error instead of only a warning?
translationUnit()->warning(ast->property_token,
"property can have at most one attribute \"readonly\" or \"readwrite\" specified");
- int setterSemAttrs = propAttrs & SetterSemanticsMask;
+ int setterSemAttrs = propAttrs & ObjCPropertyDeclaration::SetterSemanticsMask;
if (setterSemAttrs
- && setterSemAttrs != Assign
- && setterSemAttrs != Retain
- && setterSemAttrs != Copy) {
+ && setterSemAttrs != ObjCPropertyDeclaration::Assign
+ && setterSemAttrs != ObjCPropertyDeclaration::Retain
+ && setterSemAttrs != ObjCPropertyDeclaration::Copy) {
// Should this be an error instead of only a warning?
translationUnit()->warning(ast->property_token,
"property can have at most one attribute \"assign\", \"retain\", or \"copy\" specified");
}
- // TODO: Check if the next line is correct (EV)
- semantic()->check(ast->simple_declaration, _scope);
+ List<ObjCPropertyDeclaration *> **lastSymbols = &ast->symbols;
+ for (List<Declaration*> *iter = simpleDecl->symbols; iter; iter = iter->next) {
+ ObjCPropertyDeclaration *propDecl = control()->newObjCPropertyDeclaration(ast->firstToken(),
+ iter->value->name());
+ propDecl->setType(iter->value->type());
+ propDecl->setAttributes(propAttrs);
+ propDecl->setGetterName(getterName);
+ propDecl->setSetterName(setterName);
+ _scope->enterSymbol(propDecl);
+
+ *lastSymbols = new (translationUnit()->memoryPool()) List<ObjCPropertyDeclaration *>();
+ (*lastSymbols)->value = propDecl;
+ lastSymbols = &(*lastSymbols)->next;
+ }
+
return false;
}
-
-
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index 249d671ae1..d2b91e14a2 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -129,6 +129,7 @@ public:
delete_array_entries(objcForwardClassDeclarations);
delete_array_entries(objcForwardProtocolDeclarations);
delete_array_entries(objcMethods);
+ delete_array_entries(objcPropertyDeclarations);
}
NameId *findOrInsertNameId(Identifier *id)
@@ -393,6 +394,13 @@ public:
return method;
}
+ ObjCPropertyDeclaration *newObjCPropertyDeclaration(unsigned sourceLocation, Name *name)
+ {
+ ObjCPropertyDeclaration *decl = new ObjCPropertyDeclaration(translationUnit, sourceLocation, name);
+ objcPropertyDeclarations.push_back(decl);
+ return decl;
+ }
+
Enum *newEnum(unsigned sourceLocation, Name *name)
{
Enum *e = new Enum(translationUnit,
@@ -577,6 +585,7 @@ public:
std::vector<ObjCForwardClassDeclaration *> objcForwardClassDeclarations;
std::vector<ObjCForwardProtocolDeclaration *> objcForwardProtocolDeclarations;
std::vector<ObjCMethod *> objcMethods;
+ std::vector<ObjCPropertyDeclaration *> objcPropertyDeclarations;
// ObjC context keywords:
Identifier *objcGetterId;
@@ -787,6 +796,9 @@ ObjCForwardProtocolDeclaration *Control::newObjCForwardProtocolDeclaration(unsig
ObjCMethod *Control::newObjCMethod(unsigned sourceLocation, Name *name)
{ return d->newObjCMethod(sourceLocation, name); }
+ObjCPropertyDeclaration *Control::newObjCPropertyDeclaration(unsigned sourceLocation, Name *name)
+{ return d->newObjCPropertyDeclaration(sourceLocation, name); }
+
Identifier *Control::objcGetterId() const
{ return d->objcGetterId; }
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index d4db273e43..6abeb8ef6d 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -169,6 +169,9 @@ public:
/// Creates a new Objective-C method symbol.
ObjCMethod *newObjCMethod(unsigned sourceLocation, Name *name = 0);
+ /// Creates a new Objective-C @property declaration symbol.
+ ObjCPropertyDeclaration *newObjCPropertyDeclaration(unsigned sourceLocation, Name *name);
+
// Objective-C specific context keywords.
Identifier *objcGetterId() const;
Identifier *objcSetterId() const;
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 6cd6573aa6..e8b80fdcae 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -488,4 +488,5 @@ bool Symbol::isObjCForwardProtocolDeclaration() const
bool Symbol::isObjCMethod() const
{ return asObjCMethod() != 0; }
-
+bool Symbol::isObjCPropertyDeclaration() const
+{ return asObjCPropertyDeclaration() != 0; }
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index 93d730b0cf..61abe02c7e 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -228,6 +228,9 @@ public:
/// Returns true if this Symbol is an Objective-C method declaration.
bool isObjCMethod() const;
+ /// Returns true if this Symbol is an Objective-C @property declaration.
+ bool isObjCPropertyDeclaration() const;
+
virtual const ScopedSymbol *asScopedSymbol() const { return 0; }
virtual const Enum *asEnum() const { return 0; }
virtual const Function *asFunction() const { return 0; }
@@ -247,6 +250,7 @@ public:
virtual const ObjCProtocol *asObjCProtocol() const { return 0; }
virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration() const { return 0; }
virtual const ObjCMethod *asObjCMethod() const { return 0; }
+ virtual const ObjCPropertyDeclaration *asObjCPropertyDeclaration() const { return 0; }
virtual ScopedSymbol *asScopedSymbol() { return 0; }
virtual Enum *asEnum() { return 0; }
@@ -267,6 +271,7 @@ public:
virtual ObjCProtocol *asObjCProtocol() { return 0; }
virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration() { return 0; }
virtual ObjCMethod *asObjCMethod() { return 0; }
+ virtual ObjCPropertyDeclaration *asObjCPropertyDeclaration() { return 0; }
/// Returns this Symbol's type.
virtual FullySpecifiedType type() const = 0;
diff --git a/src/shared/cplusplus/SymbolVisitor.h b/src/shared/cplusplus/SymbolVisitor.h
index 4bfa379430..0e6440b750 100644
--- a/src/shared/cplusplus/SymbolVisitor.h
+++ b/src/shared/cplusplus/SymbolVisitor.h
@@ -88,6 +88,7 @@ public:
virtual bool visit(ObjCProtocol *) { return true; }
virtual bool visit(ObjCForwardProtocolDeclaration *) { return true; }
virtual bool visit(ObjCMethod *) { return true; }
+ virtual bool visit(ObjCPropertyDeclaration *) { return true; }
};
} // end of namespace CPlusPlus
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 8ddaf3ef5d..819c8730ed 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -820,4 +820,23 @@ void ObjCMethod::visitSymbol0(SymbolVisitor *visitor)
}
}
+ObjCPropertyDeclaration::ObjCPropertyDeclaration(TranslationUnit *translationUnit,
+ unsigned sourceLocation,
+ Name *name):
+ Symbol(translationUnit, sourceLocation, name),
+ _propertyAttributes(None),
+ _getterName(0),
+ _setterName(0)
+{}
+
+ObjCPropertyDeclaration::~ObjCPropertyDeclaration()
+{}
+
+FullySpecifiedType ObjCPropertyDeclaration::type() const
+{ return _type; }
+void ObjCPropertyDeclaration::visitSymbol0(SymbolVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ }
+}
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index acd13085f5..88d8d521cd 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -729,6 +729,75 @@ private:
Scope *_arguments;
};
+class CPLUSPLUS_EXPORT ObjCPropertyDeclaration: public Symbol
+{
+public:
+ enum PropertyAttributes {
+ None = 0,
+ Assign = 1 << 0,
+ Retain = 1 << 1,
+ Copy = 1 << 2,
+ ReadOnly = 1 << 3,
+ ReadWrite = 1 << 4,
+ Getter = 1 << 5,
+ Setter = 1 << 6,
+ NonAtomic = 1 << 7,
+
+ WritabilityMask = ReadOnly | ReadWrite,
+ SetterSemanticsMask = Assign | Retain | Copy,
+ };
+
+public:
+ ObjCPropertyDeclaration(TranslationUnit *translationUnit,
+ unsigned sourceLocation,
+ Name *name);
+ virtual ~ObjCPropertyDeclaration();
+
+ bool hasAttribute(int attribute) const
+ { return _propertyAttributes & attribute; }
+
+ void setAttributes(int attributes)
+ { _propertyAttributes = attributes; }
+
+ bool hasGetter() const
+ { return hasAttribute(Getter); }
+
+ bool hasSetter() const
+ { return hasAttribute(Setter); }
+
+ Name *getterName() const
+ { return _getterName; }
+
+ void setGetterName(Name *getterName)
+ { _getterName = getterName; }
+
+ Name *setterName() const
+ { return _setterName; }
+
+ void setSetterName(Name *setterName)
+ { _setterName = setterName; }
+
+ void setType(const FullySpecifiedType &type)
+ { _type = type; }
+
+ // Symbol's interface
+ virtual FullySpecifiedType type() const;
+
+ virtual const ObjCPropertyDeclaration *asOObjCPropertyDeclaration() const
+ { return this; }
+
+ virtual ObjCPropertyDeclaration *asObjCPropertyDeclaration()
+ { return this; }
+
+protected:
+ virtual void visitSymbol0(SymbolVisitor *visitor);
+
+private:
+ FullySpecifiedType _type;
+ int _propertyAttributes;
+ Name *_getterName, *_setterName;
+};
+
} // end of namespace CPlusPlus