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); }
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); }