void visit (HIR::ImplTraitType &type) override { rust_unreachable (); }
void visit (HIR::TraitObjectType &type) override { rust_unreachable (); }
void visit (HIR::ParenthesisedType &type) override { rust_unreachable (); }
- void visit (HIR::ImplTraitTypeOneBound &type) override
- {
- rust_unreachable ();
- }
void visit (HIR::TupleType &type) override { rust_unreachable (); }
void visit (HIR::NeverType &type) override { rust_unreachable (); }
void visit (HIR::RawPointerType &type) override { rust_unreachable (); }
void visit (HIR::ImplTraitType &type) override {}
void visit (HIR::TraitObjectType &type) override {}
void visit (HIR::ParenthesisedType &type) override {}
- void visit (HIR::ImplTraitTypeOneBound &type) override {}
void visit (HIR::TupleType &type) override {}
void visit (HIR::NeverType &type) override {}
void visit (HIR::RawPointerType &type) override {}
ConstChecker::visit (ParenthesisedType &)
{}
-void
-ConstChecker::visit (ImplTraitTypeOneBound &)
-{}
-
void
ConstChecker::visit (TupleType &)
{}
virtual void visit (ImplTraitType &type) override;
virtual void visit (TraitObjectType &type) override;
virtual void visit (ParenthesisedType &type) override;
- virtual void visit (ImplTraitTypeOneBound &type) override;
virtual void visit (TupleType &type) override;
virtual void visit (NeverType &type) override;
virtual void visit (RawPointerType &type) override;
PatternChecker::visit (ParenthesisedType &)
{}
-void
-PatternChecker::visit (ImplTraitTypeOneBound &)
-{}
-
void
PatternChecker::visit (TupleType &)
{}
virtual void visit (ImplTraitType &type) override;
virtual void visit (TraitObjectType &type) override;
virtual void visit (ParenthesisedType &type) override;
- virtual void visit (ImplTraitTypeOneBound &type) override;
virtual void visit (TupleType &type) override;
virtual void visit (NeverType &type) override;
virtual void visit (RawPointerType &type) override;
UnsafeChecker::visit (ParenthesisedType &)
{}
-void
-UnsafeChecker::visit (ImplTraitTypeOneBound &)
-{}
-
void
UnsafeChecker::visit (TupleType &)
{}
virtual void visit (ImplTraitType &type) override;
virtual void visit (TraitObjectType &type) override;
virtual void visit (ParenthesisedType &type) override;
- virtual void visit (ImplTraitTypeOneBound &type) override;
virtual void visit (TupleType &type) override;
virtual void visit (NeverType &type) override;
virtual void visit (RawPointerType &type) override;
type.get_locus ());
}
+void
+ASTLoweringType::visit (AST::ImplTraitType &type)
+{
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+ for (auto &bound : type.get_type_param_bounds ())
+ {
+ auto b = ASTLoweringTypeBounds::translate (*bound.get ());
+ bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+ }
+
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ translated
+ = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
+void
+ASTLoweringType::visit (AST::ImplTraitTypeOneBound &type)
+{
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+
+ auto b = ASTLoweringTypeBounds::translate (type.get_trait_bound ());
+ bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ translated
+ = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
HIR::GenericParam *
ASTLowerGenericParam::translate (AST::GenericParam ¶m)
{
void visit (AST::TraitObjectType &type) override;
void visit (AST::ParenthesisedType &type) override;
+ void visit (AST::ImplTraitType &type) override;
+ void visit (AST::ImplTraitTypeOneBound &type) override;
+
private:
ASTLoweringType (bool default_to_static_lifetime)
: ASTLoweringBase (),
end ("ParenthesisedType");
}
-void
-Dump::visit (ImplTraitTypeOneBound &e)
-{
- begin ("ImplTraitTypeOneBound");
- do_type (e);
- visit_field ("trait_bound", e.get_trait_bound ());
- end ("ImplTraitTypeOneBound");
-}
-
void
Dump::visit (TupleType &e)
{
virtual void visit (ImplTraitType &) override;
virtual void visit (TraitObjectType &) override;
virtual void visit (ParenthesisedType &) override;
- virtual void visit (ImplTraitTypeOneBound &) override;
virtual void visit (TupleType &) override;
virtual void visit (NeverType &) override;
virtual void visit (RawPointerType &) override;
class ImplTraitType;
class TraitObjectType;
class ParenthesisedType;
-class ImplTraitTypeOneBound;
class TupleType;
class NeverType;
class RawPointerType;
void accept_vis (HIRTypeVisitor &vis) override;
};
-// Impl trait with a single bound? Poor reference material here.
-class ImplTraitTypeOneBound : public TypeNoBounds
-{
- TraitBound trait_bound;
-
-protected:
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ImplTraitTypeOneBound *clone_type_impl () const override
- {
- return new ImplTraitTypeOneBound (*this);
- }
-
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ImplTraitTypeOneBound *clone_type_no_bounds_impl () const override
- {
- return new ImplTraitTypeOneBound (*this);
- }
-
-public:
- ImplTraitTypeOneBound (Analysis::NodeMapping mappings, TraitBound trait_bound,
- location_t locus)
- : TypeNoBounds (mappings, locus), trait_bound (std::move (trait_bound))
- {}
-
- std::string as_string () const override;
- TraitBound &get_trait_bound () { return trait_bound; }
- void accept_vis (HIRFullVisitor &vis) override;
- void accept_vis (HIRTypeVisitor &vis) override;
-};
-
/* A type consisting of the "product" of others (the tuple's elements) in a
* specific order */
class TupleType : public TypeNoBounds
virtual void visit (ImplTraitType &type) = 0;
virtual void visit (TraitObjectType &type) = 0;
virtual void visit (ParenthesisedType &type) = 0;
- virtual void visit (ImplTraitTypeOneBound &type) = 0;
virtual void visit (TupleType &type) = 0;
virtual void visit (NeverType &type) = 0;
virtual void visit (RawPointerType &type) = 0;
virtual void visit (ImplTraitType &) override {}
virtual void visit (TraitObjectType &) override {}
virtual void visit (ParenthesisedType &) override {}
- virtual void visit (ImplTraitTypeOneBound &) override {}
virtual void visit (TupleType &) override {}
virtual void visit (NeverType &) override {}
virtual void visit (RawPointerType &) override {}
virtual void visit (ImplTraitType &type) = 0;
virtual void visit (TraitObjectType &type) = 0;
virtual void visit (ParenthesisedType &type) = 0;
- virtual void visit (ImplTraitTypeOneBound &type) = 0;
virtual void visit (TupleType &type) = 0;
virtual void visit (NeverType &type) = 0;
virtual void visit (RawPointerType &type) = 0;
return str;
}
-std::string
-ImplTraitTypeOneBound::as_string () const
-{
- std::string str ("ImplTraitTypeOneBound: \n TraitBound: ");
-
- return str + trait_bound.as_string ();
-}
-
std::string
TypePathSegmentGeneric::as_string () const
{
vis.visit (*this);
}
-void
-ImplTraitTypeOneBound::accept_vis (HIRFullVisitor &vis)
-{
- vis.visit (*this);
-}
-
void
TupleType::accept_vis (HIRFullVisitor &vis)
{
vis.visit (*this);
}
-void
-ImplTraitTypeOneBound::accept_vis (HIRTypeVisitor &vis)
-{
- vis.visit (*this);
-}
-
void
BareFunctionType::accept_vis (HIRTypeVisitor &vis)
{
// rust-ast-resolve-type.h
+NodeId
+ResolveType::go (AST::Type &type)
+{
+ ResolveType resolver;
+ type.accept_vis (resolver);
+ return resolver.resolved_node;
+}
+
+void
+ResolveType::visit (AST::BareFunctionType &fntype)
+{
+ for (auto ¶m : fntype.get_function_params ())
+ ResolveType::go (param.get_type ());
+
+ if (fntype.has_return_type ())
+ ResolveType::go (fntype.get_return_type ());
+}
+
+void
+ResolveType::visit (AST::TupleType &tuple)
+{
+ if (tuple.is_unit_type ())
+ {
+ resolved_node = resolver->get_unit_type_node_id ();
+ return;
+ }
+
+ for (auto &elem : tuple.get_elems ())
+ ResolveType::go (*elem);
+}
+
+void
+ResolveType::visit (AST::TypePath &path)
+{
+ ResolveRelativeTypePath::go (path, resolved_node);
+}
+
+void
+ResolveType::visit (AST::QualifiedPathInType &path)
+{
+ ResolveRelativeQualTypePath::go (path);
+}
+
void
ResolveType::visit (AST::ArrayType &type)
{
void
ResolveType::visit (AST::InferredType &)
{
- // FIXME
+ // nothing to do
}
void
resolved_node = ResolveType::go (type.get_elem_type ());
}
+void
+ResolveType::visit (AST::ImplTraitType &type)
+{
+ for (auto &bound : type.get_type_param_bounds ())
+ ResolveTypeBound::go (*bound);
+}
+
+void
+ResolveType::visit (AST::ImplTraitTypeOneBound &type)
+{
+ ResolveTypeBound::go (type.get_trait_bound ());
+}
+
// resolve relative type-paths
bool
using Rust::Resolver::ResolverBase::visit;
public:
- static NodeId go (AST::Type &type)
- {
- ResolveType resolver;
- type.accept_vis (resolver);
- return resolver.resolved_node;
- }
-
- void visit (AST::BareFunctionType &fntype) override
- {
- for (auto ¶m : fntype.get_function_params ())
- ResolveType::go (param.get_type ());
-
- if (fntype.has_return_type ())
- ResolveType::go (fntype.get_return_type ());
- }
-
- void visit (AST::TupleType &tuple) override
- {
- if (tuple.is_unit_type ())
- {
- resolved_node = resolver->get_unit_type_node_id ();
- return;
- }
-
- for (auto &elem : tuple.get_elems ())
- ResolveType::go (*elem);
- }
-
- void visit (AST::TypePath &path) override
- {
- ResolveRelativeTypePath::go (path, resolved_node);
- }
-
- void visit (AST::QualifiedPathInType &path) override
- {
- ResolveRelativeQualTypePath::go (path);
- }
+ static NodeId go (AST::Type &type);
+ void visit (AST::BareFunctionType &fntype) override;
+ void visit (AST::TupleType &tuple) override;
+ void visit (AST::TypePath &path) override;
+ void visit (AST::QualifiedPathInType &path) override;
void visit (AST::ArrayType &type) override;
-
void visit (AST::ReferenceType &type) override;
-
void visit (AST::InferredType &type) override;
-
void visit (AST::NeverType &type) override;
-
void visit (AST::RawPointerType &type) override;
-
void visit (AST::TraitObjectTypeOneBound &type) override;
-
void visit (AST::TraitObjectType &type) override;
-
void visit (AST::ParenthesisedType &type) override;
-
void visit (AST::SliceType &type) override;
+ void visit (AST::ImplTraitType &type) override;
+ void visit (AST::ImplTraitTypeOneBound &type) override;
private:
ResolveType () : ResolverBase () {}
void visit (HIR::ImplTraitType &type) override
{ /* TODO */
}
- void visit (HIR::ImplTraitTypeOneBound &type) override
- { /* TODO */
- }
private:
TypeCheckType (HirId id)