Skip to content

Commit 38d4399

Browse files
committed
Enable adding exposed attribute to interface
Presently the choice is PublicNotCreatable if the implementing class is exposed. Next step is to connect view model RadioButton choice to determine the instacing.
1 parent 5b09c23 commit 38d4399

File tree

4 files changed

+40
-17
lines changed

4 files changed

+40
-17
lines changed

Rubberduck.Core/UI/Converters/ClassInstancingToBooleanConverter.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Globalization;
4-
using System.Linq;
5-
using System.Text;
6-
using System.Threading.Tasks;
73
using System.Windows.Data;
8-
using Rubberduck.UI.Refactorings;
4+
using Rubberduck.Refactorings.ExtractInterface;
95

106
namespace Rubberduck.UI.Converters
117
{

Rubberduck.Core/UI/Refactorings/ExtractInterface/ExtractInterfaceViewModel.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010

1111
namespace Rubberduck.UI.Refactorings
1212
{
13-
public enum ClassInstancing
14-
{
15-
Private = 0,
16-
PublicNotCreatable,
17-
}
18-
1913
public class ExtractInterfaceViewModel : RefactoringViewModelBase<ExtractInterfaceModel>
2014
{
2115
public ExtractInterfaceViewModel(ExtractInterfaceModel model) : base(model)

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceModel.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
namespace Rubberduck.Refactorings.ExtractInterface
88
{
9+
public enum ClassInstancing
10+
{
11+
Private = 0,
12+
PublicNotCreatable,
13+
}
14+
915
public class ExtractInterfaceModel : IRefactoringModel
1016
{
1117
public IDeclarationFinderProvider DeclarationFinderProvider { get; }
@@ -14,6 +20,7 @@ public class ExtractInterfaceModel : IRefactoringModel
1420
public string InterfaceName { get; set; }
1521
public ObservableCollection<InterfaceMember> Members { get; set; } = new ObservableCollection<InterfaceMember>();
1622
public IEnumerable<InterfaceMember> SelectedMembers => Members.Where(m => m.IsSelected);
23+
public ClassInstancing ClassInstancing { get; set; }
1724

1825
public static readonly DeclarationType[] MemberTypes =
1926
{

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Rubberduck.VBEditor;
1414
using Rubberduck.VBEditor.SafeComWrappers;
1515
using Rubberduck.VBEditor.Utility;
16+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1617

1718
namespace Rubberduck.Refactorings.ExtractInterface
1819
{
@@ -127,27 +128,52 @@ private void AddInterfaceClass(Declaration implementingClass, string interfaceNa
127128
interfaceComponent.Name = interfaceName;
128129

129130
var optionPresent = interfaceModule.CountOfLines > 1;
131+
var optionExplicit = $"{Tokens.Option} {Tokens.Explicit}{Environment.NewLine}";
130132
if (!optionPresent)
131133
{
132-
interfaceModule.InsertLines(1, $"{Tokens.Option} {Tokens.Explicit}{Environment.NewLine}");
134+
interfaceModule.InsertLines(1, optionExplicit);
133135
}
136+
134137
interfaceModule.InsertLines(3, interfaceBody);
138+
139+
var classIsExposed = Convert.ToBoolean(implementingClass.Attributes.ExposedAttribute.Values.First());
140+
if (classIsExposed)
141+
{
142+
AddExposedAttribute(components, interfaceComponent);
143+
}
135144
}
136145
}
137146
}
138147
}
139148

140-
private void AddInterfaceMembersToClass(ExtractInterfaceModel model, IModuleRewriter rewriter)
149+
private void AddExposedAttribute(IVBComponents components, IVBComponent interfaceComponent)
141150
{
142-
_implementInterfaceRefactoring.Refactor(model.SelectedMembers.Select(m => m.Member).ToList(), rewriter, model.InterfaceName);
151+
try
152+
{
153+
var tempExportDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + System.IO.Path.DirectorySeparatorChar + "Rubberduck" + System.IO.Path.DirectorySeparatorChar;
154+
var tempFile = interfaceComponent.ExportAsSourceFile(tempExportDirectory + interfaceComponent.Name);
155+
156+
var text = System.IO.File.ReadAllText(tempFile);
157+
var sb = new System.Text.StringBuilder(text);
158+
sb.Replace("Attribute VB_Exposed = False", "Attribute VB_Exposed = True");
159+
System.IO.File.WriteAllText(tempFile, sb.ToString());
143160

144-
var classIsExposed = Convert.ToBoolean(model.TargetDeclaration.Attributes.ExposedAttribute.Values.First());
145-
if (classIsExposed)
161+
components.Remove(interfaceComponent);
162+
components.ImportSourceFile(tempFile);
163+
164+
System.IO.File.Delete(tempFile);
165+
}
166+
catch (Exception)
146167
{
147-
model.TargetDeclaration.Attributes.AddExposedClassAttribute();
168+
throw;
148169
}
149170
}
150171

172+
private void AddInterfaceMembersToClass(ExtractInterfaceModel model, IModuleRewriter rewriter)
173+
{
174+
_implementInterfaceRefactoring.Refactor(model.SelectedMembers.Select(m => m.Member).ToList(), rewriter, model.InterfaceName);
175+
}
176+
151177
private string GetInterfaceModuleBody(ExtractInterfaceModel model)
152178
{
153179
return string.Join(Environment.NewLine, model.SelectedMembers.Select(m => m.Body));

0 commit comments

Comments
 (0)