/
ObjectStateUDT.cs
104 lines (85 loc) · 3.75 KB
/
ObjectStateUDT.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using Rubberduck.Parsing.Symbols;
using Rubberduck.Common;
using Rubberduck.VBEditor;
using System;
using System.Collections.Generic;
using System.Linq;
using Rubberduck.Parsing.Grammar;
namespace Rubberduck.Refactorings.EncapsulateField
{
public interface IObjectStateUDT : IEncapsulateFieldRefactoringElement
{
Declaration Declaration { get; }
string TypeIdentifier { set; get; }
string FieldIdentifier { set; get; }
string FieldDeclarationBlock { get; }
bool IsExistingDeclaration { get; }
Declaration AsTypeDeclaration { get; }
bool IsSelected { set; get; }
IReadOnlyCollection<IUserDefinedTypeMemberCandidate> ExistingMembers { get; }
}
/// <summary>
/// ObjectStateUDT is a Private UserDefinedType whose UserDefinedTypeMembers represent
/// a consolidated grouping of object state in lieu of (or in addition to) a set of Private fields.
/// </summary>
/// <remarks>
/// Within the EncapsulateField refactoring, the ObjectStateUDT can be an existing
/// UserDefinedType or a new UserDefinedType generated by the refactoring.
/// </remarks>
public class ObjectStateUDT : IObjectStateUDT
{
private static string _defaultNewFieldName = "this";
private readonly IUserDefinedTypeCandidate _wrappedUDTField;
public ObjectStateUDT(IUserDefinedTypeCandidate udtField)
: this(udtField.IdentifierName, udtField.Declaration.AsTypeName)
{
if (!udtField.TypeDeclarationIsPrivate)
{
throw new ArgumentException();
}
QualifiedModuleName = udtField.QualifiedModuleName;
_wrappedUDTField = udtField;
}
public ObjectStateUDT(QualifiedModuleName qualifiedModuleName)
:this(_defaultNewFieldName, $"T{qualifiedModuleName.ComponentName.CapitalizeFirstLetter()}")
{
QualifiedModuleName = qualifiedModuleName;
}
private ObjectStateUDT(string fieldIdentifier, string typeIdentifier)
{
FieldIdentifier = fieldIdentifier;
TypeIdentifier = typeIdentifier;
}
public string IdentifierName => _wrappedUDTField?.IdentifierName ?? FieldIdentifier;
public Declaration Declaration => _wrappedUDTField?.Declaration;
public string AsTypeName => _wrappedUDTField?.AsTypeName ?? TypeIdentifier;
public string FieldDeclarationBlock
=> $"{Accessibility.Private} {IdentifierName} {Tokens.As} {AsTypeName}";
private bool _isSelected;
public bool IsSelected
{
set
{
_isSelected = value;
if (_isSelected && IsExistingDeclaration)
{
_wrappedUDTField.EncapsulateFlag = false;
}
}
get => _isSelected;
}
public IReadOnlyCollection<IUserDefinedTypeMemberCandidate> ExistingMembers
=> _wrappedUDTField?.Members.ToList() ?? new List<IUserDefinedTypeMemberCandidate>();
public QualifiedModuleName QualifiedModuleName { get; }
public string TypeIdentifier { set; get; }
public bool IsExistingDeclaration => _wrappedUDTField != null;
public Declaration AsTypeDeclaration => _wrappedUDTField?.Declaration.AsTypeDeclaration;
public string FieldIdentifier { set; get; }
public override bool Equals(object obj)
{
return (obj is IObjectStateUDT stateUDT && stateUDT.FieldIdentifier == FieldIdentifier)
|| (obj is IEncapsulateFieldRefactoringElement fd && fd.IdentifierName == IdentifierName);
}
public override int GetHashCode() => $"{QualifiedModuleName.Name}.{FieldIdentifier}".GetHashCode();
}
}