public final Node getPropertyDefSite(String propertyName) { return getPropertyNode(propertyName); }
@Nullable private static StaticSourceFile getDefiningSource( Node getprop, @Nullable ObjectType referenceType, String propertyName) { if (referenceType != null) { Node propDefNode = referenceType.getPropertyNode(propertyName); if (propDefNode != null) { return propDefNode.getStaticSourceFile(); } } return getprop.getStaticSourceFile(); }
/** * Returns the source file in which the given property is defined, * or null if it is not known. */ @Nullable private static StaticSourceFile getDefiningSource( Node getprop, @Nullable ObjectType referenceType, String propertyName) { if (referenceType != null) { Node propDefNode = referenceType.getPropertyNode(propertyName); if (propDefNode != null) { return propDefNode.getStaticSourceFile(); } } return getprop.getStaticSourceFile(); }
/** * Removes a given property from a type and updates type-registry. * * @param type the object type to be updated, should not be null * @param propName the property to remove */ private void removeProperty(ObjectType type, String propName) { Node pNode = type.getPropertyNode(propName); if (pNode != null && srcName.equals(pNode.getSourceFileName())) { typeRegistry.unregisterPropertyOnType(propName, type); type.removeProperty(propName); } }
/** * Removes a given property from a type and updates type-registry. * * @param type the object type to be updated, should not be null * @param propName the property to remove */ private void removeProperty(ObjectType type, String propName) { Node pNode = type.getPropertyNode(propName); if (pNode != null && srcName.equals(pNode.getSourceFileName())) { typeRegistry.unregisterPropertyOnType(propName, type); type.removeProperty(propName); } }
@Override public Set<String> caseObjectType(ObjectType type) { // Record types. // {a: T1, b: T2}. if (type.isRecordType()) { for (String propertyName : type.getOwnPropertyNames()) { // After type inference it is possible that some nodes in externs // can have types which are defined in non-extern code. To avoid // bleeding property names of such types into externs we check that // the node for each property was defined in externs. if (type.getPropertyNode(propertyName).isFromExterns()) { externProperties.add(propertyName); visitOnce(type.getPropertyType(propertyName)); } } } return externProperties; }
@Override public JSType caseObjectType(ObjectType objType) { if (!visitProperties || objType.isNominalType() || objType instanceof ProxyObjectType || !objType.isRecordType()) { return objType; } if (seenTypes.contains(objType)) { return objType; } seenTypes.add(objType); boolean changed = false; RecordTypeBuilder builder = new RecordTypeBuilder(registry); for (String prop : objType.getOwnPropertyNames()) { Node propertyNode = objType.getPropertyNode(prop); JSType beforeType = objType.getPropertyType(prop); JSType afterType = beforeType.visit(this); if (beforeType != afterType) { changed = true; } builder.addProperty(prop, afterType, propertyNode); } seenTypes.remove(objType); if (changed) { return builder.build(); } return objType; }
@Override public JSType caseObjectType(ObjectType objType) { if (!visitProperties || objType.isNominalType() || objType instanceof ProxyObjectType || !objType.isRecordType()) { return objType; } if (seenTypes.contains(objType)) { return objType; } seenTypes.add(objType); boolean changed = false; RecordTypeBuilder builder = new RecordTypeBuilder(registry); for (String prop : objType.getOwnPropertyNames()) { Node propertyNode = objType.getPropertyNode(prop); JSType beforeType = objType.getPropertyType(prop); JSType afterType = beforeType.visit(this); if (beforeType != afterType) { changed = true; } builder.addProperty(prop, afterType, propertyNode); } seenTypes.remove(objType); if (changed) { return builder.build(); } return objType; }
propertyName, patternObjectType.getPropertyType(propertyName), patternObjectType.getPropertyNode(propertyName));