public static string GetDeterministicKey( CompilationOptions compilationOptions, ImmutableArray <SyntaxTree> syntaxTrees, ImmutableArray <MetadataReference> references, ImmutableArray <byte> publicKey = default, ImmutableArray <AdditionalText> additionalTexts = default, ImmutableArray <DiagnosticAnalyzer> analyzers = default, ImmutableArray <ISourceGenerator> generators = default, ImmutableArray <KeyValuePair <string, string> > pathMap = default, EmitOptions?emitOptions = null, DeterministicKeyOptions options = DeterministicKeyOptions.Default, CancellationToken cancellationToken = default) { return(GetDeterministicKey( compilationOptions, syntaxTrees.SelectAsArray(static t => SyntaxTreeKey.Create(t)),
protected void WriteFilePath( JsonWriter writer, string propertyName, string?filePath, ImmutableArray <KeyValuePair <string, string> > pathMap, DeterministicKeyOptions options) { if ((options & DeterministicKeyOptions.IgnorePaths) != 0) { filePath = Path.GetFileName(filePath); } else if (filePath is not null) { filePath = PathUtilities.NormalizePathPrefix(filePath, pathMap); } writer.Write(propertyName, filePath); }
internal string GetKey( CompilationOptions compilationOptions, ImmutableArray <SyntaxTreeKey> syntaxTrees, ImmutableArray <MetadataReference> references, ImmutableArray <byte> publicKey, ImmutableArray <AdditionalText> additionalTexts, ImmutableArray <DiagnosticAnalyzer> analyzers, ImmutableArray <ISourceGenerator> generators, ImmutableArray <KeyValuePair <string, string> > pathMap, EmitOptions?emitOptions, DeterministicKeyOptions options, CancellationToken cancellationToken) { additionalTexts = additionalTexts.NullToEmpty(); analyzers = analyzers.NullToEmpty(); generators = generators.NullToEmpty(); var(writer, builder) = CreateWriter(); writer.WriteObjectStart(); writer.WriteKey("compilation"); WriteCompilation(writer, compilationOptions, syntaxTrees, references, publicKey, pathMap, options, cancellationToken); writer.WriteKey("additionalTexts"); writeAdditionalTexts(); writer.WriteKey("analyzers"); writeAnalyzers(); writer.WriteKey("generators"); writeGenerators(); writer.WriteKey("emitOptions"); WriteEmitOptions(writer, emitOptions, pathMap, options); writer.WriteObjectEnd(); return(builder.ToStringAndFree()); void writeAdditionalTexts() { writer.WriteArrayStart(); foreach (var additionalText in additionalTexts) { cancellationToken.ThrowIfCancellationRequested(); writer.WriteObjectStart(); WriteFilePath(writer, "fileName", additionalText.Path, pathMap, options); writer.WriteKey("text"); WriteSourceText(writer, additionalText.GetText(cancellationToken)); writer.WriteObjectEnd(); } writer.WriteArrayEnd(); } void writeAnalyzers() { writer.WriteArrayStart(); foreach (var analyzer in analyzers) { cancellationToken.ThrowIfCancellationRequested(); WriteType(writer, analyzer.GetType()); } writer.WriteArrayEnd(); } void writeGenerators() { writer.WriteArrayStart(); foreach (var generator in generators) { cancellationToken.ThrowIfCancellationRequested(); WriteType(writer, generator.GetType()); } writer.WriteArrayEnd(); } }