mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-01 19:45:58 +01:00
Reals were mostly handled, but this PR adds storage of them. It also switches a little towards the FloatingPointType semantic from TokenizedBuffer. While real literals like `1.0` were handled, the type literals were not. This just adds `f64`, similar to how I also only support `i32`. The String type literal wasn't used, so I've added support in lexer and parser. Per discussion with @zygoloid String might be renamed based on the newer type literal plan, but it's still String in explorer and the design, so this is just consistent. The builtin_types.carbon tests the three basic types that are there right now. The test is added to both parser and semantics so that it's clear what the state is in both stages.
79 lines
3.0 KiB
C++
79 lines
3.0 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
|
|
|
|
#include "toolchain/semantics/semantics_ir.h"
|
|
|
|
#include <gmock/gmock.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <forward_list>
|
|
|
|
#include "toolchain/common/yaml_test_helpers.h"
|
|
#include "toolchain/diagnostics/diagnostic_emitter.h"
|
|
#include "toolchain/lexer/tokenized_buffer.h"
|
|
|
|
namespace Carbon::Testing {
|
|
namespace {
|
|
|
|
using ::testing::_;
|
|
using ::testing::AllOf;
|
|
using ::testing::Contains;
|
|
using ::testing::Each;
|
|
using ::testing::ElementsAre;
|
|
using ::testing::IsEmpty;
|
|
using ::testing::MatchesRegex;
|
|
using ::testing::Pair;
|
|
|
|
TEST(SemanticsIRTest, YAML) {
|
|
DiagnosticConsumer& consumer = ConsoleDiagnosticConsumer();
|
|
llvm::Expected<SourceBuffer> source =
|
|
SourceBuffer::CreateFromText("var x: i32 = 0;");
|
|
TokenizedBuffer tokens = TokenizedBuffer::Lex(*source, consumer);
|
|
ParseTree parse_tree =
|
|
ParseTree::Parse(tokens, consumer, /*vlog_stream=*/nullptr);
|
|
SemanticsIR builtin_ir = SemanticsIR::MakeBuiltinIR();
|
|
SemanticsIR semantics_ir = SemanticsIR::MakeFromParseTree(
|
|
builtin_ir, tokens, parse_tree, consumer, /*vlog_stream=*/nullptr);
|
|
|
|
std::string print_output;
|
|
llvm::raw_string_ostream print_stream(print_output);
|
|
semantics_ir.Print(print_stream);
|
|
print_stream.flush();
|
|
|
|
// Matches the ID of a node. The numbers may change because of builtin
|
|
// cross-references, so this code is only doing loose structural checks.
|
|
auto node_id = Yaml::Scalar(MatchesRegex("node\\d+"));
|
|
|
|
EXPECT_THAT(
|
|
Yaml::Value::FromText(print_output),
|
|
ElementsAre(Yaml::Mapping(ElementsAre(
|
|
Pair("cross_reference_irs_size", "1"),
|
|
Pair("callables", Yaml::Sequence(IsEmpty())),
|
|
Pair("integer_literals", Yaml::Sequence(ElementsAre("0"))),
|
|
Pair("real_literals", Yaml::Sequence(IsEmpty())),
|
|
Pair("strings", Yaml::Sequence(ElementsAre("x"))),
|
|
Pair("nodes",
|
|
Yaml::Sequence(AllOf(
|
|
// kind is required, other parts are optional.
|
|
Each(Yaml::Mapping(Contains(Pair("kind", _)))),
|
|
// A 0-arg node.
|
|
Contains(Yaml::Mapping(ElementsAre(
|
|
Pair("kind", "VarStorage"), Pair("type", node_id)))),
|
|
// A 1-arg node.
|
|
Contains(Yaml::Mapping(ElementsAre(
|
|
Pair("kind", "IntegerLiteral"), Pair("arg0", "int0"),
|
|
Pair("type", node_id)))),
|
|
// A 2-arg node.
|
|
Contains(Yaml::Mapping(ElementsAre(
|
|
Pair("kind", "BindName"), Pair("arg0", "str0"),
|
|
Pair("arg1", node_id), Pair("type", node_id))))))),
|
|
// This production has only one node block.
|
|
Pair("node_blocks",
|
|
Yaml::Sequence(ElementsAre(Yaml::Sequence(IsEmpty()),
|
|
Yaml::Sequence(Each(node_id)))))))));
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace Carbon::Testing
|