public static int Run(CommandLineParser parser, string responseFile, string[] args, string clientDirectory, string baseDirectory, string sdkDirectory, string additionalReferenceDirectories, IAnalyzerAssemblyLoader analyzerLoader, TextWriter output) { return new PhpCompiler(parser, responseFile, args, clientDirectory, baseDirectory, sdkDirectory, additionalReferenceDirectories, analyzerLoader) .Run(output); }
public CommonCompiler(CommandLineParser parser, string responseFile, string[] args, string baseDirectory, string additionalReferencePaths) { IEnumerable<string> allArgs = args; Debug.Assert(null == responseFile || PathUtilities.IsAbsolute(responseFile)); if (!SuppressDefaultResponseFile(args) && File.Exists(responseFile)) { allArgs = new[] { "@" + responseFile }.Concat(allArgs); } this.Arguments = parser.Parse(allArgs, baseDirectory, additionalReferencePaths); this.MessageProvider = parser.MessageProvider; }
public CommonCompiler(CommandLineParser parser, string responseFile, string[] args, string clientDirectory, string baseDirectory, string sdkDirectoryOpt, string additionalReferenceDirectories, IAnalyzerAssemblyLoader analyzerLoader) { IEnumerable<string> allArgs = args; _clientDirectory = clientDirectory; Debug.Assert(null == responseFile || PathUtilities.IsAbsolute(responseFile)); if (!SuppressDefaultResponseFile(args) && PortableShim.File.Exists(responseFile)) { allArgs = new[] { "@" + responseFile }.Concat(allArgs); } this.Arguments = parser.Parse(allArgs, baseDirectory, sdkDirectoryOpt, additionalReferenceDirectories); this.MessageProvider = parser.MessageProvider; this.AnalyzerLoader = analyzerLoader; }
public CommonCompiler(CommandLineParser parser, string responseFile, string[] args, string clientDirectory, string baseDirectory, string sdkDirectoryOpt, string additionalReferenceDirectories, IAnalyzerAssemblyLoader assemblyLoader) { IEnumerable<string> allArgs = args; _clientDirectory = clientDirectory; Debug.Assert(null == responseFile || PathUtilities.IsAbsolute(responseFile)); if (!SuppressDefaultResponseFile(args) && File.Exists(responseFile)) { allArgs = new[] { "@" + responseFile }.Concat(allArgs); } this.Arguments = parser.Parse(allArgs, baseDirectory, sdkDirectoryOpt, additionalReferenceDirectories); this.MessageProvider = parser.MessageProvider; this.AssemblyLoader = assemblyLoader; this.EmbeddedSourcePaths = GetEmbedddedSourcePaths(Arguments); if (Arguments.ParseOptions.Features.ContainsKey("debug-determinism")) { EmitDeterminismKey(Arguments, args, baseDirectory, parser); } }
/// <summary> /// The string returned from this function represents the inputs to the compiler which impact determinism. It is /// meant to be inline with the specification here: /// /// - https://github.com/dotnet/roslyn/blob/master/docs/compilers/Deterministic%20Inputs.md /// /// Issue #8193 tracks filling this out to the full specification. /// /// https://github.com/dotnet/roslyn/issues/8193 /// </summary> private static string CreateDeterminismKey(CommandLineArguments args, string[] rawArgs, string baseDirectory, CommandLineParser parser) { List<Diagnostic> diagnostics = new List<Diagnostic>(); List<string> flattenedArgs = new List<string>(); parser.FlattenArgs(rawArgs, diagnostics, flattenedArgs, null, baseDirectory); var builder = new StringBuilder(); var name = !string.IsNullOrEmpty(args.OutputFileName) ? Path.GetFileNameWithoutExtension(Path.GetFileName(args.OutputFileName)) : $"no-output-name-{Guid.NewGuid().ToString()}"; builder.AppendLine($"{name}"); builder.AppendLine($"Command Line:"); foreach (var current in flattenedArgs) { builder.AppendLine($"\t{current}"); } builder.AppendLine("Source Files:"); var hash = new MD5CryptoServiceProvider(); foreach (var sourceFile in args.SourceFiles) { var sourceFileName = Path.GetFileName(sourceFile.Path); string hashValue; try { var bytes = PortableShim.File.ReadAllBytes(sourceFile.Path); var hashBytes = hash.ComputeHash(bytes); var data = BitConverter.ToString(hashBytes); hashValue = data.Replace("-", ""); } catch (Exception ex) { hashValue = $"Could not compute {ex.Message}"; } builder.AppendLine($"\t{sourceFileName} - {hashValue}"); } return builder.ToString(); }
private static void EmitDeterminismKey(CommandLineArguments args, string[] rawArgs, string baseDirectory, CommandLineParser parser) { var key = CreateDeterminismKey(args, rawArgs, baseDirectory, parser); var filePath = Path.Combine(args.OutputDirectory, args.OutputFileName + ".key"); using (var stream = PortableShim.File.Create(filePath)) { var bytes = Encoding.UTF8.GetBytes(key); stream.Write(bytes, 0, bytes.Length); } }
/// <summary> /// Create a <see cref="ProjectInfo"/> structure initialized with data from a compiler command line. /// </summary> public static ProjectInfo CreateProjectInfo(string projectName, string language, string commandLine, string baseDirectory, Workspace workspace = null) { var args = CommandLineParser.SplitCommandLineIntoArguments(commandLine, removeHashComments: true); return(CreateProjectInfo(projectName, language, args, baseDirectory, workspace)); }
/// <summary> /// The string returned from this function represents the inputs to the compiler which impact determinism. It is /// meant to be inline with the specification here: /// /// - https://github.com/dotnet/roslyn/blob/master/docs/compilers/Deterministic%20Inputs.md /// /// Issue #8193 tracks filling this out to the full specification. /// /// https://github.com/dotnet/roslyn/issues/8193 /// </summary> private static string CreateDeterminismKey(CommandLineArguments args, string[] rawArgs, string baseDirectory, CommandLineParser parser) { List <Diagnostic> diagnostics = new List <Diagnostic>(); List <string> flattenedArgs = new List <string>(); parser.FlattenArgs(rawArgs, diagnostics, flattenedArgs, null, baseDirectory); var builder = new StringBuilder(); var name = !string.IsNullOrEmpty(args.OutputFileName) ? Path.GetFileNameWithoutExtension(Path.GetFileName(args.OutputFileName)) : $"no-output-name-{Guid.NewGuid().ToString()}"; builder.AppendLine($"{name}"); builder.AppendLine($"Command Line:"); foreach (var current in flattenedArgs) { builder.AppendLine($"\t{current}"); } builder.AppendLine("Source Files:"); var hash = new MD5CryptoServiceProvider(); foreach (var sourceFile in args.SourceFiles) { var sourceFileName = Path.GetFileName(sourceFile.Path); string hashValue; try { var bytes = PortableShim.File.ReadAllBytes(sourceFile.Path); var hashBytes = hash.ComputeHash(bytes); var data = BitConverter.ToString(hashBytes); hashValue = data.Replace("-", ""); } catch (Exception ex) { hashValue = $"Could not compute {ex.Message}"; } builder.AppendLine($"\t{sourceFileName} - {hashValue}"); } return(builder.ToString()); }
private static void EmitDeterminismKey(CommandLineArguments args, string[] rawArgs, string baseDirectory, CommandLineParser parser) { var key = CreateDeterminismKey(args, rawArgs, baseDirectory, parser); var filePath = Path.Combine(args.OutputDirectory, args.OutputFileName + ".key"); using (var stream = PortableShim.File.Create(filePath)) { var bytes = Encoding.UTF8.GetBytes(key); stream.Write(bytes, 0, bytes.Length); } }