From 55bc99bc3fe42d6068e9ba12a940f0035f790897 Mon Sep 17 00:00:00 2001
From: Dimitar Dobrev <dpldobrev@yahoo.com>
Date: Fri, 2 Oct 2015 19:35:16 +0300
Subject: [PATCH] Fixed a bug when overriding a function located in a
 dependency.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
---
 .../Generators/CSharp/CSharpTextTemplate.cs   |  4 ++--
 src/Generator/Passes/FindSymbolsPass.cs       |  3 ++-
 tests/NamespacesBase/NamespacesBase.cpp       |  9 ++++++++
 tests/NamespacesBase/NamespacesBase.h         |  7 +++++++
 .../NamespacesDerived.Tests.cs                | 21 +++++++++++++++++++
 tests/NamespacesDerived/NamespacesDerived.cpp |  9 ++++++++
 tests/NamespacesDerived/NamespacesDerived.h   |  8 +++++++
 7 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
index fd9bd2b9..61f3eb41 100644
--- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
+++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs
@@ -1479,7 +1479,7 @@ namespace CppSharp.Generators.CSharp
             for (int i = 0; i < method.Parameters.Count; i++)
             {
                 var param = method.Parameters[i];
-                if (!param.IsGenerated)
+                if (!param.IsGenerated && param.GenerationKind != GenerationKind.Link)
                     continue;
 
                 if (param.Kind == ParameterKind.IndirectReturnType)
@@ -1506,7 +1506,7 @@ namespace CppSharp.Generators.CSharp
             if (hasReturn)
                 Write("var {0} = ", Helpers.ReturnIdentifier);
 
-            if (method.IsGenerated)
+            if (method.IsGenerated || method.GenerationKind == GenerationKind.Link)
             {
                 WriteLine("{0}.{1}({2});", Helpers.TargetIdentifier,
                     method.Name, string.Join(", ", marshals));              
diff --git a/src/Generator/Passes/FindSymbolsPass.cs b/src/Generator/Passes/FindSymbolsPass.cs
index 12c4dfc6..df445a89 100644
--- a/src/Generator/Passes/FindSymbolsPass.cs
+++ b/src/Generator/Passes/FindSymbolsPass.cs
@@ -15,7 +15,8 @@ namespace CppSharp.Passes
 
             var mangledDecl = decl as IMangledDecl;
             var method = decl as Method;
-            if (mangledDecl != null && !(method != null && (method.IsPure || method.IsSynthetized)) &&
+            if (decl.IsGenerated && mangledDecl != null &&
+                !(method != null && (method.IsPure || method.IsSynthetized)) &&
                 !VisitMangledDeclaration(mangledDecl))
             {
                 decl.ExplicitlyIgnore();
diff --git a/tests/NamespacesBase/NamespacesBase.cpp b/tests/NamespacesBase/NamespacesBase.cpp
index 171e71cc..da65d232 100644
--- a/tests/NamespacesBase/NamespacesBase.cpp
+++ b/tests/NamespacesBase/NamespacesBase.cpp
@@ -27,3 +27,12 @@ Base2::Base2(int i) : Base(i)
 void Base2::parent(int i)
 {
 }
+
+HasVirtualInCore::HasVirtualInCore()
+{
+}
+
+int HasVirtualInCore::virtualInCore(int parameter)
+{
+    return 1;
+}
diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h
index e3db3aa5..30813393 100644
--- a/tests/NamespacesBase/NamespacesBase.h
+++ b/tests/NamespacesBase/NamespacesBase.h
@@ -52,3 +52,10 @@ template <typename T>
 class TemplateClass
 {
 };
+
+class DLL_API HasVirtualInCore
+{
+public:
+    HasVirtualInCore();
+    virtual int virtualInCore(int parameter);
+};
diff --git a/tests/NamespacesDerived/NamespacesDerived.Tests.cs b/tests/NamespacesDerived/NamespacesDerived.Tests.cs
index 287523c1..43fe904d 100644
--- a/tests/NamespacesDerived/NamespacesDerived.Tests.cs
+++ b/tests/NamespacesDerived/NamespacesDerived.Tests.cs
@@ -11,4 +11,25 @@ public class NamespaceDerivedTests
         var parent = derived.Parent;
         derived.parent(0);
     }
+
+    [Test]
+    public void TestOverrideMethodFromDependency()
+    {
+        using (var overrideMethodFromDependency = new OverrideMethodFromDependency())
+        {
+            using (var managedObject = new OverrideMethodFromDependency())
+            {
+                overrideMethodFromDependency.ManagedObject = managedObject;
+                Assert.That(overrideMethodFromDependency.CallManagedOverride(), Is.EqualTo(2));
+            }
+        }
+    }
+
+    private class OverrideMethodFromDependency : HasVirtualInDependency
+    {
+        public override int VirtualInCore(int parameter)
+        {
+            return 2;
+        }
+    }
 }
\ No newline at end of file
diff --git a/tests/NamespacesDerived/NamespacesDerived.cpp b/tests/NamespacesDerived/NamespacesDerived.cpp
index 710343bc..dbe579f9 100644
--- a/tests/NamespacesDerived/NamespacesDerived.cpp
+++ b/tests/NamespacesDerived/NamespacesDerived.cpp
@@ -61,3 +61,12 @@ Abstract* Derived2::getAbstract()
 {
     return 0;
 }
+
+HasVirtualInDependency::HasVirtualInDependency()
+{
+}
+
+int HasVirtualInDependency::callManagedOverride()
+{
+    return managedObject->virtualInCore(0);
+}
diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h
index ad56e89c..c7b6fe83 100644
--- a/tests/NamespacesDerived/NamespacesDerived.h
+++ b/tests/NamespacesDerived/NamespacesDerived.h
@@ -61,3 +61,11 @@ public:
 private:
     TemplateClass<int> t;
 };
+
+class DLL_API HasVirtualInDependency : public HasVirtualInCore
+{
+public:
+    HasVirtualInDependency();
+    HasVirtualInDependency* managedObject;
+    int callManagedOverride();
+};