Index: src/Common/CodeLocationTools.cpp
===================================================================
--- src/Common/CodeLocationTools.cpp	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Common/CodeLocationTools.cpp	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
@@ -105,4 +105,5 @@
     macro(UnionDecl, Decl) \
     macro(EnumDecl, Decl) \
+	macro(AdtDecl, Decl) \
     macro(TraitDecl, Decl) \
     macro(TypeDecl, Decl) \
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Common/PassVisitor.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
@@ -69,4 +69,6 @@
 	virtual void visit( EnumDecl * aggregateDecl ) override final;
 	virtual void visit( const EnumDecl * aggregateDecl ) override final;
+	virtual void visit( AdtDecl * aggregateDecl ) override final;
+	virtual void visit( const AdtDecl * AggregateDecl ) override final;
 	virtual void visit( TraitDecl * aggregateDecl ) override final;
 	virtual void visit( const TraitDecl * aggregateDecl ) override final;
@@ -269,4 +271,5 @@
 	virtual Declaration * mutate( UnionDecl * aggregateDecl ) override final;
 	virtual Declaration * mutate( EnumDecl * aggregateDecl ) override final;
+	virtual Declaration * mutate( AdtDecl * aggregateDecl ) override final;
 	virtual Declaration * mutate( TraitDecl * aggregateDecl ) override final;
 	virtual Declaration * mutate( TypeDecl * typeDecl ) override final;
@@ -439,4 +442,5 @@
 	void indexerAddStructFwd( const StructDecl          * node  ) { indexer_impl_addStructFwd( pass, 0, node ); }
 	void indexerAddEnum     ( const EnumDecl            * node  ) { indexer_impl_addEnum     ( pass, 0, node ); }
+	void indexerAddAdt		( const AdtDecl				* node  ) { indexer_impl_addAdt		 ( pass, 0, node ); }
 	void indexerAddUnion    ( const std::string         & id    ) { indexer_impl_addUnion    ( pass, 0, id   ); }
 	void indexerAddUnion    ( const UnionDecl           * node  ) { indexer_impl_addUnion    ( pass, 0, node ); }
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Common/PassVisitor.impl.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
@@ -754,7 +754,4 @@
 
 	// unlike structs, traits, and unions, enums inject their members into the global scope
-	maybeAccept_impl( node->data_constructors, *this );
-	maybeAccept_impl( node->data_union, *this );
-	maybeAccept_impl( node->tags, *this );
 	maybeAccept_impl( node->parameters, *this );
 	maybeAccept_impl( node->members   , *this );
@@ -785,4 +782,53 @@
 
 	// unlike structs, traits, and unions, enums inject their members into the global scope
+	maybeMutate_impl( node->parameters, *this );
+	maybeMutate_impl( node->members   , *this );
+	maybeMutate_impl( node->attributes, *this );
+
+	MUTATE_END( Declaration, node );
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( AdtDecl * node ) {
+	VISIT_START( node );
+
+	indexerAddAdt( node );
+
+	// unlike structs, traits, and unions, enums inject their members into the global scope
+	maybeAccept_impl( node->data_constructors, *this );
+	maybeAccept_impl( node->data_union, *this );
+	maybeAccept_impl( node->tag, *this );
+
+	maybeAccept_impl( node->parameters, *this );
+	maybeAccept_impl( node->members   , *this );
+	maybeAccept_impl( node->attributes, *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( const AdtDecl * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->data_constructors, *this );
+	maybeAccept_impl( node->data_union, *this );
+	maybeAccept_impl( node->tag, *this );
+
+	maybeAccept_impl( node->parameters, *this );
+	maybeAccept_impl( node->members   , *this );
+	maybeAccept_impl( node->attributes, *this );
+
+
+	VISIT_END( node );
+}  
+
+template< typename pass_type >
+Declaration * PassVisitor< pass_type >::mutate( AdtDecl * node ) {
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->data_constructors, *this );
+	maybeMutate_impl( node->data_union, *this );
+	maybeMutate_impl( node->tag, *this );
+
 	maybeMutate_impl( node->parameters, *this );
 	maybeMutate_impl( node->members   , *this );
Index: src/Common/PassVisitor.proto.h
===================================================================
--- src/Common/PassVisitor.proto.h	(revision 28f8f154b94c0b9fd3ef74a8d0de01187a5522c6)
+++ src/Common/PassVisitor.proto.h	(revision d6c464d2c9198b52bd24eb294ced8667c66dad4a)
@@ -233,4 +233,5 @@
 INDEXER_FUNC1( addStruct , const StructDecl *                );
 INDEXER_FUNC1( addEnum   , const EnumDecl *                  );
+INDEXER_FUNC1( addAdt	 , const AdtDecl * 					 );
 INDEXER_FUNC1( addUnion  , const UnionDecl *                 );
 INDEXER_FUNC1( addTrait  , const TraitDecl *                 );
