我想找到用于在单行或文件中抑制这些消息的内置代码分析器警告消息的消息 ID 列表(请参阅此处)。我知道您可以按消息 ID 进行搜索,但首选项中的列表(请参阅此处)实际上并未显示 ID 本身。任何帮助将不胜感激,谢谢!
经过一段时间的 MATLAB API 挖掘,我找到了您想要的解决方案:
%// Obtain all definitions
msgDefinitions = com.mathworks.widgets.text.mcode.MLint.getMessageDefinitions();
%// Count definitions
numDefinitions = msgDefinitions.size();
definitionDictionary{numDefinitions,2}=[]; %//Preallocation
for ind1=1:numDefinitions
definitionDictionary{ind1,1} = char(msgDefinitions.get(ind1-1).toString());
definitionDictionary{ind1,2} = char(msgDefinitions.get(ind1-1).getTag().toString);
end
%//Optional for convenience:
definitionDictionary = sortrows(definitionDictionary,2);
Run Code Online (Sandbox Code Playgroud)
另一种解决方案(导致更长但更混乱的列表)是
allMsgs = mlint('-allmsg', filename);
Run Code Online (Sandbox Code Playgroud)
其中filename可以是任何有效的文件名。=======类别标签可以被消息中的一堆识别。
allMsgs = mlint('-allmsg', 'Untitled.m');
msgCodes = regexpi(strtrim({allMsgs.message}'),' ','split'); ...'
msgCodes = cellfun(@(v) v(1), msgCodes(:,1));
alternativeDictionary = sortrows([{allMsgs.message}' msgCodes],2);
Run Code Online (Sandbox Code Playgroud)
在 MATLAB 2014a 中,第二个解决方案产生大小为 的字典571。第一个解决方案的长度是477。一般来说,第二种解决方案提供了更多信息。
更多信息请参阅未记录的 MATLAB文章。您也可以在 SO 上查看这个问题。
以下是我如何发现第一个解决方案的一些详细信息:
代码检查器内部的工作流程如下:
MKit.class会添加 3 个选项来抑制执行以下方法的警告CodeAnalyzerUtils.class:
suppressMessage。suppressAllMessages。disableMessage。doInsertSuppression将调用该方法,并添加字符串:" %#ok<" + paramString + '>'。paramString是一个名为的私有属性fTag,它存在于子类中MLint.class并且可以使用getTag()方法访问。这些标签从何而来仍不清楚。来源(按出现顺序):
$matlabroot/java/jar/widgets.jar -> com.mathworks.widgets.text.mcode.MKit$matlabroot/java/jar/widgets.jar -> com.mathworks.widgets.text.mcode.analyzer.CodeAnalyzerUtils$matlabroot/java/jar/widgets.jar -> com.mathworks.widgets.text.mcode.analyzer.CodeAnalyzerActions