aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus/Symbols.cpp
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2015-06-20 22:37:53 +0300
committerOrgad Shaneh <orgads@gmail.com>2015-06-29 09:22:08 +0000
commita77e32800c2bdfdccfcd6dfcacc48d3fa610daea (patch)
tree5bb11546c910ce312b660abc328cac3f364b69b7 /src/libs/3rdparty/cplusplus/Symbols.cpp
parent70bc5e842c8ec11f17a8bcde4615eedb0a5cccaa (diff)
C++: Ignore explicit template instantiations
Defined in section 14.7.2 of the standard. Fixes completion for std::string. The following explicit instantiation appears in bits/basic_string.tcc: extern template class basic_string<char>; This is wrongfully considered a specialization for a forward declaration (like `template<> class basic_string<char>` is). Introduce a new Symbol type for explicit instantiations. Use-case: template<class T> struct Foo { T bar; }; template class Foo<int>; void func() { Foo<int> foo; foo.bar; // bar not highlighted } Change-Id: I9e35c8c32f6b78fc87b4f4f1fc903b42cfbd2c2b Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Symbols.cpp')
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp
index f8a8440c09..3c632f1cd7 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.cpp
+++ b/src/libs/3rdparty/cplusplus/Symbols.cpp
@@ -481,10 +481,12 @@ void Enum::visitSymbol0(SymbolVisitor *visitor)
Template::Template(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Scope(translationUnit, sourceLocation, name)
+ , _isExplicitInstantiation(false)
{ }
Template::Template(Clone *clone, Subst *subst, Template *original)
: Scope(clone, subst, original)
+ , _isExplicitInstantiation(original->_isExplicitInstantiation)
{ }
Template::~Template()
@@ -537,6 +539,56 @@ bool Template::match0(const Type *otherType, Matcher *matcher) const
return false;
}
+ExplicitInstantiation::ExplicitInstantiation(TranslationUnit *translationUnit,
+ unsigned sourceLocation, const Name *name)
+ : Scope(translationUnit, sourceLocation, name)
+{ }
+
+ExplicitInstantiation::ExplicitInstantiation(Clone *clone, Subst *subst, ExplicitInstantiation *original)
+ : Scope(clone, subst, original)
+{ }
+
+ExplicitInstantiation::~ExplicitInstantiation()
+{ }
+
+Symbol *ExplicitInstantiation::declaration() const
+{
+ if (isEmpty())
+ return 0;
+
+ if (Symbol *s = memberAt(memberCount() - 1)) {
+ if (s->isClass() || s->isForwardClassDeclaration() ||
+ s->isTemplate() || s->isExplicitInstantiation() ||
+ s->isFunction() || s->isDeclaration()) {
+ return s;
+ }
+ }
+
+ return 0;
+}
+
+FullySpecifiedType ExplicitInstantiation::type() const
+{ return FullySpecifiedType(const_cast<ExplicitInstantiation *>(this)); }
+
+void ExplicitInstantiation::visitSymbol0(SymbolVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ for (unsigned i = 0; i < memberCount(); ++i) {
+ visitSymbol(memberAt(i), visitor);
+ }
+ }
+}
+
+void ExplicitInstantiation::accept0(TypeVisitor *visitor)
+{ visitor->visit(this); }
+
+bool ExplicitInstantiation::match0(const Type *otherType, Matcher *matcher) const
+{
+ if (const ExplicitInstantiation *otherTy = otherType->asExplicitInstantiationType())
+ return matcher->match(this, otherTy);
+ return false;
+}
+
Namespace::Namespace(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Scope(translationUnit, sourceLocation, name)
, _isInline(false)