summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/CheckDeclaration.cpp
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/CheckDeclaration.cpp
parent72d4493fc21535f1f2720106e28ae3a6980851f5 (diff)
downloadqt-creator-a6bbec2b56f4a07f408bf3213b3b15fa6fc10330.tar.gz
Added symbols for property declarations.
Diffstat (limited to 'src/shared/cplusplus/CheckDeclaration.cpp')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp77
1 files changed, 42 insertions, 35 deletions
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;
}
-
-