D-Scanner/analysis/enumarrayliteral.d

73 lines
1.7 KiB
D

// Copyright Brian Schott (Sir Alaran) 2014.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
module analysis.enumarrayliteral;
import stdx.d.ast;
import stdx.d.lexer;
import analysis.base;
void doNothing(string, size_t, size_t, string, bool) {}
class EnumArrayLiteralCheck : BaseAnalyzer
{
alias visit = BaseAnalyzer.visit;
this(string fileName)
{
super(fileName);
}
bool inAggregate = false;
bool looking = false;
template visitTemplate(T)
{
override void visit(T structDec)
{
inAggregate = true;
structDec.accept(this);
inAggregate = false;
}
}
mixin visitTemplate!ClassDeclaration;
mixin visitTemplate!InterfaceDeclaration;
mixin visitTemplate!UnionDeclaration;
mixin visitTemplate!StructDeclaration;
override void visit(Declaration dec)
{
if (inAggregate) foreach (attr; dec.attributes)
{
if (attr.storageClass !is null &&
attr.storageClass.token == tok!"enum")
{
looking = true;
}
}
dec.accept(this);
looking = false;
}
override void visit(AutoDeclaration autoDec)
{
if (looking)
{
foreach (i, initializer; autoDec.initializers)
{
if (initializer is null) continue;
if (initializer.nonVoidInitializer is null) continue;
if (initializer.nonVoidInitializer.arrayInitializer is null) continue;
addErrorMessage(autoDec.identifiers[i].line,
autoDec.identifiers[i].column, "This enum may lead to "
~ "unnecessary allocation at run-time. Use 'static immutable "
~ autoDec.identifiers[i].text ~ " = [ ...' instead.");
}
}
autoDec.accept(this);
}
}