More AST classes can be printed as XML
This commit is contained in:
parent
4a9c8699a5
commit
c7424faf56
407
astprinter.d
407
astprinter.d
|
@ -458,28 +458,105 @@ class XMLPrinter : ASTVisitor
|
||||||
override void visit(ForStatement forStatement)
|
override void visit(ForStatement forStatement)
|
||||||
{
|
{
|
||||||
output.writeln("<forStatement>");
|
output.writeln("<forStatement>");
|
||||||
// TODO
|
output.writeln("<initialize>");
|
||||||
forStatement.accept(this);
|
visit(forStatement.declarationOrStatement);
|
||||||
|
output.writeln("</initialize>");
|
||||||
|
if (forStatement.test !is null)
|
||||||
|
{
|
||||||
|
output.writeln("<test>");
|
||||||
|
visit(forStatement.test);
|
||||||
|
output.writeln("</test>");
|
||||||
|
}
|
||||||
|
if (forStatement.increment !is null)
|
||||||
|
{
|
||||||
|
output.writeln("<increment>");
|
||||||
|
visit(forStatement.increment);
|
||||||
|
output.writeln("</increment>");
|
||||||
|
}
|
||||||
|
visit(forStatement.statementNoCaseNoDefault);
|
||||||
output.writeln("</forStatement>");
|
output.writeln("</forStatement>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void visit(ForeachStatement foreachStatement)
|
||||||
/***************************************************************************
|
|
||||||
* BOOKMARK
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
override void visit(Module mod)
|
|
||||||
{
|
{
|
||||||
output.writeln("<module>");
|
output.writeln("<foreachStatement type=\"", getTokenValue(
|
||||||
mod.accept(this);
|
foreachStatement.foreachType), "\">");
|
||||||
output.writeln("</module>");
|
output.writeln("</foreachStatement>");
|
||||||
}
|
}
|
||||||
|
|
||||||
override void visit(ModuleDeclaration modDec)
|
override void visit(ForeachType foreachType)
|
||||||
{
|
{
|
||||||
output.writeln("<moduleDeclaration>");
|
output.writeln("<foreachType>");
|
||||||
modDec.accept(this);
|
foreach (constructor; foreachType.typeConstructors)
|
||||||
output.writeln("</moduleDeclaration>");
|
{
|
||||||
|
output.writeln("<typeConstructor>", getTokenValue(constructor), "</typeConstructor>");
|
||||||
|
}
|
||||||
|
if (foreachType.type !is null)
|
||||||
|
visit(foreachType.type);
|
||||||
|
visit(foreachType.identifier);
|
||||||
|
output.writeln("</foreachType>");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(ForeachTypeList foreachTypeList)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"foreachTypeList");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionAttribute functionAttribute)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"functionAttribute");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionBody functionBody)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"functionBody");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionCallExpression functionCallExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"functionCallExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionCallStatement functionCallStatement)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"functionCallStatement");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionDeclaration functionDec)
|
||||||
|
{
|
||||||
|
output.writeln("<functionDeclaration line=\"", functionDec.name.line, "\">");
|
||||||
|
output.writeln("<name>", functionDec.name.value, "</name>");
|
||||||
|
if (functionDec.hasAuto)
|
||||||
|
output.writeln("<auto/>");
|
||||||
|
if (functionDec.hasRef)
|
||||||
|
output.writeln("<ref/>");
|
||||||
|
functionDec.accept(this);
|
||||||
|
output.writeln("</functionDeclaration>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(FunctionLiteralExpression functionLiteralExpression)
|
||||||
|
{
|
||||||
|
output.writeln("<functionLiteralExpression type=\"",
|
||||||
|
getTokenValue(functionLiteralExpression.functionOrDelegate), "\">");
|
||||||
|
functionLiteralExpression.accept(this);
|
||||||
|
output.writeln("</functionLiteralExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(GotoStatement gotoStatement)
|
||||||
|
{
|
||||||
|
if (gotoStatement.token.type == TokenType.default_)
|
||||||
|
output.writeln("<gotoStatement default=\"true\"/>");
|
||||||
|
else if (gotoStatement.token.type == TokenType.identifier)
|
||||||
|
output.writeln("<gotoStatement label=\"", gotoStatement.token.value, "\">");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output.writeln("<gotoStatement>");
|
||||||
|
output.writeln("<case>");
|
||||||
|
visit(gotoStatement.expression);
|
||||||
|
output.writeln("</case>");
|
||||||
|
output.writeln("</gotoStatement>");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override void visit(IdentifierChain chain)
|
override void visit(IdentifierChain chain)
|
||||||
|
@ -496,17 +573,72 @@ class XMLPrinter : ASTVisitor
|
||||||
output.writeln("</identifierList>");
|
output.writeln("</identifierList>");
|
||||||
}
|
}
|
||||||
|
|
||||||
override void visit(FunctionBody functionBody)
|
override void visit(IdentifierOrTemplateChain identifierOrTemplateChain)
|
||||||
{
|
{
|
||||||
mixin (tagAndAccept!"functionBody");
|
mixin (tagAndAccept!"identifierOrTemplateChain");
|
||||||
}
|
}
|
||||||
|
|
||||||
override void visit(FunctionDeclaration functionDec)
|
override void visit(IdentifierOrTemplateInstance identifierOrTemplateInstance)
|
||||||
{
|
{
|
||||||
output.writeln("<functionDeclaration line=\"", functionDec.name.line, "\">");
|
mixin (tagAndAccept!"identifierOrTemplateInstance");
|
||||||
output.writeln("<name>", functionDec.name.value, "</name>");
|
}
|
||||||
functionDec.accept(this);
|
|
||||||
output.writeln("</functionDeclaration>");
|
override void visit(IdentityExpression identityExpression)
|
||||||
|
{
|
||||||
|
if (identityExpression.negated)
|
||||||
|
output.writeln("<identityExpression operator=\"!is\">");
|
||||||
|
else
|
||||||
|
output.writeln("<identityExpression operator=\"is\">");
|
||||||
|
output.writeln("<left>");
|
||||||
|
visit(identityExpression.left);
|
||||||
|
output.writeln("</left>");
|
||||||
|
output.writeln("<right>");
|
||||||
|
visit(identityExpression.right);
|
||||||
|
output.writeln("</right>");
|
||||||
|
output.writeln("</identityExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(IfStatement ifStatement)
|
||||||
|
{
|
||||||
|
output.writeln("<ifStatement>");
|
||||||
|
|
||||||
|
output.writeln("<condition>");
|
||||||
|
if (ifStatement.identifier.type != TokenType.invalid)
|
||||||
|
{
|
||||||
|
if (ifStatement.type is null)
|
||||||
|
output.writeln("<auto/>");
|
||||||
|
else
|
||||||
|
visit(ifStatement.type);
|
||||||
|
visit(ifStatement.identifier);
|
||||||
|
}
|
||||||
|
visit(ifStatement.expression);
|
||||||
|
output.writeln("</condition>");
|
||||||
|
|
||||||
|
output.writeln("<then>");
|
||||||
|
visit(ifStatement.thenStatement);
|
||||||
|
output.writeln("</then>");
|
||||||
|
|
||||||
|
if (ifStatement.elseStatement !is null)
|
||||||
|
{
|
||||||
|
output.writeln("<else>");
|
||||||
|
visit(ifStatement.elseStatement);
|
||||||
|
output.writeln("</else>");
|
||||||
|
}
|
||||||
|
output.writeln("</ifStatement>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(ImportBind importBind)
|
||||||
|
{
|
||||||
|
if (importBind.right.type == TokenType.invalid)
|
||||||
|
output.writeln("<importBind symbol=\"", importBind.left, "\">");
|
||||||
|
else
|
||||||
|
output.writeln("<importBind symbol=\"", importBind.right,
|
||||||
|
"\" rename=\"", importBind.left, "\">");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(ImportBindings importBindings)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"importBindings");
|
||||||
}
|
}
|
||||||
|
|
||||||
override void visit(ImportDeclaration importDeclaration)
|
override void visit(ImportDeclaration importDeclaration)
|
||||||
|
@ -514,6 +646,60 @@ class XMLPrinter : ASTVisitor
|
||||||
mixin (tagAndAccept!"importDeclaration");
|
mixin (tagAndAccept!"importDeclaration");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void visit(ImportExpression importExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"importExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(IndexExpression indexExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"indexExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(InExpression inExpression)
|
||||||
|
{
|
||||||
|
if (inExpression.negated)
|
||||||
|
output.writeln("<inExpression operator=\"!in\">");
|
||||||
|
else
|
||||||
|
output.writeln("<inExpression operator=\"in\">");
|
||||||
|
output.writeln("<left>");
|
||||||
|
visit(inExpression.left);
|
||||||
|
output.writeln("</left>");
|
||||||
|
output.writeln("<right>");
|
||||||
|
visit(inExpression.right);
|
||||||
|
output.writeln("</right>");
|
||||||
|
output.writeln("</inExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(InStatement inStatement)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"inStatement");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(Initialize initialize)
|
||||||
|
{
|
||||||
|
if (initialize.statementNoCaseNoDefault is null)
|
||||||
|
output.writeln("<initialize/>");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output.writeln("<initialize>");
|
||||||
|
visit(initialize.statementNoCaseNoDefault);
|
||||||
|
output.writeln("</initialize>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(Initializer initializer)
|
||||||
|
{
|
||||||
|
if (initializer.nonVoidInitializer is null)
|
||||||
|
output.writeln("<initializer void=\"true\"/>");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output.writeln("<initializer>");
|
||||||
|
visit(initializer.nonVoidInitializer);
|
||||||
|
output.writeln("</initializer>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override void visit(InterfaceDeclaration interfaceDec)
|
override void visit(InterfaceDeclaration interfaceDec)
|
||||||
{
|
{
|
||||||
output.writeln("<interfaceDeclaration line=\"", interfaceDec.name.line, "\">");
|
output.writeln("<interfaceDeclaration line=\"", interfaceDec.name.line, "\">");
|
||||||
|
@ -522,6 +708,173 @@ class XMLPrinter : ASTVisitor
|
||||||
output.writeln("</interfaceDeclaration>");
|
output.writeln("</interfaceDeclaration>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void visit(Invariant invariant_)
|
||||||
|
{
|
||||||
|
output.writeln("<invariant>");
|
||||||
|
invariant_.accept(this);
|
||||||
|
output.writeln("</invariant>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(IsExpression isExpression)
|
||||||
|
{
|
||||||
|
output.writeln("<isExpression>");
|
||||||
|
visit(isExpression.type);
|
||||||
|
if (isExpression.identifier.type != TokenType.invalid)
|
||||||
|
visit(isExpression.identifier);
|
||||||
|
if (isExpression.typeSpecialization !is null)
|
||||||
|
{
|
||||||
|
if (isExpression.equalsOrColon == TokenType.colon)
|
||||||
|
output.writeln("<colon/>");
|
||||||
|
else
|
||||||
|
output.writeln("<equals/>");
|
||||||
|
visit(isExpression.typeSpecialization);
|
||||||
|
if (isExpression.templateParameterList !is null)
|
||||||
|
visit(isExpression.templateParameterList);
|
||||||
|
}
|
||||||
|
output.writeln("</isExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(KeyValuePair keyValuePair)
|
||||||
|
{
|
||||||
|
output.writeln("<keyValuePair>");
|
||||||
|
output.writeln("<key>");
|
||||||
|
visit(keyValuePair.key);
|
||||||
|
output.writeln("</key>");
|
||||||
|
output.writeln("<value>");
|
||||||
|
visit(keyValuePair.value);
|
||||||
|
output.writeln("<value>");
|
||||||
|
output.writeln("</keyValuePair>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(KeyValuePairs keyValuePairs)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"keyValuePairs");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit (LabeledStatement labeledStatement)
|
||||||
|
{
|
||||||
|
output.writeln("<labeledStatement label=\"",
|
||||||
|
labeledStatement.identifier.value ,"\">");
|
||||||
|
visit(labeledStatement.declarationOrStatement);
|
||||||
|
output.writeln("</labeledStatement>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(LambdaExpression lambdaExpression)
|
||||||
|
{
|
||||||
|
output.writeln("<lambdaExpression>");
|
||||||
|
if (lambdaExpression.functionType == TokenType.function_)
|
||||||
|
output.writeln("<function/>");
|
||||||
|
if (lambdaExpression.functionType == TokenType.delegate_)
|
||||||
|
output.writeln("<delegate/>");
|
||||||
|
lambdaExpression.accept(this);
|
||||||
|
output.writeln("</lambdaExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(LastCatch lastCatch)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"lastCatch");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(LinkageAttribute linkageAttribute)
|
||||||
|
{
|
||||||
|
if (linkageAttribute.hasPlusPlus)
|
||||||
|
output.writeln("<linkageAttribute linkage=\"c++\"/>");
|
||||||
|
else
|
||||||
|
output.writeln("<linkageAttribute linkage=\"",
|
||||||
|
linkageAttribute.identifier.value, "\"/>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MemberFunctionAttribute memberFunctionAttribute)
|
||||||
|
{
|
||||||
|
output.writeln("<memberFunctionAttribute>");
|
||||||
|
if (memberFunctionAttribute.atAttribute is null)
|
||||||
|
output.writeln(getTokenValue(memberFunctionAttribute.tokenType));
|
||||||
|
else
|
||||||
|
memberFunctionAttribute.accept(this);
|
||||||
|
output.writeln("</memberFunctionAttribute>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MixinDeclaration mixinDeclaration)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"mixinDeclaration");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MixinExpression mixinExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"mixinExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MixinTemplateDeclaration mixinTemplateDeclaration)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"mixinTemplateDeclaration");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MixinTemplateName mixinTemplateName)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"mixinTemplateName");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(Module module_)
|
||||||
|
{
|
||||||
|
output.writeln("<module>");
|
||||||
|
module_.accept(this);
|
||||||
|
output.writeln("</module>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(ModuleDeclaration moduleDeclaration)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"moduleDeclaration");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(MulExpression mulExpression)
|
||||||
|
{
|
||||||
|
output.writeln("<mulExpression operator=\"", getTokenValue(mulExpression.operator) ,"\">");
|
||||||
|
output.writeln("<left>");
|
||||||
|
mulExpression.left.accept(this);
|
||||||
|
output.writeln("</left>");
|
||||||
|
if (mulExpression.right !is null)
|
||||||
|
{
|
||||||
|
output.writeln("<right>");
|
||||||
|
mulExpression.right.accept(this);
|
||||||
|
output.writeln("</right>");
|
||||||
|
}
|
||||||
|
output.writeln("</mulExpression>");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(NewAnonClassExpression newAnonClassExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"newAnonClassExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(NewExpression newExpression)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"newExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(StatementNoCaseNoDefault statementNoCaseNoDefault)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"statementNoCaseNoDefault");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(NonVoidInitializer nonVoidInitializer)
|
||||||
|
{
|
||||||
|
mixin (tagAndAccept!"nonVoidInitializer");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(OrExpression orExpression)
|
||||||
|
{
|
||||||
|
mixin(tagAndAccept!"orExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
override void visit(OrExpression orOrExpression)
|
||||||
|
{
|
||||||
|
mixin(tagAndAccept!"orOrExpression");
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* BOOKMARK
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
override void visit(Parameters parameters)
|
override void visit(Parameters parameters)
|
||||||
{
|
{
|
||||||
mixin (tagAndAccept!"parameters");
|
mixin (tagAndAccept!"parameters");
|
||||||
|
@ -542,6 +895,16 @@ class XMLPrinter : ASTVisitor
|
||||||
output.writeln("</parameter>");
|
output.writeln("</parameter>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void visit(SingleImport singleImport)
|
||||||
|
{
|
||||||
|
if (singleImport.rename.type == TokenType.invalid)
|
||||||
|
output.writeln("<singleImport>");
|
||||||
|
else
|
||||||
|
output.writeln("<singleImport rename=\"", singleImport.rename.value, "\">");
|
||||||
|
visit(singleImport.identifierChain);
|
||||||
|
output.writeln("</singleImport>");
|
||||||
|
}
|
||||||
|
|
||||||
override void visit(StructDeclaration structDec)
|
override void visit(StructDeclaration structDec)
|
||||||
{
|
{
|
||||||
output.writeln("<structDeclaration line=\"", structDec.name.line, "\">");
|
output.writeln("<structDeclaration line=\"", structDec.name.line, "\">");
|
||||||
|
|
Loading…
Reference in New Issue