Replace libdparse in AsmStyleCheck (#75)

This commit is contained in:
Vladiwostok 2023-11-07 10:53:49 +02:00 committed by Albert24GG
parent 52b2a16e1a
commit 608e773400
2 changed files with 43 additions and 23 deletions

View File

@ -6,39 +6,58 @@
module dscanner.analysis.asm_style;
import std.stdio;
import dparse.ast;
import dparse.lexer;
import dscanner.analysis.base;
import dscanner.analysis.helpers;
import dsymbol.scope_ : Scope;
import dmd.tokens;
/**
* Checks for confusing asm expressions.
* See_also: $(LINK https://issues.dlang.org/show_bug.cgi?id=9738)
*/
final class AsmStyleCheck : BaseAnalyzer
extern (C++) class AsmStyleCheck(AST) : BaseAnalyzerDmd
{
alias visit = BaseAnalyzer.visit;
alias visit = BaseAnalyzerDmd.visit;
mixin AnalyzerInfo!"asm_style_check";
this(BaseAnalyzerArguments args)
extern (D) this(string fileName, bool skipTests = false)
{
super(args);
super(fileName, skipTests);
}
override void visit(const AsmBrExp brExp)
override void visit(AST.AsmStatement asmStatement)
{
if (brExp.asmBrExp !is null && brExp.asmBrExp.asmUnaExp !is null
&& brExp.asmBrExp.asmUnaExp.asmPrimaryExp !is null)
for (Token* token = asmStatement.tokens; token !is null; token = token.next)
{
addErrorMessage(brExp, KEY,
"This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify.");
if (isConfusingStatement(token))
{
auto lineNum = cast(ulong) token.loc.linnum;
auto charNum = cast(ulong) token.loc.charnum;
addErrorMessage(lineNum, charNum, KEY, MESSAGE);
}
}
brExp.accept(this);
}
private enum string KEY = "dscanner.confusing.brexp";
private bool isConfusingStatement(Token* token)
{
if (token.next is null)
return false;
if (token.next.next is null)
return false;
TOK tok1 = token.value;
TOK tok2 = token.next.value;
TOK tok3 = token.next.next.value;
if (tok1 == TOK.leftBracket && tok2 == TOK.int32Literal && tok3 == TOK.rightBracket)
return true;
return false;
}
private:
enum string KEY = "dscanner.confusing.brexp";
enum string MESSAGE = "This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify.";
}
unittest
@ -47,13 +66,12 @@ unittest
StaticAnalysisConfig sac = disabledConfig();
sac.asm_style_check = Check.enabled;
assertAnalyzerWarnings(q{
assertAnalyzerWarningsDMD(q{
void testAsm()
{
asm
{
mov a, someArray[1]; /+
^^^^^^^^^^^^ [warn]: This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify. +/
mov a, someArray[1]; // [warn]: This is confusing because it looks like an array index. Rewrite a[1] as [a + 1] to clarify.
add near ptr [EAX], 3;
}
}

View File

@ -785,7 +785,7 @@ unittest
config.asm_style_check = Check.enabled;
// this is done automatically by inifiled
config.filters.asm_style_check = filters.split(",");
return shouldRun!AsmStyleCheck(moduleName, config);
return moduleName.shouldRunDmd!(AsmStyleCheck!ASTCodegen)(config);
}
// test inclusion
@ -828,10 +828,6 @@ private BaseAnalyzer[] getAnalyzersForModuleAndConfig(string fileName,
moduleScope
);
if (moduleName.shouldRun!AsmStyleCheck(analysisConfig))
checks ~= new AsmStyleCheck(args.setSkipTests(
analysisConfig.asm_style_check == Check.skipTests && !ut));
if (moduleName.shouldRun!CommaExpressionCheck(analysisConfig))
checks ~= new CommaExpressionCheck(args.setSkipTests(
analysisConfig.comma_expression_check == Check.skipTests && !ut));
@ -1342,6 +1338,12 @@ MessageSet analyzeDmd(string fileName, ASTCodegen.Module m, const char[] moduleN
config.useless_assert_check == Check.skipTests && !ut
);
if (moduleName.shouldRunDmd!(AsmStyleCheck!ASTCodegen)(config))
visitors ~= new AsmStyleCheck!ASTCodegen(
fileName,
config.asm_style_check == Check.skipTests && !ut
);
foreach (visitor; visitors)
{
m.accept(visitor);