+ ///
+ ///
/// [CanBeNull] object Test() => null;
///
/// void UseTest() {
/// var p = Test();
/// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException'
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// [NotNull] object Foo() {
/// return null; // Warning: Possible 'null' assignment
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// [StringFormatMethod("message")]
/// void ShowError(string message, params object[] args) { /* do something */ }
///
/// void Foo() {
/// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// void Foo(string param) {
/// if (param == null)
/// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol
/// }
- ///
+ ///
+ ///
- /// public class Foo : INotifyPropertyChanged {
- /// public event PropertyChangedEventHandler PropertyChanged;
- ///
- /// [NotifyPropertyChangedInvocator]
- /// protected virtual void NotifyChanged(string propertyName) { ... }
- ///
- /// string _name;
+ ///
+ ///
+ /// public class Foo : INotifyPropertyChanged {
+ /// public event PropertyChangedEventHandler PropertyChanged;
+ ///
+ /// [NotifyPropertyChangedInvocator]
+ /// protected virtual void NotifyChanged(string propertyName) { ... }
///
- /// public string Name {
- /// get { return _name; }
- /// set { _name = value; NotifyChanged("LastName"); /* Warning */ }
- /// }
- /// }
- ///
- /// Examples of generated notifications:
- ///
- /// NotifyChanged("Property")
- /// NotifyChanged(() => Property)
- /// NotifyChanged((VM x) => x.Property)
- /// SetProperty(ref myField, value, "Property")
- ///
+ /// string _name;
+ ///
+ /// public string Name {
+ /// get { return _name; }
+ /// set { _name = value; NotifyChanged("LastName"); /* Warning */ }
+ /// }
+ /// }
+ ///
+ /// Examples of generated notifications:
+ /// Function Definition Table syntax:
- ///Function Definition Table syntax:
+ ///
+ ///
+ ///
+ /// -
+ ///
/// [ContractAnnotation("=> halt")]
/// public void TerminationMethod()
- ///
- ///
+ ///
+ ///
+ /// -
+ ///
/// [ContractAnnotation("halt <= condition: false")]
/// public void Assert(bool condition, string text) // regular assertion method
- ///
- ///
+ ///
+ ///
+ /// -
+ ///
/// [ContractAnnotation("s:null => true")]
/// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty()
- ///
- ///
+ ///
+ ///
+ /// -
+ ///
/// // A method that returns null if the parameter is null,
/// // and not null if the parameter is not null
/// [ContractAnnotation("null => null; notnull => notnull")]
/// public object Transform(object data)
- ///
- ///
+ ///
+ ///
+ /// -
+ ///
/// [ContractAnnotation("=> true, result: notnull; => false, result: null")]
/// public bool TryParse(string s, out Person result)
- ///
- ///
+ ///
+ ///
+ ///
+ ///
/// [LocalizationRequiredAttribute(true)]
/// class Foo {
/// string str = "my string"; // Warning: Localizable string
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// [CannotApplyEqualityOperator]
/// class NoEquality { }
///
@@ -300,23 +371,30 @@ public LocalizationRequiredAttribute(bool required)
/// }
/// }
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// [BaseTypeRequired(typeof(IComponent)] // Specify requirement
/// class ComponentAttribute : Attribute { }
///
/// [Component] // ComponentAttribute requires implementing IComponent interface
/// class MyComponent : IComponent { }
- ///
+ ///
+ ///
+ ///
+ ///
/// [Pure] int Multiply(int x, int y) => x * y;
///
/// void M() {
/// Multiply(123, 42); // Waring: Return value of pure method is not used
/// }
- ///
+ ///
+ ///
+ ///
+ ///
/// class Foo {
/// [ProvidesContext] IBarService _barService = ...;
///
@@ -487,22 +600,29 @@ public MustUseReturnValueAttribute([NotNull] string justification)
/// // ^ Warning: use value of '_barService' field
/// }
/// }
- ///
+ ///
+ ///
+ /// In this example, the 'forEach' method is a source template available over all values
+ /// of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block:
+ ///
/// [SourceTemplate]
/// public static void forEach<T>(this IEnumerable<T> xs) {
/// foreach (var x in xs) {
@@ -535,20 +655,23 @@ public PathReferenceAttribute([NotNull, PathReference] string basePath)
///
///
+ /// Applying the attribute on a source template method:
+ ///
/// [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")]
/// public static void forEach<T>(this IEnumerable<T> collection) {
/// foreach (var item in collection) {
@@ -556,8 +679,8 @@ internal sealed class SourceTemplateAttribute : Attribute { }
/// }
/// }
///
- /// Applying the attribute on a template method parameter:
- ///
+ /// Applying the attribute on a template method parameter:
+ ///
/// [SourceTemplate]
/// public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) {
/// /*$ var $x$Id = "$newguid$" + x.ToString();
@@ -566,34 +689,37 @@ internal sealed class SourceTemplateAttribute : Attribute { }
///
///
+ ///
+ ///
/// [ActionName("Foo")]
/// public ActionResult Login(string returnUrl) {
/// ViewBag.ReturnUrl = Url.Action("Foo"); // OK
/// return RedirectToAction("Bar"); // Error: Cannot resolve action
/// }
- ///
+ ///
+ /// +
+
+
+
+
+
+