mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-27 10:20:11 +01:00
- Switch code to llvm::raw_ostream as part of standardizing output forms.
- Preferring llvm::raw_ostream over std::ostream because other tooling code should be expected to rely on llvm more closely, and an overall preference towards library consistency.
- There are a couple spots in syntax/ that still use std streams, but I'd prefer to take a separate PR to see how best to address those.
- std::boolalpha doesn't work with llvm, so I've implemented equivalent in a couple places (not enough that it felt like worth making a helper function).
- Implement Print(ostream) as consistently as we can, as an instance member.
- This facilitates the use of the common/ostream.h template to provide operators.
- Preferring this approach so that Print is easily accessible via gdb, per suggestion on #executable-semantics.
- Switch code currently calling `type->Print(ostream)` to instead do `ostream << *type`.
- Remove the unused `PrintTypeEnv`, nothing used it and the declaration didn't match the definition.
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
#ifndef EXECUTABLE_SEMANTICS_INTERPRETER_FIELD_PATH_H_
|
|
#define EXECUTABLE_SEMANTICS_INTERPRETER_FIELD_PATH_H_
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "common/ostream.h"
|
|
|
|
namespace Carbon {
|
|
|
|
// Given some initial Value, a FieldPath identifies a sub-Value within it,
|
|
// in much the same way that a file path identifies a file within some
|
|
// directory. FieldPaths are relative rather than absolute: the initial
|
|
// Value is specified by the context in which the FieldPath is used, not
|
|
// by the FieldPath itself.
|
|
//
|
|
// A FieldPath consists of a series of steps, which specify how to
|
|
// incrementally navigate from a Value to one of its fields. Currently
|
|
// there is only one kind of step, a string specifying a child field by name,
|
|
// but that may change as Carbon develops. Note that an empty FieldPath
|
|
// refers to the initial Value itself.
|
|
class FieldPath {
|
|
public:
|
|
// Constructs an empty FieldPath.
|
|
FieldPath() = default;
|
|
|
|
// Constructs a FieldPath consisting of a single step.
|
|
explicit FieldPath(std::string name) : components({std::move(name)}) {}
|
|
|
|
FieldPath(const FieldPath&) = default;
|
|
FieldPath(FieldPath&&) = default;
|
|
auto operator=(const FieldPath&) -> FieldPath& = default;
|
|
auto operator=(FieldPath&&) -> FieldPath& = default;
|
|
|
|
// Returns whether *this is empty.
|
|
auto IsEmpty() const -> bool { return components.empty(); }
|
|
|
|
// Appends `name` to the end of *this.
|
|
auto Append(std::string name) -> void {
|
|
components.push_back(std::move(name));
|
|
}
|
|
|
|
void Print(llvm::raw_ostream& out) const {
|
|
for (const std::string& component : components) {
|
|
out << "." << component;
|
|
}
|
|
}
|
|
|
|
private:
|
|
// The representation of FieldPath describes how to locate a Value within
|
|
// another Value, so its implementation details are tied to the implementation
|
|
// details of Value.
|
|
friend struct Value;
|
|
std::vector<std::string> components;
|
|
};
|
|
|
|
} // namespace Carbon
|
|
|
|
#endif // EXECUTABLE_SEMANTICS_INTERPRETER_FIELD_PATH_H_
|