#104, refact ctors and dtors + add tests

This commit is contained in:
Basile Burg 2016-12-07 08:46:51 +01:00
parent 3ad9b0f682
commit 394b96bf2a
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
1 changed files with 112 additions and 45 deletions

View File

@ -2,6 +2,8 @@ module halstead;
import
std.meta, std.algorithm.iteration, std.json, std.conv;
import
std.range: iota;
import
dparse.lexer, dparse.parser, dparse.ast, dparse.rollback_allocator;
import
@ -155,8 +157,6 @@ private final class HalsteadMetric: ASTVisitor
expr.accept(this);
}
//TODO-crefactor: function-dtor-ctor-... should use a common template
override void visit(const(FunctionDeclaration) decl)
{
beginFunction;
@ -166,54 +166,42 @@ private final class HalsteadMetric: ASTVisitor
endFunction(decl.name.text, decl.name.line);
}
override void visit(const(SharedStaticConstructor) ssc)
void visitFunction(T)(const(T) decl)
{
beginFunction;
ssc.accept(this);
endFunction("sharedStaticCtorL" ~ to!string(ssc.line), ssc.line);
decl.accept(this);
endFunction(T.stringof ~ to!string(decl.line), decl.line);
}
override void visit(const(StaticConstructor) sc)
static string funDeclString()
{
beginFunction;
sc.accept(this);
endFunction("staticCtorL" ~ to!string(sc.line), sc.line);
alias FunDecl = AliasSeq!(
SharedStaticConstructor,
StaticConstructor,
Constructor,
SharedStaticDestructor,
StaticDestructor,
Destructor,
Postblit
);
string result;
enum funDeclOverride(T) =
"override void visit(const(" ~ T.stringof ~ ") decl)
{
visitFunction(decl);
}";
foreach(i; aliasSeqOf!(iota(0,FunDecl.length)))
{
result ~= funDeclOverride!(FunDecl[i]);
}
return result;
}
override void visit(const(Constructor) sc)
{
beginFunction;
sc.accept(this);
endFunction("ctorL" ~ to!string(sc.line), sc.line);
}
override void visit(const(SharedStaticDestructor) ssc)
{
beginFunction;
ssc.accept(this);
endFunction("sharedStaticDtorL" ~ to!string(ssc.line), ssc.line);
}
override void visit(const(StaticDestructor) sc)
{
beginFunction;
sc.accept(this);
endFunction("staticDtorL" ~ to!string(sc.line), sc.line);
}
override void visit(const(Destructor) sc)
{
beginFunction;
sc.accept(this);
endFunction("dtorL" ~ to!string(sc.line), sc.line);
}
override void visit(const(Postblit) pb)
{
beginFunction;
pb.accept(this);
endFunction("postblit" ~ to!string(pb.line), pb.line);
}
mixin(funDeclString);
override void visit(const(PrimaryExpression) primary)
{
@ -464,8 +452,6 @@ private final class HalsteadMetric: ASTVisitor
static string binExprsString()
{
import std.range: iota;
alias SeqOfBinExpr = AliasSeq!(
AddExpression,
AndExpression,
@ -978,3 +964,84 @@ unittest
assert(r.operatorsKinds == 3);
}
unittest
{
Function r =
q{
this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
static this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
shared static this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
~this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
static ~this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
shared static ~this(){a = 0;}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
struct S{this(this){a = 0;}}
}.test;
assert(r.operandsKinds == 2);
assert(r.operatorsKinds == 1);
}
unittest
{
Function r =
q{
struct S{@disable this(this);}
}.test;
assert(r.operandsKinds == 0);
assert(r.operatorsKinds == 0);
}