Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision ddb80bdef0426d2cec4497bdc27176f0987deb06)
+++ src/SynTree/AggregateDecl.cc	(revision fc9153d3ba3b3695534e2a2b4c1a7c29819e0975)
@@ -86,4 +86,37 @@
 std::string TraitDecl::typeString() const { return "trait"; }
 
+namespace {
+	long long int getConstValue( Expression * expr ) {
+		if ( CastExpr * castExpr = dynamic_cast< CastExpr * > ( expr ) ) {
+			return getConstValue( castExpr->arg );
+		} else if ( ConstantExpr * constExpr = dynamic_cast< ConstantExpr * >( expr ) ) {
+			return constExpr->intValue();
+		} else {
+			assertf( false, "Unhandled expression type in getConstValue for enumerators: %s", toString( expr ).c_str() );
+		}
+	}
+}
+
+bool EnumDecl::valueOf( Declaration * enumerator, long long int & value ) {
+	if ( enumValues.empty() ) {
+		long long int currentValue = 0;
+		for ( Declaration * member : members ) {
+			ObjectDecl * field = strict_dynamic_cast< ObjectDecl * >( member );
+			if ( field->init ) {
+				SingleInit * init = strict_dynamic_cast< SingleInit * >( field->init );
+				currentValue = getConstValue( init->value );
+			}
+			assertf( enumValues.count( field->name ) == 0, "Enum %s has multiple members with the name %s", name.c_str(), field->name.c_str() );
+			enumValues[ field->name ] = currentValue;
+			++currentValue;
+		}
+	}
+	if ( enumValues.count( enumerator->name ) ) {
+		value = enumValues[ enumerator->name ];
+		return true;
+	}
+	return false;
+}
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision ddb80bdef0426d2cec4497bdc27176f0987deb06)
+++ src/SynTree/Declaration.h	(revision fc9153d3ba3b3695534e2a2b4c1a7c29819e0975)
@@ -319,8 +319,11 @@
 	EnumDecl( const EnumDecl &other ) : Parent( other ) {}
 
+	bool valueOf( Declaration * enumerator, long long int & value );
+
 	virtual EnumDecl *clone() const override { return new EnumDecl( *this ); }
 	virtual void accept( Visitor &v ) override { v.visit( this ); }
 	virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
   private:
+	std::map< std::string, long long int > enumValues;
 	virtual std::string typeString() const override;
 };
