private void HandleMetaDirective( State state, SourcesFile file, string pathDirectory, string includeDirectory, bool asExclusionsList, string directive ) { var include = "#include "; if (directive.StartsWith(include)) { var includeName = directive.Substring(include.Length).Trim(); var fileName = Path.Combine(includeDirectory, includeName); if (!File.Exists(fileName)) { Console.Error.WriteLine($"// Include does not exist: {fileName}"); state.Result.ErrorCount++; return; } var newFile = ParseSingleFile(state, fileName, asExclusionsList, overrideDirectory: pathDirectory); if (newFile == null) { Console.Error.WriteLine($"// Failed to parse included file: {fileName}"); state.Result.ErrorCount++; return; } file.Includes.Add(newFile); } }
private void HandleMetaDirective( State state, SourcesFile file, string pathDirectory, string includeDirectory, bool asExclusionsList, string directive ) { var include = "#include "; var split = "#split "; if (directive.StartsWith(include)) { var includeName = directive.Substring(include.Length).Trim(); var fileName = Path.Combine(includeDirectory, includeName); if (!File.Exists(fileName)) { Console.Error.WriteLine($"// Include does not exist: {fileName}"); state.Result.ErrorCount++; return; } var newFile = ParseSingleFile(state, fileName, asExclusionsList); if (newFile == null) { Console.Error.WriteLine($"// Failed to parse included file: {fileName}"); state.Result.ErrorCount++; return; } file.Includes.Add(newFile); } else if (directive.StartsWith(split)) { if (asExclusionsList) { throw new InvalidOperationException("split directive is not valid for exclusion lists"); } var profileName = directive.Substring(split.Length).Trim(); if (profileName == TargetProfileName) { state.CurrentSplitNumber++; } } }
private void HandleMetaDirective(State state, SourcesFile file, string directory, bool asExclusionsList, string directive) { var include = "#include "; if (directive.StartsWith(include)) { var fileName = Path.Combine(directory, directive.Substring(include.Length)); var newFile = ParseSingleFile(state, fileName, asExclusionsList); if (newFile == null) { Console.Error.WriteLine($"// Include not found: {fileName}"); state.Result.ErrorCount++; } else { file.Includes.Add(newFile); } } }
private SourcesFile ParseSingleFile(State state, string fileName, bool asExclusionsList, string overrideDirectory = null) { var fileTable = asExclusionsList ? state.Result.ExclusionFiles : state.Result.SourcesFiles; var nullStr = "<none>"; if (fileTable.ContainsKey(fileName)) { if (TraceLevel >= 2) { Console.Error.WriteLine($"// {new String (' ', ParseDepth * 2)}{fileName} (already parsed)"); } return(fileTable[fileName]); } else { if (TraceLevel >= 2) { Console.Error.WriteLine($"// {new String (' ', ParseDepth * 2)}{fileName} [{state.HostPlatform ?? nullStr}] [{state.ProfileName ?? nullStr}]"); } } ParseDepth += 1; var includeDirectory = Path.GetDirectoryName(fileName); var pathDirectory = overrideDirectory ?? includeDirectory; var result = new SourcesFile(fileName, asExclusionsList); fileTable.Add(fileName, result); using (var sr = new StreamReader(fileName)) { if (asExclusionsList) { state.ExclusionsFilesParsed++; } else { state.SourcesFilesParsed++; } string line; while ((line = sr.ReadLine()) != null) { if (line.StartsWith("#")) { HandleMetaDirective(state, result, pathDirectory, includeDirectory, asExclusionsList, line); continue; } line = line.Trim(); if (String.IsNullOrWhiteSpace(line)) { continue; } var parts = line.Split(':'); if (parts.Length > 1) { var explicitExclusions = parts[1].Split(','); // gensources.sh implemented these explicit exclusions like so: // ../foo/bar/*.cs:A.cs,B.cs // This would generate exclusions for ../foo/bar/A.cs and ../foo/bar/B.cs, // not ./A.cs and ./B.cs as you might expect var mainPatternDirectory = Path.GetDirectoryName(parts[0]); foreach (var pattern in explicitExclusions) { result.Exclusions.Add(new ParseEntry { Directory = pathDirectory, Pattern = Path.Combine(mainPatternDirectory, pattern) }); } } (asExclusionsList ? result.Exclusions : result.Sources) .Add(new ParseEntry { Directory = pathDirectory, Pattern = parts[0] }); } } ParseDepth -= 1; return(result); }