1*0fca6ea1SDimitry Andric //===- CodeExpander.h - Expand variables in a string ------------*- C++ -*-===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric // 9*0fca6ea1SDimitry Andric /// \file Expand the variables in a string. 10*0fca6ea1SDimitry Andric // 11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 12*0fca6ea1SDimitry Andric 13*0fca6ea1SDimitry Andric #ifndef LLVM_UTILS_TABLEGEN_CODEEXPANDER_H 14*0fca6ea1SDimitry Andric #define LLVM_UTILS_TABLEGEN_CODEEXPANDER_H 15*0fca6ea1SDimitry Andric 16*0fca6ea1SDimitry Andric #include "llvm/ADT/ArrayRef.h" 17*0fca6ea1SDimitry Andric #include "llvm/ADT/StringRef.h" 18*0fca6ea1SDimitry Andric 19*0fca6ea1SDimitry Andric namespace llvm { 20*0fca6ea1SDimitry Andric class CodeExpansions; 21*0fca6ea1SDimitry Andric class SMLoc; 22*0fca6ea1SDimitry Andric class raw_ostream; 23*0fca6ea1SDimitry Andric 24*0fca6ea1SDimitry Andric /// Emit the given code with all '${foo}' placeholders expanded to their 25*0fca6ea1SDimitry Andric /// replacements. 26*0fca6ea1SDimitry Andric /// 27*0fca6ea1SDimitry Andric /// It's an error to use an undefined expansion and expansion-like output that 28*0fca6ea1SDimitry Andric /// needs to be emitted verbatim can be escaped as '\${foo}' 29*0fca6ea1SDimitry Andric /// 30*0fca6ea1SDimitry Andric /// The emitted code can be given a custom indent to enable both indentation by 31*0fca6ea1SDimitry Andric /// an arbitrary amount of whitespace and emission of the code as a comment. 32*0fca6ea1SDimitry Andric class CodeExpander { 33*0fca6ea1SDimitry Andric StringRef Code; 34*0fca6ea1SDimitry Andric const CodeExpansions &Expansions; 35*0fca6ea1SDimitry Andric const ArrayRef<SMLoc> &Loc; 36*0fca6ea1SDimitry Andric bool ShowExpansions; 37*0fca6ea1SDimitry Andric StringRef Indent; 38*0fca6ea1SDimitry Andric 39*0fca6ea1SDimitry Andric public: 40*0fca6ea1SDimitry Andric CodeExpander(StringRef Code, const CodeExpansions &Expansions, 41*0fca6ea1SDimitry Andric const ArrayRef<SMLoc> &Loc, bool ShowExpansions, 42*0fca6ea1SDimitry Andric StringRef Indent = " ") 43*0fca6ea1SDimitry Andric : Code(Code), Expansions(Expansions), Loc(Loc), 44*0fca6ea1SDimitry Andric ShowExpansions(ShowExpansions), Indent(Indent) {} 45*0fca6ea1SDimitry Andric 46*0fca6ea1SDimitry Andric void emit(raw_ostream &OS) const; 47*0fca6ea1SDimitry Andric }; 48*0fca6ea1SDimitry Andric 49*0fca6ea1SDimitry Andric inline raw_ostream &operator<<(raw_ostream &OS, const CodeExpander &Expander) { 50*0fca6ea1SDimitry Andric Expander.emit(OS); 51*0fca6ea1SDimitry Andric return OS; 52*0fca6ea1SDimitry Andric } 53*0fca6ea1SDimitry Andric } // end namespace llvm 54*0fca6ea1SDimitry Andric 55*0fca6ea1SDimitry Andric #endif // ifndef LLVM_UTILS_TABLEGEN_CODEEXPANDER_H 56