diff --git a/dsymbol b/dsymbol index 2664939..84ed30c 160000 --- a/dsymbol +++ b/dsymbol @@ -1 +1 @@ -Subproject commit 26649393504a8617760f9c7fd99b31f0362f095e +Subproject commit 84ed30c0786c8f1f1954c79152820b79aebece13 diff --git a/libdparse b/libdparse index d928584..4d87656 160000 --- a/libdparse +++ b/libdparse @@ -1 +1 @@ -Subproject commit d928584e9e05bb003d1e378aa921899010b0a670 +Subproject commit 4d876562b4862a98bf1b6b6bf4fd07af96506a54 diff --git a/src/analysis/unmodified.d b/src/analysis/unmodified.d index 68db453..5d87749 100644 --- a/src/analysis/unmodified.d +++ b/src/analysis/unmodified.d @@ -248,9 +248,9 @@ private: if (storageClass.token == tok!"enum") return true; } - foreach (attr; dec.attributes) + foreach (sc; dec.storageClasses) { - if (attr.attribute.type == tok!"immutable" || attr.attribute.type == tok!"const") + if (sc.token == tok!"immutable" || sc.token == tok!"const") return true; } if (dec.type !is null) diff --git a/src/astprinter.d b/src/astprinter.d index d755e2f..e447fa9 100644 --- a/src/astprinter.d +++ b/src/astprinter.d @@ -11,946 +11,951 @@ import std.string; import std.array; /** - * AST visitor that outputs an XML representation of the AST to its file. - */ +* AST visitor that outputs an XML representation of the AST to its file. +*/ class XMLPrinter : ASTVisitor { - override void visit(const AddExpression addExpression) - { - output.writeln(""); - output.writeln(""); - visit(addExpression.left); - output.writeln(""); - if (addExpression.right !is null) - { - output.writeln(""); - visit(addExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const AliasDeclaration aliasDeclaration) - { - output.writeln(""); - writeDdoc(aliasDeclaration.comment); - aliasDeclaration.accept(this); - output.writeln(""); - } - - override void visit(const AlignAttribute alignAttribute) - { - output.writeln(""); - } - - override void visit(const AndAndExpression andAndExpression) - { - output.writeln(""); - output.writeln(""); - visit(andAndExpression.left); - output.writeln(""); - if (andAndExpression.right !is null) - { - output.writeln(""); - visit(andAndExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const AndExpression andExpression) - { - output.writeln(""); - output.writeln(""); - visit(andExpression.left); - output.writeln(""); - if (andExpression.right !is null) - { - output.writeln(""); - visit(andExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const AsmInstruction asmInstruction) - { - output.writeln(""); - if (asmInstruction.hasAlign) - { - output.writeln(""); - visit(asmInstruction.identifierOrIntegerOrOpcode); - output.writeln(""); - } - if (asmInstruction.asmInstruction !is null) - { - output.writeln(""); - } - - override void visit(const AssertExpression assertExpression) - { - output.writeln(""); - output.writeln(""); - assertExpression.assertion.accept(this); - output.writeln(""); - if (assertExpression.message !is null) - { - output.writeln(""); - assertExpression.message.accept(this); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const AssignExpression assignExpression) - { - if (assignExpression.expression is null) - output.writeln(""); - else - output.writeln(""); - assignExpression.accept(this); - output.writeln(""); - } - - override void visit(const AtAttribute atAttribute) - { - output.writeln(""); - if (atAttribute.identifier.type == tok!"") - atAttribute.accept(this); - else - output.writeln("", atAttribute.identifier.text, ""); - output.writeln(""); - } - - override void visit(const Attribute attribute) - { - output.writeln(""); - if (attribute.attribute == tok!"") - attribute.accept(this); - else - output.writeln(str(attribute.attribute.type)); - output.writeln(""); - } - - override void visit(const AutoDeclaration autoDec) - { - output.writeln(""); - for (size_t i = 0; i < autoDec.identifiers.length; i++) - { - output.writeln(""); - output.writeln("", - autoDec.identifiers[i].text, ""); - visit(autoDec.initializers[i]); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const BreakStatement breakStatement) - { - if (breakStatement.label.type == tok!"") - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const CaseRangeStatement caseRangeStatement) - { - output.writeln(""); - if (caseRangeStatement.low !is null) - { - output.writeln(""); - visit(caseRangeStatement.low); - output.writeln(""); - } - if (caseRangeStatement.high !is null) - { - output.writeln(""); - visit(caseRangeStatement.high); - output.writeln(""); - } - if (caseRangeStatement.declarationsAndStatements !is null) - visit(caseRangeStatement.declarationsAndStatements); - output.writeln(""); - } - - override void visit(const Catch catch_) - { - output.writeln(""); - catch_.accept(this); - output.writeln(""); - } - - override void visit(const ClassDeclaration classDec) - { - output.writeln(""); - writeName(classDec.name.text); - writeDdoc(classDec.comment); - classDec.accept(this); - output.writeln(""); - } - - override void visit(const ConditionalDeclaration conditionalDeclaration) - { - output.writeln(""); - visit(conditionalDeclaration.compileCondition); - output.writeln(""); - foreach (dec; conditionalDeclaration.trueDeclarations) - visit(dec); - output.writeln(""); - if (conditionalDeclaration.falseDeclarations.length > 0) - { - output.writeln(""); - foreach (dec; conditionalDeclaration.falseDeclarations) - visit(dec); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const ConditionalStatement conditionalStatement) - { - output.writeln(""); - visit(conditionalStatement.compileCondition); - output.writeln(""); - visit(conditionalStatement.trueStatement); - output.writeln(""); - if (conditionalStatement.falseStatement !is null) - { - output.writeln(""); - visit(conditionalStatement.falseStatement); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const ContinueStatement continueStatement) - { - if (continueStatement.label.type == tok!"") - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const DebugCondition debugCondition) - { - if (debugCondition.identifierOrInteger.type == tok!"") - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const DebugSpecification debugSpecification) - { - if (debugSpecification.identifierOrInteger.type == tok!"") - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const Declarator declarator) - { - output.writeln(""); - writeName(declarator.name.text); - writeDdoc(declarator.comment); - declarator.accept(this); - output.writeln(""); - } - - override void visit(const Deprecated deprecated_) - { - if (deprecated_.stringLiterals.length > 0) - { - output.writeln(""); - foreach (literal; deprecated_.stringLiterals) - output.writeln("", xmlEscape(literal.text), ""); - output.writeln(""); - } - else - output.writeln(""); - } - - override void visit(const EnumDeclaration enumDec) - { - output.writeln(""); - writeDdoc(enumDec.comment); - if (enumDec.name.type == tok!"identifier") - writeName(enumDec.name.text); - enumDec.accept(this); - output.writeln(""); - } - - override void visit(const AnonymousEnumMember enumMember) - { - output.writeln(""); - writeDdoc(enumMember.comment); - if (enumMember.type !is null) - visit(enumMember.type); - output.write("", enumMember.name.text, ""); - if (enumMember.assignExpression !is null) - visit(enumMember.assignExpression); - output.writeln(""); - } - - override void visit(const EnumMember enumMem) - { - output.writeln(""); - writeDdoc(enumMem.comment); - enumMem.accept(this); - output.writeln(""); - } - - override void visit(const EqualExpression equalExpression) - { - output.writeln(""); - output.writeln(""); - visit(equalExpression.left); - output.writeln(""); - output.writeln(""); - visit(equalExpression.right); - output.writeln(""); - output.writeln(""); - } - - override void visit(const Finally finally_) - { - output.writeln(""); - finally_.accept(this); - output.writeln(""); - } - - override void visit(const ForStatement forStatement) - { - output.writeln(""); - if (forStatement.initialization !is null) - { - output.writeln(""); - visit(forStatement.initialization); - output.writeln(""); - } - if (forStatement.test !is null) - { - output.writeln(""); - visit(forStatement.test); - output.writeln(""); - } - if (forStatement.increment !is null) - { - output.writeln(""); - visit(forStatement.increment); - output.writeln(""); - } - if (forStatement.declarationOrStatement !is null) - visit(forStatement.declarationOrStatement); - output.writeln(""); - } - - override void visit(const ForeachStatement foreachStatement) - { - output.writeln(""); - if (foreachStatement.foreachType !is null) - visit(foreachStatement.foreachType); - if (foreachStatement.foreachTypeList !is null) - visit(foreachStatement.foreachTypeList); - output.writeln(""); - visit(foreachStatement.low); - output.writeln(""); - if (foreachStatement.high !is null) - { - output.writeln(""); - visit(foreachStatement.high); - output.writeln(""); - } - visit(foreachStatement.declarationOrStatement); - output.writeln(""); - } - - override void visit(const ForeachType foreachType) - { - output.writeln(""); - foreach (constructor; foreachType.typeConstructors) - { - output.writeln("", str(constructor), ""); - } - if (foreachType.type !is null) - visit(foreachType.type); - visit(foreachType.identifier); - output.writeln(""); - - } - - override void visit(const FunctionDeclaration functionDec) - { - output.writeln(""); - writeName(functionDec.name.text); - writeDdoc(functionDec.comment); - if (functionDec.hasAuto) - output.writeln(""); - if (functionDec.hasRef) - output.writeln(""); - functionDec.accept(this); - output.writeln(""); - } - - override void visit(const FunctionLiteralExpression functionLiteralExpression) - { - output.writeln(""); - functionLiteralExpression.accept(this); - output.writeln(""); - } - - override void visit(const GotoStatement gotoStatement) - { - if (gotoStatement.label.type == tok!"default") - output.writeln(""); - else if (gotoStatement.label.type == tok!"identifier") - output.writeln(""); - else - { - output.writeln(""); - output.writeln(""); - if (gotoStatement.expression) - visit(gotoStatement.expression); - output.writeln(""); - output.writeln(""); - } - } - - override void visit(const IdentityExpression identityExpression) - { - if (identityExpression.negated) - output.writeln(""); - else - output.writeln(""); - output.writeln(""); - visit(identityExpression.left); - output.writeln(""); - output.writeln(""); - visit(identityExpression.right); - output.writeln(""); - output.writeln(""); - } - - override void visit(const IfStatement ifStatement) - { - output.writeln(""); - - output.writeln(""); - if (ifStatement.identifier.type != tok!"") - { - if (ifStatement.type is null) - output.writeln(""); - else - visit(ifStatement.type); - visit(ifStatement.identifier); - } - ifStatement.expression.accept(this); - output.writeln(""); - - output.writeln(""); - ifStatement.thenStatement.accept(this); - output.writeln(""); - - if (ifStatement.elseStatement !is null) - { - output.writeln(""); - ifStatement.elseStatement.accept(this); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const ImportBind importBind) - { - if (importBind.right.type == tok!"") - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const InExpression inExpression) - { - if (inExpression.negated) - output.writeln(""); - else - output.writeln(""); - output.writeln(""); - visit(inExpression.left); - output.writeln(""); - output.writeln(""); - visit(inExpression.right); - output.writeln(""); - output.writeln(""); - } - - override void visit(const Initialize initialize) - { - if (initialize.statementNoCaseNoDefault is null) - output.writeln(""); - else - { - output.writeln(""); - visit(initialize.statementNoCaseNoDefault); - output.writeln(""); - } - } - - override void visit(const Initializer initializer) - { - if (initializer.nonVoidInitializer is null) - output.writeln(""); - else - { - output.writeln(""); - visit(initializer.nonVoidInitializer); - output.writeln(""); - } - } - - override void visit(const InterfaceDeclaration interfaceDec) - { - output.writeln(""); - writeName(interfaceDec.name.text); - writeDdoc(interfaceDec.comment); - interfaceDec.accept(this); - output.writeln(""); - } - - override void visit(const Invariant invariant_) - { - output.writeln(""); - writeDdoc(invariant_.comment); - invariant_.accept(this); - output.writeln(""); - } - - override void visit(const IsExpression isExpression) - { - output.writeln(""); - visit(isExpression.type); - if (isExpression.identifier.type != tok!"") - visit(isExpression.identifier); - if (isExpression.typeSpecialization !is null) - { - if (isExpression.equalsOrColon == tok!":") - output.writeln(""); - else - output.writeln(""); - visit(isExpression.typeSpecialization); - if (isExpression.templateParameterList !is null) - visit(isExpression.templateParameterList); - } - output.writeln(""); - } - - override void visit(const KeyValuePair keyValuePair) - { - output.writeln(""); - output.writeln(""); - visit(keyValuePair.key); - output.writeln(""); - output.writeln(""); - visit(keyValuePair.value); - output.writeln(""); - output.writeln(""); - } - - override void visit (const LabeledStatement labeledStatement) - { - output.writeln(""); - visit(labeledStatement.declarationOrStatement); - output.writeln(""); - } - - override void visit(const LambdaExpression lambdaExpression) - { - output.writeln(""); - if (lambdaExpression.functionType == tok!"function") - output.writeln(""); - if (lambdaExpression.functionType == tok!"delegate") - output.writeln(""); - lambdaExpression.accept(this); - output.writeln(""); - } - - override void visit(const LinkageAttribute linkageAttribute) - { - if (linkageAttribute.hasPlusPlus) - output.writeln(""); - else - output.writeln(""); - } - - override void visit(const MemberFunctionAttribute memberFunctionAttribute) - { - output.writeln(""); - if (memberFunctionAttribute.atAttribute is null) - output.writeln(str(memberFunctionAttribute.tokenType)); - else - memberFunctionAttribute.accept(this); - output.writeln(""); - } - - override void visit(const Module module_) - { - output.writeln(""); - output.writeln(""); - module_.accept(this); - output.writeln(""); - } - - override void visit(const MulExpression mulExpression) - { - output.writeln(""); - output.writeln(""); - visit(mulExpression.left); - output.writeln(""); - if (mulExpression.right !is null) - { - output.writeln(""); - visit(mulExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const OrOrExpression orOrExpression) - { - output.writeln(""); - output.writeln(""); - visit(orOrExpression.left); - output.writeln(""); - if (orOrExpression.right !is null) - { - output.writeln(""); - visit(orOrExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const Parameter param) - { - output.writeln(""); - if (param.name.type == tok!"identifier") - writeName(param.name.text); - foreach (attribute; param.parameterAttributes) - { - output.writeln("", str(attribute), ""); - } - param.accept(this); - if (param.vararg) - output.writeln(""); - output.writeln(""); - } - - - override void visit(const PowExpression powExpression) - { - output.writeln(""); - output.writeln(""); - visit(powExpression.left); - output.writeln(""); - if (powExpression.right !is null) - { - output.writeln(""); - visit(powExpression.right); - output.writeln(""); - } - output.writeln(""); - } - - override void visit(const RelExpression relExpression) - { - output.writeln(""); - output.writeln(""); - visit(relExpression.left); - output.writeln(""); - output.writeln(""); - visit(relExpression.right); - output.writeln(""); - output.writeln(""); - } - - override void visit(const ReturnStatement returnStatement) - { - if (returnStatement.expression is null) - output.writeln(""); - else - { - output.writeln(""); - returnStatement.accept(this); - output.writeln(""); - } - } - - override void visit(const ShiftExpression shiftExpression) - { - output.writeln(""); - output.writeln(""); - visit(shiftExpression.left); - output.writeln(""); - output.writeln(""); - visit(shiftExpression.right); - output.writeln(""); - output.writeln(""); - } - - override void visit(const SingleImport singleImport) - { - if (singleImport.rename.type == tok!"") - output.writeln(""); - else - output.writeln(""); - visit(singleImport.identifierChain); - output.writeln(""); - } - - override void visit(const StructDeclaration structDec) - { - output.writeln(""); - writeName(structDec.name.text); - writeDdoc(structDec.comment); - structDec.accept(this); - output.writeln(""); - } - - override void visit(const TemplateAliasParameter templateAliasParameter) - { - output.writeln(""); - if (templateAliasParameter.type !is null) - visit(templateAliasParameter.type); - visit(templateAliasParameter.identifier); - if (templateAliasParameter.colonExpression !is null) - { - output.writeln(""); - visit(templateAliasParameter.colonExpression); - output.writeln(""); - } - else if (templateAliasParameter.colonType !is null) - { - output.writeln(""); - visit(templateAliasParameter.colonType); - output.writeln(""); - } - - if (templateAliasParameter.assignExpression !is null) - { - output.writeln(""); - visit(templateAliasParameter.assignExpression); - output.writeln(""); - } - else if (templateAliasParameter.assignType !is null) - { - output.writeln(""); - visit(templateAliasParameter.assignType); - output.writeln(""); - } - - output.writeln(""); - } - - override void visit(const TemplateDeclaration templateDeclaration) - { - writeDdoc(templateDeclaration.comment); - output.writeln(""); - writeName(templateDeclaration.name.text); - visit(templateDeclaration.templateParameters); - if (templateDeclaration.constraint !is null) - visit(templateDeclaration.constraint); - foreach (dec; templateDeclaration.declarations) - { - if (dec !is null) visit(dec); - } - output.writeln(""); - } - - override void visit(const Token token) - { - string tagName; - switch (token.type) - { - case tok!"": return; - case tok!"identifier": tagName = "identifier"; break; - case tok!"doubleLiteral": tagName = "doubleLiteral"; break; - case tok!"idoubleLiteral": tagName = "idoubleLiteral"; break; - case tok!"floatLiteral": tagName = "floatLiteral"; break; - case tok!"ifloatLiteral": tagName = "ifloatLiteral"; break; - case tok!"intLiteral": tagName = "intLiteral"; break; - case tok!"uintLiteral": tagName = "uintLiteral"; break; - case tok!"longLiteral": tagName = "longLiteral"; break; - case tok!"ulongLiteral": tagName = "ulongLiteral"; break; - case tok!"realLiteral": tagName = "realLiteral"; break; - case tok!"irealLiteral": tagName = "irealLiteral"; break; - case tok!"characterLiteral": tagName = "characterLiteral"; break; - case tok!"stringLiteral": tagName = "stringLiteral"; break; - case tok!"dstringLiteral": tagName = "dstringLiteral"; break; - case tok!"wstringLiteral": tagName = "wstringLiteral"; break; - case tok!"scriptLine": tagName = "scriptLine"; break; - case tok!"$": output.writeln(""); return; - case tok!".": output.writeln(""); return; - default: output.writeln("<", str(token.type), "/>"); return; - } - output.writeln("<", tagName, ">", xmlEscape(token.text), ""); - } - - override void visit(const Type type) - { - auto app = appender!string(); - auto formatter = new Formatter!(typeof(app))(app); - formatter.format(type); - output.writeln(""); - type.accept(this); - output.writeln(""); - } - - override void visit(const Type2 type2) - { - if (type2.builtinType != tok!"") - output.writeln("", str(type2.builtinType), ""); - else - { - output.writeln(""); - type2.accept(this); - output.writeln(""); - } - } - - override void visit(const TypeSuffix typeSuffix) - { - if (typeSuffix.star != tok!"") - output.writeln(""); - else if (typeSuffix.array) - { - if (typeSuffix.low is null && typeSuffix.type is null) - output.writeln(""); - else - { - if (typeSuffix.low is null) - { - output.writeln(""); - visit(typeSuffix.type); - output.writeln(""); - } - else - { - output.writeln(""); - if (typeSuffix.high !is null) - { - output.writeln(""); - visit(typeSuffix.low); - output.writeln(""); - output.writeln(""); - visit(typeSuffix.high); - output.writeln(""); - } - else - visit(typeSuffix.low); - output.writeln(""); - } - } - } - else - { - visit(typeSuffix.delegateOrFunction); - visit(typeSuffix.parameters); - foreach (attr; typeSuffix.memberFunctionAttributes) - { - if (attr !is null) visit(attr); - } - } - } - - override void visit(const UnaryExpression unaryExpression) - { - output.writeln(""); - if (unaryExpression.prefix != tok!"") - { - output.writeln("", xmlEscape(str(unaryExpression.prefix.type)), - ""); - unaryExpression.unaryExpression.accept(this); - } - else - { - if (unaryExpression.suffix != tok!"") - { - assert(unaryExpression.suffix.text == ""); - unaryExpression.unaryExpression.accept(this); - output.writeln("", str(unaryExpression.suffix.type), - ""); - } - else - unaryExpression.accept(this); - } - output.writeln(""); - } - - override void visit(const UnionDeclaration unionDeclaration) - { - output.writeln(""); - if (unionDeclaration.name != tok!"") - writeName(unionDeclaration.name.text); - if (unionDeclaration.templateParameters !is null) - visit(unionDeclaration.templateParameters); - if (unionDeclaration.constraint !is null) - visit(unionDeclaration.constraint); - if (unionDeclaration.structBody !is null) - visit(unionDeclaration.structBody); - output.writeln(""); - } - - override void visit(const Unittest unittest_) - { - output.writeln(""); - unittest_.accept(this); - output.writeln(""); - } - - override void visit(const VariableDeclaration variableDeclaration) - { - output.writeln(""); - writeDdoc(variableDeclaration.comment); - variableDeclaration.accept(this); - output.writeln(""); - } - - override void visit(const XorExpression xorExpression) - { - output.writeln(""); - output.writeln(""); - visit(xorExpression.left); - output.writeln(""); - if (xorExpression.right !is null) - { - output.writeln(""); - visit(xorExpression.right); - output.writeln(""); - } - output.writeln(""); - } + override void visit(const AddExpression addExpression) + { + output.writeln(""); + output.writeln(""); + visit(addExpression.left); + output.writeln(""); + if (addExpression.right !is null) + { + output.writeln(""); + visit(addExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const AliasDeclaration aliasDeclaration) + { + output.writeln(""); + writeDdoc(aliasDeclaration.comment); + aliasDeclaration.accept(this); + output.writeln(""); + } + + override void visit(const AlignAttribute alignAttribute) + { + output.writeln(""); + } + + override void visit(const AndAndExpression andAndExpression) + { + output.writeln(""); + output.writeln(""); + visit(andAndExpression.left); + output.writeln(""); + if (andAndExpression.right !is null) + { + output.writeln(""); + visit(andAndExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const AndExpression andExpression) + { + output.writeln(""); + output.writeln(""); + visit(andExpression.left); + output.writeln(""); + if (andExpression.right !is null) + { + output.writeln(""); + visit(andExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const AsmInstruction asmInstruction) + { + output.writeln(""); + if (asmInstruction.hasAlign) + { + output.writeln(""); + visit(asmInstruction.identifierOrIntegerOrOpcode); + output.writeln(""); + } + if (asmInstruction.asmInstruction !is null) + { + output.writeln(""); + } + + override void visit(const AssertExpression assertExpression) + { + output.writeln(""); + output.writeln(""); + assertExpression.assertion.accept(this); + output.writeln(""); + if (assertExpression.message !is null) + { + output.writeln(""); + assertExpression.message.accept(this); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const AssignExpression assignExpression) + { + if (assignExpression.expression is null) + output.writeln(""); + else + output.writeln(""); + assignExpression.accept(this); + output.writeln(""); + } + + override void visit(const AtAttribute atAttribute) + { + output.writeln(""); + if (atAttribute.identifier.type == tok!"") + atAttribute.accept(this); + else + output.writeln("", atAttribute.identifier.text, ""); + output.writeln(""); + } + + override void visit(const Attribute attribute) + { + output.writeln(""); + if (attribute.attribute == tok!"") + attribute.accept(this); + else + output.writeln(str(attribute.attribute.type)); + output.writeln(""); + } + + override void visit(const AutoDeclaration autoDec) + { + output.writeln(""); + output.writeln(""); + foreach(sc; autoDec.storageClasses) + visit(sc); + output.writeln(""); + + for (size_t i = 0; i < autoDec.identifiers.length; i++) + { + output.writeln(""); + output.writeln("", + autoDec.identifiers[i].text, ""); + visit(autoDec.initializers[i]); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const BreakStatement breakStatement) + { + if (breakStatement.label.type == tok!"") + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const CaseRangeStatement caseRangeStatement) + { + output.writeln(""); + if (caseRangeStatement.low !is null) + { + output.writeln(""); + visit(caseRangeStatement.low); + output.writeln(""); + } + if (caseRangeStatement.high !is null) + { + output.writeln(""); + visit(caseRangeStatement.high); + output.writeln(""); + } + if (caseRangeStatement.declarationsAndStatements !is null) + visit(caseRangeStatement.declarationsAndStatements); + output.writeln(""); + } + + override void visit(const Catch catch_) + { + output.writeln(""); + catch_.accept(this); + output.writeln(""); + } + + override void visit(const ClassDeclaration classDec) + { + output.writeln(""); + writeName(classDec.name.text); + writeDdoc(classDec.comment); + classDec.accept(this); + output.writeln(""); + } + + override void visit(const ConditionalDeclaration conditionalDeclaration) + { + output.writeln(""); + visit(conditionalDeclaration.compileCondition); + output.writeln(""); + foreach (dec; conditionalDeclaration.trueDeclarations) + visit(dec); + output.writeln(""); + if (conditionalDeclaration.falseDeclarations.length > 0) + { + output.writeln(""); + foreach (dec; conditionalDeclaration.falseDeclarations) + visit(dec); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const ConditionalStatement conditionalStatement) + { + output.writeln(""); + visit(conditionalStatement.compileCondition); + output.writeln(""); + visit(conditionalStatement.trueStatement); + output.writeln(""); + if (conditionalStatement.falseStatement !is null) + { + output.writeln(""); + visit(conditionalStatement.falseStatement); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const ContinueStatement continueStatement) + { + if (continueStatement.label.type == tok!"") + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const DebugCondition debugCondition) + { + if (debugCondition.identifierOrInteger.type == tok!"") + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const DebugSpecification debugSpecification) + { + if (debugSpecification.identifierOrInteger.type == tok!"") + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const Declarator declarator) + { + output.writeln(""); + writeName(declarator.name.text); + writeDdoc(declarator.comment); + declarator.accept(this); + output.writeln(""); + } + + override void visit(const Deprecated deprecated_) + { + if (deprecated_.stringLiterals.length > 0) + { + output.writeln(""); + foreach (literal; deprecated_.stringLiterals) + output.writeln("", xmlEscape(literal.text), ""); + output.writeln(""); + } + else + output.writeln(""); + } + + override void visit(const EnumDeclaration enumDec) + { + output.writeln(""); + writeDdoc(enumDec.comment); + if (enumDec.name.type == tok!"identifier") + writeName(enumDec.name.text); + enumDec.accept(this); + output.writeln(""); + } + + override void visit(const AnonymousEnumMember enumMember) + { + output.writeln(""); + writeDdoc(enumMember.comment); + if (enumMember.type !is null) + visit(enumMember.type); + output.write("", enumMember.name.text, ""); + if (enumMember.assignExpression !is null) + visit(enumMember.assignExpression); + output.writeln(""); + } + + override void visit(const EnumMember enumMem) + { + output.writeln(""); + writeDdoc(enumMem.comment); + enumMem.accept(this); + output.writeln(""); + } + + override void visit(const EqualExpression equalExpression) + { + output.writeln(""); + output.writeln(""); + visit(equalExpression.left); + output.writeln(""); + output.writeln(""); + visit(equalExpression.right); + output.writeln(""); + output.writeln(""); + } + + override void visit(const Finally finally_) + { + output.writeln(""); + finally_.accept(this); + output.writeln(""); + } + + override void visit(const ForStatement forStatement) + { + output.writeln(""); + if (forStatement.initialization !is null) + { + output.writeln(""); + visit(forStatement.initialization); + output.writeln(""); + } + if (forStatement.test !is null) + { + output.writeln(""); + visit(forStatement.test); + output.writeln(""); + } + if (forStatement.increment !is null) + { + output.writeln(""); + visit(forStatement.increment); + output.writeln(""); + } + if (forStatement.declarationOrStatement !is null) + visit(forStatement.declarationOrStatement); + output.writeln(""); + } + + override void visit(const ForeachStatement foreachStatement) + { + output.writeln(""); + if (foreachStatement.foreachType !is null) + visit(foreachStatement.foreachType); + if (foreachStatement.foreachTypeList !is null) + visit(foreachStatement.foreachTypeList); + output.writeln(""); + visit(foreachStatement.low); + output.writeln(""); + if (foreachStatement.high !is null) + { + output.writeln(""); + visit(foreachStatement.high); + output.writeln(""); + } + visit(foreachStatement.declarationOrStatement); + output.writeln(""); + } + + override void visit(const ForeachType foreachType) + { + output.writeln(""); + foreach (constructor; foreachType.typeConstructors) + { + output.writeln("", str(constructor), ""); + } + if (foreachType.type !is null) + visit(foreachType.type); + visit(foreachType.identifier); + output.writeln(""); + + } + + override void visit(const FunctionDeclaration functionDec) + { + output.writeln(""); + writeName(functionDec.name.text); + writeDdoc(functionDec.comment); + if (functionDec.hasAuto) + output.writeln(""); + if (functionDec.hasRef) + output.writeln(""); + functionDec.accept(this); + output.writeln(""); + } + + override void visit(const FunctionLiteralExpression functionLiteralExpression) + { + output.writeln(""); + functionLiteralExpression.accept(this); + output.writeln(""); + } + + override void visit(const GotoStatement gotoStatement) + { + if (gotoStatement.label.type == tok!"default") + output.writeln(""); + else if (gotoStatement.label.type == tok!"identifier") + output.writeln(""); + else + { + output.writeln(""); + output.writeln(""); + if (gotoStatement.expression) + visit(gotoStatement.expression); + output.writeln(""); + output.writeln(""); + } + } + + override void visit(const IdentityExpression identityExpression) + { + if (identityExpression.negated) + output.writeln(""); + else + output.writeln(""); + output.writeln(""); + visit(identityExpression.left); + output.writeln(""); + output.writeln(""); + visit(identityExpression.right); + output.writeln(""); + output.writeln(""); + } + + override void visit(const IfStatement ifStatement) + { + output.writeln(""); + + output.writeln(""); + if (ifStatement.identifier.type != tok!"") + { + if (ifStatement.type is null) + output.writeln(""); + else + visit(ifStatement.type); + visit(ifStatement.identifier); + } + ifStatement.expression.accept(this); + output.writeln(""); + + output.writeln(""); + ifStatement.thenStatement.accept(this); + output.writeln(""); + + if (ifStatement.elseStatement !is null) + { + output.writeln(""); + ifStatement.elseStatement.accept(this); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const ImportBind importBind) + { + if (importBind.right.type == tok!"") + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const InExpression inExpression) + { + if (inExpression.negated) + output.writeln(""); + else + output.writeln(""); + output.writeln(""); + visit(inExpression.left); + output.writeln(""); + output.writeln(""); + visit(inExpression.right); + output.writeln(""); + output.writeln(""); + } + + override void visit(const Initialize initialize) + { + if (initialize.statementNoCaseNoDefault is null) + output.writeln(""); + else + { + output.writeln(""); + visit(initialize.statementNoCaseNoDefault); + output.writeln(""); + } + } + + override void visit(const Initializer initializer) + { + if (initializer.nonVoidInitializer is null) + output.writeln(""); + else + { + output.writeln(""); + visit(initializer.nonVoidInitializer); + output.writeln(""); + } + } + + override void visit(const InterfaceDeclaration interfaceDec) + { + output.writeln(""); + writeName(interfaceDec.name.text); + writeDdoc(interfaceDec.comment); + interfaceDec.accept(this); + output.writeln(""); + } + + override void visit(const Invariant invariant_) + { + output.writeln(""); + writeDdoc(invariant_.comment); + invariant_.accept(this); + output.writeln(""); + } + + override void visit(const IsExpression isExpression) + { + output.writeln(""); + visit(isExpression.type); + if (isExpression.identifier.type != tok!"") + visit(isExpression.identifier); + if (isExpression.typeSpecialization !is null) + { + if (isExpression.equalsOrColon == tok!":") + output.writeln(""); + else + output.writeln(""); + visit(isExpression.typeSpecialization); + if (isExpression.templateParameterList !is null) + visit(isExpression.templateParameterList); + } + output.writeln(""); + } + + override void visit(const KeyValuePair keyValuePair) + { + output.writeln(""); + output.writeln(""); + visit(keyValuePair.key); + output.writeln(""); + output.writeln(""); + visit(keyValuePair.value); + output.writeln(""); + output.writeln(""); + } + + override void visit (const LabeledStatement labeledStatement) + { + output.writeln(""); + visit(labeledStatement.declarationOrStatement); + output.writeln(""); + } + + override void visit(const LambdaExpression lambdaExpression) + { + output.writeln(""); + if (lambdaExpression.functionType == tok!"function") + output.writeln(""); + if (lambdaExpression.functionType == tok!"delegate") + output.writeln(""); + lambdaExpression.accept(this); + output.writeln(""); + } + + override void visit(const LinkageAttribute linkageAttribute) + { + if (linkageAttribute.hasPlusPlus) + output.writeln(""); + else + output.writeln(""); + } + + override void visit(const MemberFunctionAttribute memberFunctionAttribute) + { + output.writeln(""); + if (memberFunctionAttribute.atAttribute is null) + output.writeln(str(memberFunctionAttribute.tokenType)); + else + memberFunctionAttribute.accept(this); + output.writeln(""); + } + + override void visit(const Module module_) + { + output.writeln(""); + output.writeln(""); + module_.accept(this); + output.writeln(""); + } + + override void visit(const MulExpression mulExpression) + { + output.writeln(""); + output.writeln(""); + visit(mulExpression.left); + output.writeln(""); + if (mulExpression.right !is null) + { + output.writeln(""); + visit(mulExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const OrOrExpression orOrExpression) + { + output.writeln(""); + output.writeln(""); + visit(orOrExpression.left); + output.writeln(""); + if (orOrExpression.right !is null) + { + output.writeln(""); + visit(orOrExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const Parameter param) + { + output.writeln(""); + if (param.name.type == tok!"identifier") + writeName(param.name.text); + foreach (attribute; param.parameterAttributes) + { + output.writeln("", str(attribute), ""); + } + param.accept(this); + if (param.vararg) + output.writeln(""); + output.writeln(""); + } + + + override void visit(const PowExpression powExpression) + { + output.writeln(""); + output.writeln(""); + visit(powExpression.left); + output.writeln(""); + if (powExpression.right !is null) + { + output.writeln(""); + visit(powExpression.right); + output.writeln(""); + } + output.writeln(""); + } + + override void visit(const RelExpression relExpression) + { + output.writeln(""); + output.writeln(""); + visit(relExpression.left); + output.writeln(""); + output.writeln(""); + visit(relExpression.right); + output.writeln(""); + output.writeln(""); + } + + override void visit(const ReturnStatement returnStatement) + { + if (returnStatement.expression is null) + output.writeln(""); + else + { + output.writeln(""); + returnStatement.accept(this); + output.writeln(""); + } + } + + override void visit(const ShiftExpression shiftExpression) + { + output.writeln(""); + output.writeln(""); + visit(shiftExpression.left); + output.writeln(""); + output.writeln(""); + visit(shiftExpression.right); + output.writeln(""); + output.writeln(""); + } + + override void visit(const SingleImport singleImport) + { + if (singleImport.rename.type == tok!"") + output.writeln(""); + else + output.writeln(""); + visit(singleImport.identifierChain); + output.writeln(""); + } + + override void visit(const StructDeclaration structDec) + { + output.writeln(""); + writeName(structDec.name.text); + writeDdoc(structDec.comment); + structDec.accept(this); + output.writeln(""); + } + + override void visit(const TemplateAliasParameter templateAliasParameter) + { + output.writeln(""); + if (templateAliasParameter.type !is null) + visit(templateAliasParameter.type); + visit(templateAliasParameter.identifier); + if (templateAliasParameter.colonExpression !is null) + { + output.writeln(""); + visit(templateAliasParameter.colonExpression); + output.writeln(""); + } + else if (templateAliasParameter.colonType !is null) + { + output.writeln(""); + visit(templateAliasParameter.colonType); + output.writeln(""); + } + + if (templateAliasParameter.assignExpression !is null) + { + output.writeln(""); + visit(templateAliasParameter.assignExpression); + output.writeln(""); + } + else if (templateAliasParameter.assignType !is null) + { + output.writeln(""); + visit(templateAliasParameter.assignType); + output.writeln(""); + } + + output.writeln(""); + } + + override void visit(const TemplateDeclaration templateDeclaration) + { + writeDdoc(templateDeclaration.comment); + output.writeln(""); + writeName(templateDeclaration.name.text); + visit(templateDeclaration.templateParameters); + if (templateDeclaration.constraint !is null) + visit(templateDeclaration.constraint); + foreach (dec; templateDeclaration.declarations) + { + if (dec !is null) visit(dec); + } + output.writeln(""); + } + + override void visit(const Token token) + { + string tagName; + switch (token.type) + { + case tok!"": return; + case tok!"identifier": tagName = "identifier"; break; + case tok!"doubleLiteral": tagName = "doubleLiteral"; break; + case tok!"idoubleLiteral": tagName = "idoubleLiteral"; break; + case tok!"floatLiteral": tagName = "floatLiteral"; break; + case tok!"ifloatLiteral": tagName = "ifloatLiteral"; break; + case tok!"intLiteral": tagName = "intLiteral"; break; + case tok!"uintLiteral": tagName = "uintLiteral"; break; + case tok!"longLiteral": tagName = "longLiteral"; break; + case tok!"ulongLiteral": tagName = "ulongLiteral"; break; + case tok!"realLiteral": tagName = "realLiteral"; break; + case tok!"irealLiteral": tagName = "irealLiteral"; break; + case tok!"characterLiteral": tagName = "characterLiteral"; break; + case tok!"stringLiteral": tagName = "stringLiteral"; break; + case tok!"dstringLiteral": tagName = "dstringLiteral"; break; + case tok!"wstringLiteral": tagName = "wstringLiteral"; break; + case tok!"scriptLine": tagName = "scriptLine"; break; + case tok!"$": output.writeln(""); return; + case tok!".": output.writeln(""); return; + default: output.writeln("<", str(token.type), "/>"); return; + } + output.writeln("<", tagName, ">", xmlEscape(token.text), ""); + } + + override void visit(const Type type) + { + auto app = appender!string(); + auto formatter = new Formatter!(typeof(app))(app); + formatter.format(type); + output.writeln(""); + type.accept(this); + output.writeln(""); + } + + override void visit(const Type2 type2) + { + if (type2.builtinType != tok!"") + output.writeln("", str(type2.builtinType), ""); + else + { + output.writeln(""); + type2.accept(this); + output.writeln(""); + } + } + + override void visit(const TypeSuffix typeSuffix) + { + if (typeSuffix.star != tok!"") + output.writeln(""); + else if (typeSuffix.array) + { + if (typeSuffix.low is null && typeSuffix.type is null) + output.writeln(""); + else + { + if (typeSuffix.low is null) + { + output.writeln(""); + visit(typeSuffix.type); + output.writeln(""); + } + else + { + output.writeln(""); + if (typeSuffix.high !is null) + { + output.writeln(""); + visit(typeSuffix.low); + output.writeln(""); + output.writeln(""); + visit(typeSuffix.high); + output.writeln(""); + } + else + visit(typeSuffix.low); + output.writeln(""); + } + } + } + else + { + visit(typeSuffix.delegateOrFunction); + visit(typeSuffix.parameters); + foreach (attr; typeSuffix.memberFunctionAttributes) + { + if (attr !is null) visit(attr); + } + } + } + + override void visit(const UnaryExpression unaryExpression) + { + output.writeln(""); + if (unaryExpression.prefix != tok!"") + { + output.writeln("", xmlEscape(str(unaryExpression.prefix.type)), + ""); + unaryExpression.unaryExpression.accept(this); + } + else + { + if (unaryExpression.suffix != tok!"") + { + assert(unaryExpression.suffix.text == ""); + unaryExpression.unaryExpression.accept(this); + output.writeln("", str(unaryExpression.suffix.type), + ""); + } + else + unaryExpression.accept(this); + } + output.writeln(""); + } + + override void visit(const UnionDeclaration unionDeclaration) + { + output.writeln(""); + if (unionDeclaration.name != tok!"") + writeName(unionDeclaration.name.text); + if (unionDeclaration.templateParameters !is null) + visit(unionDeclaration.templateParameters); + if (unionDeclaration.constraint !is null) + visit(unionDeclaration.constraint); + if (unionDeclaration.structBody !is null) + visit(unionDeclaration.structBody); + output.writeln(""); + } + + override void visit(const Unittest unittest_) + { + output.writeln(""); + unittest_.accept(this); + output.writeln(""); + } + + override void visit(const VariableDeclaration variableDeclaration) + { + output.writeln(""); + writeDdoc(variableDeclaration.comment); + variableDeclaration.accept(this); + output.writeln(""); + } + + override void visit(const XorExpression xorExpression) + { + output.writeln(""); + output.writeln(""); + visit(xorExpression.left); + output.writeln(""); + if (xorExpression.right !is null) + { + output.writeln(""); + visit(xorExpression.right); + output.writeln(""); + } + output.writeln(""); + } override void visit(const Index index) { @@ -970,162 +975,162 @@ class XMLPrinter : ASTVisitor output.writeln(""); } - override void visit(const AliasInitializer aliasInitializer) { mixin (tagAndAccept!"aliasInitializer"); } - override void visit(const AliasThisDeclaration aliasThisDeclaration) { mixin (tagAndAccept!"aliasThisDeclaration"); } - override void visit(const AnonymousEnumDeclaration anonymousEnumDeclaration) { mixin (tagAndAccept!"anonymousEnumDeclaration"); } - override void visit(const ArgumentList argumentList) { mixin (tagAndAccept!"argumentList"); } - override void visit(const Arguments arguments) { mixin (tagAndAccept!"arguments"); } - override void visit(const ArrayInitializer arrayInitializer) { mixin (tagAndAccept!"arrayInitializer"); } - override void visit(const ArrayLiteral arrayLiteral) { mixin (tagAndAccept!"arrayLiteral"); } - override void visit(const ArrayMemberInitialization arrayMemberInitialization) { mixin (tagAndAccept!"arrayMemberInitialization"); } - override void visit(const AsmAddExp asmAddExp) { mixin (tagAndAccept!"asmAddExp"); } - override void visit(const AsmAndExp asmAndExp) { mixin (tagAndAccept!"asmAndExp"); } - override void visit(const AsmBrExp asmBrExp) { mixin (tagAndAccept!"asmBrExp"); } - override void visit(const AsmEqualExp asmEqualExp) { mixin (tagAndAccept!"asmEqualExp"); } - override void visit(const AsmExp asmExp) { mixin (tagAndAccept!"asmExp"); } - override void visit(const AsmLogAndExp asmLogAndExp) { mixin (tagAndAccept!"asmLogAndExp"); } - override void visit(const AsmLogOrExp asmLogOrExp) { mixin (tagAndAccept!"asmLogOrExp"); } - override void visit(const AsmMulExp asmMulExp) { mixin (tagAndAccept!"asmMulExp"); } - override void visit(const AsmOrExp asmOrExp) { mixin (tagAndAccept!"asmOrExp"); } - override void visit(const AsmPrimaryExp asmPrimaryExp) { mixin (tagAndAccept!"asmPrimaryExp"); } - override void visit(const AsmRelExp asmRelExp) { mixin (tagAndAccept!"asmRelExp"); } - override void visit(const AsmShiftExp asmShiftExp) { mixin (tagAndAccept!"asmShiftExp"); } - override void visit(const AsmStatement asmStatement) { mixin (tagAndAccept!"asmStatement"); } - override void visit(const AsmTypePrefix asmTypePrefix) { mixin (tagAndAccept!"asmTypePrefix"); } - override void visit(const AsmUnaExp asmUnaExp) { mixin (tagAndAccept!"asmUnaExp"); } - override void visit(const AsmXorExp asmXorExp) { mixin (tagAndAccept!"asmXorExp"); } - override void visit(const AssocArrayLiteral assocArrayLiteral) { mixin (tagAndAccept!"assocArrayLiteral"); } - override void visit(const AttributeDeclaration attributeDeclaration) { mixin (tagAndAccept!"attributeDeclaration"); } - override void visit(const BaseClass baseClass) { mixin (tagAndAccept!"baseClass"); } - override void visit(const BaseClassList baseClassList) { mixin (tagAndAccept!"baseClassList"); } - override void visit(const BlockStatement blockStatement) { mixin (tagAndAccept!"blockStatement"); } - override void visit(const BodyStatement bodyStatement) { mixin (tagAndAccept!"bodyStatement"); } - override void visit(const CaseStatement caseStatement) { mixin (tagAndAccept!"caseStatement"); } - override void visit(const CastExpression castExpression) { mixin (tagAndAccept!"castExpression"); } - override void visit(const CastQualifier castQualifier) { mixin (tagAndAccept!"castQualifier"); } - override void visit(const Catches catches) { mixin (tagAndAccept!"catches"); } - override void visit(const CmpExpression cmpExpression) { mixin (tagAndAccept!"cmpExpression"); } - override void visit(const CompileCondition compileCondition) { mixin (tagAndAccept!"compileCondition"); } - override void visit(const Constraint constraint) { mixin (tagAndAccept!"constraint"); } - override void visit(const Constructor constructor) { mixin (tagAndAccept!"constructor"); } - override void visit(const Declaration declaration) { mixin (tagAndAccept!"declaration"); } - override void visit(const DeclarationOrStatement declarationOrStatement) { mixin (tagAndAccept!"declarationOrStatement"); } - override void visit(const DeclarationsAndStatements declarationsAndStatements) { mixin (tagAndAccept!"declarationsAndStatements"); } - override void visit(const DefaultStatement defaultStatement) { mixin (tagAndAccept!"defaultStatement"); } - override void visit(const DeleteExpression deleteExpression) { mixin (tagAndAccept!"deleteExpression"); } - override void visit(const DeleteStatement deleteStatement) { mixin (tagAndAccept!"deleteStatement"); } - override void visit(const Destructor destructor) { mixin (tagAndAccept!"destructor"); } - override void visit(const DoStatement doStatement) { mixin (tagAndAccept!"doStatement"); } - override void visit(const EnumBody enumBody) { mixin (tagAndAccept!"enumBody"); } - override void visit(const EponymousTemplateDeclaration eponymousTemplateDeclaration) { mixin (tagAndAccept!"eponymousTemplateDeclaration"); } - override void visit(const Expression expression) { mixin (tagAndAccept!"expression"); } - override void visit(const ExpressionStatement expressionStatement) { mixin (tagAndAccept!"expressionStatement"); } - override void visit(const FinalSwitchStatement finalSwitchStatement) { mixin (tagAndAccept!"finalSwitchStatement"); } - override void visit(const ForeachTypeList foreachTypeList) { mixin (tagAndAccept!"foreachTypeList"); } - override void visit(const FunctionAttribute functionAttribute) { mixin (tagAndAccept!"functionAttribute"); } - override void visit(const FunctionBody functionBody) { mixin (tagAndAccept!"functionBody"); } - override void visit(const FunctionCallExpression functionCallExpression) { mixin (tagAndAccept!"functionCallExpression"); } - override void visit(const IdentifierChain identifierChain) { mixin (tagAndAccept!"identifierChain"); } - override void visit(const IdentifierList identifierList) { mixin (tagAndAccept!"identifierList"); } - override void visit(const IdentifierOrTemplateChain identifierOrTemplateChain) { mixin (tagAndAccept!"identifierOrTemplateChain"); } - override void visit(const IdentifierOrTemplateInstance identifierOrTemplateInstance) { mixin (tagAndAccept!"identifierOrTemplateInstance"); } - override void visit(const ImportBindings importBindings) { mixin (tagAndAccept!"importBindings"); } - override void visit(const ImportDeclaration importDeclaration) { mixin (tagAndAccept!"importDeclaration"); } - override void visit(const ImportExpression importExpression) { mixin (tagAndAccept!"importExpression"); } - override void visit(const IndexExpression indexExpression) { mixin (tagAndAccept!"indexExpression"); } - override void visit(const InStatement inStatement) { mixin (tagAndAccept!"inStatement"); } - override void visit(const KeyValuePairs keyValuePairs) { mixin (tagAndAccept!"keyValuePairs"); } - override void visit(const MixinExpression mixinExpression) { mixin (tagAndAccept!"mixinExpression"); } - override void visit(const MixinTemplateDeclaration mixinTemplateDeclaration) { mixin (tagAndAccept!"mixinTemplateDeclaration"); } - override void visit(const MixinTemplateName mixinTemplateName) { mixin (tagAndAccept!"mixinTemplateName"); } - override void visit(const ModuleDeclaration moduleDeclaration) { mixin (tagAndAccept!"moduleDeclaration"); } - override void visit(const LastCatch lastCatch) { mixin (tagAndAccept!"lastCatch"); } - override void visit(const NewExpression newExpression) { mixin (tagAndAccept!"newExpression"); } - override void visit(const NonVoidInitializer nonVoidInitializer) { mixin (tagAndAccept!"nonVoidInitializer"); } - override void visit(const Operands operands) { mixin (tagAndAccept!"operands"); } - override void visit(const OrExpression orExpression) { mixin (tagAndAccept!"orExpression"); } - override void visit(const OutStatement outStatement) { mixin (tagAndAccept!"outStatement"); } override void visit(const MixinDeclaration mixinDeclaration) { mixin (tagAndAccept!"mixinDeclaration"); } - override void visit(const Parameters parameters) { mixin (tagAndAccept!"parameters"); } - override void visit(const Postblit postblit) { mixin (tagAndAccept!"postblit"); } override void visit(const NewAnonClassExpression newAnonClassExpression) { mixin (tagAndAccept!"newAnonClassExpression"); } - override void visit(const PragmaDeclaration pragmaDeclaration) { mixin (tagAndAccept!"pragmaDeclaration"); } - override void visit(const PragmaExpression pragmaExpression) { mixin (tagAndAccept!"pragmaExpression"); } - override void visit(const PrimaryExpression primaryExpression) { mixin (tagAndAccept!"primaryExpression"); } - override void visit(const Register register) { mixin (tagAndAccept!"register"); } - override void visit(const ScopeGuardStatement scopeGuardStatement) { mixin (tagAndAccept!"scopeGuardStatement"); } - override void visit(const SharedStaticConstructor sharedStaticConstructor) { mixin (tagAndAccept!"sharedStaticConstructor"); } - override void visit(const SharedStaticDestructor sharedStaticDestructor) { mixin (tagAndAccept!"sharedStaticDestructor"); } - override void visit(const StatementNoCaseNoDefault statementNoCaseNoDefault) { mixin (tagAndAccept!"statementNoCaseNoDefault"); } - override void visit(const StaticAssertDeclaration staticAssertDeclaration) { mixin (tagAndAccept!"staticAssertDeclaration"); } - override void visit(const StaticAssertStatement staticAssertStatement) { mixin (tagAndAccept!"staticAssertStatement"); } - override void visit(const StaticConstructor staticConstructor) { mixin (tagAndAccept!"staticConstructor"); } - override void visit(const StaticDestructor staticDestructor) { mixin (tagAndAccept!"staticDestructor"); } - override void visit(const StaticIfCondition staticIfCondition) { mixin (tagAndAccept!"staticIfCondition"); } - override void visit(const StorageClass storageClass) { mixin (tagAndAccept!"storageClass"); } - override void visit(const StructBody structBody) { mixin (tagAndAccept!"structBody"); } - override void visit(const StructInitializer structInitializer) { mixin (tagAndAccept!"structInitializer"); } - override void visit(const StructMemberInitializers structMemberInitializers) { mixin (tagAndAccept!"structMemberInitializers"); } - override void visit(const StructMemberInitializer structMemberInitializer) { mixin (tagAndAccept!"structMemberInitializer"); } - override void visit(const SwitchStatement switchStatement) { mixin (tagAndAccept!"switchStatement"); } - override void visit(const Symbol symbol) { mixin (tagAndAccept!"symbol"); } - override void visit(const SynchronizedStatement synchronizedStatement) { mixin (tagAndAccept!"synchronizedStatement"); } override void visit(const Statement statement) { mixin (tagAndAccept!"statement"); } - override void visit(const TemplateArgumentList templateArgumentList) { mixin (tagAndAccept!"templateArgumentList"); } - override void visit(const TemplateArguments templateArguments) { mixin (tagAndAccept!"templateArguments"); } - override void visit(const TemplateArgument templateArgument) { mixin (tagAndAccept!"templateArgument"); } - override void visit(const TemplateMixinExpression templateMixinExpression) { mixin (tagAndAccept!"templateMixinExpression"); } - override void visit(const TemplateParameterList templateParameterList) { mixin (tagAndAccept!"templateParameterList"); } - override void visit(const TemplateParameters templateParameters) { mixin (tagAndAccept!"templateParameters"); } - override void visit(const TemplateParameter templateParameter) { mixin (tagAndAccept!"templateParameter"); } - override void visit(const TemplateSingleArgument templateSingleArgument) { mixin (tagAndAccept!"templateSingleArgument"); } - override void visit(const TemplateThisParameter templateThisParameter) { mixin (tagAndAccept!"templateThisParameter"); } - override void visit(const TemplateTupleParameter templateTupleParameter) { mixin (tagAndAccept!"templateTupleParameter"); } - override void visit(const TemplateTypeParameter templateTypeParameter) { mixin (tagAndAccept!"templateTypeParameter"); } - override void visit(const TemplateValueParameterDefault templateValueParameterDefault) { mixin (tagAndAccept!"templateValueParameterDefault"); } - override void visit(const TemplateValueParameter templateValueParameter) { mixin (tagAndAccept!"templateValueParameter"); } - override void visit(const TernaryExpression ternaryExpression) { mixin (tagAndAccept!"ternaryExpression"); } - override void visit(const ThrowStatement throwStatement) { mixin (tagAndAccept!"throwStatement"); } - override void visit(const TryStatement tryStatement) { mixin (tagAndAccept!"tryStatement"); } override void visit(const TemplateInstance templateInstance) { mixin (tagAndAccept!"templateInstance"); } - override void visit(const TypeofExpression typeofExpression) { mixin (tagAndAccept!"typeofExpression"); } override void visit(const TypeSpecialization typeSpecialization) { mixin (tagAndAccept!"typeSpecialization"); } override void visit(const TraitsExpression traitsExpression) { mixin (tagAndAccept!"traitsExpression"); } - override void visit(const Vector vector) { mixin (tagAndAccept!"vector"); } - override void visit(const VersionCondition versionCondition) { mixin (tagAndAccept!"versionCondition"); } - override void visit(const VersionSpecification versionSpecification) { mixin (tagAndAccept!"versionSpecification"); } - override void visit(const WhileStatement whileStatement) { mixin (tagAndAccept!"whileStatement"); } - override void visit(const WithStatement withStatement) { mixin (tagAndAccept!"withStatement"); } override void visit(const TypeidExpression typeidExpression) { mixin (tagAndAccept!"typeidExpression"); } + override void visit(const AliasInitializer aliasInitializer) { mixin (tagAndAccept!"aliasInitializer"); } + override void visit(const AliasThisDeclaration aliasThisDeclaration) { mixin (tagAndAccept!"aliasThisDeclaration"); } + override void visit(const AnonymousEnumDeclaration anonymousEnumDeclaration) { mixin (tagAndAccept!"anonymousEnumDeclaration"); } + override void visit(const ArgumentList argumentList) { mixin (tagAndAccept!"argumentList"); } + override void visit(const Arguments arguments) { mixin (tagAndAccept!"arguments"); } + override void visit(const ArrayInitializer arrayInitializer) { mixin (tagAndAccept!"arrayInitializer"); } + override void visit(const ArrayLiteral arrayLiteral) { mixin (tagAndAccept!"arrayLiteral"); } + override void visit(const ArrayMemberInitialization arrayMemberInitialization) { mixin (tagAndAccept!"arrayMemberInitialization"); } + override void visit(const AsmAddExp asmAddExp) { mixin (tagAndAccept!"asmAddExp"); } + override void visit(const AsmAndExp asmAndExp) { mixin (tagAndAccept!"asmAndExp"); } + override void visit(const AsmBrExp asmBrExp) { mixin (tagAndAccept!"asmBrExp"); } + override void visit(const AsmEqualExp asmEqualExp) { mixin (tagAndAccept!"asmEqualExp"); } + override void visit(const AsmExp asmExp) { mixin (tagAndAccept!"asmExp"); } + override void visit(const AsmLogAndExp asmLogAndExp) { mixin (tagAndAccept!"asmLogAndExp"); } + override void visit(const AsmLogOrExp asmLogOrExp) { mixin (tagAndAccept!"asmLogOrExp"); } + override void visit(const AsmMulExp asmMulExp) { mixin (tagAndAccept!"asmMulExp"); } + override void visit(const AsmOrExp asmOrExp) { mixin (tagAndAccept!"asmOrExp"); } + override void visit(const AsmPrimaryExp asmPrimaryExp) { mixin (tagAndAccept!"asmPrimaryExp"); } + override void visit(const AsmRelExp asmRelExp) { mixin (tagAndAccept!"asmRelExp"); } + override void visit(const AsmShiftExp asmShiftExp) { mixin (tagAndAccept!"asmShiftExp"); } + override void visit(const AsmStatement asmStatement) { mixin (tagAndAccept!"asmStatement"); } + override void visit(const AsmTypePrefix asmTypePrefix) { mixin (tagAndAccept!"asmTypePrefix"); } + override void visit(const AsmUnaExp asmUnaExp) { mixin (tagAndAccept!"asmUnaExp"); } + override void visit(const AsmXorExp asmXorExp) { mixin (tagAndAccept!"asmXorExp"); } + override void visit(const AssocArrayLiteral assocArrayLiteral) { mixin (tagAndAccept!"assocArrayLiteral"); } + override void visit(const AttributeDeclaration attributeDeclaration) { mixin (tagAndAccept!"attributeDeclaration"); } + override void visit(const BaseClass baseClass) { mixin (tagAndAccept!"baseClass"); } + override void visit(const BaseClassList baseClassList) { mixin (tagAndAccept!"baseClassList"); } + override void visit(const BlockStatement blockStatement) { mixin (tagAndAccept!"blockStatement"); } + override void visit(const BodyStatement bodyStatement) { mixin (tagAndAccept!"bodyStatement"); } + override void visit(const CaseStatement caseStatement) { mixin (tagAndAccept!"caseStatement"); } + override void visit(const CastExpression castExpression) { mixin (tagAndAccept!"castExpression"); } + override void visit(const CastQualifier castQualifier) { mixin (tagAndAccept!"castQualifier"); } + override void visit(const Catches catches) { mixin (tagAndAccept!"catches"); } + override void visit(const CmpExpression cmpExpression) { mixin (tagAndAccept!"cmpExpression"); } + override void visit(const CompileCondition compileCondition) { mixin (tagAndAccept!"compileCondition"); } + override void visit(const Constraint constraint) { mixin (tagAndAccept!"constraint"); } + override void visit(const Constructor constructor) { mixin (tagAndAccept!"constructor"); } + override void visit(const Declaration declaration) { mixin (tagAndAccept!"declaration"); } + override void visit(const DeclarationOrStatement declarationOrStatement) { mixin (tagAndAccept!"declarationOrStatement"); } + override void visit(const DeclarationsAndStatements declarationsAndStatements) { mixin (tagAndAccept!"declarationsAndStatements"); } + override void visit(const DefaultStatement defaultStatement) { mixin (tagAndAccept!"defaultStatement"); } + override void visit(const DeleteExpression deleteExpression) { mixin (tagAndAccept!"deleteExpression"); } + override void visit(const DeleteStatement deleteStatement) { mixin (tagAndAccept!"deleteStatement"); } + override void visit(const Destructor destructor) { mixin (tagAndAccept!"destructor"); } + override void visit(const DoStatement doStatement) { mixin (tagAndAccept!"doStatement"); } + override void visit(const EnumBody enumBody) { mixin (tagAndAccept!"enumBody"); } + override void visit(const EponymousTemplateDeclaration eponymousTemplateDeclaration) { mixin (tagAndAccept!"eponymousTemplateDeclaration"); } + override void visit(const Expression expression) { mixin (tagAndAccept!"expression"); } + override void visit(const ExpressionStatement expressionStatement) { mixin (tagAndAccept!"expressionStatement"); } + override void visit(const FinalSwitchStatement finalSwitchStatement) { mixin (tagAndAccept!"finalSwitchStatement"); } + override void visit(const ForeachTypeList foreachTypeList) { mixin (tagAndAccept!"foreachTypeList"); } + override void visit(const FunctionAttribute functionAttribute) { mixin (tagAndAccept!"functionAttribute"); } + override void visit(const FunctionBody functionBody) { mixin (tagAndAccept!"functionBody"); } + override void visit(const FunctionCallExpression functionCallExpression) { mixin (tagAndAccept!"functionCallExpression"); } + override void visit(const IdentifierChain identifierChain) { mixin (tagAndAccept!"identifierChain"); } + override void visit(const IdentifierList identifierList) { mixin (tagAndAccept!"identifierList"); } + override void visit(const IdentifierOrTemplateChain identifierOrTemplateChain) { mixin (tagAndAccept!"identifierOrTemplateChain"); } + override void visit(const IdentifierOrTemplateInstance identifierOrTemplateInstance) { mixin (tagAndAccept!"identifierOrTemplateInstance"); } + override void visit(const ImportBindings importBindings) { mixin (tagAndAccept!"importBindings"); } + override void visit(const ImportDeclaration importDeclaration) { mixin (tagAndAccept!"importDeclaration"); } + override void visit(const ImportExpression importExpression) { mixin (tagAndAccept!"importExpression"); } + override void visit(const IndexExpression indexExpression) { mixin (tagAndAccept!"indexExpression"); } + override void visit(const InStatement inStatement) { mixin (tagAndAccept!"inStatement"); } + override void visit(const KeyValuePairs keyValuePairs) { mixin (tagAndAccept!"keyValuePairs"); } + override void visit(const MixinExpression mixinExpression) { mixin (tagAndAccept!"mixinExpression"); } + override void visit(const MixinTemplateDeclaration mixinTemplateDeclaration) { mixin (tagAndAccept!"mixinTemplateDeclaration"); } + override void visit(const MixinTemplateName mixinTemplateName) { mixin (tagAndAccept!"mixinTemplateName"); } + override void visit(const ModuleDeclaration moduleDeclaration) { mixin (tagAndAccept!"moduleDeclaration"); } + override void visit(const LastCatch lastCatch) { mixin (tagAndAccept!"lastCatch"); } + override void visit(const NewExpression newExpression) { mixin (tagAndAccept!"newExpression"); } + override void visit(const NonVoidInitializer nonVoidInitializer) { mixin (tagAndAccept!"nonVoidInitializer"); } + override void visit(const Operands operands) { mixin (tagAndAccept!"operands"); } + override void visit(const OrExpression orExpression) { mixin (tagAndAccept!"orExpression"); } + override void visit(const OutStatement outStatement) { mixin (tagAndAccept!"outStatement"); } override void visit(const MixinDeclaration mixinDeclaration) { mixin (tagAndAccept!"mixinDeclaration"); } + override void visit(const Parameters parameters) { mixin (tagAndAccept!"parameters"); } + override void visit(const Postblit postblit) { mixin (tagAndAccept!"postblit"); } override void visit(const NewAnonClassExpression newAnonClassExpression) { mixin (tagAndAccept!"newAnonClassExpression"); } + override void visit(const PragmaDeclaration pragmaDeclaration) { mixin (tagAndAccept!"pragmaDeclaration"); } + override void visit(const PragmaExpression pragmaExpression) { mixin (tagAndAccept!"pragmaExpression"); } + override void visit(const PrimaryExpression primaryExpression) { mixin (tagAndAccept!"primaryExpression"); } + override void visit(const Register register) { mixin (tagAndAccept!"register"); } + override void visit(const ScopeGuardStatement scopeGuardStatement) { mixin (tagAndAccept!"scopeGuardStatement"); } + override void visit(const SharedStaticConstructor sharedStaticConstructor) { mixin (tagAndAccept!"sharedStaticConstructor"); } + override void visit(const SharedStaticDestructor sharedStaticDestructor) { mixin (tagAndAccept!"sharedStaticDestructor"); } + override void visit(const StatementNoCaseNoDefault statementNoCaseNoDefault) { mixin (tagAndAccept!"statementNoCaseNoDefault"); } + override void visit(const StaticAssertDeclaration staticAssertDeclaration) { mixin (tagAndAccept!"staticAssertDeclaration"); } + override void visit(const StaticAssertStatement staticAssertStatement) { mixin (tagAndAccept!"staticAssertStatement"); } + override void visit(const StaticConstructor staticConstructor) { mixin (tagAndAccept!"staticConstructor"); } + override void visit(const StaticDestructor staticDestructor) { mixin (tagAndAccept!"staticDestructor"); } + override void visit(const StaticIfCondition staticIfCondition) { mixin (tagAndAccept!"staticIfCondition"); } + override void visit(const StorageClass storageClass) { mixin (tagAndAccept!"storageClass"); } + override void visit(const StructBody structBody) { mixin (tagAndAccept!"structBody"); } + override void visit(const StructInitializer structInitializer) { mixin (tagAndAccept!"structInitializer"); } + override void visit(const StructMemberInitializers structMemberInitializers) { mixin (tagAndAccept!"structMemberInitializers"); } + override void visit(const StructMemberInitializer structMemberInitializer) { mixin (tagAndAccept!"structMemberInitializer"); } + override void visit(const SwitchStatement switchStatement) { mixin (tagAndAccept!"switchStatement"); } + override void visit(const Symbol symbol) { mixin (tagAndAccept!"symbol"); } + override void visit(const SynchronizedStatement synchronizedStatement) { mixin (tagAndAccept!"synchronizedStatement"); } override void visit(const Statement statement) { mixin (tagAndAccept!"statement"); } + override void visit(const TemplateArgumentList templateArgumentList) { mixin (tagAndAccept!"templateArgumentList"); } + override void visit(const TemplateArguments templateArguments) { mixin (tagAndAccept!"templateArguments"); } + override void visit(const TemplateArgument templateArgument) { mixin (tagAndAccept!"templateArgument"); } + override void visit(const TemplateMixinExpression templateMixinExpression) { mixin (tagAndAccept!"templateMixinExpression"); } + override void visit(const TemplateParameterList templateParameterList) { mixin (tagAndAccept!"templateParameterList"); } + override void visit(const TemplateParameters templateParameters) { mixin (tagAndAccept!"templateParameters"); } + override void visit(const TemplateParameter templateParameter) { mixin (tagAndAccept!"templateParameter"); } + override void visit(const TemplateSingleArgument templateSingleArgument) { mixin (tagAndAccept!"templateSingleArgument"); } + override void visit(const TemplateThisParameter templateThisParameter) { mixin (tagAndAccept!"templateThisParameter"); } + override void visit(const TemplateTupleParameter templateTupleParameter) { mixin (tagAndAccept!"templateTupleParameter"); } + override void visit(const TemplateTypeParameter templateTypeParameter) { mixin (tagAndAccept!"templateTypeParameter"); } + override void visit(const TemplateValueParameterDefault templateValueParameterDefault) { mixin (tagAndAccept!"templateValueParameterDefault"); } + override void visit(const TemplateValueParameter templateValueParameter) { mixin (tagAndAccept!"templateValueParameter"); } + override void visit(const TernaryExpression ternaryExpression) { mixin (tagAndAccept!"ternaryExpression"); } + override void visit(const ThrowStatement throwStatement) { mixin (tagAndAccept!"throwStatement"); } + override void visit(const TryStatement tryStatement) { mixin (tagAndAccept!"tryStatement"); } override void visit(const TemplateInstance templateInstance) { mixin (tagAndAccept!"templateInstance"); } + override void visit(const TypeofExpression typeofExpression) { mixin (tagAndAccept!"typeofExpression"); } override void visit(const TypeSpecialization typeSpecialization) { mixin (tagAndAccept!"typeSpecialization"); } override void visit(const TraitsExpression traitsExpression) { mixin (tagAndAccept!"traitsExpression"); } + override void visit(const Vector vector) { mixin (tagAndAccept!"vector"); } + override void visit(const VersionCondition versionCondition) { mixin (tagAndAccept!"versionCondition"); } + override void visit(const VersionSpecification versionSpecification) { mixin (tagAndAccept!"versionSpecification"); } + override void visit(const WhileStatement whileStatement) { mixin (tagAndAccept!"whileStatement"); } + override void visit(const WithStatement withStatement) { mixin (tagAndAccept!"withStatement"); } override void visit(const TypeidExpression typeidExpression) { mixin (tagAndAccept!"typeidExpression"); } - alias visit = ASTVisitor.visit; + alias visit = ASTVisitor.visit; - private static string xmlEscape(string s) - { - return s.translate(['<' : "<", '>' : ">", '&' : "&"]); - } + private static string xmlEscape(string s) + { + return s.translate(['<' : "<", '>' : ">", '&' : "&"]); + } - private static string xmlAttributeEscape(string s) - { - return s.translate(['<' : "<", '>' : ">", '&' : "&", - '\"' : """, '\'' : "'"]); - } + private static string xmlAttributeEscape(string s) + { + return s.translate(['<' : "<", '>' : ">", '&' : "&", + '\"' : """, '\'' : "'"]); + } - private void writeName(string name) - { - output.write("", name, ""); - } + private void writeName(string name) + { + output.write("", name, ""); + } - private void writeDdoc(string comment) - { - if (comment is null) return; - output.writeln("", xmlEscape(comment), ""); - } + private void writeDdoc(string comment) + { + if (comment is null) return; + output.writeln("", xmlEscape(comment), ""); + } - /** - * File that output is written to. - */ - File output; + /** + * File that output is written to. + */ + File output; } private: template tagAndAccept(string tagName) { - immutable tagAndAccept = `output.writeln("<` ~ tagName ~ `>");` - ~ tagName ~ `.accept(this);` - ~ `output.writeln("");`; + immutable tagAndAccept = `output.writeln("<` ~ tagName ~ `>");` + ~ tagName ~ `.accept(this);` + ~ `output.writeln("");`; }