| 126 | } |
| 127 | |
| 128 | void ReferenceInfo::outputToStream(std::ostream& os) const { |
| 129 | auto it = rbegin(); |
| 130 | auto end = rend(); |
| 131 | |
| 132 | if (it == end) { |
| 133 | os << "<unknown>"; |
| 134 | return; |
| 135 | } |
| 136 | |
| 137 | bool previousIsPropertyLike = false; |
| 138 | bool hasPrevious = false; |
| 139 | while (it != end) { |
| 140 | const auto& component = *it; |
| 141 | |
| 142 | switch (component.type) { |
| 143 | case Component::Type::Unknown: |
| 144 | os << "<unknown>"; |
| 145 | previousIsPropertyLike = false; |
| 146 | break; |
| 147 | case Component::Type::Property: |
| 148 | if (previousIsPropertyLike) { |
| 149 | os << "."; |
| 150 | } |
| 151 | |
| 152 | if (component.hasAssignedName) { |
| 153 | os << getNameForComponent(component); |
| 154 | } else { |
| 155 | if (component.isFunction) { |
| 156 | os << "<unknown_function>"; |
| 157 | } else { |
| 158 | os << "<unknown_property>"; |
| 159 | } |
| 160 | } |
| 161 | previousIsPropertyLike = true; |
| 162 | |
| 163 | break; |
| 164 | case Component::Type::ReturnValue: |
| 165 | if (hasPrevious) { |
| 166 | os << " -> "; |
| 167 | } |
| 168 | |
| 169 | os << "<return_value>"; |
| 170 | previousIsPropertyLike = true; |
| 171 | break; |
| 172 | case Component::Type::ParameterValue: |
| 173 | if (hasPrevious) { |
| 174 | os << " -> "; |
| 175 | } |
| 176 | |
| 177 | os << "<parameter " << static_cast<size_t>(component.index); |
| 178 | os << ">"; |
| 179 | previousIsPropertyLike = true; |
| 180 | break; |
| 181 | case Component::Type::ArrayItem: |
| 182 | if (!hasPrevious) { |
| 183 | os << "<array>"; |
| 184 | } |
| 185 |
no outgoing calls
no test coverage detected