forked from qt-creator/qt-creator
Added type declarations for forward declared ObjC protocols and classes.
This commit is contained in:
@@ -1204,6 +1204,28 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
|
||||
}
|
||||
}
|
||||
|
||||
if (result.first->isObjCForwardClassDeclarationType()) {
|
||||
while (! resolvedSymbols.isEmpty()) {
|
||||
TypeOfExpression::Result r = resolvedSymbols.takeFirst();
|
||||
|
||||
if (! r.first->isObjCForwardClassDeclarationType()) {
|
||||
result = r;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (result.first->isObjCForwardProtocolDeclarationType()) {
|
||||
while (! resolvedSymbols.isEmpty()) {
|
||||
TypeOfExpression::Result r = resolvedSymbols.takeFirst();
|
||||
|
||||
if (! r.first->isObjCForwardProtocolDeclarationType()) {
|
||||
result = r;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Symbol *symbol = result.second) {
|
||||
Symbol *def = 0;
|
||||
if (resolveTarget && !lastSymbol->isFunction())
|
||||
|
||||
@@ -557,7 +557,8 @@ void Class::visitSymbol0(SymbolVisitor *visitor)
|
||||
|
||||
ObjCClass::ObjCClass(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name):
|
||||
ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
_categoryName(0)
|
||||
_categoryName(0),
|
||||
_baseClass(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -584,10 +585,14 @@ bool ObjCClass::isEqualTo(const Type *other) const
|
||||
void ObjCClass::visitSymbol0(SymbolVisitor *visitor)
|
||||
{
|
||||
if (visitor->visit(this)) {
|
||||
for (unsigned i = 0; i < _baseClasses.size(); ++i)
|
||||
visitSymbol(_baseClasses.at(i), visitor);
|
||||
if (_baseClass)
|
||||
visitSymbol(_baseClass, visitor);
|
||||
|
||||
for (unsigned i = 0; i < _protocols.size(); ++i)
|
||||
visitSymbol(_protocols.at(i), visitor);
|
||||
|
||||
for (unsigned i = 0; i < memberCount(); ++i)
|
||||
visitSymbol(memberAt(i), visitor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -641,9 +646,26 @@ ObjCForwardClassDeclaration::~ObjCForwardClassDeclaration()
|
||||
FullySpecifiedType ObjCForwardClassDeclaration::type() const
|
||||
{ return FullySpecifiedType(); }
|
||||
|
||||
bool ObjCForwardClassDeclaration::isEqualTo(const Type *other) const
|
||||
{
|
||||
if (const ObjCForwardClassDeclaration *otherFwdClass = other->asObjCForwardClassDeclarationType()) {
|
||||
if (name() == otherFwdClass->name())
|
||||
return true;
|
||||
else if (name() && otherFwdClass->name())
|
||||
return name()->isEqualTo(otherFwdClass->name());
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ObjCForwardClassDeclaration::visitSymbol0(SymbolVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
void ObjCForwardClassDeclaration::accept0(TypeVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
ObjCForwardProtocolDeclaration::ObjCForwardProtocolDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name):
|
||||
Symbol(translationUnit, sourceLocation, name)
|
||||
{
|
||||
@@ -655,9 +677,26 @@ ObjCForwardProtocolDeclaration::~ObjCForwardProtocolDeclaration()
|
||||
FullySpecifiedType ObjCForwardProtocolDeclaration::type() const
|
||||
{ return FullySpecifiedType(); }
|
||||
|
||||
bool ObjCForwardProtocolDeclaration::isEqualTo(const Type *other) const
|
||||
{
|
||||
if (const ObjCForwardProtocolDeclaration *otherFwdProtocol = other->asObjCForwardProtocolDeclarationType()) {
|
||||
if (name() == otherFwdProtocol->name())
|
||||
return true;
|
||||
else if (name() && otherFwdProtocol->name())
|
||||
return name()->isEqualTo(otherFwdProtocol->name());
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void ObjCForwardProtocolDeclaration::visitSymbol0(SymbolVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
void ObjCForwardProtocolDeclaration::accept0(TypeVisitor *visitor)
|
||||
{ visitor->visit(this); }
|
||||
|
||||
ObjCMethod::ObjCMethod(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name)
|
||||
: ScopedSymbol(translationUnit, sourceLocation, name),
|
||||
_flags(0)
|
||||
|
||||
@@ -472,23 +472,31 @@ private:
|
||||
Array<BaseClass *> _baseClasses;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCForwardProtocolDeclaration: public Symbol
|
||||
class CPLUSPLUS_EXPORT ObjCForwardProtocolDeclaration: public Symbol, public Type
|
||||
{
|
||||
public:
|
||||
ObjCForwardProtocolDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name);
|
||||
virtual ~ObjCForwardProtocolDeclaration();
|
||||
|
||||
// Symbol's interface
|
||||
virtual FullySpecifiedType type() const;
|
||||
|
||||
virtual bool isEqualTo(const Type *other) const;
|
||||
|
||||
virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration() const
|
||||
{ return this; }
|
||||
|
||||
virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration()
|
||||
{ return this; }
|
||||
|
||||
virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() const
|
||||
{ return this; }
|
||||
|
||||
virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType()
|
||||
{ return this; }
|
||||
|
||||
protected:
|
||||
virtual void visitSymbol0(SymbolVisitor *visitor);
|
||||
virtual void accept0(TypeVisitor *visitor);
|
||||
|
||||
private:
|
||||
};
|
||||
@@ -525,23 +533,31 @@ private:
|
||||
Array<ObjCProtocol *> _protocols;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCForwardClassDeclaration: public Symbol
|
||||
class CPLUSPLUS_EXPORT ObjCForwardClassDeclaration: public Symbol, public Type
|
||||
{
|
||||
public:
|
||||
ObjCForwardClassDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name);
|
||||
virtual ~ObjCForwardClassDeclaration();
|
||||
|
||||
// Symbol's interface
|
||||
virtual FullySpecifiedType type() const;
|
||||
|
||||
virtual bool isEqualTo(const Type *other) const;
|
||||
|
||||
virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclaration() const
|
||||
{ return this; }
|
||||
|
||||
virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclaration()
|
||||
{ return this; }
|
||||
|
||||
virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() const
|
||||
{ return this; }
|
||||
|
||||
virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType()
|
||||
{ return this; }
|
||||
|
||||
protected:
|
||||
virtual void visitSymbol0(SymbolVisitor *visitor);
|
||||
virtual void accept0(TypeVisitor *visitor);
|
||||
|
||||
private:
|
||||
};
|
||||
@@ -559,6 +575,20 @@ public:
|
||||
Name *categoryName() const { return _categoryName; }
|
||||
void setCategoryName(Name *categoryName) { _categoryName = categoryName; }
|
||||
|
||||
ObjCClass *baseClass() const
|
||||
{ return _baseClass; }
|
||||
void setBaseClass(ObjCClass *baseClass)
|
||||
{ _baseClass = baseClass; }
|
||||
|
||||
unsigned protocolCount() const
|
||||
{ return _protocols.count(); }
|
||||
|
||||
ObjCProtocol *protocolAt(unsigned index) const
|
||||
{ return _protocols.at(index); }
|
||||
|
||||
void addProtocol(ObjCProtocol *protocol)
|
||||
{ _protocols.push_back(protocol); }
|
||||
|
||||
// Symbol's interface
|
||||
virtual FullySpecifiedType type() const;
|
||||
|
||||
@@ -584,7 +614,7 @@ protected:
|
||||
private:
|
||||
bool _isInterface;
|
||||
Name *_categoryName;
|
||||
Array<ObjCClass *> _baseClasses;
|
||||
ObjCClass * _baseClass;
|
||||
Array<ObjCProtocol *> _protocols;
|
||||
};
|
||||
|
||||
|
||||
@@ -110,6 +110,12 @@ bool Type::isObjCProtocolType() const
|
||||
bool Type::isObjCMethodType() const
|
||||
{ return asObjCMethodType() != 0; }
|
||||
|
||||
bool Type::isObjCForwardClassDeclarationType() const
|
||||
{ return asObjCForwardClassDeclarationType() != 0; }
|
||||
|
||||
bool Type::isObjCForwardProtocolDeclarationType() const
|
||||
{ return asObjCForwardProtocolDeclarationType() != 0; }
|
||||
|
||||
void Type::accept(TypeVisitor *visitor)
|
||||
{
|
||||
if (visitor->preVisit(this))
|
||||
|
||||
@@ -80,6 +80,8 @@ public:
|
||||
bool isObjCClassType() const;
|
||||
bool isObjCProtocolType() const;
|
||||
bool isObjCMethodType() const;
|
||||
bool isObjCForwardClassDeclarationType() const;
|
||||
bool isObjCForwardProtocolDeclarationType() const;
|
||||
|
||||
virtual const VoidType *asVoidType() const { return 0; }
|
||||
virtual const IntegerType *asIntegerType() const { return 0; }
|
||||
@@ -97,6 +99,8 @@ public:
|
||||
virtual const ObjCClass *asObjCClassType() const { return 0; }
|
||||
virtual const ObjCProtocol *asObjCProtocolType() const { return 0; }
|
||||
virtual const ObjCMethod *asObjCMethodType() const { return 0; }
|
||||
virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() const { return 0; }
|
||||
virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() const { return 0; }
|
||||
|
||||
virtual VoidType *asVoidType() { return 0; }
|
||||
virtual IntegerType *asIntegerType() { return 0; }
|
||||
@@ -114,6 +118,8 @@ public:
|
||||
virtual ObjCClass *asObjCClassType() { return 0; }
|
||||
virtual ObjCProtocol *asObjCProtocolType() { return 0; }
|
||||
virtual ObjCMethod *asObjCMethodType() { return 0; }
|
||||
virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() { return 0; }
|
||||
virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() { return 0; }
|
||||
|
||||
void accept(TypeVisitor *visitor);
|
||||
static void accept(Type *type, TypeVisitor *visitor);
|
||||
|
||||
@@ -84,6 +84,8 @@ public:
|
||||
virtual void visit(ObjCClass *) {}
|
||||
virtual void visit(ObjCProtocol *) {}
|
||||
virtual void visit(ObjCMethod *) {}
|
||||
virtual void visit(ObjCForwardClassDeclaration *) {}
|
||||
virtual void visit(ObjCForwardProtocolDeclaration*) {}
|
||||
};
|
||||
|
||||
CPLUSPLUS_END_NAMESPACE
|
||||
|
||||
Reference in New Issue
Block a user