Index: src/SynTree/BaseSyntaxNode.h
===================================================================
--- src/SynTree/BaseSyntaxNode.h	(revision 99d45847f7626033f67b33afdf3e149972c747b0)
+++ src/SynTree/BaseSyntaxNode.h	(revision d3b2c32a655466c4084655c0fb259f5b8b1d0eb5)
@@ -41,7 +41,4 @@
   /// * Expressions should not finish with a newline, since the expression's parent has better information.
 	virtual void print( std::ostream & os, Indenter indent = {} ) const = 0;
-  // void print( std::ostream & os, unsigned int indent ) {
-  //   print( os, Indenter{ indent });
-  // }
 };
 
Index: src/SynTree/DeclReplacer.cc
===================================================================
--- src/SynTree/DeclReplacer.cc	(revision 99d45847f7626033f67b33afdf3e149972c747b0)
+++ src/SynTree/DeclReplacer.cc	(revision d3b2c32a655466c4084655c0fb259f5b8b1d0eb5)
@@ -30,4 +30,7 @@
 			bool debug;
 		public:
+			size_t replaced;
+
+		public:
 			DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
 
@@ -45,4 +48,7 @@
 			bool debug;
 		public:
+			size_t replaced;
+
+		public:
 			ExprDeclReplacer( const ExprMap & exprMap, bool debug = false );
 
@@ -52,26 +58,28 @@
 	}
 
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
+	size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
 		PassVisitor<DeclReplacer> replacer( declMap, typeMap, debug );
 		maybeAccept( node, replacer );
+		return replacer.pass.replaced;
 	}
 
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
+	size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
 		TypeMap typeMap;
-		replace( node, declMap, typeMap, debug );
+		return replace( node, declMap, typeMap, debug );
 	}
 
-	void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
+	size_t replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
 		DeclMap declMap;
-		replace( node, declMap, typeMap, debug );
+		return replace( node, declMap, typeMap, debug );
 	}
 
-	void replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug ) {
+	size_t replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug ) {
 		PassVisitor<ExprDeclReplacer> replacer( exprMap, debug );
 		node = maybeMutate( node, replacer );
+		return replacer.pass.replaced;
 	}
 
 	namespace {
-		DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ) {}
+		DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ), replaced( 0 ) {}
 
 		// replace variable with new node from decl map
@@ -79,4 +87,5 @@
 			// xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
 			if ( declMap.count( varExpr->var ) ) {
+				replaced++;
 				auto replacement = declMap.at( varExpr->var );
 				if ( debug ) {
@@ -89,4 +98,5 @@
 		void DeclReplacer::previsit( TypeInstType * inst ) {
 			if ( typeMap.count( inst->baseType ) ) {
+				replaced++;
 				auto replacement = typeMap.at( inst->baseType );
 				if ( debug ) {
@@ -97,8 +107,9 @@
 		}
 
-		ExprDeclReplacer::ExprDeclReplacer( const ExprMap & exprMap, bool debug ) : exprMap( exprMap ), debug( debug ) {}
+		ExprDeclReplacer::ExprDeclReplacer( const ExprMap & exprMap, bool debug ) : exprMap( exprMap ), debug( debug ), replaced( 0 ) {}
 
 		Expression * ExprDeclReplacer::postmutate( VariableExpr * varExpr ) {
 			if ( exprMap.count( varExpr->var ) ) {
+				replaced++;
 				Expression * replacement = exprMap.at( varExpr->var )->clone();
 				if ( debug ) {
Index: src/SynTree/DeclReplacer.h
===================================================================
--- src/SynTree/DeclReplacer.h	(revision 99d45847f7626033f67b33afdf3e149972c747b0)
+++ src/SynTree/DeclReplacer.h	(revision d3b2c32a655466c4084655c0fb259f5b8b1d0eb5)
@@ -28,9 +28,9 @@
 	typedef std::map< DeclarationWithType *, Expression * > ExprMap;
 
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
-	void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug = false );
-	void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
+	size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
+	size_t replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug = false );
+	size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
 
-	void replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug = false);
+	size_t replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug = false);
 	template<typename T>
 		void replace( T *& node, const ExprMap & exprMap, bool debug = false ) {
