forked from dotnet/sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DiagnosticsHelper.cs
153 lines (136 loc) · 5.8 KB
/
DiagnosticsHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Collections.Generic;
namespace Microsoft.NET.Build.Tasks
{
/// <summary>
/// Writes diagnostic messages to the task log and creates diagnostic task items
/// that can be returned from a task
/// </summary>
internal sealed class DiagnosticsHelper
{
private readonly List<ITaskItem> _diagnosticMessages = new List<ITaskItem>();
private readonly TaskLoggingHelper _log;
public DiagnosticsHelper(TaskLoggingHelper log)
{
_log = log;
}
public ITaskItem[] GetDiagnosticMessages() => _diagnosticMessages.ToArray();
public ITaskItem Add(string diagnosticCode, string message, string filePath, DiagnosticMessageSeverity severity)
=> Add(diagnosticCode, message, filePath, severity, startLine: 1, startColumn: 0);
public ITaskItem Add(string diagnosticCode, string message, string filePath, DiagnosticMessageSeverity severity, int startLine, int startColumn)
=> Add(
diagnosticCode,
message,
filePath,
severity,
startLine,
startColumn,
targetFrameworkMoniker: null,
packageId: null);
public ITaskItem Add(
string diagnosticCode,
string message,
string filePath,
DiagnosticMessageSeverity severity,
int startLine,
int startColumn,
string targetFrameworkMoniker,
string packageId,
bool logToMSBuild = true)
=> Add(
diagnosticCode,
message,
filePath,
severity,
startLine,
startColumn,
endLine: startLine,
endColumn: startColumn,
targetFrameworkMoniker: targetFrameworkMoniker,
packageId: packageId,
logToMSBuild: logToMSBuild);
public ITaskItem Add(
string diagnosticCode,
string message,
string filePath,
DiagnosticMessageSeverity severity,
int startLine,
int startColumn,
int endLine,
int endColumn,
string targetFrameworkMoniker,
string packageId,
bool logToMSBuild = true)
{
string itemspec =
(string.IsNullOrEmpty(targetFrameworkMoniker) ? string.Empty : $"{targetFrameworkMoniker}/") +
(string.IsNullOrEmpty(packageId) ? string.Empty : $"{packageId}/") +
diagnosticCode;
var diagnostic = new TaskItem(itemspec, new Dictionary<string, string>
{
{ MetadataKeys.DiagnosticCode, diagnosticCode },
{ MetadataKeys.Message, message },
{ MetadataKeys.FilePath, filePath ?? string.Empty },
{ MetadataKeys.Severity, severity.ToString() },
{ MetadataKeys.StartLine, startLine.ToString() },
{ MetadataKeys.StartColumn, startColumn.ToString() },
{ MetadataKeys.EndLine, endLine.ToString() },
{ MetadataKeys.EndColumn, endColumn.ToString() },
{ MetadataKeys.ParentTarget, targetFrameworkMoniker ?? string.Empty },
{ MetadataKeys.ParentPackage, packageId ?? string.Empty },
});
_diagnosticMessages.Add(diagnostic);
if (logToMSBuild)
{
LogToMSBuild(diagnosticCode, message, filePath, severity, startLine, startColumn, endLine, endColumn);
}
return diagnostic;
}
private void LogToMSBuild(string diagnosticCode, string message, string filePath, DiagnosticMessageSeverity severity, int startLine, int startColumn, int endLine, int endColumn)
{
switch (severity)
{
case DiagnosticMessageSeverity.Error:
_log.LogError(
subcategory: null,
errorCode: diagnosticCode,
helpKeyword: null,
file: filePath,
lineNumber: startLine,
columnNumber: startColumn,
endLineNumber: endLine,
endColumnNumber: endColumn,
message: message);
break;
case DiagnosticMessageSeverity.Warning:
_log.LogWarning(
subcategory: null,
warningCode: diagnosticCode,
helpKeyword: null,
file: filePath,
lineNumber: startLine,
columnNumber: startColumn,
endLineNumber: endLine,
endColumnNumber: endColumn,
message: message);
break;
case DiagnosticMessageSeverity.Info:
_log.LogMessage(
subcategory: null,
code: diagnosticCode,
helpKeyword: null,
file: filePath,
lineNumber: startLine,
columnNumber: startColumn,
endLineNumber: endLine,
endColumnNumber: endColumn,
importance: MessageImportance.Normal,
message: message);
break;
}
}
}
}