|
#region License
// Copyright (c) 2008, Michal Dabrowski
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
// * Neither the name of the Michal Dabrowski nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
using System.Collections.Generic;
using System.Reflection;
using PostSharp.CodeModel;
using PostSharp.CodeWeaver;
using PostSharp.Extensibility;
using PostSharp.Extensibility.Tasks;
namespace Unsealer.Weaver {
public class UnsealTask : Task, IAdviceProvider {
#region IAdviceProvider Members
public void ProvideAdvices(PostSharp.CodeWeaver.Weaver codeWeaver) {
CustomAttributeDictionaryTask task = CustomAttributeDictionaryTask.GetTask(this.Project);
IEnumerator<ICustomAttributeInstance> customAttributesEnumerator = task.GetCustomAttributesEnumerator(typeof (UnsealAttribute), false);
while (customAttributesEnumerator.MoveNext()) {
var wovenType = customAttributesEnumerator.Current.TargetElement as TypeDefDeclaration;
if ((wovenType != null) && (! wovenType.IsInterface())) {
if (wovenType.IsSealed()) {
MessageSource.MessageSink.Write(new Message(SeverityType.Error, "UNSL01", string.Format("Unsealer cannot process the type '{0}' because it is sealed. Remove either the 'sealed' keyword or the [Unseal] attribute.", wovenType.Name), "Unsealer"));
}
foreach (var method in wovenType.Methods) {
if (method.IsInstance() && method.IsNonPrivate() && (method.Name != ".ctor") && (!method.IsVirtual())) {
if (method.IsSealed()) {
MessageSource.MessageSink.Write(new Message(SeverityType.Error, "UNSL02", string.Format("Unsealer cannot process the method '{0}' in type '{1}' because it is sealed. Remove either the 'sealed' keyword from the method or the [Unseal] attribute from its declaring type.", method.Name, wovenType.Name), "Unsealer"));
}
method.Attributes |= MethodAttributes.Virtual | MethodAttributes.NewSlot;
}
}
}
}
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.