Esempio n. 1
0
        private void AddOrUpdate(IEnumerable <IncludeDefinition> includes, IIncludeCacheTransaction cacheTransaction, HashSet <string> parsedIncludes, CppCodeModel codeModel, List <CodeSpecificException> codeSpecificExceptions, IncludeManagerParameter parameter)
        {
            Stack <IncludeDefinition> unvisited = new Stack <IncludeDefinition>(includes);

            while (unvisited.Any())
            {
                IncludeDefinition include = unvisited.Pop();
                if (TryFindInclude(include, out IncludeFindResult findResult, parsedIncludes, parameter))
                {
                    IEnumerable <IncludeDefinition> childDefinitions;
                    if (findResult.IsInCache)
                    {
                        VirtualFile      cacheSourceFile    = fileSystem.GetFile(findResult.IncludeCacheEntry.File);
                        VirtualDirectory cacheBaseDirectory = fileSystem.GetDirectory(findResult.IncludeCacheEntry.BaseDirectory);
                        parsedIncludes.Add(cacheSourceFile.GetRelativePath(cacheBaseDirectory));
                        childDefinitions = findResult.IncludeCacheEntry.Includes.Select(i => new IncludeDefinition(i, cacheSourceFile, cacheBaseDirectory));

                        codeModel.AddDefineStatements(findResult.IncludeCacheEntry.DefineStatements);
                    }
                    else
                    {
                        parsedIncludes.Add(findResult.IncludeFile.GetRelativePath(findResult.IncludeBaseDirectory));
                        childDefinitions = ProcessInclude(findResult.IncludeFile, findResult.IncludeBaseDirectory, codeSpecificExceptions, cacheTransaction, codeModel);
                    }

                    foreach (IncludeDefinition childDefinition in childDefinitions)
                    {
                        unvisited.Push(childDefinition);
                    }
                }
            }
        }
Esempio n. 2
0
        private IEnumerable <IncludeDefinition> ProcessInclude(VirtualFile findResultIncludeFile, VirtualDirectory findResultIncludeBaseDirectory, List <CodeSpecificException> codeSpecificExceptions, IIncludeCacheTransaction cacheTransaction, CppCodeModel codeModel)
        {
            ParserResult parserResult = fileParser.Parse(findResultIncludeFile);

            if (!parserResult.Success)
            {
                codeSpecificExceptions.AddRange(parserResult.Exceptions);
                cacheTransaction.AddEntry(new IncludeCacheEntry(findResultIncludeFile.FullName, false, findResultIncludeFile.LastWriteTime, findResultIncludeBaseDirectory.FullName, Enumerable.Empty <string>(), Enumerable.Empty <string>(), new Dictionary <string, string>(), Enumerable.Empty <IConstant>()));
                return(Enumerable.Empty <IncludeDefinition>());
            }

            foreach (IType type in parserResult.Types.Keys)
            {
                codeModel.AddType(type, findResultIncludeFile, findResultIncludeBaseDirectory);
            }

            codeModel.AddDefineStatements(parserResult.DefineStatements);
            codeModel.AddConstants(parserResult.Constants);

            codeSpecificExceptions.AddRange(parserResult.Exceptions);
            cacheTransaction.AddEntry(new IncludeCacheEntry(findResultIncludeFile.FullName, true, findResultIncludeFile.LastWriteTime, findResultIncludeBaseDirectory.FullName, parserResult.Types.Keys.Select(t => t.FullName), parserResult.Includes, parserResult.DefineStatements, parserResult.Constants));
            return(parserResult.Includes.Select(i => new IncludeDefinition(i, findResultIncludeFile, findResultIncludeBaseDirectory)));
        }