Browse Source

Fixed the completion of templates.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/661/head
Dimitar Dobrev 9 years ago
parent
commit
cc2a283c7f
  1. 6
      src/CppParser/Parser.cpp
  2. 8
      src/Generator.Tests/AST/TestAST.cs
  3. 6
      tests/Native/AST.h
  4. 7
      tests/Native/ASTExtensions.h

6
src/CppParser/Parser.cpp

@ -1148,7 +1148,8 @@ ClassTemplate* Parser::WalkClassTemplate(const clang::ClassTemplateDecl* TD)
return CT; return CT;
CT = new ClassTemplate(); CT = new ClassTemplate();
if (TD != TD->getCanonicalDecl()) if (!TD->isThisDeclarationADefinition() &&
TD->getCanonicalDecl()->isThisDeclarationADefinition())
{ {
CT->IsIncomplete = true; CT->IsIncomplete = true;
CT->CompleteDeclaration = WalkClassTemplate(TD->getCanonicalDecl()); CT->CompleteDeclaration = WalkClassTemplate(TD->getCanonicalDecl());
@ -1373,7 +1374,8 @@ FunctionTemplate* Parser::WalkFunctionTemplate(const clang::FunctionTemplateDecl
/*AddToNamespace=*/false); /*AddToNamespace=*/false);
FT = new FunctionTemplate(); FT = new FunctionTemplate();
if (TD != TD->getCanonicalDecl()) if (!TD->isThisDeclarationADefinition() &&
TD->getCanonicalDecl()->isThisDeclarationADefinition())
{ {
FT->IsIncomplete = true; FT->IsIncomplete = true;
FT->CompleteDeclaration = WalkFunctionTemplate(TD->getCanonicalDecl()); FT->CompleteDeclaration = WalkFunctionTemplate(TD->getCanonicalDecl());

8
src/Generator.Tests/AST/TestAST.cs

@ -367,5 +367,13 @@ namespace CppSharp.Generator.Tests.AST
/// <para>no string for this control key.</para> /// <para>no string for this control key.</para>
/// </returns>".Replace("\r", string.Empty), commentMethod.Replace("\r", string.Empty)); /// </returns>".Replace("\r", string.Empty), commentMethod.Replace("\r", string.Empty));
} }
[Test]
public void TestCompletionOfClassTemplates()
{
var templates = AstContext.FindDecl<ClassTemplate>("ForwardedTemplate").ToList();
Assert.IsFalse(templates.Single(
t => t.DebugText == "template <typename T>\r\nclass ForwardedTemplate\r\n{\r\n}").IsIncomplete);
}
} }
} }

6
tests/Native/AST.h

@ -148,3 +148,9 @@ public:
//---------------------------------------------------------------------- //----------------------------------------------------------------------
const char * GetIOHandlerControlSequence(char ch); const char * GetIOHandlerControlSequence(char ch);
}; };
template <typename T>
class ForwardedTemplate;
typedef ForwardedTemplate<int> i;
typedef ForwardedTemplate<long> l;

7
tests/Native/ASTExtensions.h

@ -6,4 +6,9 @@
template class TestTemplateClass<Math::Complex>; template class TestTemplateClass<Math::Complex>;
// Implicit instantiations // Implicit instantiations
typedef TestTemplateClass<Math::Complex> TestTemplateClassComplex; typedef TestTemplateClass<Math::Complex> TestTemplateClassComplex;
typedef TestTemplateClass<std::vector<Math::Complex>> TestTemplateClassMoreComplex; typedef TestTemplateClass<std::vector<Math::Complex>> TestTemplateClassMoreComplex;
template <typename T>
class ForwardedTemplate
{
};

Loading…
Cancel
Save