private IAnalysisSet GetRecurse(AnalysisValue protoStart, Node node, AnalysisUnit unit, string name, bool addRef) { var prototypes = protoStart.GetPrototype(unit.ProjectEntry); IAnalysisSet protovalue = AnalysisSet.Empty; if (prototypes != null) { try { foreach (var proto in prototypes) { if (PushProtoLookup(proto.Value)) { var property = proto.Value.GetProperty(node, unit, name); if (property != null) { var value = property.GetValue( node, unit, proto.Value.DeclaringModule, this.SelfSet, addRef ); protovalue = protovalue.Union(value); if (property.IsEphemeral) { protovalue = protovalue.Union(GetRecurse(proto.Value, node, unit, name, addRef)); } } else { // keep searching the prototype chain... protovalue = protovalue.Union(GetRecurse(proto.Value, node, unit, name, addRef)); } } } } finally { foreach (var proto in prototypes) { PopProtoLookup(proto.Value); } } } return(protovalue); }
private IAnalysisSet GetRecurse(AnalysisValue protoStart, Node node, AnalysisUnit unit, string name, bool addRef) { var prototypes = protoStart.GetPrototype(unit.ProjectEntry); IAnalysisSet protovalue = AnalysisSet.Empty; if (prototypes != null) { try { foreach (var proto in prototypes) { if (PushProtoLookup(proto.Value)) { var property = proto.Value.GetProperty(node, unit, name); if (property != null) { var value = property.GetValue( node, unit, proto.Value.DeclaringModule, this.SelfSet, addRef ); protovalue = protovalue.Union(value); if (property.IsEphemeral) { protovalue = protovalue.Union(GetRecurse(proto.Value, node, unit, name, addRef)); } } else { // keep searching the prototype chain... protovalue = protovalue.Union(GetRecurse(proto.Value, node, unit, name, addRef)); } } } } finally { foreach (var proto in prototypes) { PopProtoLookup(proto.Value); } } } return protovalue; }