1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
3
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
// software and associated documentation files (the "Software"), to deal in the Software
5
// without restriction, including without limitation the rights to use, copy, modify, merge,
6
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
// to whom the Software is furnished to do so, subject to the following conditions:
9
// The above copyright notice and this permission notice shall be included in all copies or
10
// substantial portions of the Software.
12
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17
// DEALINGS IN THE SOFTWARE.
21
using ICSharpCode.NRefactory.Semantics;
23
namespace ICSharpCode.NRefactory.TypeSystem
26
/// Helper methods for COM.
28
public static class ComHelper
30
static bool IsComAttribute(IAttribute attribute, string name)
32
return attribute.AttributeType.Name == name && attribute.AttributeType.Namespace == "System.Runtime.InteropServices";
36
/// Gets whether the specified type is imported from COM.
38
public static bool IsComImport(ITypeDefinition typeDefinition)
40
return typeDefinition != null
41
&& typeDefinition.Kind == TypeKind.Interface
42
&& typeDefinition.Attributes.Any(a => IsComAttribute(a, "ComImportAttribute"));
46
/// Gets the CoClass of the specified COM interface.
48
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Co",
49
Justification = "Consistent with CoClassAttribute")]
50
public static IType GetCoClass(ITypeDefinition typeDefinition)
52
if (typeDefinition == null)
53
return SpecialType.UnknownType;
54
var coClassAttribute = typeDefinition.Attributes.FirstOrDefault(a => IsComAttribute(a, "CoClassAttribute"));
55
if (coClassAttribute != null && coClassAttribute.PositionalArguments.Count == 1) {
56
var rr = coClassAttribute.PositionalArguments[0] as TypeOfResolveResult;
58
return rr.ReferencedType;
60
return SpecialType.UnknownType;