Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5643 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61pull/1/head
14 changed files with 301 additions and 230 deletions
@ -1,2 +1,4 @@ |
|||||||
%windir%\microsoft.net\framework\v4.0.30128\msbuild /m SharpDevelop.sln /t:clean "/p:Platform=Any CPU" |
%windir%\microsoft.net\framework\v4.0.30128\msbuild /m SharpDevelop.sln /t:clean "/p:Platform=Any CPU" /p:Configuration=Debug |
||||||
|
@IF %ERRORLEVEL% NEQ 0 PAUSE |
||||||
|
%windir%\microsoft.net\framework\v4.0.30128\msbuild /m SharpDevelop.sln /t:clean "/p:Platform=Any CPU" /p:Configuration=Release |
||||||
@IF %ERRORLEVEL% NEQ 0 PAUSE |
@IF %ERRORLEVEL% NEQ 0 PAUSE |
@ -0,0 +1,136 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <author name="Daniel Grunwald"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using ICSharpCode.Core; |
||||||
|
using Microsoft.Build.Framework; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Project |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Interface for elements in /SharpDevelop/MSBuildEngine/LoggerFilters
|
||||||
|
/// </summary>
|
||||||
|
public interface IMSBuildLoggerFilter |
||||||
|
{ |
||||||
|
IMSBuildChainedLoggerFilter CreateFilter(MSBuildEngine engine, IMSBuildChainedLoggerFilter nextFilter); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Element in the logger filter chain.
|
||||||
|
/// Receives build events and errors and forwards them to the next element in the chain (possibly after modifying the event).
|
||||||
|
/// </summary>
|
||||||
|
public interface IMSBuildChainedLoggerFilter |
||||||
|
{ |
||||||
|
void HandleError(BuildError error); |
||||||
|
void HandleBuildEvent(Microsoft.Build.Framework.BuildEventArgs e); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates <see cref="IMSBuildLoggerFilter"/> objects that are only
|
||||||
|
/// activated when a specific MSBuild task is running.
|
||||||
|
/// </summary>
|
||||||
|
/// <attribute name="class" use="required">
|
||||||
|
/// Name of the IMSBuildLoggerFilter class.
|
||||||
|
/// </attribute>
|
||||||
|
/// <attribute name="taskname" use="required">
|
||||||
|
/// Specifies the name of the MSBuild task that must be running for
|
||||||
|
/// this logger to be active.
|
||||||
|
/// </attribute>
|
||||||
|
/// <example>
|
||||||
|
/// <TaskBoundLoggerFilter
|
||||||
|
/// id = "FxCopLogger"
|
||||||
|
/// taskname = "FxCop"
|
||||||
|
/// class = "ICSharpCode.CodeAnalysis.FxCopLoggerFilter"/>
|
||||||
|
/// </example>
|
||||||
|
/// <usage>Only in /SharpDevelop/MSBuildEngine/LoggerFilters</usage>
|
||||||
|
/// <returns>
|
||||||
|
/// A IMSBuildLoggerFilter object that lazy-loads the specified
|
||||||
|
/// IMSBuildLoggerFilter when the specified task is running.
|
||||||
|
/// </returns>
|
||||||
|
public class TaskBoundLoggerFilterDoozer : IDoozer |
||||||
|
{ |
||||||
|
public bool HandleConditions { |
||||||
|
get { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public object BuildItem(object caller, Codon codon, System.Collections.ArrayList subItems) |
||||||
|
{ |
||||||
|
return new TaskBoundLoggerFilterDescriptor(codon); |
||||||
|
} |
||||||
|
|
||||||
|
sealed class TaskBoundLoggerFilterDescriptor : IMSBuildLoggerFilter |
||||||
|
{ |
||||||
|
internal string taskname; |
||||||
|
internal string classname; |
||||||
|
internal AddIn addIn; |
||||||
|
|
||||||
|
public TaskBoundLoggerFilterDescriptor(Codon codon) |
||||||
|
{ |
||||||
|
classname = codon.Properties["class"]; |
||||||
|
taskname = codon.Properties["taskname"]; |
||||||
|
addIn = codon.AddIn; |
||||||
|
} |
||||||
|
|
||||||
|
public IMSBuildChainedLoggerFilter CreateFilter(MSBuildEngine engine, IMSBuildChainedLoggerFilter nextFilter) |
||||||
|
{ |
||||||
|
if (nextFilter == null) |
||||||
|
throw new ArgumentNullException("nextFilter"); |
||||||
|
// Create a Filter that tracks whether the task is active.
|
||||||
|
// If active, forward to 'baseFilter', otherwise forward to 'nextFilter'.
|
||||||
|
return new TaskBoundLoggerFilter(this, engine, nextFilter); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
sealed class TaskBoundLoggerFilter : IMSBuildChainedLoggerFilter |
||||||
|
{ |
||||||
|
readonly TaskBoundLoggerFilterDescriptor desc; |
||||||
|
readonly MSBuildEngine engine; |
||||||
|
readonly IMSBuildChainedLoggerFilter nextFilter; |
||||||
|
IMSBuildChainedLoggerFilter baseFilter = null; |
||||||
|
bool insideTask = false; |
||||||
|
|
||||||
|
public TaskBoundLoggerFilter(TaskBoundLoggerFilterDescriptor desc, MSBuildEngine engine, IMSBuildChainedLoggerFilter nextFilter) |
||||||
|
{ |
||||||
|
this.desc = desc; |
||||||
|
this.engine = engine; |
||||||
|
this.nextFilter = nextFilter; |
||||||
|
} |
||||||
|
|
||||||
|
public void HandleError(BuildError error) |
||||||
|
{ |
||||||
|
if (insideTask) |
||||||
|
baseFilter.HandleError(error); |
||||||
|
else |
||||||
|
nextFilter.HandleError(error); |
||||||
|
} |
||||||
|
|
||||||
|
public void HandleBuildEvent(Microsoft.Build.Framework.BuildEventArgs e) |
||||||
|
{ |
||||||
|
TaskStartedEventArgs start = e as TaskStartedEventArgs; |
||||||
|
if (start != null && string.Equals(start.TaskName, desc.taskname, StringComparison.OrdinalIgnoreCase)) { |
||||||
|
insideTask = true; |
||||||
|
if (baseFilter == null) { |
||||||
|
IMSBuildLoggerFilter baseLoggerFilter = (IMSBuildLoggerFilter)desc.addIn.CreateObject(desc.classname); |
||||||
|
if (baseLoggerFilter != null) |
||||||
|
baseFilter = baseLoggerFilter.CreateFilter(engine, nextFilter) ?? nextFilter; |
||||||
|
else |
||||||
|
baseFilter = nextFilter; |
||||||
|
} |
||||||
|
} |
||||||
|
if (insideTask) |
||||||
|
baseFilter.HandleBuildEvent(e); |
||||||
|
else |
||||||
|
nextFilter.HandleBuildEvent(e); |
||||||
|
if (insideTask && e is TaskFinishedEventArgs) { |
||||||
|
insideTask = false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue