public void resolveEnum(EnumType e, DeclaredTypeRegistry registry) {
   Preconditions.checkState(
       e != null, "getEnum should only be " + "called when we know that the enum is defined");
   if (e.isResolved()) {
     return;
   }
   JSTypeExpression texp = e.getTypeExpr();
   JSType enumeratedType;
   if (texp == null) {
     warnings.add(JSError.make(e.getTypeExprForErrorReporting().getRoot(), CIRCULAR_TYPEDEF_ENUM));
     enumeratedType = JSType.UNKNOWN;
   } else {
     int numTypeVars = howmanyTypeVars;
     enumeratedType = getTypeFromJSTypeExpression(texp, registry, null);
     if (howmanyTypeVars > numTypeVars) {
       warnings.add(JSError.make(texp.getRoot(), ENUM_WITH_TYPEVARS));
       enumeratedType = JSType.UNKNOWN;
       howmanyTypeVars = numTypeVars;
     } else if (enumeratedType.isTop()) {
       warnings.add(JSError.make(texp.getRoot(), ENUM_IS_TOP));
       enumeratedType = JSType.UNKNOWN;
     } else if (enumeratedType.isUnion()) {
       warnings.add(JSError.make(texp.getRoot(), ENUM_IS_UNION));
       enumeratedType = JSType.UNKNOWN;
     }
   }
   e.resolveEnum(enumeratedType);
 }
 private JSType getEnumPropType(EnumType e, DeclaredTypeRegistry registry) {
   resolveEnum(e, registry);
   return e.getPropType();
 }