Esempio n. 1
0
        public IEnumerable <CodeSpecificException> InitializeCodeModel(CppCodeModel codeModel, IncludeManagerParameter parameter)
        {
            HashSet <string>             parsedIncludes         = new HashSet <string>(parameter.KnownIncludes);
            List <CodeSpecificException> codeSpecificExceptions = new List <CodeSpecificException>();
            VirtualFile cacheFile = fileSystem.GetFile(IncludeFilePath.CleanPath().ResolvePathName(environmentService.PathNames));

            includeCache.LoadCache(cacheFile);

            UpdateCache(parameter, parsedIncludes, codeModel, codeSpecificExceptions);

            codeModel.IncludeDirectories = parameter.IncludeDirectories;

            codeModel.RegisterIncludeTypeFinder(s => FindIncludeType(s, parameter.IncludeDirectories));
            this.codeModel = codeModel;
            codeModel.AddConstants(includeCache.Entries.SelectMany(e => e.Constants));

            return(codeSpecificExceptions);
        }
Esempio n. 2
0
        private IType FindIncludeType(string fullName, IEnumerable <IncludePath> includeDirectories)
        {
            if (!includeCache.TryGetCacheEntryWithTypeName(fullName, includeDirectories.Select(x => x.Directory)
                                                           .Select(d => d?.FullName ?? string.Empty)
                                                           .ToArray(),
                                                           out IncludeCacheEntry cacheEntry))
            {
                return(null);
            }

            log.LogInformation($"Parse type {fullName} from {cacheEntry.File}");
            VirtualFile      cacheFile          = fileSystem.GetFile(cacheEntry.File);
            VirtualDirectory cacheBaseDirectory = fileSystem.GetDirectory(cacheEntry.BaseDirectory);
            ParserResult     parserResult       = fileParser.Parse(cacheFile);
            IType            result             = null;

            foreach (CodeSpecificException codeSpecificException in parserResult.Exceptions)
            {
                log.LogWarning(codeSpecificException.Message);
            }
            if (parserResult.Success)
            {
                foreach (IType type in parserResult.Types.Keys)
                {
                    codeModel?.AddType(type, cacheFile, cacheBaseDirectory);
                    if (type.FullName == fullName)
                    {
                        result = type;
                    }
                }
                codeModel?.AddConstants(parserResult.Constants);
            }

            log.LogInformation(result != null
                                   ? $"Successfully retrieved type {fullName}."
                                   : $"Could not find the type {fullName} in {cacheEntry.File}. This should not happen.");
            return(result);
        }
Esempio n. 3
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)));
        }