Exemple #1
0
 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();
            }
        }