@Override
 public ConcreteType getTypeWithProperty(String field, ConcreteType type) {
   if (type.isInstance()) {
     ConcreteInstanceType instanceType = (ConcreteInstanceType) type;
     return instanceType.getInstanceTypeWithProperty(field);
   } else if (type.isFunction()) {
     if ("prototype".equals(field) || codingConvention.isSuperClassReference(field)) {
       return type;
     }
   } else if (type.isNone()) {
     // If the receiver is none, then this code is never reached.  We will
     // return a new fake type to ensure that this access is renamed
     // differently from any other, so it can be easily removed.
     return new ConcreteUniqueType(++nextUniqueId);
   } else if (type.isUnion()) {
     // If only one has the property, return that.
     for (ConcreteType t : ((ConcreteUnionType) type).getAlternatives()) {
       ConcreteType ret = getTypeWithProperty(field, t);
       if (ret != null) {
         return ret;
       }
     }
   }
   return null;
 }
 @Override
 public ConcreteType getInstanceFromPrototype(ConcreteType type) {
   if (type.isInstance()) {
     ConcreteInstanceType instanceType = (ConcreteInstanceType) type;
     if (instanceType.isFunctionPrototype()) {
       return instanceType.getConstructorType().getInstanceType();
     }
   }
   return null;
 }