VS2013与ReSharper 8.2无法识别代码合同?

时间:2014-07-19 09:36:01

标签: c# ide visual-studio-2013 resharper code-contracts

我有以下软件:

  • Visual Studio 2013 Update 2
  • 代码合约(1.6.60617.15)
  • ReSharper C#edition(8.2.0.2160)
  • ReSharper Code Contracts(1.0.0.0)

当我打开一个包含代码契约的方法时,ReSharper对合同感到困惑:

enter image description here

警告我chapter可以为空,即使合同要求它不是。也:

enter image description here

合约不变方法标记为never used。技术上是正确的,但它不应该告诉我,因为代码合同重写器使用该方法来获取有关每个不变量的信息。我如何教授ReSharper关于代码合同以纠正这两个问题?

2 个答案:

答案 0 :(得分:3)

要使其适用于Portable Class Library,请执行以下操作:

  1. ExternalAnnotations目录中创建新文件夹C:\Program Files (x86)\JetBrains\ReSharper\v8.2\Bin\;

  2. System.Diagnostics.Contracts.xml放在其中,内容如下:

    <assembly name="System.Diagnostics.Contracts">
    <member name="M:System.Diagnostics.Contracts.Contract.Assume(System.Boolean)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Assume(System.Boolean,System.String)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Assert(System.Boolean)">
        <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Assert(System.Boolean,System.String)">
        <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean,System.String)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Requires``1(System.Boolean)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Requires``1(System.Boolean,System.String)">
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Invariant(System.Boolean)">
        <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.Invariant(System.Boolean,System.String)">
        <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>condition:false=&gt;halt</argument>
        </attribute>
    </member>
    <member name="M:System.Diagnostics.Contracts.Contract.ReportFailure(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception)">
        <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
        <attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
            <argument>=&gt;halt</argument>
        </attribute>
    </member>
    <member name="T:System.Diagnostics.Contracts.ContractInvariantMethodAttribute">
        <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
    </member>
    <member name="T:System.Diagnostics.Contracts.ContractClassForAttribute">
        <attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
    </member>
    </assembly>
    
  3. 关闭所有Visual Studio实例(只是为了让ReSharper有机会重新加载注释),重新打开Visual Studio并加载所需的解决方案;

  4. 您可能需要清理ReSharper缓存(ReSharper |选项|环境|常规|清除缓存);

  5. 我还提交了a new ticket关于在ReSharper ExternalAnnotations扩展中支持此类案例的默认情况。

答案 1 :(得分:2)

我已经通过电子邮件支持与JetBrains签订合同,突然意识到了这一点。我正在使用便携式类库解决方案。我会附上我这边的电子邮件来回答这个问题,并会对那些可能在此时遇到类似问题的人提供后续回复(如果有的话)。

  

感谢您的快速回复。我现在安装了8.2.1000.4556和   将ExternalAnnotations扩展更新为8.2.1001。该   上述&#34; ReSharper代码合同1.0.0&#34;插件实际上是   叫&#34; ReSharper.ContractExtensions 0.7.51&#34;在插件页面上。我是   使用.NET 4.5,我没有定义编译符号也没有   引用任何与代码契约相关的库。

     

然而,我似乎忽略了提到我在工作   便携式类库项目。因为我没有想到这一点   可能性,我创建了一个测试我的ReSharper的测试项目   安装用。我使用了常规项目和Portable Class   图书馆项目。结果对你来说可能并不奇怪:一切   在常规项目中按预期工作,但代码合同不是   在便携式类库中得到认可。

     

因此很容易得出结论,尚未得到支持   便携式类库,或者这只是没有的东西   经过测试。我已将测试项目附加到此电子邮件中。如果你   打开&#34; Class1.cs&#34;文件在&#34; ClassLibrary1&#34;来自VS2013的项目   使用ReSharper 8.2.1更新2,您应该看到与我相同的警告   做。

     

我希望您考虑添加对这些项目类型的支持。我可以   只是想象一下,在支持中出现问题   检测,但唉,我不知道你的代码库,我也不应该尝试   猜测。我只希望你会考虑这个功能。