74 lines
1.5 KiB
D
74 lines
1.5 KiB
D
module analysis.run;
|
|
|
|
import std.stdio;
|
|
import std.array;
|
|
import std.conv;
|
|
import std.algorithm;
|
|
import std.range;
|
|
import std.array;
|
|
|
|
import stdx.d.lexer;
|
|
import stdx.d.parser;
|
|
import stdx.d.ast;
|
|
|
|
import analysis.base;
|
|
import analysis.style;
|
|
import analysis.enumarrayliteral;
|
|
import analysis.pokemon;
|
|
|
|
void messageFunction(string fileName, size_t line, size_t column, string message,
|
|
bool isError)
|
|
{
|
|
writefln("%s(%d:%d)[%s]: %s", fileName, line, column,
|
|
isError ? "error" : "warn", message);
|
|
}
|
|
|
|
void syntaxCheck(File output, string[] fileNames)
|
|
{
|
|
analyze(output, fileNames, false);
|
|
}
|
|
|
|
void analyze(File output, string[] fileNames, bool staticAnalyze = true)
|
|
{
|
|
foreach (fileName; fileNames)
|
|
{
|
|
File f = File(fileName);
|
|
auto bytes = uninitializedArray!(ubyte[])(to!size_t(f.size));
|
|
f.rawRead(bytes);
|
|
auto lexer = byToken(bytes);
|
|
auto app = appender!(typeof(lexer.front)[])();
|
|
while (!lexer.empty)
|
|
{
|
|
app.put(lexer.front);
|
|
lexer.popFront();
|
|
}
|
|
|
|
foreach (message; lexer.messages)
|
|
{
|
|
messageFunction(fileName, message.line, message.column, message.message,
|
|
message.isError);
|
|
}
|
|
|
|
Module m = parseModule(app.data, fileName, &messageFunction);
|
|
|
|
if (!staticAnalyze)
|
|
return;
|
|
|
|
auto style = new StyleChecker(fileName);
|
|
style.visit(m);
|
|
|
|
auto enums = new EnumArrayLiteralCheck(fileName);
|
|
enums.visit(m);
|
|
|
|
auto pokemon = new PokemonExceptionCheck(fileName);
|
|
pokemon.visit(m);
|
|
|
|
foreach (message; sort(chain(enums.messages, style.messages,
|
|
pokemon.messages).array))
|
|
{
|
|
writeln(message);
|
|
}
|
|
}
|
|
}
|
|
|