third_party/closure-compiler/src/src/com/google/javascript/rhino/jstype/JSTypeRegistry.java
/**
   * Tells the type system that {@code owner} may have a property named
   * {@code propertyName}. This allows the registry to keep track of what
   * types a property is defined upon.
   *
   * This is NOT the same as saying that {@code owner} must have a property
   * named type. ObjectType#hasProperty attempts to minimize false positives
   * ("if we're not sure, then don't type check this property"). The type
   * registry, on the other hand, should attempt to minimize false negatives
   * ("if this property is assigned anywhere in the program, it must
   * show up in the type registry").
   */
Tells the type system that  owner may have a property named
propertyName. This allows the registry to keep track of what
types a property is defined upon.

This is NOT the same as saying that  owner must have a property
named type. ObjectType#hasProperty attempts to minimize false positives
("if we're not sure, then don't type check this property"). The type
registry, on the other hand, should attempt to minimize false negatives
("if this property is assigned anywhere in the program, it must
show up in the type registry").
Tells the type system that owner may have a property named propertyName . This allows the registry to keep track of what types a property is defined upon . This is NOT the same as saying that owner must have a property named type . ObjectType#hasProperty attempts to minimize false positives ( " if we ' re not sure then don ' t type check this property " ) . The type registry on the other hand should attempt to minimize false negatives ( " if this property is assigned anywhere in the program it must show up in the type registry " ) .
public void registerPropertyOnType(String propertyName, JSType type) {
    if (isObjectLiteralThatCanBeSkipped(type)) {
      type = getSentinelObjectLiteral();
    }
    if (type.isUnionType()) {
      typesIndexedByProperty.putAll(propertyName, type.toMaybeUnionType().getAlternates());
    } else {
      typesIndexedByProperty.put(propertyName, type);
    }
    addReferenceTypeIndexedByProperty(propertyName, type);
    greatestSubtypeByProperty.remove(propertyName);
  }
public void registerPropertyOnType ( String propertyName , JSType type ) { if ( isObjectLiteralThatCanBeSkipped ( type ) ) { type = getSentinelObjectLiteral ( ) ; } if ( type . isUnionType ( ) ) { typesIndexedByProperty . putAll ( propertyName , type . toMaybeUnionType ( ) . getAlternates ( ) ) ; } else { typesIndexedByProperty . put ( propertyName , type ) ; } addReferenceTypeIndexedByProperty ( propertyName , type ) ; greatestSubtypeByProperty . remove ( propertyName ) ; }
Tells the type system that {@code owner} may have a property named
 {@code propertyName}.
Tells the type system that { @code owner } may have a property named { @code propertyName } .
// Clear cached values that depend on typesIndexedByProperty.