Skip to content

Commit

Permalink
Merge pull request #3975 from bclothier/techdebt
Browse files Browse the repository at this point in the history
Reflection API & COM management/cleanup
  • Loading branch information
retailcoder committed May 24, 2018
2 parents c5c11eb + f211f42 commit d533a96
Show file tree
Hide file tree
Showing 112 changed files with 4,460 additions and 495 deletions.
15 changes: 0 additions & 15 deletions Rubberduck.API/API/VBA/Accessibility.cs

This file was deleted.

35 changes: 0 additions & 35 deletions Rubberduck.API/API/VBA/DeclarationType.cs

This file was deleted.

5 changes: 3 additions & 2 deletions Rubberduck.API/Properties/AssemblyInfo.cs
@@ -1,12 +1,13 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Rubberduck.API")]
[assembly: AssemblyDescription("API for programmatic access to Rubberduck's Code Analysis features.")]
[assembly: AssemblyDescription("Rubberduck Reflection API")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Rubberduck-VBA")]
[assembly: AssemblyProduct("Rubberduck.API")]
Expand All @@ -21,7 +22,7 @@
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ac1b4a57-364a-4f90-a0cd-6ee818349ce5")]
[assembly: Guid(RubberduckGuid.RubberduckApiTypeLibGuid)]

// Version information for an assembly consists of the following four values:
//
Expand Down
29 changes: 22 additions & 7 deletions Rubberduck.API/Rubberduck.API.csproj
Expand Up @@ -9,7 +9,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Rubberduck.API</RootNamespace>
<AssemblyName>Rubberduck.API</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
Expand All @@ -36,32 +36,47 @@
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="API\VBA\Accessibility.cs" />
<Compile Include="API\VBA\Declaration.cs" />
<Compile Include="API\VBA\DeclarationType.cs" />
<Compile Include="API\VBA\IdentifierReference.cs" />
<Compile Include="API\VBA\ParserState.cs" />
<Compile Include="VBA\ApiProvider.cs" />
<Compile Include="VBA\Accessibility.cs" />
<Compile Include="VBA\Declaration.cs" />
<Compile Include="VBA\Declarations.cs" />
<Compile Include="VBA\DeclarationType.cs" />
<Compile Include="VBA\IdentifierReference.cs" />
<Compile Include="VBA\IdentifierReferences.cs" />
<Compile Include="VBA\Parser.cs" />
<Compile Include="VBA\ParserState.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Rubberduck.Core\Rubberduck.Core.csproj">
<Project>{a1587eac-7b54-407e-853f-4c7493d0323e}</Project>
<Name>Rubberduck.Core</Name>
</ProjectReference>
<ProjectReference Include="..\Rubberduck.Main\Rubberduck.Main.csproj">
<Project>{E8AB5D93-2D0F-423D-BC15-5EE118673E48}</Project>
<Name>Rubberduck.Main</Name>
</ProjectReference>
<ProjectReference Include="..\Rubberduck.Parsing\Rubberduck.Parsing.csproj">
<Project>{a4a618e1-cbca-435f-9c6c-5181e030adfc}</Project>
<Name>Rubberduck.Parsing</Name>
</ProjectReference>
<ProjectReference Include="..\Rubberduck.Resources\Rubberduck.Resources.csproj">
<Project>{1b84b387-f7c4-4876-9bdf-c644c365359a}</Project>
<Name>Rubberduck.Resources</Name>
</ProjectReference>
<ProjectReference Include="..\Rubberduck.VBEEditor\Rubberduck.VBEditor.csproj">
<Project>{8ce35eb3-8852-4ba1-84dd-df3f5d2967b0}</Project>
<Name>Rubberduck.VBEditor</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="API\Plugin\" />
<Folder Include="Plugin\" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Analyzer Include="..\RubberduckCodeAnalysis\bin\Release\RubberduckCodeAnalysis.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
35 changes: 35 additions & 0 deletions Rubberduck.API/VBA/APIProvider.cs
@@ -0,0 +1,35 @@
using System.ComponentModel;
using Rubberduck.API.VBA;
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;

namespace Rubberduck.API
{
[
ComVisible(true),
Guid(RubberduckGuid.IApiProviderGuid),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IApiProvider
{
Parser GetParser(object vbe);
}

[
ComVisible(true),
Guid(RubberduckGuid.ApiProviderClassGuid),
ProgId(RubberduckProgId.ApiProviderProgId),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IApiProvider)),
EditorBrowsable(EditorBrowsableState.Always)
]
public class ApiProvider : IApiProvider
{
// vbe is the com coclass interface from the interop assembly.
// There is no shared interface between VBA and VB6 types, hence object.
public Parser GetParser(object vbe)
{
return new Parser(vbe);
}
}
}
20 changes: 20 additions & 0 deletions Rubberduck.API/VBA/Accessibility.cs
@@ -0,0 +1,20 @@
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;
using Source = Rubberduck.Parsing.Symbols;

namespace Rubberduck.API.VBA
{
[
ComVisible(true),
Guid(RubberduckGuid.AccessibilityGuid)
]
public enum Accessibility
{
Private = Source.Accessibility.Private,
Friend = Source.Accessibility.Friend,
Global = Source.Accessibility.Global,
Implicit = Source.Accessibility.Implicit,
Public = Source.Accessibility.Public,
Static = Source.Accessibility.Static
}
}
Expand Up @@ -2,34 +2,42 @@
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;
using RubberduckDeclaration = Rubberduck.Parsing.Symbols.Declaration;

namespace Rubberduck.API.VBA
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[
ComVisible(true),
Guid(RubberduckGuid.IDeclarationGuid),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IDeclaration
{
[ComVisible(true)]
[DispId(1)]
string Name { get; }
[ComVisible(true)]
[DispId(2)]
Accessibility Accessibility { get; }
[ComVisible(true)]
[DispId(3)]
DeclarationType DeclarationType { get; }
[DispId(4)]
string TypeName { get; }
[ComVisible(true)]
[DispId(5)]
bool IsArray { get; }
[ComVisible(true)]
[DispId(6)]
Declaration ParentDeclaration { get; }
[ComVisible(true)]
IdentifierReference[] References { get; }
[DispId(7)]
IdentifierReferences References { get; }
}

[ComVisible(true)]
[Guid(RubberduckGuid.DeclarationClassGuid)]
[ProgId(RubberduckProgId.DeclarationProgId)]
[ComDefaultInterface(typeof(IDeclaration))]
[EditorBrowsable(EditorBrowsableState.Always)]
[
ComVisible(true),
Guid(RubberduckGuid.DeclarationClassGuid),
ProgId(RubberduckProgId.DeclarationProgId),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IDeclaration)),
EditorBrowsable(EditorBrowsableState.Always)
]
public class Declaration : IDeclaration
{
internal Declaration(RubberduckDeclaration declaration)
Expand All @@ -49,7 +57,7 @@ internal Declaration(RubberduckDeclaration declaration)
new Dictionary<Parsing.Symbols.DeclarationType, DeclarationType>
{
{ Parsing.Symbols.DeclarationType.Project, DeclarationType.Project },
{ Parsing.Symbols.DeclarationType.ProceduralModule, DeclarationType.StandardModule },
{ Parsing.Symbols.DeclarationType.ProceduralModule, DeclarationType.ProceduralModule },
{ Parsing.Symbols.DeclarationType.ClassModule, DeclarationType.ClassModule },
{ Parsing.Symbols.DeclarationType.Control, DeclarationType.Control },
{ Parsing.Symbols.DeclarationType.UserForm, DeclarationType.UserForm },
Expand All @@ -75,12 +83,12 @@ internal Declaration(RubberduckDeclaration declaration)
private Declaration _parentDeclaration;
public Declaration ParentDeclaration => _parentDeclaration ?? (_parentDeclaration = new Declaration(Instance.ParentDeclaration));

private IdentifierReference[] _references;
public IdentifierReference[] References
private IdentifierReferences _references;
public IdentifierReferences References
{
get
{
return _references ?? (_references = Instance.References.Select(item => new IdentifierReference(item)).ToArray());
return _references ?? (_references = new IdentifierReferences(Instance.References.Select(item => new IdentifierReference(item))));
}
}
}
Expand Down
43 changes: 43 additions & 0 deletions Rubberduck.API/VBA/DeclarationType.cs
@@ -0,0 +1,43 @@
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;
using Source = Rubberduck.Parsing.Symbols;

namespace Rubberduck.API.VBA
{
[
ComVisible(true),
Guid(RubberduckGuid.DeclarationTypeGuid)
]
public enum DeclarationType
{
//TODO: figure out a cleaner way to handle long/int
BracketedExpression = (int)Source.DeclarationType.BracketedExpression,
ClassModule = (int)Source.DeclarationType.ClassModule,
ComAlias = (int)Source.DeclarationType.ComAlias,
Constant = (int)Source.DeclarationType.Constant,
Control = (int)Source.DeclarationType.Control,
Document = (int)Source.DeclarationType.Document,
Enumeration = (int)Source.DeclarationType.Enumeration,
EnumerationMember = (int)Source.DeclarationType.EnumerationMember,
Event = (int)Source.DeclarationType.Event,
Function = (int)Source.DeclarationType.Function,
LibraryFunction = (int)Source.DeclarationType.LibraryFunction,
LibraryProcedure = (int)Source.DeclarationType.LibraryProcedure,
LineLabel = (int)Source.DeclarationType.LineLabel,
Member = (int)Source.DeclarationType.Member,
Module = (int)Source.DeclarationType.Module,
Parameter = (int)Source.DeclarationType.Parameter,
ProceduralModule = (int)Source.DeclarationType.ProceduralModule,
Procedure = (int)Source.DeclarationType.Procedure,
Project = (int)Source.DeclarationType.Project,
Property = (int)Source.DeclarationType.Property,
PropertyGet = (int)Source.DeclarationType.PropertyGet,
PropertyLet = (int)Source.DeclarationType.PropertyLet,
PropertySet = (int)Source.DeclarationType.PropertySet,
UnresolvedMember = (int)Source.DeclarationType.UnresolvedMember,
UserDefinedType = (int)Source.DeclarationType.UserDefinedType,
UserDefinedTypeMember = (int)Source.DeclarationType.UserDefinedTypeMember,
UserForm = (int)Source.DeclarationType.UserForm,
Variable = (int)Source.DeclarationType.Variable
}
}
64 changes: 64 additions & 0 deletions Rubberduck.API/VBA/Declarations.cs
@@ -0,0 +1,64 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using Rubberduck.Resources.Registration;

namespace Rubberduck.API.VBA
{
[
ComVisible(true),
Guid(RubberduckGuid.IDeclarationsGuid),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IDeclarations : IEnumerable
{
[DispId(WellKnownDispIds.Value)]
Declaration Item(int Index);

[DispId(1)]
int Count { get; }

[DispId(WellKnownDispIds.NewEnum)]
IEnumerator _GetEnumerator();
}

[
ComVisible(true),
Guid(RubberduckGuid.DeclarationsClassGuid),
ProgId(RubberduckProgId.DeclarationsProgId),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IDeclarations))
]
public class Declarations : IDeclarations, IEnumerable<Declaration>
{
private readonly IEnumerable<Declaration> _declarations;

public int Count => _declarations.Count();

internal Declarations(IEnumerable<Declaration> declarations)
{
_declarations = declarations;
}

public Declaration Item(int Index)
{
return _declarations.ElementAt(Index);
}

public IEnumerator<Declaration> GetEnumerator()
{
return _declarations.GetEnumerator();
}

public IEnumerator _GetEnumerator()
{
return _declarations.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return _declarations.GetEnumerator();
}
}
}

0 comments on commit d533a96

Please sign in to comment.