code: @Nullable
    private SymbolScope maybeGetParentPropertyScope(ObjectType symbolObjectType) {
      ObjectType proto = symbolObjectType.getImplicitPrototype();
      if (proto == null || proto == symbolObjectType) {
        return null;
      }
      final Symbol parentSymbol;
      if (isEs6ClassConstructor(proto)) {
        // given `class Foo {} class Bar extends Foo {}`, `Foo` is the implicit prototype of `Bar`.
        parentSymbol = getSymbolDeclaredBy(proto.toMaybeFunctionType());
      } else if (proto.getConstructor() != null) {
        // given
        //   /** @constructor */ function Foo() {}
        //   /** @constructor */ function Bar() {}
        //   goog.inherits(Bar, Foo);
        // the implicit prototype of Bar.prototype is the instance of Foo.
        parentSymbol = getSymbolForInstancesOf(proto.getConstructor());
      } else {
        return null;
      }
      if (parentSymbol == null) {
        return null;
      }
      createPropertyScopeFor(parentSymbol);
      return parentSymbol.getPropertyScope();
    }
docs: If this type has an implicit prototype set, returns the SymbolScope corresponding to the
  properties of the implicit prototype. Otherwise returns null.
  
  <p>Note that currently we only handle cases where the implicit prototype is a) a class or b) is
  an instance object.