// 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 std.d.ast; import std.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 looking = false; mixin visitTemplate!ClassDeclaration; mixin visitTemplate!InterfaceDeclaration; mixin visitTemplate!UnionDeclaration; mixin visitTemplate!StructDeclaration; override void visit(const 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(const 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); } }