code: static Visibility getEffectivePropertyVisibility(
        Node property,
        ObjectType referenceType,
        ImmutableMap<StaticSourceFile, Visibility> fileVisibilityMap,
        @Nullable CodingConvention codingConvention) {
      String propertyName = property.getLastChild().getString();
      StaticSourceFile definingSource = getDefiningSource(
          property, referenceType, propertyName);
      Visibility fileOverviewVisibility = fileVisibilityMap.get(definingSource);
      Node parent = property.getParent();
      boolean isOverride = parent.getJSDocInfo() != null
          && parent.isAssign()
          && parent.getFirstChild() == property;
      ObjectType objectType = getObjectType(
          referenceType, isOverride, propertyName);
      if (isOverride) {
        Visibility overridden = getOverriddenPropertyVisibility(
            objectType, propertyName);
        return getEffectiveVisibilityForOverriddenProperty(
            overridden, fileOverviewVisibility, propertyName, codingConvention);
      } else {
        return getEffectiveVisibilityForNonOverriddenProperty(
            property, objectType, fileOverviewVisibility, codingConvention);
      }
    }
docs: Returns the effective visibility of the given property. This can differ
  from the property's declared visibility if the property is inherited from
  a superclass, or if the file's {@code @fileoverview} JsDoc specifies
  a default visibility.
  
  @param property The property to compute effective visibility for.
  @param referenceType The JavaScript type of the property.
  @param fileVisibilityMap A map of {@code @fileoverview} visibility
  annotations, used to compute the property's default visibility.
  @param codingConvention The coding convention in effect (if any),
  used to determine whether the property is private by lexical convention
  (example: trailing underscore).