Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 1f37045134019dcc85ce9bbfe573c87275cfb714)
+++ src/SymTab/Indexer.cc	(revision 81644e025cbf854af3550d54b343f22ec9ec8f05)
@@ -567,4 +567,20 @@
 	}
 
+	void Indexer::addWith( WithStmt * stmt ) {
+		for ( Expression * expr : stmt->exprs ) {
+			if ( expr->result ) {
+				AggregateDecl * aggr = expr->result->getAggr();
+				assertf( aggr, "WithStmt expr has non-aggregate type: %s", toString( expr->result ).c_str() );
+
+				// xxx - this is wrong, needs to somehow hook up chain of objects
+				for ( Declaration * decl : aggr->members ) {
+					if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * >( decl ) ) {
+						addId( dwt );
+					}
+				}
+			}
+		}
+	}
+
 	void Indexer::addIds( const std::list< DeclarationWithType * > & decls ) {
 		for ( auto d : decls ) {
Index: src/SymTab/Indexer.h
===================================================================
--- src/SymTab/Indexer.h	(revision 1f37045134019dcc85ce9bbfe573c87275cfb714)
+++ src/SymTab/Indexer.h	(revision 81644e025cbf854af3550d54b343f22ec9ec8f05)
@@ -76,4 +76,7 @@
 		void addTrait( TraitDecl *decl );
 
+		/// adds all of the IDs from WithStmt exprs
+		void addWith( WithStmt * );
+
 		/// convenience function for adding a list of Ids to the indexer
 		void addIds( const std::list< DeclarationWithType * > & decls );
