コード例 #1
0
        public SerializableProject SerializableProject(ProjectDeclaration projectDeclaration)
        {
            var finder = _declarationFinderProvider.DeclarationFinder;

            var serializableProject = new SerializableProject(projectDeclaration);

            var projectName = projectDeclaration.QualifiedModuleName;
            var projectLevelDeclarationsByParent = ProjectLevelDeclarations(projectName, finder)
                                                   .Where(declaration => declaration.ParentDeclaration != null)
                                                   .GroupBy(declaration => declaration.ParentDeclaration)
                                                   .ToDictionary();

            if (projectLevelDeclarationsByParent.TryGetValue(projectDeclaration, out var nonModuleProjectChildren))
            {
                foreach (var projectLevelDeclaration in nonModuleProjectChildren)
                {
                    serializableProject.AddDeclaration(new SerializableDeclarationTree(projectLevelDeclaration));
                }
            }

            foreach (var module in ProjectModules(projectName, finder))
            {
                var serializableModule = SerializableModule(module, projectDeclaration, projectLevelDeclarationsByParent, finder);
                serializableProject.AddDeclaration(serializableModule);
            }

            serializableProject.SortDeclarations();
            return(serializableProject);
        }
コード例 #2
0
        public List <Declaration> LoadDeclarationsFromLibrary()
        {
            ITypeLib typeLibrary;

            // Failure to load might mean that it's a "normal" VBProject that will get parsed by us anyway.
            LoadTypeLibEx(_path, REGKIND.REGKIND_NONE, out typeLibrary);
            if (typeLibrary == null)
            {
                return(_declarations);
            }

            var type = new ComProject(typeLibrary)
            {
                Path = _path
            };

            var projectName = new QualifiedModuleName(type.Name, _path, type.Name);
            var project     = new ProjectDeclaration(type, projectName);

            _serialized = new SerializableProject(project);
            _declarations.Add(project);

            foreach (var alias in type.Aliases.Select(item => new AliasDeclaration(item, project, projectName)))
            {
                _declarations.Add(alias);
                _serialized.AddDeclaration(new SerializableDeclarationTree(alias));
            }

            foreach (var module in type.Members)
            {
                var moduleName = new QualifiedModuleName(_referenceName, _path,
                                                         module.Type == DeclarationType.Enumeration || module.Type == DeclarationType.UserDefinedType
                        ? string.Format("_{0}", module.Name)
                        : module.Name);

                var declaration = CreateModuleDeclaration(module, moduleName, project, GetModuleAttributes(module));
                var moduleTree  = new SerializableDeclarationTree(declaration);
                _declarations.Add(declaration);
                _serialized.AddDeclaration(moduleTree);

                var membered = module as IComTypeWithMembers;
                if (membered != null)
                {
                    CreateMemberDeclarations(membered.Members, moduleName, declaration, moduleTree, membered.DefaultMember);
                    var coClass = membered as ComCoClass;
                    if (coClass != null)
                    {
                        CreateMemberDeclarations(coClass.SourceMembers, moduleName, declaration, moduleTree, coClass.DefaultMember, true);
                    }
                }

                var enumeration = module as ComEnumeration;
                if (enumeration != null)
                {
                    var enumDeclaration = new Declaration(enumeration, declaration, moduleName);
                    _declarations.Add(enumDeclaration);
                    var members = enumeration.Members.Select(e => new Declaration(e, enumDeclaration, moduleName)).ToList();
                    _declarations.AddRange(members);

                    var enumTree = new SerializableDeclarationTree(enumDeclaration);
                    moduleTree.AddChildTree(enumTree);
                    enumTree.AddChildren(members);
                }

                var structure = module as ComStruct;
                if (structure != null)
                {
                    var typeDeclaration = new Declaration(structure, declaration, moduleName);
                    _declarations.Add(typeDeclaration);
                    var members = structure.Fields.Select(f => new Declaration(f, typeDeclaration, moduleName)).ToList();
                    _declarations.AddRange(members);

                    var typeTree = new SerializableDeclarationTree(typeDeclaration);
                    moduleTree.AddChildTree(typeTree);
                    typeTree.AddChildren(members);
                }

                var fields = module as IComTypeWithFields;
                if (fields == null || !fields.Fields.Any())
                {
                    continue;
                }
                var declarations = fields.Fields.Select(f => new Declaration(f, declaration, projectName)).ToList();
                _declarations.AddRange(declarations);
                moduleTree.AddChildren(declarations);
            }
            _state.BuiltInDeclarationTrees.TryAdd(_serialized);
            return(_declarations);
        }