Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Embed source file from CodeTaskFactory and RoslynCodeTaskFactory in binlog #9746

Merged
merged 71 commits into from
Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from 65 commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
29f8489
embed source file from CodeTaskFactory and RoslynCodeTaskFactory in b…
surayya-MS Feb 15, 2024
da93ecd
remove Shouldly from CodeTaskFactoryTests
surayya-MS Feb 15, 2024
5f08399
Revert "remove Shouldly from CodeTaskFactoryTests"
surayya-MS Feb 15, 2024
693a612
moved unit test for RoslynCodeTaskFactory
surayya-MS Feb 15, 2024
37a21d9
small fix
surayya-MS Feb 15, 2024
76f1a4b
Update src/Tasks.UnitTests/RoslynCodeTaskFactory_Tests.cs
surayya-MS Feb 15, 2024
d96df3c
make SourceFilePath nullable
surayya-MS Feb 15, 2024
488dd86
log source file in case of compilation failure too
surayya-MS Feb 15, 2024
bfa5c54
fix
surayya-MS Feb 16, 2024
2a2eabc
add tests for case when source file fails to compile
surayya-MS Feb 16, 2024
faafcc4
fix
surayya-MS Feb 16, 2024
448aba8
fix spaces
surayya-MS Feb 16, 2024
4e6191c
fix formatting
surayya-MS Feb 16, 2024
601d3d1
remove RoslynCodeTaskFactory tests to see if Windows Core and Windows…
surayya-MS Feb 16, 2024
aea4ee7
remove CodeTaskFactory tests to see if Windows Core and Windos Full f…
surayya-MS Feb 16, 2024
8021d78
Revert "remove CodeTaskFactory tests to see if Windows Core and Windo…
surayya-MS Feb 16, 2024
9ba7906
Revert "remove RoslynCodeTaskFactory tests to see if Windows Core and…
surayya-MS Feb 16, 2024
9a55dd9
Reapply "remove CodeTaskFactory tests to see if Windows Core and Wind…
surayya-MS Feb 16, 2024
cf859ea
test if binary logger in ObjectModelHelpers is the problem
surayya-MS Feb 16, 2024
6477957
Revert "test if binary logger in ObjectModelHelpers is the problem"
surayya-MS Feb 16, 2024
1ca25d6
Revert "Reapply "remove CodeTaskFactory tests to see if Windows Core …
surayya-MS Feb 16, 2024
938a05f
fix pipeline problem
surayya-MS Feb 21, 2024
d121f3f
Merge branch 'main' of https://github.com/surayya-MS/msbuild
surayya-MS Feb 21, 2024
b6100f6
Merge branch 'main' into embe-file-from-CodeTaskFactory
surayya-MS Feb 21, 2024
a2d5f70
Convert to raw strings
rainersigwald Feb 21, 2024
d66abaf
Use test environment
rainersigwald Feb 21, 2024
e43ec80
change CodeTaskFactoryTests to be similar to RoslynCodeTaskFactory tests
surayya-MS Feb 22, 2024
f5b5be8
Update src/Tasks.UnitTests/RoslynCodeTaskFactory_Tests.cs
surayya-MS Feb 22, 2024
a3e4643
Update src/Tasks.UnitTests/RoslynCodeTaskFactory_Tests.cs
surayya-MS Feb 22, 2024
198da60
Update src/Tasks.UnitTests/RoslynCodeTaskFactory_Tests.cs
surayya-MS Feb 22, 2024
a5e8f15
Update src/Tasks.UnitTests/RoslynCodeTaskFactory_Tests.cs
surayya-MS Feb 22, 2024
d2317eb
Merge branch 'embe-file-from-CodeTaskFactory' of https://github.com/s…
surayya-MS Feb 22, 2024
19d0f05
make IHasSourceFilePath internal
surayya-MS Feb 22, 2024
66f1ad0
small fix
surayya-MS Feb 22, 2024
68d4f77
small fix
surayya-MS Feb 22, 2024
3482412
rename file
surayya-MS Feb 22, 2024
b0dde8e
remove unnecessary variable
surayya-MS Feb 22, 2024
3576fb0
embed generated files from CodeTaskFactory and RoslynCodeTaskFactory …
surayya-MS Feb 22, 2024
977fe93
Merge branch 'main' of https://github.com/surayya-MS/msbuild
surayya-MS Mar 6, 2024
e76dfd9
Merge branch 'main' into embe-file-from-CodeTaskFactory
surayya-MS Mar 6, 2024
24ad7ef
log file from memory in binlog
surayya-MS Mar 7, 2024
218ff2a
add summary for LogIncludeGeneratedFile
surayya-MS Mar 7, 2024
42ed5ea
small fix
surayya-MS Mar 7, 2024
9f200a0
rename variable and add summary
surayya-MS Mar 7, 2024
219ba79
move using static to the end
surayya-MS Mar 8, 2024
23a4dbc
small fix
surayya-MS Mar 11, 2024
907a293
use ExtendedBuildMessageEventArgs instead of a custom created event
surayya-MS Mar 11, 2024
d1b9cbd
set message importance
surayya-MS Mar 11, 2024
cbd7e0b
use different constructor ExtendedBuildMessageEventArgs
surayya-MS Mar 11, 2024
4f358f7
fix linux and macos tests
surayya-MS Mar 12, 2024
2618a02
use new custom event ResponseGeneratedFileEventArgs
surayya-MS Mar 15, 2024
503894a
1. embed the compilation file as {projectDirectory}/{guid}-{taskName}…
surayya-MS Mar 18, 2024
1f5d3cc
remove unnessesary usings from tests
surayya-MS Mar 18, 2024
a803d68
add summary for projectDirectory
surayya-MS Mar 18, 2024
1809224
fix test
surayya-MS Mar 18, 2024
f71f22d
rename new event to GeneratedFileUsedEventArgs;
surayya-MS Mar 19, 2024
7f56f40
remove IHasProjectFullPath and instead get the project directory from…
surayya-MS Mar 19, 2024
06e4f59
rename GeneratedFileUsedEventArgs properties
surayya-MS Mar 19, 2024
d1d1f9b
rename variables
surayya-MS Mar 19, 2024
22d8da2
rename property
surayya-MS Mar 19, 2024
dd444c6
Add summaries for GeneratedFileUsedEventArgs properties
surayya-MS Mar 19, 2024
c9b98f1
fix typo in variable name
surayya-MS Mar 19, 2024
7a27083
fix
surayya-MS Mar 19, 2024
fb7031f
remove Serializable attribute from GeneratedFileUsedEventArgs
surayya-MS Mar 20, 2024
0f612d5
Revert "remove Serializable attribute from GeneratedFileUsedEventArgs"
surayya-MS Mar 20, 2024
2133ebc
move serialization logic to WriteToStream/CreateFromStream in Generat…
surayya-MS Mar 20, 2024
9d80c28
Merge branch 'main' of https://github.com/surayya-MS/msbuild
surayya-MS Mar 20, 2024
a1f9cef
Merge branch 'main' into embe-file-from-CodeTaskFactory
surayya-MS Mar 20, 2024
95b1d5b
add serialazible back
surayya-MS Mar 20, 2024
17a0b09
add serialization/desirialization test for GeneratedFileUsedEventArgs
surayya-MS Mar 20, 2024
ac256be
remove serializable attribute from GeneratedFileUsedEventArgs;
surayya-MS Mar 20, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Build.UnitTests/BuildEventArgsSerialization_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,15 @@ public void RoundtripResponseFileUsedEventArgs()
e => e.ResponseFilePath);
}

[Fact]
public void RoundtripGeneratedFileUsedEventArgs()
{
var args = new GeneratedFileUsedEventArgs("MSBuild.rsp", "");
Roundtrip(args,
e => e.FilePath,
e => e.Content);
}

[Fact]
public void RoundtripCriticalBuildMessageEventArgs()
{
Expand Down
1 change: 1 addition & 0 deletions src/Build/Logging/BinaryLogger/BinaryLogRecordKind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public enum BinaryLogRecordKind
String,
TaskParameter,
ResponseFileUsed,
GeneratedFileUsed,
AssemblyLoad,
}
}
9 changes: 8 additions & 1 deletion src/Build/Logging/BinaryLogger/BinaryLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,16 @@ public sealed class BinaryLogger : ILogger
// - Making ProjectStartedEventArgs, ProjectEvaluationFinishedEventArgs, AssemblyLoadBuildEventArgs equal
// between de/serialization roundtrips.
// - Adding serialized events lengths - to support forward compatible reading
// version 19:
// - new record kind: GeneratedFileUsedEventArgs

// This should be never changed.
// The minimum version of the binary log reader that can read log of above version.
internal const int ForwardCompatibilityMinimalVersion = 18;

// The current version of the binary log representation.
// Changes with each update of the binary log format.
internal const int FileFormatVersion = 18;
internal const int FileFormatVersion = 19;

// The minimum version of the binary log reader that can read log of above version.
// This should be changed only when the binary log format is changed in a way that would prevent it from being
Expand Down Expand Up @@ -364,6 +366,11 @@ private void CollectImports(BuildEventArgs e)
{
projectImportsCollector.AddFile(responseFileArgs.ResponseFilePath);
}
else if (e is GeneratedFileUsedEventArgs generatedFileUsedEventArgs && generatedFileUsedEventArgs.FilePath != null)
{
string fullPath = Path.GetFullPath(generatedFileUsedEventArgs.FilePath);
projectImportsCollector.AddFileFromMemory(fullPath, generatedFileUsedEventArgs.Content);
}
}

/// <summary>
Expand Down
18 changes: 18 additions & 0 deletions src/Build/Logging/BinaryLogger/BuildEventArgsReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ void HandleError(FormatErrorMessage msgFactory, bool noThrow, ReaderErrorType re
BinaryLogRecordKind.TargetSkipped => ReadTargetSkippedEventArgs(),
BinaryLogRecordKind.EnvironmentVariableRead => ReadEnvironmentVariableReadEventArgs(),
BinaryLogRecordKind.ResponseFileUsed => ReadResponseFileUsedEventArgs(),
BinaryLogRecordKind.GeneratedFileUsed => ReadGeneratedFileUsedEventArgs(),
BinaryLogRecordKind.PropertyReassignment => ReadPropertyReassignmentEventArgs(),
BinaryLogRecordKind.UninitializedPropertyRead => ReadUninitializedPropertyReadEventArgs(),
BinaryLogRecordKind.PropertyInitialValueSet => ReadPropertyInitialValueSetEventArgs(),
Expand Down Expand Up @@ -1112,6 +1113,23 @@ private BuildEventArgs ReadResponseFileUsedEventArgs()
return e;
}

private BuildEventArgs ReadGeneratedFileUsedEventArgs()
{
var fields = ReadBuildEventArgsFields();

string? filePath = ReadDeduplicatedString();
string? content = ReadDeduplicatedString();

if (filePath != null && content != null)
{
var e = new GeneratedFileUsedEventArgs(filePath, content);
SetCommonFields(e, fields);
return e;
}

return new GeneratedFileUsedEventArgs();
}

private BuildEventArgs ReadPropertyReassignmentEventArgs()
{
var fields = ReadBuildEventArgsFields(readImportance: true);
Expand Down
8 changes: 8 additions & 0 deletions src/Build/Logging/BinaryLogger/BuildEventArgsWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,7 @@ private BinaryLogRecordKind Write(BuildMessageEventArgs e)
switch (e)
{
case ResponseFileUsedEventArgs responseFileUsed: return Write(responseFileUsed);
case GeneratedFileUsedEventArgs generatedFileUsed: return Write(generatedFileUsed);
case TaskParameterEventArgs taskParameter: return Write(taskParameter);
case ProjectImportedEventArgs projectImported: return Write(projectImported);
case TargetSkippedEventArgs targetSkipped: return Write(targetSkipped);
Expand Down Expand Up @@ -554,6 +555,13 @@ private BinaryLogRecordKind Write(ResponseFileUsedEventArgs e)
WriteDeduplicatedString(e.ResponseFilePath);
return BinaryLogRecordKind.ResponseFileUsed;
}
private BinaryLogRecordKind Write(GeneratedFileUsedEventArgs e)
{
WriteMessageFields(e);
WriteDeduplicatedString(e.FilePath);
WriteDeduplicatedString(e.Content);
return BinaryLogRecordKind.GeneratedFileUsed;
}
private BinaryLogRecordKind Write(TaskCommandLineEventArgs e)
{
WriteMessageFields(e, writeMessage: false, writeImportance: true);
Expand Down
39 changes: 39 additions & 0 deletions src/Framework/GeneratedFileUsedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;

namespace Microsoft.Build.Framework
{
/// <summary>
/// Arguments for the generated file used event
/// </summary>
[Serializable]
surayya-MS marked this conversation as resolved.
Show resolved Hide resolved
public class GeneratedFileUsedEventArgs : BuildMessageEventArgs
{
public GeneratedFileUsedEventArgs()
{
}

/// <summary>
/// Initializes a new instance of the <see cref="GeneratedFileUsedEventArgs"/> class.
/// </summary>
///
public GeneratedFileUsedEventArgs(string filePath, string content)
: base("", null, null, MessageImportance.Low)
{
FilePath = filePath;
Content = content;
}

/// <summary>
/// The file path relative to the current project.
/// </summary>
public string? FilePath { set; get; }

/// <summary>
/// The content of the file.
/// </summary>
public string? Content { set; get; }
}
}
1 change: 1 addition & 0 deletions src/MSBuildTaskHost/MSBuildTaskHost.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
</Compile>
<Compile Include="..\Framework\AssemblyUtilities.cs" />
<Compile Include="..\Framework\ResponseFileUsedEventArgs.cs" />
<Compile Include="..\Framework\GeneratedFileUsedEventArgs.cs" />
<Compile Include="..\Shared\BufferedReadStream.cs" />
<Compile Include="..\Shared\CollectionHelpers.cs" />
<Compile Include="..\Shared\CopyOnWriteDictionary.cs">
Expand Down
49 changes: 49 additions & 0 deletions src/Shared/LogMessagePacketBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,11 @@ internal enum LoggingEventType : int
/// Event is <see cref="ExtendedCriticalBuildMessageEventArgs"/>
/// </summary>
ExtendedCriticalBuildMessageEvent = 33,

/// <summary>
/// Event is a <see cref="GeneratedFileUsedEventArgs"/>
/// </summary>
GeneratedFileUsedEvent = 34,
}
#endregion

Expand Down Expand Up @@ -590,6 +595,8 @@ private BuildEventArgs GetBuildEventArgFromId()
LoggingEventType.TaskCommandLineEvent => new TaskCommandLineEventArgs(null, null, MessageImportance.Normal),
LoggingEventType.EnvironmentVariableReadEvent => new EnvironmentVariableReadEventArgs(),
LoggingEventType.ResponseFileUsedEvent => new ResponseFileUsedEventArgs(null),
LoggingEventType.GeneratedFileUsedEvent => new GeneratedFileUsedEventArgs(),

#if !TASKHOST // MSBuildTaskHost is targeting Microsoft.Build.Framework.dll 3.5
LoggingEventType.AssemblyLoadEvent => new AssemblyLoadBuildEventArgs(),
LoggingEventType.TaskParameterEvent => new TaskParameterEventArgs(0, null, null, true, default),
Expand Down Expand Up @@ -762,6 +769,10 @@ private LoggingEventType GetLoggingEventId(BuildEventArgs eventArg)
{
return LoggingEventType.ResponseFileUsedEvent;
}
else if (eventType == typeof(GeneratedFileUsedEventArgs))
{
return LoggingEventType.GeneratedFileUsedEvent;
}
else
{
return LoggingEventType.CustomEvent;
Expand Down Expand Up @@ -804,6 +815,9 @@ private void WriteEventToStream(BuildEventArgs buildEvent, LoggingEventType even
case LoggingEventType.ResponseFileUsedEvent:
WriteResponseFileUsedEventToStream((ResponseFileUsedEventArgs)buildEvent, translator);
break;
case LoggingEventType.GeneratedFileUsedEvent:
WriteGeneratedFileUsedEventToStream((GeneratedFileUsedEventArgs)buildEvent, translator);
break;
surayya-MS marked this conversation as resolved.
Show resolved Hide resolved
case LoggingEventType.TaskCommandLineEvent:
WriteTaskCommandLineEventToStream((TaskCommandLineEventArgs)buildEvent, translator);
break;
Expand Down Expand Up @@ -938,6 +952,23 @@ private void WriteResponseFileUsedEventToStream(ResponseFileUsedEventArgs respon
#endif
}

/// <summary>
/// Write a response generated file used log message into the translator
/// </summary>
private void WriteGeneratedFileUsedEventToStream(GeneratedFileUsedEventArgs generatedFileUsedEventArgs, ITranslator translator)
{
string filePath = generatedFileUsedEventArgs.FilePath;
string content = generatedFileUsedEventArgs.Content;

translator.Translate(ref filePath);
translator.Translate(ref content);

#if !CLR2COMPATIBILITY
DateTime timestamp = generatedFileUsedEventArgs.RawTimestamp;
translator.Translate(ref timestamp);
#endif
}

#if !TASKHOST && !MSBUILDENTRYPOINTEXE
private void WriteProjectEvaluationStartedEventToStream(ProjectEvaluationStartedEventArgs args, ITranslator translator)
{
Expand Down Expand Up @@ -1174,6 +1205,7 @@ private BuildEventArgs ReadEventFromStream(LoggingEventType eventType, ITranslat
LoggingEventType.BuildErrorEvent => ReadTaskBuildErrorEventFromStream(translator, message, helpKeyword, senderName),
LoggingEventType.BuildMessageEvent => ReadBuildMessageEventFromStream(translator, message, helpKeyword, senderName),
LoggingEventType.ResponseFileUsedEvent => ReadResponseFileUsedEventFromStream(translator, message, helpKeyword, senderName),
LoggingEventType.GeneratedFileUsedEvent => ReadGeneratedFileUsedEventFromStream(translator, message, helpKeyword, senderName),
surayya-MS marked this conversation as resolved.
Show resolved Hide resolved
LoggingEventType.BuildWarningEvent => ReadBuildWarningEventFromStream(translator, message, helpKeyword, senderName),
LoggingEventType.EnvironmentVariableReadEvent => ReadEnvironmentVariableReadEventFromStream(translator, message, helpKeyword, senderName),
_ => null,
Expand Down Expand Up @@ -1335,6 +1367,23 @@ private ResponseFileUsedEventArgs ReadResponseFileUsedEventFromStream(ITranslato
return buildEvent;
}

private GeneratedFileUsedEventArgs ReadGeneratedFileUsedEventFromStream(ITranslator translator, string message, string helpKeyword, string senderName)
{
string filePath = String.Empty;
string content = String.Empty;
translator.Translate(ref filePath);
translator.Translate(ref content);
GeneratedFileUsedEventArgs buildEvent = new GeneratedFileUsedEventArgs(filePath, content);

#if !CLR2COMPATIBILITY
DateTime timestamp = default;
translator.Translate(ref timestamp);
buildEvent.RawTimestamp = timestamp;
#endif

return buildEvent;
}

#if !TASKHOST && !MSBUILDENTRYPOINTEXE
private ProjectEvaluationStartedEventArgs ReadProjectEvaluationStartedEventFromStream(ITranslator translator)
{
Expand Down
15 changes: 15 additions & 0 deletions src/Shared/TaskLoggingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,21 @@ public void LogMessageFromResources(MessageImportance importance, string message
#endif
}

/// <summary>
/// Logs a file generated from the given data.
/// </summary>
/// <param name="filePath">The file path relative to the currecnt project.</param>
/// <param name="content">The content of the file.</param>
public void LogIncludeGeneratedFile(string filePath, string content)
{
ErrorUtilities.VerifyThrowArgumentNull(filePath, nameof(filePath));
ErrorUtilities.VerifyThrowArgumentNull(content, nameof(content));

var e = new GeneratedFileUsedEventArgs(filePath, content);

BuildEngine.LogMessageEvent(e);
}

/// <summary>
/// Flatten the inner exception message
/// </summary>
Expand Down
Loading