public void GetsCorrectReferenceCount_ClassAccessor()
        {
            string className = "TestClass";
            string classCode =
                $@"
Public this As TBar
";

            string classInstance = "theClass";
            string moduleName    = MockVbeBuilder.TestModuleName;
            string moduleCode    =
                $@"
Public Type TBar
    First As String
    Second As String
End Type

Private {classInstance} As {className}

Public Sub Initialize()
    Set {classInstance} = New {className}
End Sub

'Public Sub Fizz(newValue As String)
'    With {classInstance}
'        .this.First = newValue
'    End With
'End Sub

'Public Sub Buzz(newValue As String)
'    With {classInstance}
'        .this.Second = newValue
'    End With
'End Sub

Public Sub Fizz1(newValue As String)
        {classInstance}.this.First = newValue
End Sub

Public Sub Buzz1(newValue As String)
        {classInstance}.this.Second = newValue
End Sub

";

            var vbe = MockVbeBuilder.BuildFromModules((moduleName, moduleCode, ComponentType.StandardModule),
                                                      (className, classCode, ComponentType.ClassModule));

            using (var state = MockParser.CreateAndParse(vbe.Object))
            {
                var this_Target = state.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
                                  .Where(d => d.IdentifierName == "this")
                                  .Single();

                var udtMembers = state.DeclarationFinder.UserDeclarations(DeclarationType.UserDefinedTypeMember);

                var sut = new UserDefinedTypeInstance(this_Target as VariableDeclaration, udtMembers);
                Assert.AreEqual(2, sut.UDTMemberReferences.Count());
            }
        }
        public void UDTField_MemberAccessMultipleInstances()
        {
            var inputCode =
                $@"
Private Type TBar
    FirstVal As String
    SecondVal As Long
    ThirdVal As Byte
End Type

Private myBar As TBar
Private myFoo As TBar

Public Function GetOne() As String
    GetOne = myBar.FirstVal
End Function

Public Function GetTwo() As Long
    GetTwo = myBar.ThirdVal
End Function

Public Function GetThree() As Long
    GetThree = myFoo.ThirdVal
End Function

";

            var vbe   = MockVbeBuilder.BuildFromStdModules((MockVbeBuilder.TestModuleName, inputCode));
            var state = MockParser.CreateAndParse(vbe.Object);

            using (state)
            {
                var myBarTarget = state.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
                                  .OfType <VariableDeclaration>()
                                  .Where(d => "myBar" == d.IdentifierName)
                                  .Single();

                var myFooTarget = state.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
                                  .OfType <VariableDeclaration>()
                                  .Where(d => "myFoo" == d.IdentifierName)
                                  .Single();

                var udtMembers = state.DeclarationFinder.UserDeclarations(DeclarationType.UserDefinedTypeMember)
                                 .Where(d => "TBar" == d.ParentDeclaration.IdentifierName);

                var myBarRefs = new UserDefinedTypeInstance(myBarTarget, udtMembers);
                var refs      = myBarRefs.UDTMemberReferences;
                Assert.AreEqual(2, refs.Select(rf => rf.IdentifierName).Count());

                var myFooRefs = new UserDefinedTypeInstance(myFooTarget, udtMembers);
                var fooRefs   = myBarRefs.UDTMemberReferences;
                Assert.AreEqual(2, fooRefs.Select(rf => rf.IdentifierName).Count());
            }
        }
        public void GetsCorrectReferenceCount()
        {
            string inputCode =
                $@"
Private Type TBar
    First As String
    Second As String
End Type

Private bizz_ As TBar

Private fizz_ As TBar

Public Sub Fizz(newValue As String)
    With bizz_
        .First = newValue
    End With
End Sub

Public Sub Buzz(newValue As String)
    With bizz_
        .Second = newValue
    End With
End Sub

Public Sub Fizz1(newValue As String)
    bizz_.First = newValue
End Sub

Public Sub Buzz1(newValue As String)
    bizz_.Second = newValue
End Sub

Public Sub Tazz(newValue As String)
    fizz_.First = newValue
    fizz_.Second = newValue
End Sub
";

            var vbe = MockVbeBuilder.BuildFromModules((MockVbeBuilder.TestModuleName, inputCode, ComponentType.StandardModule));

            using (var state = MockParser.CreateAndParse(vbe.Object))
            {
                var bizz_Target = state.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
                                  .Where(d => d.IdentifierName == "bizz_")
                                  .Single();

                var udtMembers = state.DeclarationFinder.UserDeclarations(DeclarationType.UserDefinedTypeMember);

                var sut = new UserDefinedTypeInstance(bizz_Target as VariableDeclaration, udtMembers);
                Assert.AreEqual(4, sut.UDTMemberReferences.Count());
            }
        }