| 591 | } |
| 592 | |
| 593 | void llvm::json::OStream::value(const Value &V) { |
| 594 | switch (V.kind()) { |
| 595 | case Value::Null: |
| 596 | valueBegin(); |
| 597 | OS << "null"; |
| 598 | return; |
| 599 | case Value::Boolean: |
| 600 | valueBegin(); |
| 601 | OS << (*V.getAsBoolean() ? "true" : "false"); |
| 602 | return; |
| 603 | case Value::Number: |
| 604 | valueBegin(); |
| 605 | if (V.Type == Value::T_Integer) |
| 606 | OS << *V.getAsInteger(); |
| 607 | else |
| 608 | OS << format("%.*g", std::numeric_limits<double>::max_digits10, |
| 609 | *V.getAsNumber()); |
| 610 | return; |
| 611 | case Value::String: |
| 612 | valueBegin(); |
| 613 | quote(OS, *V.getAsString()); |
| 614 | return; |
| 615 | case Value::Array: |
| 616 | return array([&] { |
| 617 | for (const Value &E : *V.getAsArray()) |
| 618 | value(E); |
| 619 | }); |
| 620 | case Value::Object: |
| 621 | return object([&] { |
| 622 | for (const Object::value_type *E : sortedElements(*V.getAsObject())) |
| 623 | attribute(E->first, E->second); |
| 624 | }); |
| 625 | } |
| 626 | } |
| 627 | |
| 628 | void llvm::json::OStream::valueBegin() { |
| 629 | assert(Stack.back().Ctx != Object && "Only attributes allowed here"); |
no test coverage detected