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