1 // =================================
  2 // Copyright (c) 2021 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 #ifndef SNGCM_AST_SOURCE_WRITER_INCLUDED
  7 #define SNGCM_AST_SOURCE_WRITER_INCLUDED
  8 #include <sngcm/ast/AstApi.hpp>
  9 #include <sngcm/ast/Visitor.hpp>
 10 #include <soulng/util/CodeFormatter.hpp>
 11 
 12 namespace sngcm { namespace ast {
 13 
 14 class SourceWriter public Visitor
 15 {
 16 public:
 17     SourceWriter(soulng::util::CodeFormatter& formatter_);
 18     void Visit(BoolNode& boolNode) override;
 19     void Visit(SByteNode& sbyteNode) override;
 20     void Visit(ByteNode& byteNode) override;
 21     void Visit(ShortNode& shortNode) override;
 22     void Visit(UShortNode& ushortNode) override;
 23     void Visit(IntNode& intNode) override;
 24     void Visit(UIntNode& uintNode) override;
 25     void Visit(LongNode& longNode) override;
 26     void Visit(ULongNode& ulongNode) override;
 27     void Visit(FloatNode& floatNode) override;
 28     void Visit(DoubleNode& doubleNode) override;
 29     void Visit(CharNode& charNode) override;
 30     void Visit(WCharNode& wcharNode) override;
 31     void Visit(UCharNode& ucharNode) override;
 32     void Visit(VoidNode& voidNode) override;
 33 
 34     void Visit(BooleanLiteralNode& booleanLiteralNode) override;
 35     void Visit(SByteLiteralNode& sbyteLiteralNode) override;
 36     void Visit(ByteLiteralNode& byteLiteralNode) override;
 37     void Visit(ShortLiteralNode& shortLiteralNode) override;
 38     void Visit(UShortLiteralNode& ushortLiteralNode) override;
 39     void Visit(IntLiteralNode& intLiteralNode) override;
 40     void Visit(UIntLiteralNode& uintLiteralNode) override;
 41     void Visit(LongLiteralNode& longLiteralNode) override;
 42     void Visit(ULongLiteralNode& ulongLiteralNode) override;
 43     void Visit(FloatLiteralNode& floatLiteralNode) override;
 44     void Visit(DoubleLiteralNode& doubleLiteralNode) override;
 45     void Visit(CharLiteralNode& charLiteralNode) override;
 46     void Visit(WCharLiteralNode& wcharLiteralNode) override;
 47     void Visit(UCharLiteralNode& ucharLiteralNode) override;
 48     void Visit(StringLiteralNode& stringLiteralNode) override;
 49     void Visit(WStringLiteralNode& wstringLiteralNode) override;
 50     void Visit(UStringLiteralNode& ustringLiteralNode) override;
 51     void Visit(NullLiteralNode& nullLiteralNode) override;
 52     void Visit(ArrayLiteralNode& arrayLiteralNode) override;
 53     void Visit(StructuredLiteralNode& structuredLiteralNode) override;
 54     void Visit(UuidLiteralNode& uuidLiteralNode) override;
 55 
 56     void Visit(CompileUnitNode& compileUnitNode) override;
 57     void Visit(NamespaceNode& namespaceNode) override;
 58     void Visit(AliasNode& aliasNode) override;
 59     void Visit(NamespaceImportNode& namespaceImportNode) override;
 60     void Visit(IdentifierNode& identifierNode) override;
 61     void Visit(CursorIdNode& cursorIdNode) override;
 62     void Visit(TemplateIdNode& templateIdNode) override;
 63     void Visit(FunctionNode& functionNode) override;
 64     void Visit(ClassNode& classNode) override;
 65     void Visit(ThisInitializerNode& thisInitializerNode) override;
 66     void Visit(BaseInitializerNode& baseInitializerNode) override;
 67     void Visit(MemberInitializerNode& memberInitializerNode) override;
 68     void Visit(StaticConstructorNode& staticConstructorNode) override;
 69     void Visit(ConstructorNode& constructorNode) override;
 70     void Visit(DestructorNode& destructorNode) override;
 71     void Visit(MemberFunctionNode& memberFunctionNode) override;
 72     void Visit(ConversionFunctionNode& conversionFunctionNode) override;
 73     void Visit(MemberVariableNode& memberVariableNode) override;
 74     void Visit(InterfaceNode& interfaceNode) override;
 75     void Visit(DelegateNode& delegateNode) override;
 76     void Visit(ClassDelegateNode& classDelegateNode) override;
 77 
 78     void Visit(ParenthesizedConstraintNode& parenthesizedConstraintNode) override;
 79     void Visit(DisjunctiveConstraintNode& disjunctiveConstraintNode) override;
 80     void Visit(ConjunctiveConstraintNode& conjunctiveConstraintNode) override;
 81     void Visit(WhereConstraintNode& whereConstraintNode) override;
 82     void Visit(PredicateConstraintNode& predicateConstraintNode) override;
 83     void Visit(IsConstraintNode& isConstraintNode) override;
 84     void Visit(MultiParamConstraintNode& multiParamConstraintNode) override;
 85     void Visit(TypeNameConstraintNode& typeNameConstraintNode) override;
 86     void Visit(ConstructorConstraintNode& constructorConstraintNode) override;
 87     void Visit(DestructorConstraintNode& destructorConstraintNode) override;
 88     void Visit(MemberFunctionConstraintNode& memberFunctionConstraintNode) override;
 89     void Visit(FunctionConstraintNode& functionConstraintNode) override;
 90     void Visit(AxiomStatementNode& axiomStatementNode) override;
 91     void Visit(AxiomNode& axiomNode) override;
 92     void Visit(ConceptIdNode& conceptIdNode) override;
 93     void Visit(ConceptNode& conceptNode) override;
 94 
 95     void Visit(LabelNode& labelNode) override;
 96     void Visit(LabeledStatementNode& labeledStatementNode) override;
 97     void Visit(CompoundStatementNode& compoundStatementNode) override;
 98     void Visit(ReturnStatementNode& returnStatementNode) override;
 99     void Visit(IfStatementNode& ifStatementNode) override;
100     void Visit(WhileStatementNode& whileStatementNode) override;
101     void Visit(DoStatementNode& doStatementNode) override;
102     void Visit(ForStatementNode& forStatementNode) override;
103     void Visit(BreakStatementNode& breakStatementNode) override;
104     void Visit(ContinueStatementNode& continueStatementNode) override;
105     void Visit(GotoStatementNode& gotoStatementNode) override;
106     void Visit(ConstructionStatementNode& constructionStatementNode) override;
107     void Visit(DeleteStatementNode& deleteStatementNode) override;
108     void Visit(DestroyStatementNode& destroyStatementNode) override;
109     void Visit(AssignmentStatementNode& assignmentStatementNode) override;
110     void Visit(ExpressionStatementNode& expressionStatementNode) override;
111     void Visit(EmptyStatementNode& emptyStatementNode) override;
112     void Visit(RangeForStatementNode& rangeForStatementNode) override;
113     void Visit(SwitchStatementNode& switchStatementNode) override;
114     void Visit(CaseStatementNode& caseStatementNode) override;
115     void Visit(DefaultStatementNode& defaultStatementNode) override;
116     void Visit(GotoCaseStatementNode& gotoCaseStatementNode) override;
117     void Visit(GotoDefaultStatementNode& gotoDefaultStatementNode) override;
118     void Visit(ThrowStatementNode& throwStatementNode) override;
119     void Visit(TryStatementNode& tryStatementNode) override;
120     void Visit(CatchNode& catchNode) override;
121     void Visit(AssertStatementNode& assertStatementNode) override;
122     void Visit(ConditionalCompilationPartNode& conditionalCompilationPartNode) override;
123     void Visit(ConditionalCompilationDisjunctionNode& conditionalCompilationDisjunctionNode) override;
124     void Visit(ConditionalCompilationConjunctionNode& conditionalCompilationConjunctionNode) override;
125     void Visit(ConditionalCompilationNotNode& conditionalCompilationNotNode) override;
126     void Visit(ConditionalCompilationPrimaryNode& conditionalCompilationPrimaryNode) override;
127     void Visit(ParenthesizedConditionalCompilationExpressionNode& parenthesizeCondCompExprNode) override;
128     void Visit(ConditionalCompilationStatementNode& conditionalCompilationStatementNode) override;
129 
130     void Visit(TypedefNode& typedefNode) override;
131     void Visit(ConstantNode& constantNode) override;
132     void Visit(EnumTypeNode& enumTypeNode) override;
133     void Visit(EnumConstantNode& enumConstantNode) override;
134     void Visit(ParameterNode& parameterNode) override;
135     void Visit(TemplateParameterNode& templateParameterNode) override;
136 
137     void Visit(ConstNode& constNode) override;
138     void Visit(LValueRefNode& lvalueRefNode) override;
139     void Visit(RValueRefNode& rvalueRefNode) override;
140     void Visit(PointerNode& pointerNode) override;
141     void Visit(ArrayNode& arrayNode) override;
142 
143     void Visit(DotNode& dotNode) override;
144     void Visit(ArrowNode& arrowNode) override;
145     void Visit(EquivalenceNode& equivalenceNode) override;
146     void Visit(ImplicationNode& implicationNode) override;
147     void Visit(DisjunctionNode& disjunctionNode) override;
148     void Visit(ConjunctionNode& conjunctionNode) override;
149     void Visit(BitOrNode& bitOrNode) override;
150     void Visit(BitXorNode& bitXorNode) override;
151     void Visit(BitAndNode& bitAndNode) override;
152     void Visit(EqualNode& equalNode) override;
153     void Visit(NotEqualNode& notEqualNode) override;
154     void Visit(LessNode& lessNode) override;
155     void Visit(GreaterNode& greaterNode) override;
156     void Visit(LessOrEqualNode& lessOrEqualNode) override;
157     void Visit(GreaterOrEqualNode& greaterOrEqualNode) override;
158     void Visit(ShiftLeftNode& shiftLeftNode) override;
159     void Visit(ShiftRightNode& shiftRightNode) override;
160     void Visit(AddNode& addNode) override;
161     void Visit(SubNode& subNode) override;
162     void Visit(MulNode& mulNode) override;
163     void Visit(DivNode& divNode) override;
164     void Visit(RemNode& remNode) override;
165     void Visit(NotNode& notNode) override;
166     void Visit(UnaryPlusNode& unaryPlusNode) override;
167     void Visit(UnaryMinusNode& unaryMinusNode) override;
168     void Visit(PrefixIncrementNode& prefixIncrementNode) override;
169     void Visit(PrefixDecrementNode& prefixDecrementNode) override;
170     void Visit(DerefNode& derefNode) override;
171     void Visit(AddrOfNode& addrOfNode) override;
172     void Visit(ComplementNode& complementNode) override;
173     void Visit(IsNode& isNode) override;
174     void Visit(AsNode& asNode) override;
175     void Visit(IndexingNode& indexingNode) override;
176     void Visit(InvokeNode& invokeNode) override;
177     void Visit(PostfixIncrementNode& postfixIncrementNode) override;
178     void Visit(PostfixDecrementNode& postfixDecrementNode) override;
179     void Visit(SizeOfNode& sizeOfNode) override;
180     void Visit(TypeNameNode& typeNameNode) override;
181     void Visit(TypeIdNode& typeIdNode) override;
182     void Visit(CastNode& castNode) override;
183     void Visit(ConstructNode& constructNode) override;
184     void Visit(NewNode& newNode) override;
185     void Visit(ThisNode& thisNode) override;
186     void Visit(BaseNode& baseNode) override;
187     void Visit(ParenthesizedExpressionNode& parenthesizedExpressionNode) override;
188     void Visit(GlobalVariableNode& globalVariableNode) override;
189     void Visit(AttributeNode& attribute) override;
190     void Visit(AttributesNode& attributes) override;
191     void Visit(CommentNode& comment) override;
192     void WriteWarning(const std::string& message);
193     void WriteEmptyLine();
194 private:
195     soulng::util::CodeFormatter& formatter;
196     bool omitNewLine;
197     bool omitSemicolon;
198     bool emptyLine;
199 };
200 
201 } } // sngcm::ast
202 
203 #endif // SNGCM_AST_SOURCE_WRITER_INCLUDED