Browse Source

Add support for calling constructors on COM interfaces.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
e8f092892b
  1. 51
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ComTests.cs
  2. 1
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
  3. 1
      ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj
  4. 61
      ICSharpCode.NRefactory/TypeSystem/ComHelper.cs
  5. 3
      ICSharpCode.NRefactory/TypeSystem/IType.cs
  6. 9
      ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

51
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ComTests.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.Resolver
{
[TestFixture]
public class ComTests : ResolverTestBase
{
[Test]
public void NewCoClass()
{
string program = @"using System;
using System.Runtime.InteropServices;
[ComImport, Guid(""698D8281-3890-41A6-8A2F-DBC29CBAB8BC""), CoClass(typeof(Test))]
public interface Dummy { }
public class Test : Dummy {
public Test(int x = 1) {}
static void Main() {
$
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program.Replace("$", "var x = $new Dummy()$;"));
Assert.IsFalse(rr.IsError);
Assert.AreEqual("Dummy", rr.Type.ReflectionName);
Assert.AreEqual(1, rr.Member.Parameters.Count);
}
}
}

1
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -156,6 +156,7 @@ @@ -156,6 +156,7 @@
<Compile Include="CSharp\Resolver\AttributeTests.cs" />
<Compile Include="CSharp\Resolver\BinaryOperatorTests.cs" />
<Compile Include="CSharp\Resolver\CastTests.cs" />
<Compile Include="CSharp\Resolver\ComTests.cs" />
<Compile Include="CSharp\Resolver\ConditionalOperatorTests.cs" />
<Compile Include="CSharp\Resolver\ExtensionMethodTests.cs" />
<Compile Include="CSharp\Resolver\FindReferencesTest.cs" />

1
ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

@ -107,6 +107,7 @@ @@ -107,6 +107,7 @@
<Compile Include="TypeSystem\ArrayType.cs" />
<Compile Include="TypeSystem\ByReferenceType.cs" />
<Compile Include="TypeSystem\CecilLoader.cs" />
<Compile Include="TypeSystem\ComHelper.cs" />
<Compile Include="TypeSystem\DomRegion.cs" />
<Compile Include="TypeSystem\EntityType.cs" />
<Compile Include="TypeSystem\ExtensionMethods.cs" />

61
ICSharpCode.NRefactory/TypeSystem/ComHelper.cs

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Linq;
using ICSharpCode.NRefactory.Semantics;
namespace ICSharpCode.NRefactory.TypeSystem
{
/// <summary>
/// Helper methods for COM.
/// </summary>
public class ComHelper
{
static bool IsComAttribute(IAttribute attribute, string name)
{
return attribute.AttributeType.Name == name && attribute.AttributeType.Namespace == "System.Runtime.InteropServices";
}
/// <summary>
/// Gets whether the specified type is imported from COM.
/// </summary>
public static bool IsComImport(ITypeDefinition typeDefinition)
{
return typeDefinition != null
&& typeDefinition.Kind == TypeKind.Interface
&& typeDefinition.Attributes.Any(a => IsComAttribute(a, "ComImportAttribute"));
}
/// <summary>
/// Gets the CoClass of the specified COM interface.
/// </summary>
public static IType GetCoClass(ITypeDefinition typeDefinition)
{
if (typeDefinition == null)
return SpecialType.UnknownType;
var coClassAttribute = typeDefinition.Attributes.FirstOrDefault(a => IsComAttribute(a, "CoClassAttribute"));
if (coClassAttribute != null && coClassAttribute.PositionalArguments.Count == 1) {
var rr = coClassAttribute.PositionalArguments[0] as TypeOfResolveResult;
if (rr != null)
return rr.ReferencedType;
}
return SpecialType.UnknownType;
}
}
}

3
ICSharpCode.NRefactory/TypeSystem/IType.cs

@ -177,7 +177,8 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -177,7 +177,8 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// The filter is tested on the original method definitions (before specialization).</param>
/// <param name="options">Specified additional options for the GetMembers() operation.</param>
/// <remarks>
/// <para>The result does not include constructors in base classes or static constructors.</para>
/// <para>The result does not include static constructors.
/// Constructors in base classes are not returned by default, as GetMemberOptions.IgnoreInheritedMembers is the default value.</para>
/// <para>
/// For methods on parameterized types, type substitution will be performed on the method signature,
/// and the appropriate <see cref="Implementation.SpecializedMethod"/> will be returned.

9
ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs

@ -674,6 +674,15 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -674,6 +674,15 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public virtual IEnumerable<IMethod> GetConstructors(Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.IgnoreInheritedMembers)
{
if (ComHelper.IsComImport(this)) {
IType coClass = ComHelper.GetCoClass(this);
using (var busyLock = BusyManager.Enter(this)) {
if (busyLock.Success) {
return coClass.GetConstructors(filter, options).Select(m => new SpecializedMethod(this, m));
}
}
return EmptyList<IMethod>.Instance;
}
if ((options & GetMemberOptions.IgnoreInheritedMembers) == GetMemberOptions.IgnoreInheritedMembers) {
return GetFilteredMembers<IUnresolvedMethod, IMethod>(Utils.ExtensionMethods.And(m => m.IsConstructor && !m.IsStatic, filter));
} else {

Loading…
Cancel
Save