我正在使用 Roslyn 进行代码分析,以验证即使我有以下签名
public void MyMethod(object anObject, MyCustomObject customObject);
Run Code Online (Sandbox Code Playgroud)
我只想接收来自 MyCustomObject 的字符串(第一个)和子元素(第二个)作为参数。我对签名没有权力,无法更改。
这是我评估我的方法所做的事情(这是一个片段)
public void OnMethodInvocation(SyntaxNodeAnalysisContext context)
{
var invocation= context.Node as InvocationExpressionSyntax;
var symbol = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol;
if (symbol?.Name.ToString()== "MyMethod")
{
var parameterList = invocation.Parameters;
}
Run Code Online (Sandbox Code Playgroud)
截至目前,我可以通过属性参数 (symbol.Parameters) 操作 IParameterSymbol 对象。我没有得到的是以下内容:我已经检查了包含两个参数的结果 IEnumerable,但由于方法签名,它期望接收一个对象和一个 MyCustomObject 实例。我(目前)无法确定第一个参数确实是一个对象而不是字符串(只是一个例子,可能是其他任何东西),并且当我期待 MyCustomObject 的子级时,如果我给它一个空值,我想知道它是一个空参数。
我将感激任何能让我摆脱困境的人!
更新
以下是当我进入 ArgumentSyntax 对象时向我提供的信息类型:
ArgumentSyntax Argument exception
ContainsAnnotations: false
ContainsDiagnostics: false
ContainsDirectives: false
ContainsSkippedText: false
Expression: IdentifierNameSyntax IdentifierName exception
FullSpan: {[550..559)}
HasLeadingTrivia: false
HasStructuredTrivia: false
HasTrailingTrivia: false
IsMissing: false
IsStructuredTrivia: false …Run Code Online (Sandbox Code Playgroud) 我已经在 VS 2015 中对我的所有解决方案项目设置了代码分析,并且运行良好。在其中一个项目中,有 .ruleset 文件,所有其他项目都引用该文件作为其代码分析的规则集。现在我希望在 TeamCity 上运行相同的代码分析,TeamCity 在没有安装 VS 的情况下在 Windows Server 2012 R2 上运行。
我已经尝试/p:RunCodeAnalysis=True作为这里建议的 MSBuild 步骤的命令行参数。但是这个选项显然被忽略了,因为构建日志没有说明运行代码分析的任何内容。我没有设置 FxCop 构建步骤,因为它需要指向 .dll 文件,但我希望代码分析实际分析我的解决方案中的代码,而不是 IL。
这里提出的解决方案是唯一可能的吗?对我来说,它看起来有点像一个容易出错的 hack。
这个问题哪个@NotNull的Java注解,我应该使用?是过时的,有点基于意见。从那时起,Java 8 以及更新的 IDE 出现了。
虽然 Java 8 允许通过集成JSR 308进行类型注释,但它没有附带任何注释。来自JSR 308 解释:Josh Juneau 的 Java 类型注释:
JSR 308,Java 类型注解,已作为 Java SE 8 的一部分合并
。...
编译器检查器可以编写来验证注解的代码,通过在代码不满足某些要求时生成编译器警告来强制执行规则。Java SE 8 不提供默认的类型检查框架,但可以编写自定义注解和处理器来进行类型检查。还有很多类型检查框架可以下载,它们可以作为Java编译器的插件来检查和强制执行已经注解的类型。类型检查框架包括类型注释定义和一个或多个与编译器一起用于注释处理的可插拔模块。
仅考虑提供至少某种@CanBeNulland 的解决方案@CannotBeNull,我找到了有关以下内容的信息(可能是错误的):
org.eclipse.jdt.annotation. 其他 IDE 有各自的包。使用 JSR 308,并且仍然支持 Java 8 之前的注释。javax.annotation。使用休眠的JSR 305,它似乎没有使用 Java 8 的类型注释。尽管它没有集成到 Oracle 的 API 中,但出于某种原因它仍然使用javax域,这意味着它确实如此。org.checkerframework.checker.nullness. …我正在使用pylint进行代码分析。当我运行时,pylint我看到有关依赖项的长输出。它看起来像这样:
External dependencies
---------------------
::
example_lib (my_project.pack1.name_module)
pack1 (pack1.pack2.name_module1,pack1.pack2.name_module2,...)
\-...
... # long list of dependencies here
Run Code Online (Sandbox Code Playgroud)
如何禁用此图?有谁知道pylint config禁用External dependencies输出的一些参数?
谢谢你。
我正在使用 Visual Studio 2017 并从 StyleCop 扩展转移到 StyleCop Analyzers NuGet。经过一些麻烦,我设法让它工作。但观察到一些奇怪的事情:
如果我将项目构建设置保留为默认值(不生成 XML 文档文件),我会收到 SA0001 警告(对于关闭的文件缺少 xml 文档没有警告)。如果我选择输出 XML 文档(在 Build 选项卡上),SA0001 自然会消失,并且我会收到很多 SA160x 警告(也针对已关闭的文件)。“问题”是我还看到每个 SA1600 都有一个 CS1591。
我还可以为文本编辑器、C#、高级、启用完整解决方案分析设置 VS 选项以查看关闭文件的警告,但对于同一行代码,我仍然获得 CS1591 和 SA1600。
在我梦想的场景中,我会在没有看到 CS1591 和 SA0001 的情况下收到所有文件的 SA160x 警告。那可能吗?
验证正确的枚举值时,我抛出 ArgumentOutOfRangeException:
internal class MyClass : IMyInterface
{
private readonly MyEnum _myEnum;
public MyClass(MyEnum myEnum) => _myEnum = myEnum;
public String MyString
{
get
{
switch (_myEnum)
{
case MyEnum.A:
return "A";
case MyEnum.B:
return "B";
default:
throw new ArgumentOutOfRangeException("_myEnum");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在构建时遇到 CA2208 错误:
CA2208 方法“MyCLass.MyString.get()”将“_myEnum”作为“paramName”参数传递给“ArgumentOutOfRangeException”构造函数。将此参数替换为方法的参数名称之一。请注意,提供的参数名称应具有与方法上声明的完全相同的大小写。
我不确定为什么这条规则如此严格,因为参数必须是方法的参数之一,而且我不能使用类字段。
我正在考虑取消此警告,但我宁愿调查为什么会发出此警告。
注意:MyString 属性是 IMyInterface 的一部分,不能将此枚举值作为参数。
快速搜索但找不到任何相关信息.
我猜你们所有人都知道这Visual Studio Code Analysis是非常挑剔的,并且会对许多事情发出警告.有人知道微软自己如何做到这一点......?也就是说,如果我要在他们的程序集上运行代码分析,那么警告是否会是非常少的(也许是有正当理由的警告......?).
例如,我必须.ToString(CultureInfo.CurrentCulture)在每个数字中使用字符串转换.我可以以某种方式覆盖,.ToString()以便我不会明确地获得字符串转换中的文化消息吗?
例如,现在我必须改变每一个
myNumValue.Count.ToString();
Run Code Online (Sandbox Code Playgroud)
至
myNumValue.Count.ToString(CultureInfo.CurrentCulture);
Run Code Online (Sandbox Code Playgroud) Vim是一个不错的编辑器,我将它用于许多任务.
但是,当开始处理一个新的(可能是巨大的)代码库时,我不习惯使用它来解决代码,目的是了解事情是如何工作的.
例如,如果我想查看C++函数的使用位置,我可以:vimgrep在每个**/*.cpp文件中使用该函数,并且:copenquickfix窗口可以在每次出现时跳转到该字符串.
如果我对例如Eclipse(C++方法的调用层次结构)做同样的事情,那不仅仅是一个字符串,而是一个在对象中定义的C++方法,所以我将得到该函数的用法的精确指示(而不是也是在另一个类中定义的同名函数).
那么问题是,如何使vim成为分析代码的强大工具?
子问题:
我在我的ServiceStack项目上运行Resharper代码分析,它会警告某些未使用的服务操作的参数.这是真的.
我面临的困境是在没有参数的路线上,例如返回课程列表的简单GET请求:
[Route("/Courses","GET")]
public class ListCoursesRequest : IReturn<List<CourseResult>> {}
Run Code Online (Sandbox Code Playgroud)
然后该操作将不使用请求对象(ListCoursesRequest),从而导致此警告.
public List<CourseResult> Get(ListCoursesRequest request)
{
...
}
Run Code Online (Sandbox Code Playgroud)
警告:从不使用参数'request'.
我可以让Resharper使用忽略注释忽略警告,但我不喜欢这样乱丢我的代码.
但是因为ServiceStack根据参数路由到操作ListCoursesRequest,所以除非有不同的方法来处理无参数路由方案,否则无法将其删除.行动的一个属性可能?
我正在尝试采用最佳实践并保持清洁代码,我知道这是化妆品,我怀疑它只是我必须要忍受的东西,但我想我会问.