blob: 13126b440571e984e6190584c73154628b0b3cfd [file] [log] [blame]
// Copyright (C) 2020-2024 Free Software Foundation, Inc.
// This file is part of GCC.
// GCC is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3, or (at your option) any later
// version.
// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include "rust-ast-builder-type.h"
#include "rust-ast-builder.h"
#include "rust-ast-full.h"
#include "rust-common.h"
namespace Rust {
namespace AST {
ASTTypeBuilder::ASTTypeBuilder () : translated (nullptr) {}
Type *
ASTTypeBuilder::build (Type &type)
{
ASTTypeBuilder builder;
type.accept_vis (builder);
rust_assert (builder.translated != nullptr);
return builder.translated;
}
void
ASTTypeBuilder::visit (BareFunctionType &fntype)
{
/* TODO */
}
void
ASTTypeBuilder::visit (TupleType &tuple)
{
std::vector<std::unique_ptr<Type> > elems;
for (auto &elem : tuple.get_elems ())
{
Type *t = ASTTypeBuilder::build (*elem.get ());
std::unique_ptr<Type> ty (t);
elems.push_back (std::move (ty));
}
translated = new TupleType (std::move (elems), tuple.get_locus ());
}
void
ASTTypeBuilder::visit (TypePath &path)
{
std::vector<std::unique_ptr<TypePathSegment> > segments;
for (auto &seg : path.get_segments ())
{
switch (seg->get_type ())
{
case TypePathSegment::REG: {
const TypePathSegment &segment
= (const TypePathSegment &) (*seg.get ());
TypePathSegment *s
= new TypePathSegment (segment.get_ident_segment (),
segment.get_separating_scope_resolution (),
segment.get_locus ());
std::unique_ptr<TypePathSegment> sg (s);
segments.push_back (std::move (sg));
}
break;
case TypePathSegment::GENERIC: {
TypePathSegmentGeneric &generic
= (TypePathSegmentGeneric &) (*seg.get ());
GenericArgs args
= Builder::new_generic_args (generic.get_generic_args ());
TypePathSegmentGeneric *s
= new TypePathSegmentGeneric (generic.get_ident_segment (), false,
std::move (args),
generic.get_locus ());
std::unique_ptr<TypePathSegment> sg (s);
segments.push_back (std::move (sg));
}
break;
case TypePathSegment::FUNCTION: {
rust_unreachable ();
// TODO
// const TypePathSegmentFunction &fn
// = (const TypePathSegmentFunction &) (*seg.get ());
}
break;
}
}
translated = new TypePath (std::move (segments), path.get_locus (),
path.has_opening_scope_resolution_op ());
}
void
ASTTypeBuilder::visit (QualifiedPathInType &path)
{
/* TODO */
}
void
ASTTypeBuilder::visit (ArrayType &type)
{
/* TODO */
}
void
ASTTypeBuilder::visit (ReferenceType &type)
{
/* TODO */
}
void
ASTTypeBuilder::visit (RawPointerType &type)
{
/* TODO */
}
void
ASTTypeBuilder::visit (SliceType &type)
{
Type *t = ASTTypeBuilder::build (type.get_elem_type ());
std::unique_ptr<Type> ty (t);
translated = new SliceType (std::move (ty), type.get_locus ());
}
void
ASTTypeBuilder::visit (InferredType &type)
{
translated = new InferredType (type.get_locus ());
}
void
ASTTypeBuilder::visit (NeverType &type)
{
translated = new NeverType (type.get_locus ());
}
void
ASTTypeBuilder::visit (TraitObjectTypeOneBound &type)
{
/* TODO */
}
void
ASTTypeBuilder::visit (TraitObjectType &type)
{
/* TODO */
}
} // namespace AST
} // namespace Rust