mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 11:21:05 +01:00
- Distinguish attached vs. unattached constants. - Add some missing value stores to the top-level output. - Add missing fields to various Print methods.
69 lines
2.5 KiB
C++
69 lines
2.5 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 CARBON_TOOLCHAIN_SEM_IR_NAME_H_
|
|
#define CARBON_TOOLCHAIN_SEM_IR_NAME_H_
|
|
|
|
#include "toolchain/base/shared_value_stores.h"
|
|
#include "toolchain/base/value_ids.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::SemIR {
|
|
|
|
// Provides a ValueStore-like interface for names.
|
|
//
|
|
// A name is either an identifier name or a special name such as `self` that
|
|
// does not correspond to an identifier token. Identifier names are represented
|
|
// as `NameId`s with the same non-negative index as the `IdentifierId` of the
|
|
// identifier. Special names are represented as `NameId`s with a negative index.
|
|
//
|
|
// `NameId` values should be obtained by using `NameId::ForIdentifier` or the
|
|
// named constants such as `NameId::SelfValue`.
|
|
//
|
|
// As we do not require any additional explicit storage for names, this is
|
|
// currently a wrapper around an identifier store that has no state of its own.
|
|
class NameStoreWrapper {
|
|
public:
|
|
explicit NameStoreWrapper(
|
|
const SharedValueStores::IdentifierStore* identifiers)
|
|
: identifiers_(identifiers) {}
|
|
|
|
// Returns the requested name as a string, if it is an identifier name. This
|
|
// returns std::nullopt for special names.
|
|
auto GetAsStringIfIdentifier(NameId name_id) const
|
|
-> std::optional<llvm::StringRef> {
|
|
if (auto identifier_id = name_id.AsIdentifierId();
|
|
identifier_id.has_value()) {
|
|
return identifiers_->Get(identifier_id);
|
|
}
|
|
return std::nullopt;
|
|
}
|
|
|
|
// Returns the requested name as a string for formatted output. This returns
|
|
// `"r#name"` if `name` is a keyword.
|
|
auto GetFormatted(NameId name_id) const -> llvm::StringRef;
|
|
|
|
// Returns a best-effort name to use as the basis for SemIR and LLVM IR names.
|
|
// This is always identifier-shaped, but may be ambiguous, for example if
|
|
// there is both a `self` and an `r#self` in the same scope. Returns "" if
|
|
// `name_id` is `None`.
|
|
auto GetIRBaseName(NameId name_id) const -> llvm::StringRef;
|
|
|
|
auto OutputYaml() const -> Yaml::OutputMapping {
|
|
return Yaml::OutputMapping([&](Yaml::OutputMapping::Map map) {
|
|
for (auto [identifier_id, value] : identifiers_->enumerate()) {
|
|
map.Add(PrintToString(NameId{identifier_id.index}),
|
|
Yaml::OutputScalar(value));
|
|
}
|
|
});
|
|
}
|
|
|
|
private:
|
|
const SharedValueStores::IdentifierStore* identifiers_;
|
|
};
|
|
|
|
} // namespace Carbon::SemIR
|
|
|
|
#endif // CARBON_TOOLCHAIN_SEM_IR_NAME_H_
|