Skip to content

Commit 6bef6a0

Browse files
committed
Unbreak the experimental types feature
1 parent bce77cb commit 6bef6a0

File tree

5 files changed

+66
-45
lines changed

5 files changed

+66
-45
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace Rubberduck.Settings
6+
{
7+
public interface IExperimentalTypesProvider
8+
{
9+
IReadOnlyList<Type> ExperimentalTypes { get; }
10+
}
11+
12+
public class ExperimentalTypesProvider : IExperimentalTypesProvider
13+
{
14+
public IReadOnlyList<Type> ExperimentalTypes { get; }
15+
16+
public ExperimentalTypesProvider(IEnumerable<Type> experimentalTypes)
17+
{
18+
ExperimentalTypes = experimentalTypes.ToList().AsReadOnly();
19+
}
20+
}
21+
}

Rubberduck.Core/UI/Settings/GeneralSettingsViewModel.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,22 @@ public sealed class GeneralSettingsViewModel : SettingsViewModelBase<Rubberduck.
2828
private readonly IFilePersistanceService<HotkeySettings> _hotkeyService;
2929

3030
private bool _indenterPrompted;
31-
private readonly ReadOnlyCollection<Type> _experimentalFeatureTypes;
31+
private readonly IReadOnlyList<Type> _experimentalFeatureTypes;
3232

3333
public GeneralSettingsViewModel(
3434
Configuration config,
3535
IOperatingSystem operatingSystem,
3636
IMessageBox messageBox,
37-
IVbeSettings vbeSettings,
38-
IEnumerable<Type> experimentalFeatureTypes,
37+
IVbeSettings vbeSettings,
38+
IExperimentalTypesProvider experimentalTypesProvider,
3939
IFilePersistanceService<Rubberduck.Settings.GeneralSettings> service,
4040
IFilePersistanceService<HotkeySettings> hotkeyService)
4141
: base(service)
4242
{
4343
_operatingSystem = operatingSystem;
4444
_messageBox = messageBox;
4545
_vbeSettings = vbeSettings;
46-
_experimentalFeatureTypes = experimentalFeatureTypes.ToList().AsReadOnly();
46+
_experimentalFeatureTypes = experimentalTypesProvider.ExperimentalTypes;
4747
Languages = new ObservableCollection<DisplayLanguageSetting>(
4848
new[]
4949
{

Rubberduck.Core/UI/Settings/SettingsForm.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,6 @@ public SettingsForm(IGeneralConfigService configService,
3838
config,
3939
new SettingsView
4040
{
41-
// FIXME inject types marked as ExperimentalFeatures
42-
/*
43-
* These ExperimentalFeatureTypes were originally obtained by directly calling into the IoC container
44-
* (since only it knows, which Assemblies have been loaded as Plugins). The code is preserved here for easy access.
45-
* RubberduckIoCInstaller.AssembliesToRegister()
46-
* .SelectMany(s => s.DefinedTypes)
47-
* .Where(w => Attribute.IsDefined(w, typeof(ExperimentalAttribute)))
48-
*/
49-
//Control = new GeneralSettings(new GeneralSettingsViewModel(config, operatingSystem, messageBox, vbeSettings, new List<Type>())),
5041
Control = new GeneralSettings(viewModelFactory.Create<Rubberduck.Settings.GeneralSettings>(config)),
5142
View = SettingsViews.GeneralSettings
5243
},

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,56 @@
66
using Castle.Facilities.TypedFactory;
77
using Castle.MicroKernel.ModelBuilder.Inspectors;
88
using Castle.MicroKernel.Registration;
9+
using Component = Castle.MicroKernel.Registration.Component;
910
using Castle.MicroKernel.Resolvers.SpecializedResolvers;
1011
using Castle.MicroKernel.SubSystems.Configuration;
1112
using Castle.Windsor;
13+
using Rubberduck.AutoComplete;
14+
using Rubberduck.AutoComplete.Service;
15+
using Rubberduck.CodeAnalysis.CodeMetrics;
1216
using Rubberduck.ComClientLibrary.UnitTesting;
1317
using Rubberduck.Common;
1418
using Rubberduck.Common.Hotkeys;
1519
using Rubberduck.Inspections.Rubberduck.Inspections;
1620
using Rubberduck.Parsing;
21+
using Rubberduck.Parsing.Common;
1722
using Rubberduck.Parsing.ComReflection;
1823
using Rubberduck.Parsing.Inspections.Abstract;
1924
using Rubberduck.Parsing.PreProcessing;
2025
using Rubberduck.Parsing.Symbols.DeclarationLoaders;
26+
using Rubberduck.Parsing.Rewriter;
2127
using Rubberduck.Parsing.VBA;
28+
using Rubberduck.Parsing.VBA.ComReferenceLoading;
29+
using Rubberduck.Parsing.VBA.DeclarationCaching;
30+
using Rubberduck.Parsing.VBA.DeclarationResolving;
31+
using Rubberduck.Parsing.VBA.Parsing;
32+
using Rubberduck.Parsing.VBA.Parsing.ParsingExceptions;
33+
using Rubberduck.Parsing.VBA.ReferenceManagement;
2234
using Rubberduck.Settings;
35+
using GeneralSettings = Rubberduck.Settings.GeneralSettings;
2336
using Rubberduck.SettingsProvider;
2437
using Rubberduck.SmartIndenter;
38+
using IndenterSettings = Rubberduck.SmartIndenter.IndenterSettings;
2539
using Rubberduck.UI;
40+
using Rubberduck.UI.AddRemoveReferences;
2641
using Rubberduck.UI.Command;
2742
using Rubberduck.UI.Command.MenuItems;
2843
using Rubberduck.UI.Command.MenuItems.CommandBars;
2944
using Rubberduck.UI.Command.MenuItems.ParentMenus;
3045
using Rubberduck.UI.Controls;
3146
using Rubberduck.UI.Refactorings;
3247
using Rubberduck.UI.Refactorings.Rename;
48+
using Rubberduck.UI.Settings;
3349
using Rubberduck.UI.UnitTesting;
3450
using Rubberduck.UnitTesting;
35-
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
36-
using Component = Castle.MicroKernel.Registration.Component;
51+
using Rubberduck.VBEditor;
3752
using Rubberduck.VBEditor.ComManagement;
38-
using Rubberduck.Parsing.Common;
53+
using Rubberduck.VBEditor.ComManagement.TypeLibs;
3954
using Rubberduck.VBEditor.ComManagement.TypeLibsAPI;
4055
using Rubberduck.VBEditor.Events;
4156
using Rubberduck.VBEditor.Utility;
42-
using Rubberduck.AutoComplete;
43-
using Rubberduck.AutoComplete.Service;
44-
using Rubberduck.CodeAnalysis.CodeMetrics;
45-
using Rubberduck.Parsing.Rewriter;
46-
using Rubberduck.Parsing.VBA.ComReferenceLoading;
47-
using Rubberduck.Parsing.VBA.DeclarationResolving;
48-
using Rubberduck.Parsing.VBA.Parsing;
49-
using Rubberduck.Parsing.VBA.ReferenceManagement;
50-
using Rubberduck.VBEditor;
51-
using Rubberduck.VBEditor.ComManagement.TypeLibs;
57+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
5258
using Rubberduck.VBEditor.SourceCodeHandling;
53-
using Rubberduck.Parsing.VBA.DeclarationCaching;
54-
using Rubberduck.Parsing.VBA.Parsing.ParsingExceptions;
55-
using Rubberduck.UI.AddRemoveReferences;
56-
using Rubberduck.UI.Settings;
57-
using GeneralSettings = Rubberduck.Settings.GeneralSettings;
58-
using IndenterSettings = Rubberduck.SmartIndenter.IndenterSettings;
5959

6060
namespace Rubberduck.Root
6161
{
@@ -204,20 +204,21 @@ private void RegisterConfiguration(IWindsorContainer container, Assembly[] assem
204204
{
205205
container.Register(Classes.FromAssembly(assembly)
206206
.IncludeNonPublicTypes()
207-
.Where(type => type.Namespace == typeof(Configuration).Namespace && type.NotDisabledOrExperimental(_initialSettings))
207+
.Where(type => type.Namespace == typeof(Configuration).Namespace
208+
&& type.NotDisabledOrExperimental(_initialSettings)
209+
&& type != typeof(ExperimentalTypesProvider))
208210
.WithService.AllInterfaces()
209211
.LifestyleSingleton());
210212

211213
experimentalTypes.AddRange(assembly.GetTypes()
212214
.Where(t => Attribute.IsDefined(t, typeof(ExperimentalAttribute))));
213215
}
214216

215-
// FIXME correctly register experimentalFeatureTypes.
216-
// This is probably blocked until GeneralSettingsViewModel is no more newed up in SettingsForm's code-behind
217-
//container.Register(Component.For(typeof(IEnumerable<Type>))
218-
// .DependsOn(Dependency.OnComponent<ViewModelBase, GeneralSettingsViewModel>())
219-
// .LifestyleSingleton()
220-
// .Instance(experimentalTypes));
217+
var provider = new ExperimentalTypesProvider(experimentalTypes);
218+
container.Register(Component.For(typeof(IExperimentalTypesProvider))
219+
.DependsOn(Dependency.OnComponent<ViewModelBase, GeneralSettingsViewModel>())
220+
.LifestyleSingleton()
221+
.Instance(provider));
221222

222223
container.Register(Component.For<IComProjectSerializationProvider>()
223224
.ImplementedBy<XmlComProjectSerializer>()

RubberduckTests/Settings/GeneralSettingsTests.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Moq;
99
using Rubberduck.VBEditor.VbeRuntime.Settings;
1010
using System;
11+
using System.Collections.ObjectModel;
1112
using Rubberduck.Interaction;
1213
using Rubberduck.SettingsProvider;
1314

@@ -31,6 +32,13 @@ private Mock<IVbeSettings> GetVbeSettingsMock()
3132
return new Mock<IVbeSettings>();
3233
}
3334

35+
private Mock<IExperimentalTypesProvider> GetExperimentalTypesProviderMock()
36+
{
37+
var mock = new Mock<IExperimentalTypesProvider>();
38+
mock.Setup(x => x.ExperimentalTypes).Returns(new List<Type>());
39+
return mock;
40+
}
41+
3442
private Configuration GetDefaultConfig()
3543
{
3644
var generalSettings = new GeneralSettings
@@ -83,7 +91,7 @@ private Configuration GetNondefaultConfig()
8391
public void SaveConfigWorks()
8492
{
8593
var customConfig = GetNondefaultConfig();
86-
var viewModel = new GeneralSettingsViewModel(customConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
94+
var viewModel = new GeneralSettingsViewModel(customConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
8795

8896
var config = GetDefaultConfig();
8997
viewModel.UpdateConfig(config);
@@ -101,7 +109,7 @@ public void SaveConfigWorks()
101109
[Test]
102110
public void SetDefaultsWorks()
103111
{
104-
var viewModel = new GeneralSettingsViewModel(GetNondefaultConfig(), GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
112+
var viewModel = new GeneralSettingsViewModel(GetNondefaultConfig(), GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
105113

106114
var defaultConfig = GetDefaultConfig();
107115
viewModel.SetToDefaults(defaultConfig);
@@ -120,7 +128,7 @@ public void SetDefaultsWorks()
120128
public void LanguageIsSetInCtor()
121129
{
122130
var defaultConfig = GetDefaultConfig();
123-
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
131+
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
124132

125133
Assert.AreEqual(defaultConfig.UserSettings.GeneralSettings.Language, viewModel.SelectedLanguage);
126134
}
@@ -130,7 +138,7 @@ public void LanguageIsSetInCtor()
130138
public void HotkeysAreSetInCtor()
131139
{
132140
var defaultConfig = GetDefaultConfig();
133-
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
141+
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
134142

135143
Assert.IsTrue(defaultConfig.UserSettings.HotkeySettings.Settings.SequenceEqual(viewModel.Hotkeys));
136144
}
@@ -140,7 +148,7 @@ public void HotkeysAreSetInCtor()
140148
public void AutoSaveEnabledIsSetInCtor()
141149
{
142150
var defaultConfig = GetDefaultConfig();
143-
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
151+
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
144152

145153
Assert.AreEqual(defaultConfig.UserSettings.GeneralSettings.IsAutoSaveEnabled, viewModel.AutoSaveEnabled);
146154
}
@@ -150,7 +158,7 @@ public void AutoSaveEnabledIsSetInCtor()
150158
public void AutoSavePeriodIsSetInCtor()
151159
{
152160
var defaultConfig = GetDefaultConfig();
153-
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, new List<Type>(), null, null);
161+
var viewModel = new GeneralSettingsViewModel(defaultConfig, GetOperatingSystemMock().Object, GetMessageBoxMock().Object, GetVbeSettingsMock().Object, GetExperimentalTypesProviderMock().Object, null, null);
154162

155163
Assert.AreEqual(defaultConfig.UserSettings.GeneralSettings.AutoSavePeriod, viewModel.AutoSavePeriod);
156164
}

0 commit comments

Comments
 (0)