@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; }