private List <Declaration> GetExcelRangeDeclarations()
        {
            var excelDeclaration = new ProjectDeclaration(new QualifiedMemberName(new QualifiedModuleName("Excel",
                                                                                                          "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Excel"), "Excel"), "Excel", true);

            var globalDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
                                                                   new QualifiedModuleName("Excel",
                                                                                           "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
                                                                   "_Global"), excelDeclaration, "_Global", true, null, null);

            var globalCoClassDeclarationAttributes = new Attributes();

            globalCoClassDeclarationAttributes.AddPredeclaredIdTypeAttribute();
            globalCoClassDeclarationAttributes.AddGlobalClassAttribute();

            var globalCoClassDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
                                                                          new QualifiedModuleName("Excel",
                                                                                                  "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Global"),
                                                                          "Global"), excelDeclaration, "Global", true, null, globalCoClassDeclarationAttributes);

            globalDeclaration.AddSubtype(globalCoClassDeclaration);
            globalCoClassDeclaration.AddSupertype(globalDeclaration);
            globalCoClassDeclaration.AddSupertype("_Global");

            var rangeClassModuleDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
                                                                             new QualifiedModuleName("Excel",
                                                                                                     "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Range"),
                                                                             "Range"), excelDeclaration, "Range", true, new List <IAnnotation>(), new Attributes());

            var rangeDeclaration = new PropertyGetDeclaration(new QualifiedMemberName(
                                                                  new QualifiedModuleName("Excel",
                                                                                          "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"), "Range"),
                                                              globalDeclaration, globalDeclaration, "Range", null, null, Accessibility.Global, null, Selection.Home,
                                                              false, true, new List <IAnnotation>(), new Attributes());

            var firstParamDeclaration = new ParameterDeclaration(new QualifiedMemberName(
                                                                     new QualifiedModuleName("Excel",
                                                                                             "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
                                                                     "Cell1"), rangeDeclaration, "Variant", null, null, false, false);

            var secondParamDeclaration = new ParameterDeclaration(new QualifiedMemberName(
                                                                      new QualifiedModuleName("Excel",
                                                                                              "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
                                                                      "Cell2"), rangeDeclaration, "Variant", null, null, true, false);

            rangeDeclaration.AddParameter(firstParamDeclaration);
            rangeDeclaration.AddParameter(secondParamDeclaration);

            return(new List <Declaration>
            {
                excelDeclaration,
                globalDeclaration,
                globalCoClassDeclaration,
                rangeClassModuleDeclaration,
                rangeDeclaration,
                firstParamDeclaration,
                secondParamDeclaration,
            });
        }
        public void ClassModulesThatAreGlobalClassesHaveADefaultInstanceVariable()
        {
            var projectDeclaration = GetTestProject("testProject");
            var classAttributes    = new Attributes();

            classAttributes.AddGlobalClassAttribute();
            var classModule = GetTestClassModule(projectDeclaration, "testClass", true, classAttributes);

            Assert.IsTrue(classModule.HasDefaultInstanceVariable);
        }
        public void ClassModulesWithTheGlobalNamespaceAttributeAreGlobalClasses()
        {
            var projectDeclaration = GetTestProject("testProject");
            var classAttributes    = new Attributes();

            classAttributes.AddGlobalClassAttribute();
            var classModule = GetTestClassModule(projectDeclaration, "testClass", true, classAttributes);

            Assert.IsTrue(classModule.IsGlobalClassModule);
        }
        public void ClassModulesWithASubtypeBelowInTheHiearchyThatIsAGlobalClassAndThatHasBeenAddedBeforeCallingIsGlobalClassTheFirstTimeIsAGlobalClass()
        {
            var projectDeclaration = GetTestProject("testProject");
            var classAttributes    = new Attributes();

            classAttributes.AddGlobalClassAttribute();
            var subsubtype = GetTestClassModule(projectDeclaration, "testSubSubtype", true, classAttributes);
            var subtype    = GetTestClassModule(projectDeclaration, "testSubtype", true, null);

            subsubtype.AddSupertype(subtype);
            var classModule = GetTestClassModule(projectDeclaration, "testClass", true, null);

            subtype.AddSupertype(classModule);

            Assert.IsTrue(classModule.IsGlobalClassModule);
        }
        public void ClassModulesBecomeAGlobalClassIfBelowInTheHierarchyASubtypeIsAddedThatIsAGlobalClassAfterIsAGlobalClassHasAlreadyBeenCalled()
        {
            var projectDeclaration = GetTestProject("testProject");
            var classAttributes    = new Attributes();

            classAttributes.AddGlobalClassAttribute();
            var subsubtype  = GetTestClassModule(projectDeclaration, "testSubSubtype", true, classAttributes);
            var subtype     = GetTestClassModule(projectDeclaration, "testSubtype", true, null);
            var classModule = GetTestClassModule(projectDeclaration, "testClass", true, null);

            subtype.AddSupertype(classModule);
            var dummy = classModule.IsGlobalClassModule;

            subsubtype.AddSupertype(subtype);

            Assert.IsTrue(classModule.IsGlobalClassModule);
        }
        private static Attributes GetModuleAttributes(IComType module)
        {
            var attributes = new Attributes();

            if (module.IsPreDeclared)
            {
                attributes.AddPredeclaredIdTypeAttribute();
            }
            if (module.IsAppObject)
            {
                attributes.AddGlobalClassAttribute();
            }
            if (module is IComTypeWithMembers members && members.IsExtensible)
            {
                attributes.AddExtensibledClassAttribute();
            }
            return(attributes);
        }