यहां रोसलिन इम्प्लीमेंटेशन है, इसलिए आप अपनी विशेषताओं को बना सकते हैं जो मक्खी पर चेतावनी या त्रुटियां देते हैं।
मैंने एक विशेषता टाइप कॉल की है, IdeMessage
जो चेतावनी उत्पन्न करने वाली विशेषता होगी:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class IDEMessageAttribute : Attribute
{
public string Message;
public IDEMessageAttribute(string message);
}
ऐसा करने के लिए आपको पहले रोसलिन एसडीके को स्थापित करना होगा और विश्लेषक के साथ एक नया वीएसआईएक्स प्रोजेक्ट शुरू करना होगा। मैंने संदेशों की तरह कुछ कम प्रासंगिक टुकड़े को छोड़ दिया है, आप यह पता लगा सकते हैं कि यह कैसे करना है। अपने विश्लेषक में आप ऐसा करते हैं
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression);
}
private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context)
{
var invocation = (InvocationExpressionSyntax)context.Node;
var methodDeclaration = (context.SemanticModel.GetSymbolInfo(invocation, context.CancellationToken).Symbol as IMethodSymbol);
//There are several reason why this may be null e.g invoking a delegate
if (null == methodDeclaration)
{
return;
}
var methodAttributes = methodDeclaration.GetAttributes();
var attributeData = methodAttributes.FirstOrDefault(attr => IsIDEMessageAttribute(context.SemanticModel, attr, typeof(IDEMessageAttribute)));
if(null == attributeData)
{
return;
}
var message = GetMessage(attributeData);
var diagnostic = Diagnostic.Create(Rule, invocation.GetLocation(), methodDeclaration.Name, message);
context.ReportDiagnostic(diagnostic);
}
static bool IsIDEMessageAttribute(SemanticModel semanticModel, AttributeData attribute, Type desiredAttributeType)
{
var desiredTypeNamedSymbol = semanticModel.Compilation.GetTypeByMetadataName(desiredAttributeType.FullName);
var result = attribute.AttributeClass.Equals(desiredTypeNamedSymbol);
return result;
}
static string GetMessage(AttributeData attribute)
{
if (attribute.ConstructorArguments.Length < 1)
{
return "This method is obsolete";
}
return (attribute.ConstructorArguments[0].Value as string);
}
इसके लिए कोई CodeFixProvider नहीं है आप इसे समाधान से निकाल सकते हैं।