summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ast/ast.cpp12
-rw-r--r--src/ast/ast.hpp23
-rw-r--r--src/ast/expr.hpp27
-rw-r--r--src/ast/generics.hpp36
-rw-r--r--src/ast/types.hpp24
-rw-r--r--src/expand/cfg.cpp4
-rw-r--r--src/expand/derive.cpp56
-rw-r--r--src/expand/mod.cpp8
-rw-r--r--src/parse/expr.cpp6
-rw-r--r--src/parse/root.cpp76
-rw-r--r--src/resolve/absolute.cpp12
11 files changed, 121 insertions, 163 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index 08aad21b..144842db 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -77,7 +77,7 @@ TupleItem TupleItem::clone() const
TypeAlias TypeAlias::clone() const
{
- return TypeAlias( m_params, m_type );
+ return TypeAlias( m_params.clone(), m_type );
}
Static Static::clone() const
{
@@ -101,7 +101,7 @@ Function Function::clone() const
for(const auto& arg : m_args)
new_args.push_back( ::std::make_pair( arg.first.clone(), arg.second ) );
- auto rv = Function( m_span, m_params, m_abi, m_is_unsafe, m_is_const, m_is_variadic, m_rettype, mv$(new_args) );
+ auto rv = Function( m_span, m_params.clone(), m_abi, m_is_unsafe, m_is_const, m_is_variadic, m_rettype, mv$(new_args) );
if( m_code.is_valid() )
{
rv.m_code = AST::Expr( m_code.node().clone() );
@@ -139,7 +139,7 @@ bool Trait::has_named_item(const ::std::string& name, bool& out_is_fcn) const
Trait Trait::clone() const
{
- auto rv = Trait(m_params, m_supertraits);
+ auto rv = Trait(m_params.clone(), m_supertraits);
for(const auto& item : m_items)
{
rv.m_items.push_back( Named<Item> { item.name, item.data.clone(), item.is_pub } );
@@ -167,7 +167,7 @@ Enum Enum::clone() const
)
)
}
- return Enum(m_params, mv$(new_variants));
+ return Enum(m_params.clone(), mv$(new_variants));
}
Struct Struct::clone() const
{
@@ -176,13 +176,13 @@ Struct Struct::clone() const
decltype(e.ents) new_fields;
for(const auto& f : e.ents)
new_fields.push_back( f.clone() );
- return Struct(m_params, mv$(new_fields));
+ return Struct(m_params.clone(), mv$(new_fields));
),
(Struct,
decltype(e.ents) new_fields;
for(const auto& f : e.ents)
new_fields.push_back( f.clone() );
- return Struct(m_params, mv$(new_fields));
+ return Struct(m_params.clone(), mv$(new_fields));
)
)
throw "";
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index 700a7e40..e6b1ea1c 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -55,9 +55,7 @@ struct StructItem
::std::string m_name;
TypeRef m_type;
- StructItem()
- {
- }
+ //StructItem() {}
StructItem(::AST::MetaItems attrs, bool is_pub, ::std::string name, TypeRef ty):
m_attrs( mv$(attrs) ),
@@ -80,9 +78,7 @@ struct TupleItem
bool m_is_public;
TypeRef m_type;
- TupleItem()
- {
- }
+ //TupleItem() {}
TupleItem(::AST::MetaItems attrs, bool is_pub, TypeRef ty):
m_attrs( mv$(attrs) ),
@@ -103,7 +99,7 @@ class TypeAlias
GenericParams m_params;
TypeRef m_type;
public:
- TypeAlias() {}
+ //TypeAlias() {}
TypeAlias(GenericParams params, TypeRef type):
m_params( move(params) ),
m_type( move(type) )
@@ -132,9 +128,9 @@ private:
TypeRef m_type;
Expr m_value;
public:
- Static():
- m_class(CONST)
- {}
+ //Static():
+ // m_class(CONST)
+ //{}
Static(Class s_class, TypeRef type, Expr value):
m_class(s_class),
m_type( move(type) ),
@@ -170,13 +166,12 @@ private:
bool m_is_unsafe;
bool m_is_variadic; // extern only
public:
- Function()
- {}
Function(const Function&) = delete;
Function& operator=(const Function&) = delete;
Function(Function&&) = default;
Function& operator=(Function&&) = default;
+ //Function() {}
Function(Span sp, GenericParams params, ::std::string abi, bool is_unsafe, bool is_const, bool is_variadic, TypeRef ret_type, Arglist args);
void set_code(Expr code) { m_code = ::std::move(code); }
@@ -369,7 +364,7 @@ class ImplDef
Spanned<Path> m_trait;
TypeRef m_type;
public:
- ImplDef() {}
+ //ImplDef() {}
ImplDef(ImplDef&&) /*noexcept*/ = default;
ImplDef(Span sp, MetaItems attrs, GenericParams params, Spanned<Path> trait_type, TypeRef impl_type):
m_span( mv$(sp) ),
@@ -416,7 +411,7 @@ private:
//NamedList<Static> m_statics;
public:
- Impl() {}
+ //Impl() {}
Impl(Impl&&) /*noexcept*/ = default;
Impl(ImplDef def):
m_def( mv$(def) )
diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp
index 3f2151dd..1d1ccdae 100644
--- a/src/ast/expr.hpp
+++ b/src/ast/expr.hpp
@@ -20,7 +20,7 @@ class NodeVisitor;
class ExprNode
{
- TypeRef m_res_type;
+ TypeRef m_res_type = TypeRef(Span());
MetaItems m_attrs;
Position m_pos;
public:
@@ -81,7 +81,6 @@ struct ExprNode_Macro:
::std::string m_ident;
::TokenTree m_tokens;
- ExprNode_Macro() {}
ExprNode_Macro(::std::string name, ::std::string ident, ::TokenTree&& tokens):
m_name(name),
m_ident(ident),
@@ -103,7 +102,6 @@ struct ExprNode_Flow:
::std::string m_target;
unique_ptr<ExprNode> m_value;
- ExprNode_Flow() {}
ExprNode_Flow(Type type, ::std::string target, unique_ptr<ExprNode>&& value):
m_type(type),
m_target( move(target) ),
@@ -120,7 +118,6 @@ struct ExprNode_LetBinding:
TypeRef m_type;
unique_ptr<ExprNode> m_value;
- ExprNode_LetBinding() {}
ExprNode_LetBinding(Pattern pat, TypeRef type, unique_ptr<ExprNode>&& value):
m_pat( move(pat) ),
m_type( move(type) ),
@@ -159,7 +156,6 @@ struct ExprNode_CallPath:
Path m_path;
::std::vector<unique_ptr<ExprNode>> m_args;
- ExprNode_CallPath() {}
ExprNode_CallPath(Path&& path, ::std::vector<unique_ptr<ExprNode>>&& args):
m_path( move(path) ),
m_args( move(args) )
@@ -175,7 +171,6 @@ struct ExprNode_CallMethod:
PathNode m_method;
::std::vector<unique_ptr<ExprNode>> m_args;
- ExprNode_CallMethod() {}
ExprNode_CallMethod(unique_ptr<ExprNode> obj, PathNode method, ::std::vector<unique_ptr<ExprNode>> args):
m_val( move(obj) ),
m_method( move(method) ),
@@ -192,7 +187,6 @@ struct ExprNode_CallObject:
unique_ptr<ExprNode> m_val;
::std::vector<unique_ptr<ExprNode>> m_args;
- ExprNode_CallObject() {}
ExprNode_CallObject(unique_ptr<ExprNode>&& val, ::std::vector< unique_ptr<ExprNode> >&& args):
m_val( move(val) ),
m_args( move(args) )
@@ -261,7 +255,6 @@ struct ExprNode_Match:
unique_ptr<ExprNode> m_val;
::std::vector<ExprNode_Match_Arm> m_arms;
- ExprNode_Match() {}
ExprNode_Match(unique_ptr<ExprNode> val, ::std::vector<ExprNode_Match_Arm> arms):
m_val( ::std::move(val) ),
m_arms( ::std::move(arms) )
@@ -277,7 +270,6 @@ struct ExprNode_If:
unique_ptr<ExprNode> m_true;
unique_ptr<ExprNode> m_false;
- ExprNode_If() {}
ExprNode_If(unique_ptr<ExprNode>&& cond, unique_ptr<ExprNode>&& true_code, unique_ptr<ExprNode>&& false_code):
m_cond( ::std::move(cond) ),
m_true( ::std::move(true_code) ),
@@ -294,7 +286,6 @@ struct ExprNode_IfLet:
unique_ptr<ExprNode> m_true;
unique_ptr<ExprNode> m_false;
- ExprNode_IfLet() {}
ExprNode_IfLet(AST::Pattern pattern, unique_ptr<ExprNode>&& cond, unique_ptr<ExprNode>&& true_code, unique_ptr<ExprNode>&& false_code):
m_pattern( ::std::move(pattern) ),
m_value( ::std::move(cond) ),
@@ -311,7 +302,6 @@ struct ExprNode_Integer:
enum eCoreType m_datatype;
uint64_t m_value;
- ExprNode_Integer() {}
ExprNode_Integer(uint64_t value, enum eCoreType datatype):
m_datatype(datatype),
m_value(value)
@@ -327,7 +317,6 @@ struct ExprNode_Float:
enum eCoreType m_datatype;
double m_value;
- ExprNode_Float() {}
ExprNode_Float(double value, enum eCoreType datatype):
m_datatype(datatype),
m_value(value)
@@ -342,7 +331,6 @@ struct ExprNode_Bool:
{
bool m_value;
- ExprNode_Bool() {}
ExprNode_Bool(bool value):
m_value(value)
{
@@ -356,7 +344,6 @@ struct ExprNode_String:
{
::std::string m_value;
- ExprNode_String() {}
ExprNode_String(::std::string value):
m_value( ::std::move(value) )
{}
@@ -369,7 +356,6 @@ struct ExprNode_ByteString:
{
::std::string m_value;
- ExprNode_ByteString() {}
ExprNode_ByteString(::std::string value):
m_value( ::std::move(value) )
{}
@@ -387,7 +373,6 @@ struct ExprNode_Closure:
TypeRef m_return;
unique_ptr<ExprNode> m_code;
- ExprNode_Closure() {}
ExprNode_Closure(args_t args, TypeRef rv, unique_ptr<ExprNode> code):
m_args( ::std::move(args) ),
m_return( ::std::move(rv) ),
@@ -405,7 +390,6 @@ struct ExprNode_StructLiteral:
unique_ptr<ExprNode> m_base_value;
t_values m_values;
- ExprNode_StructLiteral() {}
ExprNode_StructLiteral(Path path, unique_ptr<ExprNode>&& base_value, t_values&& values ):
m_path( move(path) ),
m_base_value( move(base_value) ),
@@ -421,7 +405,6 @@ struct ExprNode_Array:
unique_ptr<ExprNode> m_size; // if non-NULL, it's a sized array
::std::vector< unique_ptr<ExprNode> > m_values;
- ExprNode_Array() {}
ExprNode_Array(::std::vector< unique_ptr<ExprNode> > vals):
m_values( ::std::move(vals) )
{}
@@ -439,7 +422,6 @@ struct ExprNode_Tuple:
{
::std::vector< unique_ptr<ExprNode> > m_values;
- ExprNode_Tuple() {}
ExprNode_Tuple(::std::vector< unique_ptr<ExprNode> > vals):
m_values( ::std::move(vals) )
{}
@@ -452,7 +434,6 @@ struct ExprNode_NamedValue:
{
Path m_path;
- ExprNode_NamedValue() {}
ExprNode_NamedValue(Path&& path):
m_path( ::std::move(path) )
{
@@ -466,7 +447,6 @@ struct ExprNode_Field:
::std::unique_ptr<ExprNode> m_obj;
::std::string m_name;
- ExprNode_Field() {}
ExprNode_Field(::std::unique_ptr<ExprNode>&& obj, ::std::string name):
m_obj( ::std::move(obj) ),
m_name( ::std::move(name) )
@@ -480,7 +460,6 @@ struct ExprNode_Index:
::std::unique_ptr<ExprNode> m_obj;
::std::unique_ptr<ExprNode> m_idx;
- ExprNode_Index() {}
ExprNode_Index(::std::unique_ptr<ExprNode> obj, ::std::unique_ptr<ExprNode> idx):
m_obj( ::std::move(obj) ),
m_idx( ::std::move(idx) )
@@ -495,7 +474,6 @@ struct ExprNode_Deref:
{
::std::unique_ptr<ExprNode> m_value;
- ExprNode_Deref() {}
ExprNode_Deref(::std::unique_ptr<ExprNode> value):
m_value( ::std::move(value) )
{
@@ -511,7 +489,6 @@ struct ExprNode_Cast:
unique_ptr<ExprNode> m_value;
TypeRef m_type;
- ExprNode_Cast() {}
ExprNode_Cast(unique_ptr<ExprNode>&& value, TypeRef&& dst_type):
m_value( move(value) ),
m_type( move(dst_type) )
@@ -557,7 +534,6 @@ struct ExprNode_BinOp:
::std::unique_ptr<ExprNode> m_left;
::std::unique_ptr<ExprNode> m_right;
- ExprNode_BinOp() {}
ExprNode_BinOp(Type type, ::std::unique_ptr<ExprNode> left, ::std::unique_ptr<ExprNode> right):
m_type(type),
m_left( ::std::move(left) ),
@@ -583,7 +559,6 @@ struct ExprNode_UniOp:
enum Type m_type;
::std::unique_ptr<ExprNode> m_value;
- ExprNode_UniOp() {}
ExprNode_UniOp(Type type, ::std::unique_ptr<ExprNode> value):
m_type(type),
m_value( ::std::move(value) )
diff --git a/src/ast/generics.hpp b/src/ast/generics.hpp
index 0209ccbb..f02de958 100644
--- a/src/ast/generics.hpp
+++ b/src/ast/generics.hpp
@@ -11,9 +11,10 @@ class TypeParam
::std::string m_name;
TypeRef m_default;
public:
- TypeParam(): m_name("") {}
+ //TypeParam(): m_name("") {}
TypeParam(::std::string name):
- m_name( ::std::move(name) )
+ m_name( ::std::move(name) ),
+ m_default( Span() )
{}
void setDefault(TypeRef type) {
assert(m_default.is_wildcard());
@@ -92,25 +93,18 @@ class GenericParams
::std::vector<GenericBound> m_bounds;
public:
GenericParams() {}
- GenericParams(GenericParams&& x) noexcept:
- m_type_params( mv$(x.m_type_params) ),
- m_lifetime_params( mv$(x.m_lifetime_params) ),
- m_bounds( mv$(x.m_bounds) )
- {}
- GenericParams& operator=(GenericParams&& x) {
- m_type_params = mv$(x.m_type_params);
- m_lifetime_params = mv$(x.m_lifetime_params);
- m_bounds = mv$(x.m_bounds);
- return *this;
- }
- GenericParams(const GenericParams& x):
- m_type_params(x.m_type_params),
- m_lifetime_params(x.m_lifetime_params),
- m_bounds()
- {
- m_bounds.reserve( x.m_bounds.size() );
- for(auto& e: x.m_bounds)
- m_bounds.push_back( e.clone() );
+ GenericParams(GenericParams&& x) noexcept = default;
+ GenericParams& operator=(GenericParams&& x) = default;
+ GenericParams(const GenericParams& x) = delete;
+
+ GenericParams clone() const {
+ GenericParams rv;
+ rv.m_type_params = m_type_params; // Copy-constructable
+ rv.m_lifetime_params = m_lifetime_params;
+ rv.m_bounds.reserve( m_bounds.size() );
+ for(auto& e: m_bounds)
+ rv.m_bounds.push_back( e.clone() );
+ return rv;
}
const ::std::vector<TypeParam>& ty_params() const { return m_type_params; }
diff --git a/src/ast/types.hpp b/src/ast/types.hpp
index e0cede23..79934e16 100644
--- a/src/ast/types.hpp
+++ b/src/ast/types.hpp
@@ -96,6 +96,10 @@ TAGGED_UNION(TypeData, None,
(TraitObject, struct {
::std::vector<::std::string> hrls;
::std::vector<AST::Path> traits;
+ // }),
+ //(ImplTrait, struct {
+ // ::std::vector<::std::string> hrls;
+ // ::std::vector<AST::Path> traits;
})
);
@@ -125,7 +129,7 @@ public:
return *this;
}
- TypeRef(Span sp = Span()):
+ TypeRef(Span sp):
m_span( mv$(sp) ),
m_data( TypeData::make_Any({}) )
{}
@@ -195,11 +199,12 @@ public:
{}
struct TagArg {};
- TypeRef(TagArg, ::std::string name, unsigned int binding = ~0u):
+ TypeRef(TagArg, Span sp, ::std::string name, unsigned int binding = ~0u):
+ m_span( mv$(sp) ),
m_data(TypeData::make_Generic({ name, binding }))
{}
- TypeRef(::std::string name, unsigned int binding = ~0u):
- TypeRef(TagArg(), ::std::move(name), binding)
+ TypeRef(Span sp, ::std::string name, unsigned int binding = ~0u):
+ TypeRef(TagArg(), mv$(sp), mv$(name), binding)
{}
struct TagPath {};
@@ -242,12 +247,6 @@ public:
return TypeRef(*this);
}
- //::option<const TypeData::Tuple&> as_tuple() const {
- // switch(m_data.tag())
- // {
- // }
- //}
-
const TypeRef& inner_type() const {
TU_MATCH_DEF(TypeData, (m_data), (e),
( throw ::std::runtime_error("Called inner_type on non-wrapper"); ),
@@ -264,11 +263,6 @@ public:
(Array, return *e.inner; )
)
}
- //::std::vector<TypeRef>& sub_types() { return m_inner_types; }
- //const ::std::vector<TypeRef>& sub_types() const { return m_inner_types; }
-
- //void add_trait(TypeRef trait) { assert(is_wildcard()); m_inner_types.push_back( ::std::move(trait) ); }
- //const ::std::vector<TypeRef>& traits() const { assert(is_wildcard()); return m_inner_types; }
Ordering ord(const TypeRef& x) const;
bool operator==(const TypeRef& x) const { return ord(x) == OrdEqual; }
diff --git a/src/expand/cfg.cpp b/src/expand/cfg.cpp
index 897c952a..0a4617cf 100644
--- a/src/expand/cfg.cpp
+++ b/src/expand/cfg.cpp
@@ -142,7 +142,7 @@ class CCfgHandler:
// Leave
}
else {
- impl.type() = ::TypeRef();
+ impl.type() = ::TypeRef(sp);
}
}
@@ -155,7 +155,7 @@ class CCfgHandler:
void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::TupleItem& i) const override {
DEBUG("#[cfg] tuple item - " << mi);
if( !check_cfg(sp, mi) ) {
- i.m_type = ::TypeRef();
+ i.m_type = ::TypeRef(sp);
}
}
void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, ::AST::EnumVariant& i) const override {
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp
index 173afa81..06e2921e 100644
--- a/src/expand/derive.cpp
+++ b/src/expand/derive.cpp
@@ -37,9 +37,9 @@ struct Deriver
virtual AST::Impl handle_item(Span sp, const ::std::string& core_name, const AST::GenericParams& p, const TypeRef& type, const AST::Enum& enm) const = 0;
- AST::GenericParams get_params_with_bounds(const AST::GenericParams& p, const AST::Path& trait_path, ::std::vector<TypeRef> additional_bounded_types) const
+ AST::GenericParams get_params_with_bounds(const Span& sp, const AST::GenericParams& p, const AST::Path& trait_path, ::std::vector<TypeRef> additional_bounded_types) const
{
- AST::GenericParams params = p;
+ AST::GenericParams params = p.clone();
// TODO: Get bounds based on generic (or similar) types used within the type.
// - How would this code (that runs before resolve) know what's a generic and what's a local type?
@@ -49,7 +49,7 @@ struct Deriver
for(const auto& arg : params.ty_params())
{
params.add_bound( ::AST::GenericBound::make_IsTrait({
- TypeRef(arg.name(), i), {}, trait_path
+ TypeRef(sp, arg.name(), i), {}, trait_path
}) );
i ++;
}
@@ -247,13 +247,13 @@ class Deriver_Debug:
ABI_RUST, false, false, false,
ret_type,
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) ),
::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "f"), f_type )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, debug_trait, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, debug_trait, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, debug_trait), type ) );
rv.add_function(false, false, "fmt", mv$(fcn));
@@ -424,13 +424,13 @@ class Deriver_PartialEq:
ABI_RUST, false, false, false,
TypeRef(sp, CORETYPE_BOOL),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) ),
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v" ), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "eq", mv$(fcn));
@@ -610,13 +610,13 @@ class Deriver_PartialOrd:
ABI_RUST, false, false, false,
TypeRef(sp, path_option_ordering),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) ),
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v" ), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "partial_cmp", mv$(fcn));
@@ -865,12 +865,12 @@ class Deriver_Eq:
ABI_RUST, false, false, false,
TypeRef(TypeRef::TagUnit(), sp),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "assert_receiver_is_total_eq", mv$(fcn));
@@ -1007,13 +1007,13 @@ class Deriver_Ord:
ABI_RUST, false, false, false,
TypeRef(sp, path_ordering),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) ),
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "v"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "cmp", mv$(fcn));
@@ -1250,14 +1250,14 @@ class Deriver_Clone:
sp,
AST::GenericParams(),
ABI_RUST, false, false, false,
- TypeRef("Self", 0xFFFF),
+ TypeRef(sp, "Self", 0xFFFF),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) )
)
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "clone", mv$(fcn));
@@ -1396,7 +1396,7 @@ class Deriver_Copy:
{
const AST::Path trait_path = this->get_trait_path(core_name);
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
return mv$(rv);
@@ -1421,7 +1421,7 @@ class Deriver_Default:
return AST::Path(core_name, { AST::PathNode("default", {}), AST::PathNode("Default", {}) });
}
AST::Path get_method_path(const ::std::string& core_name) const {
- return AST::Path(AST::Path::TagUfcs(), ::TypeRef(), get_trait_path(core_name), { AST::PathNode("default", {}) } );
+ return AST::Path(AST::Path::TagUfcs(), ::TypeRef(Span()), get_trait_path(core_name), { AST::PathNode("default", {}) } );
}
AST::Impl make_ret(Span sp, const ::std::string& core_name, const AST::GenericParams& p, const TypeRef& type, ::std::vector<TypeRef> types_to_bound, AST::ExprNodeP node) const
@@ -1432,12 +1432,12 @@ class Deriver_Default:
sp,
AST::GenericParams(),
ABI_RUST, false, false, false,
- TypeRef("Self", 0xFFFF),
+ TypeRef(sp, "Self", 0xFFFF),
{}
);
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "default", mv$(fcn));
@@ -1514,19 +1514,19 @@ class Deriver_Hash:
ABI_RUST, false, false, false,
TypeRef(TypeRef::TagUnit(), sp),
vec$(
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef("Self", 0xFFFF)) ),
- ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "state"), TypeRef(TypeRef::TagReference(), sp, true, TypeRef("H", 0x100|0)) )
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), sp, false, TypeRef(sp, "Self", 0xFFFF)) ),
+ ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "state"), TypeRef(TypeRef::TagReference(), sp, true, TypeRef(sp, "H", 0x100|0)) )
)
);
fcn.params().add_ty_param( AST::TypeParam("H") );
fcn.params().add_bound( AST::GenericBound::make_IsTrait({
- TypeRef("H", 0x100|0),
+ TypeRef(sp, "H", 0x100|0),
{},
this->get_trait_path_Hasher(core_name)
}) );
fcn.set_code( NEWNODE(Block, vec$(mv$(node))) );
- AST::GenericParams params = get_params_with_bounds(p, trait_path, mv$(types_to_bound));
+ AST::GenericParams params = get_params_with_bounds(sp, p, trait_path, mv$(types_to_bound));
AST::Impl rv( AST::ImplDef( sp, AST::MetaItems(), mv$(params), make_spanned(sp, trait_path), type ) );
rv.add_function(false, false, "hash", mv$(fcn));
@@ -1686,7 +1686,7 @@ static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mo
TypeRef type(sp, path);
auto& types_args = type.path().nodes().back().args();
for( const auto& param : params.ty_params() ) {
- types_args.m_types.push_back( TypeRef(TypeRef::TagArg(), param.name()) );
+ types_args.m_types.push_back( TypeRef(TypeRef::TagArg(), sp, param.name()) );
}
::std::vector< ::std::string> missing_handlers;
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 755defa7..ba8f6977 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -402,7 +402,7 @@ struct CExpandExpr:
replacement.reset(new ::AST::ExprNode_Match(
::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
- ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), path_IntoIterator, { ::AST::PathNode("into_iter") } ),
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(node.span()), path_IntoIterator, { ::AST::PathNode("into_iter") } ),
::make_vec1( mv$(node.m_cond) )
)),
::make_vec1(::AST::ExprNode_Match_Arm(
@@ -412,7 +412,7 @@ struct CExpandExpr:
node.m_label,
::AST::ExprNodeP(new ::AST::ExprNode_Match(
::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
- ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), path_Iterator, { ::AST::PathNode("next") } ),
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(node.span()), path_Iterator, { ::AST::PathNode("next") } ),
::make_vec1( ::AST::ExprNodeP(new ::AST::ExprNode_UniOp(
::AST::ExprNode_UniOp::REFMUT,
::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("it") ))
@@ -513,7 +513,7 @@ struct CExpandExpr:
auto path_Ok = ::AST::Path(core_crate, {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Ok")});
auto path_Err = ::AST::Path(core_crate, {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Err")});
auto path_From = ::AST::Path(core_crate, {::AST::PathNode("convert"), ::AST::PathNode("From")});
- path_From.nodes().back().args().m_types.push_back( ::TypeRef() );
+ path_From.nodes().back().args().m_types.push_back( ::TypeRef(node.span()) );
// Desugars into
// ```
@@ -541,7 +541,7 @@ struct CExpandExpr:
::AST::Path(path_Err),
::make_vec1(
::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
- ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), mv$(path_From), { ::AST::PathNode("from") }),
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(node.span()), mv$(path_From), { ::AST::PathNode("from") }),
::make_vec1( ::AST::ExprNodeP( new ::AST::ExprNode_NamedValue( ::AST::Path(::AST::Path::TagLocal(), "e") ) ) )
))
)
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index 5590b738..471e6c34 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -518,7 +518,7 @@ ExprNodeP Parse_Stmt_Let(TokenStream& lex)
{
Token tok;
AST::Pattern pat = Parse_Pattern(lex, false); // irrefutable
- TypeRef type;
+ TypeRef type { lex.getPosition() };
if( GET_TOK(tok, lex) == TOK_COLON ) {
type = Parse_Type(lex);
GET_TOK(tok, lex);
@@ -997,7 +997,7 @@ ExprNodeP Parse_ExprVal_Closure(TokenStream& lex, bool is_move)
// Irrefutable pattern
AST::Pattern pat = Parse_Pattern(lex, false);
- TypeRef type;
+ TypeRef type { lex.getPosition() };
if( GET_TOK(tok, lex) == TOK_COLON )
type = Parse_Type(lex);
else
@@ -1010,7 +1010,7 @@ ExprNodeP Parse_ExprVal_Closure(TokenStream& lex, bool is_move)
}
CHECK_TOK(tok, TOK_PIPE);
- TypeRef rt;
+ auto rt = TypeRef(lex.getPosition());
if( GET_TOK(tok, lex) == TOK_THINARROW ) {
if( GET_TOK(tok, lex) == TOK_EXCLAM ) {
diff --git a/src/parse/root.cpp b/src/parse/root.cpp
index 4af5c147..488ef9d3 100644
--- a/src/parse/root.cpp
+++ b/src/parse/root.cpp
@@ -134,7 +134,8 @@ AST::GenericParams Parse_GenericParams(TokenStream& lex)
ret.add_lft_param( param_name );
else
ret.add_ty_param( AST::TypeParam( param_name ) );
-
+ auto param_ty = TypeRef(lex.getPosition(), param_name);
+
if( GET_TOK(tok, lex) == TOK_COLON )
{
if( is_lifetime )
@@ -146,7 +147,7 @@ AST::GenericParams Parse_GenericParams(TokenStream& lex)
}
else
{
- Parse_TypeBound(lex, ret, TypeRef(TypeRef::TagArg(), param_name));
+ Parse_TypeBound(lex, ret, param_ty);
GET_TOK(tok, lex);
}
}
@@ -278,14 +279,16 @@ AST::Function Parse_FunctionDef(TokenStream& lex, ::std::string abi, bool allow_
lifetime = tok.str();
GET_TOK(tok, lex);
}
+ auto ty_sp = lex.end_span(ps);
+
if( tok.type() == TOK_RWORD_MUT )
{
GET_CHECK_TOK(tok, lex, TOK_RWORD_SELF);
- args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), lex.end_span(ps), true, TypeRef("Self", 0xFFFF))) );
+ args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), ty_sp, true, TypeRef(ty_sp, "Self", 0xFFFF))) );
}
else
{
- args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), lex.end_span(ps), false, TypeRef("Self", 0xFFFF))) );
+ args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), TypeRef(TypeRef::TagReference(), ty_sp, false, TypeRef(ty_sp, "Self", 0xFFFF))) );
}
DEBUG("TODO: UFCS / self lifetimes");
if( allow_self == false )
@@ -310,14 +313,13 @@ AST::Function Parse_FunctionDef(TokenStream& lex, ::std::string abi, bool allow_
GET_TOK(tok, lex);
if( allow_self == false )
throw ParseError::Generic(lex, "Self binding not expected");
- TypeRef ty;
+ TypeRef ty = TypeRef( lex.getPosition(), "Self", 0xFFFF );
if( GET_TOK(tok, lex) == TOK_COLON ) {
// Typed mut self
ty = Parse_Type(lex);
}
else {
PUTBACK(tok, lex);
- ty = TypeRef("Self", 0xFFFF);
}
args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), ty) );
GET_TOK(tok, lex);
@@ -328,14 +330,13 @@ AST::Function Parse_FunctionDef(TokenStream& lex, ::std::string abi, bool allow_
// By-value method
if( allow_self == false )
throw ParseError::Generic(lex, "Self binding not expected");
- TypeRef ty;
+ TypeRef ty = TypeRef( lex.getPosition(), "Self", 0xFFFF );
if( GET_TOK(tok, lex) == TOK_COLON ) {
// Typed mut self
ty = Parse_Type(lex);
}
else {
PUTBACK(tok, lex);
- ty = TypeRef("Self", 0xFFFF);
}
args.push_back( ::std::make_pair( AST::Pattern(AST::Pattern::TagBind(), "self"), ty) );
GET_TOK(tok, lex);
@@ -658,14 +659,14 @@ AST::Trait Parse_TraitDef(TokenStream& lex, const AST::MetaItems& meta_items)
if( GET_TOK(tok, lex) == TOK_COLON )
{
// Bounded associated type
- Parse_TypeBound(lex, atype_params, TypeRef("Self", 0xFFFF));
+ Parse_TypeBound(lex, atype_params, TypeRef(lex.getPosition(), "Self", 0xFFFF));
GET_TOK(tok, lex);
}
if( tok.type() == TOK_RWORD_WHERE ) {
throw ParseError::Todo(lex, "Where clause on associated type");
}
- TypeRef default_type;
+ TypeRef default_type = TypeRef( lex.getPosition() );
if( tok.type() == TOK_EQUAL ) {
default_type = Parse_Type(lex);
GET_TOK(tok, lex);
@@ -889,14 +890,14 @@ void Parse_Impl(TokenStream& lex, AST::Module& mod, AST::MetaItems attrs, bool i
// 2. Either a trait name (with type params), or the type to impl
Spanned<AST::Path> trait_path;
- TypeRef impl_type;
- // - Handle negative impls, which must be a trait
+
+ // - Handle negative impls specially, which must be a trait
// "impl !Trait for Type {}"
if( GET_TOK(tok, lex) == TOK_EXCLAM )
{
trait_path = GET_SPANNED(::AST::Path, lex, Parse_Path(lex, PATH_GENERIC_TYPE));
GET_CHECK_TOK(tok, lex, TOK_RWORD_FOR);
- impl_type = Parse_Type(lex, true);
+ auto impl_type = Parse_Type(lex, true);
if( GET_TOK(tok, lex) == TOK_RWORD_WHERE )
{
@@ -910,37 +911,36 @@ void Parse_Impl(TokenStream& lex, AST::Module& mod, AST::MetaItems attrs, bool i
mod.add_neg_impl( AST::ImplDef(lex.end_span(ps), AST::MetaItems(), mv$(params), mv$(trait_path), mv$(impl_type) ) );
return ;
}
- else
+
+ // - Don't care which at this stage
+ PUTBACK(tok, lex);
+
+ auto impl_type = Parse_Type(lex, true);
+
+ if( GET_TOK(tok, lex) == TOK_RWORD_FOR )
{
- // - Don't care which at this stage
- PUTBACK(tok, lex);
-
- impl_type = Parse_Type(lex, true);
-
- if( GET_TOK(tok, lex) == TOK_RWORD_FOR )
+ // Trickery! All traits parse as valid types, so this works.
+ if( !impl_type.is_path() )
+ throw ParseError::Generic(lex, "Trait was not a path");
+ trait_path = Spanned< AST::Path> {
+ impl_type.span(),
+ mv$(impl_type.path())
+ };
+ // Implementing a trait for another type, get the target type
+ if( GET_TOK(tok, lex) == TOK_DOUBLE_DOT )
{
- if( !impl_type.is_path() )
- throw ParseError::Generic(lex, "Trait was not a path");
- trait_path = Spanned< AST::Path> {
- impl_type.span(),
- mv$(impl_type.path())
- };
- // Implementing a trait for another type, get the target type
- if( GET_TOK(tok, lex) == TOK_DOUBLE_DOT )
- {
- // Default impl
- impl_type = TypeRef(TypeRef::TagInvalid(), lex.getPosition());
- }
- else
- {
- PUTBACK(tok, lex);
- impl_type = Parse_Type(lex, true);
- }
+ // Default impl
+ impl_type = TypeRef(TypeRef::TagInvalid(), lex.getPosition());
}
- else {
+ else
+ {
PUTBACK(tok, lex);
+ impl_type = Parse_Type(lex, true);
}
}
+ else {
+ PUTBACK(tok, lex);
+ }
// Where clause
if( GET_TOK(tok, lex) == TOK_RWORD_WHERE )
diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp
index f466a40f..4a4ac5cb 100644
--- a/src/resolve/absolute.cpp
+++ b/src/resolve/absolute.cpp
@@ -156,7 +156,7 @@ struct Context
return e->clone();
}
else {
- return ::TypeRef("Self", 0xFFFF);
+ return ::TypeRef(Span(), "Self", 0xFFFF);
}
)
)
@@ -822,7 +822,7 @@ namespace {
for(const auto& typ : e.m_params.m_types)
{
(void)typ;
- trait_path.nodes().back().args().m_types.push_back( ::TypeRef() );
+ trait_path.nodes().back().args().m_types.push_back( ::TypeRef(sp) );
}
}
trait_path.bind( ::AST::PathBinding::make_Trait({nullptr, &e}) );
@@ -848,7 +848,7 @@ namespace {
new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(sp, mv$(trait_path)));
}
else {
- new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), mv$(trait_path));
+ new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(sp), mv$(trait_path));
}
for( unsigned int j = i+1; j < path_abs.nodes.size(); j ++ )
new_path.nodes().push_back( mv$(path_abs.nodes[j]) );
@@ -1093,14 +1093,14 @@ void Resolve_Absolute_Path_BindAbsolute(Context& context, const Span& sp, Contex
for(const auto& typ : e.trait_->params().ty_params())
{
(void)typ;
- trait_path.nodes().back().args().m_types.push_back( ::TypeRef() );
+ trait_path.nodes().back().args().m_types.push_back( ::TypeRef(sp) );
}
}
else {
for(const auto& typ : e.hir->m_params.m_types)
{
(void)typ;
- trait_path.nodes().back().args().m_types.push_back( ::TypeRef() );
+ trait_path.nodes().back().args().m_types.push_back( ::TypeRef(sp) );
}
}
}
@@ -1136,7 +1136,7 @@ void Resolve_Absolute_Path_BindAbsolute(Context& context, const Span& sp, Contex
new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(sp, mv$(trait_path)));
}
else {
- new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), mv$(trait_path));
+ new_path = ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(sp), mv$(trait_path));
}
for( unsigned int j = i+1; j < path_abs.nodes.size(); j ++ )
new_path.nodes().push_back( mv$(path_abs.nodes[j]) );