mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #16036 from tamasvajk/autobuilder/disposable
C#: Properly dispose diagnostic writer objects
This commit is contained in:
@@ -203,6 +203,8 @@ namespace Semmle.Autobuild.Cpp.Tests
|
|||||||
public IList<DiagnosticMessage> Diagnostics { get; } = new List<DiagnosticMessage>();
|
public IList<DiagnosticMessage> Diagnostics { get; } = new List<DiagnosticMessage>();
|
||||||
|
|
||||||
public void AddEntry(DiagnosticMessage message) => this.Diagnostics.Add(message);
|
public void AddEntry(DiagnosticMessage message) => this.Diagnostics.Add(message);
|
||||||
|
|
||||||
|
public void Dispose() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace Semmle.Autobuild.Cpp
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Console.WriteLine("CodeQL C++ autobuilder");
|
Console.WriteLine("CodeQL C++ autobuilder");
|
||||||
var builder = new CppAutobuilder(actions, options);
|
using var builder = new CppAutobuilder(actions, options);
|
||||||
return builder.AttemptBuild();
|
return builder.AttemptBuild();
|
||||||
}
|
}
|
||||||
catch (InvalidEnvironmentException ex)
|
catch (InvalidEnvironmentException ex)
|
||||||
|
|||||||
@@ -218,6 +218,8 @@ namespace Semmle.Autobuild.CSharp.Tests
|
|||||||
public IList<DiagnosticMessage> Diagnostics { get; } = new List<DiagnosticMessage>();
|
public IList<DiagnosticMessage> Diagnostics { get; } = new List<DiagnosticMessage>();
|
||||||
|
|
||||||
public void AddEntry(DiagnosticMessage message) => this.Diagnostics.Add(message);
|
public void AddEntry(DiagnosticMessage message) => this.Diagnostics.Add(message);
|
||||||
|
|
||||||
|
public void Dispose() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace Semmle.Autobuild.CSharp
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Console.WriteLine("CodeQL C# autobuilder");
|
Console.WriteLine("CodeQL C# autobuilder");
|
||||||
var builder = new CSharpAutobuilder(actions, options);
|
using var builder = new CSharpAutobuilder(actions, options);
|
||||||
return builder.AttemptBuild();
|
return builder.AttemptBuild();
|
||||||
}
|
}
|
||||||
catch (InvalidEnvironmentException ex)
|
catch (InvalidEnvironmentException ex)
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ namespace Semmle.Autobuild.Shared
|
|||||||
/// The overall design is intended to be extensible so that in theory,
|
/// The overall design is intended to be extensible so that in theory,
|
||||||
/// it should be possible to add new build rules without touching this code.
|
/// it should be possible to add new build rules without touching this code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class Autobuilder<TAutobuildOptions> : IAutobuilder<TAutobuildOptions> where TAutobuildOptions : AutobuildOptionsShared
|
public abstract class Autobuilder<TAutobuildOptions> : IDisposable, IAutobuilder<TAutobuildOptions> where TAutobuildOptions : AutobuildOptionsShared
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Full file paths of files found in the project directory, as well as
|
/// Full file paths of files found in the project directory, as well as
|
||||||
@@ -351,6 +351,20 @@ namespace Semmle.Autobuild.Shared
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing)
|
||||||
|
{
|
||||||
|
diagnostics.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Value of CODEQL_EXTRACTOR_<LANG>_ROOT environment variable.
|
/// Value of CODEQL_EXTRACTOR_<LANG>_ROOT environment variable.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
using Newtonsoft.Json.Serialization;
|
using Newtonsoft.Json.Serialization;
|
||||||
@@ -179,64 +178,4 @@ namespace Semmle.Util
|
|||||||
this.PlaintextMessage = plaintextMessage;
|
this.PlaintextMessage = plaintextMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Provides the ability to write diagnostic messages to some output.
|
|
||||||
/// </summary>
|
|
||||||
public interface IDiagnosticsWriter
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Adds <paramref name="message" /> as a new diagnostics entry.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The diagnostics entry to add.</param>
|
|
||||||
void AddEntry(DiagnosticMessage message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A wrapper around an underlying <see cref="StreamWriter" /> which allows
|
|
||||||
/// <see cref="DiagnosticMessage" /> objects to be serialized to it.
|
|
||||||
/// </summary>
|
|
||||||
public sealed class DiagnosticsStream : IDiagnosticsWriter, IDisposable
|
|
||||||
{
|
|
||||||
private readonly JsonSerializer serializer;
|
|
||||||
private readonly StreamWriter writer;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initialises a new <see cref="DiagnosticsStream" /> for a file at <paramref name="path" />.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="path">The path to the file that should be created.</param>
|
|
||||||
public DiagnosticsStream(string path)
|
|
||||||
{
|
|
||||||
this.writer = File.CreateText(path);
|
|
||||||
|
|
||||||
var contractResolver = new DefaultContractResolver
|
|
||||||
{
|
|
||||||
NamingStrategy = new CamelCaseNamingStrategy()
|
|
||||||
};
|
|
||||||
|
|
||||||
serializer = new JsonSerializer
|
|
||||||
{
|
|
||||||
ContractResolver = contractResolver,
|
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds <paramref name="message" /> as a new diagnostics entry.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">The diagnostics entry to add.</param>
|
|
||||||
public void AddEntry(DiagnosticMessage message)
|
|
||||||
{
|
|
||||||
serializer.Serialize(writer, message);
|
|
||||||
writer.Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases all resources used by the <see cref="DiagnosticsStream" /> object.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
writer.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Semmle.Util
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A wrapper around an underlying <see cref="StreamWriter" /> which allows
|
||||||
|
/// <see cref="DiagnosticMessage" /> objects to be serialized to it.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class DiagnosticsStream : IDiagnosticsWriter
|
||||||
|
{
|
||||||
|
private readonly JsonSerializer serializer;
|
||||||
|
private readonly StreamWriter writer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialises a new <see cref="DiagnosticsStream" /> for a file at <paramref name="path" />.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">The path to the file that should be created.</param>
|
||||||
|
public DiagnosticsStream(string path)
|
||||||
|
{
|
||||||
|
this.writer = File.CreateText(path);
|
||||||
|
|
||||||
|
var contractResolver = new DefaultContractResolver
|
||||||
|
{
|
||||||
|
NamingStrategy = new CamelCaseNamingStrategy()
|
||||||
|
};
|
||||||
|
|
||||||
|
serializer = new JsonSerializer
|
||||||
|
{
|
||||||
|
ContractResolver = contractResolver,
|
||||||
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds <paramref name="message" /> as a new diagnostics entry.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">The diagnostics entry to add.</param>
|
||||||
|
public void AddEntry(DiagnosticMessage message)
|
||||||
|
{
|
||||||
|
serializer.Serialize(writer, message);
|
||||||
|
writer.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Releases all resources used by the <see cref="DiagnosticsStream" /> object.
|
||||||
|
/// </summary>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Semmle.Util
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides the ability to write diagnostic messages to some output.
|
||||||
|
/// </summary>
|
||||||
|
public interface IDiagnosticsWriter : IDisposable
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Adds <paramref name="message" /> as a new diagnostics entry.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">The diagnostics entry to add.</param>
|
||||||
|
void AddEntry(DiagnosticMessage message);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user