protected virtual int WriteTemplate(StringTemplate self, StringTemplate stToWrite, IStringTemplateWriter @out) { int n = 0; /* failsafe: perhaps enclosing instance not set * Or, it could be set to another context! This occurs * when you store a template instance as an attribute of more * than one template (like both a header file and C file when * generating C code). It must execute within the context of * the enclosing template. */ stToWrite.EnclosingInstance = self; // if self is found up the enclosing instance chain, then infinite recursion if (StringTemplate.LintMode && StringTemplate.IsRecursiveEnclosingInstance(stToWrite)) { // throw exception since sometimes eval keeps going even after I ignore this write of o. throw new InvalidOperationException("infinite recursion to " + stToWrite.GetTemplateDeclaratorString() + " referenced in " + stToWrite.EnclosingInstance.TemplateDeclaratorString + "; stack trace:" + Environment.NewLine + stToWrite.GetEnclosingInstanceStackTrace()); } else { // if we have a wrap string, then inform writer it might need to wrap if (_wrapString != null) { n = @out.WriteWrapSeparator(_wrapString); } // check if formatting needs to be applied to the stToWrite if (_formatString != null) { IAttributeRenderer renderer = self.GetAttributeRenderer(typeof(string)); if (renderer != null) { /* you pay a penalty for applying format option to a template * because the template must be written to a temp StringWriter so it can * be formatted before being written to the real output. */ StringWriter buf = new StringWriter(); IStringTemplateWriter sw = self.Group.GetStringTemplateWriter(buf); stToWrite.Write(sw); n = @out.Write(renderer.ToString(buf.ToString(), _formatString)); return n; } } n = stToWrite.Write(@out); } return n; }