added more symbol to the list

+ class/struct ctor/dtor
+ anon enum, first member used as ident
+ mixin template decl not as template but as mixin
+ test as runnable with <CFF> using the version ident automatically set by CE
+ libdparse FR: line/col for static ctor/dtor
This commit is contained in:
Basile Burg 2015-03-06 22:27:51 +01:00
parent a954f31417
commit 173acc0c8e
1 changed files with 55 additions and 18 deletions

View File

@ -24,7 +24,7 @@ void main(string[] args)
slb.visit(decl);
}
version(none)
version(runnable_module)
{
int level = -1;
void print(Symbol * s)
@ -37,12 +37,14 @@ void main(string[] args)
level--;
}
print(&slb.root);
print(slb.root);
}
else
{
auto str = slb.serialize;
write(str);
}
auto str = slb.serialize;
write(str);
slb.destruct;
}
@ -91,7 +93,7 @@ enum SymbolType
_function, // X
_interface, // X
_import, // X
_mixin,
_mixin, // X (template decl)
_struct, // X
_template, // X
_union, // X
@ -170,6 +172,7 @@ class SymbolListBuilder : ASTVisitor
static if
(
is(DT == const(EponymousTemplateDeclaration)) ||
is(DT == const(AnonymousEnumMember)) ||
is(DT == const(AliasInitializer)) ||
is(DT == const(ClassDeclaration)) ||
is(DT == const(Declarator)) ||
@ -209,21 +212,47 @@ class SymbolListBuilder : ASTVisitor
}
}
//TODO-cfeature: anonymous enum, accept visitor and add Symbol based on the 1st member name.
/// visitor implementation for special cases.
final void otherVisitorImpl(SymbolType st, string name, size_t line, size_t col)
{
count++;
auto result = construct!Symbol;
result.name = name;
result.line = cast(int) line;
result.col = cast(int) col;
result.type = st;
parent.subs ~= result;
}
final override void visit(const AliasDeclaration decl)
{
// old alias syntax not supported by this method
// why is initializers an array ?
if (decl.initializers.length == 1)
if (decl.initializers.length > 0)
namedVisitorImpl!(AliasInitializer, SymbolType._alias)(decl.initializers[0]);
}
final override void visit(const AnonymousEnumDeclaration decl)
{
if (decl.members.length > 0)
namedVisitorImpl!(AnonymousEnumMember, SymbolType._enum)(decl.members[0]);
}
final override void visit(const ClassDeclaration decl)
{
namedVisitorImpl!(ClassDeclaration, SymbolType._class)(decl);
}
final override void visit(const Constructor decl)
{
otherVisitorImpl(SymbolType._function, "this", decl.line, decl.column);
}
final override void visit(const Destructor decl)
{
otherVisitorImpl(SymbolType._function, "~this", decl.line, decl.column);
}
final override void visit(const EnumDeclaration decl)
{
namedVisitorImpl!(EnumDeclaration, SymbolType._enum)(decl);
@ -258,20 +287,17 @@ class SymbolListBuilder : ASTVisitor
modules ~= ".";
}
//
count++;
auto result = construct!Symbol;
result.name = modules[0..$-1].join;
result.line = cast(int) si.identifierChain.identifiers[0].line;
result.col = cast(int) si.identifierChain.identifiers[0].column;
result.type = SymbolType._import;
parent.subs ~= result;
otherVisitorImpl(SymbolType._import, modules[0..$-1].join,
si.identifierChain.identifiers[0].line,
si.identifierChain.identifiers[0].column
);
}
}
final override void visit(const MixinTemplateDeclaration decl)
{
namedVisitorImpl!(TemplateDeclaration, SymbolType._template)(decl.templateDeclaration);
}
namedVisitorImpl!(TemplateDeclaration, SymbolType._mixin)(decl.templateDeclaration);
}
final override void visit(const StructDeclaration decl)
{
@ -293,6 +319,17 @@ class SymbolListBuilder : ASTVisitor
foreach(elem; decl.declarators)
namedVisitorImpl!(Declarator, SymbolType._variable, false)(elem);
}
/* Disabled: line and column are not available
final override void visit(const StaticConstructor decl)
{
otherVisitorImpl(SymbolType._function, "static this", decl.line, decl.column);
}
final override void visit(const StaticDestructor decl)
{
otherVisitorImpl(SymbolType._function, "static ~this", decl.line, decl.column);
}
*/
}
//----