summaryrefslogtreecommitdiff
path: root/src/hir/from_ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/from_ast.cpp')
-rw-r--r--src/hir/from_ast.cpp64
1 files changed, 40 insertions, 24 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 177bc65c..a6947f8f 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -70,13 +70,13 @@
(IsTrait,
rv.m_bounds.push_back(::HIR::GenericBound::make_TraitBound({
LowerHIR_Type(e.type),
- ::HIR::TraitPath { LowerHIR_GenericPath(e.trait), e.hrls }
+ ::HIR::TraitPath { LowerHIR_GenericPath(Span(), e.trait), e.hrls }
}));
),
(MaybeTrait,
rv.m_bounds.push_back(::HIR::GenericBound::make_TraitUnbound({
LowerHIR_Type(e.type),
- LowerHIR_GenericPath(e.trait)
+ LowerHIR_GenericPath(Span(), e.trait)
}));
),
(NotTrait,
@@ -167,7 +167,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_EnumTuple({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -176,7 +176,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_StructTuple({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -197,7 +197,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_EnumStruct({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -206,7 +206,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_Struct({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -251,7 +251,7 @@
return ::HIR::Pattern::Value::make_String(e);
),
(Named,
- return ::HIR::Pattern::Value::make_Named( LowerHIR_Path(e) );
+ return ::HIR::Pattern::Value::make_Named( LowerHIR_Path(Span(), e) );
)
)
throw "BUGCHECK: Reached end of LowerHIR_Pattern::H::lowerhir_pattern_value";
@@ -356,7 +356,7 @@
throw "BUG: Encountered non-Absolute path when creating ::HIR::GenericPath";
}
}
-::HIR::GenericPath LowerHIR_GenericPath(const ::AST::Path& path)
+::HIR::GenericPath LowerHIR_GenericPath(const Span& sp, const ::AST::Path& path)
{
TU_IFLET(::AST::Path::Class, path.m_class, Absolute, e,
auto sp = LowerHIR_SimplePath(path, true);
@@ -370,30 +370,30 @@
BUG(Span(), "Encountered non-Absolute path when creating ::HIR::GenericPath - " << path);
}
}
-::HIR::Path LowerHIR_Path(const ::AST::Path& path)
+::HIR::Path LowerHIR_Path(const Span& sp, const ::AST::Path& path)
{
TU_MATCH(::AST::Path::Class, (path.m_class), (e),
(Invalid,
- throw "BUG: Encountered Invalid path in LowerHIR_Path";
+ BUG(sp, "BUG: Encountered Invalid path in LowerHIR_Path");
),
(Local,
- BUG(Span(), "TODO: What to do wth Path::Class::Local in LowerHIR_Path - " << path);
+ TODO(sp, "What to do wth Path::Class::Local in LowerHIR_Path - " << path);
),
(Relative,
- throw "BUG: Encountered `Relative` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Relative` path in LowerHIR_Path - " << path);
),
(Self,
- throw "BUG: Encountered `Self` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Self` path in LowerHIR_Path - " << path);
),
(Super,
- throw "BUG: Encountered `Super` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Super` path in LowerHIR_Path - " << path);
),
(Absolute,
- return ::HIR::Path( LowerHIR_GenericPath(path) );
+ return ::HIR::Path( LowerHIR_GenericPath(sp, path) );
),
(UFCS,
if( e.nodes.size() != 1 )
- throw "TODO: Handle UFCS with multiple nodes";
+ TODO(Span(), "Handle UFCS with multiple nodes - " << path);
if( ! e.trait )
{
return ::HIR::Path(::HIR::Path::Data::make_UfcsInherent({
@@ -414,7 +414,7 @@
{
return ::HIR::Path(
LowerHIR_Type(*e.type),
- LowerHIR_GenericPath(*e.trait),
+ LowerHIR_GenericPath(sp, *e.trait),
e.nodes[0].name(),
{}
);
@@ -501,7 +501,7 @@
return ::HIR::TypeRef( l.name, slot );
)
else {
- return ::HIR::TypeRef( LowerHIR_Path(e.path) );
+ return ::HIR::TypeRef( LowerHIR_Path(ty.span(), e.path) );
}
),
(TraitObject,
@@ -510,14 +510,21 @@
::HIR::TypeRef::Data::Data_TraitObject v;
for(const auto& t : e.traits)
{
- v.m_traits.push_back( LowerHIR_GenericPath(t) );
+ v.m_traits.push_back( LowerHIR_GenericPath(ty.span(), t) );
}
return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_TraitObject( mv$(v) ) );
),
(Function,
- TODO(ty.span(), "Function types");
- //::HIR::FunctionType f;
- //return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) );
+ ::std::vector< ::HIR::TypeRef> args;
+ for(const auto& arg : e.info.m_arg_types)
+ args.push_back( LowerHIR_Type(arg) );
+ ::HIR::FunctionType f {
+ e.info.is_unsafe,
+ e.info.m_abi,
+ box$( LowerHIR_Type(*e.info.m_rettype) ),
+ mv$(args)
+ };
+ return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) );
),
(Generic,
return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Generic({ e.name, 0 }) );
@@ -607,11 +614,20 @@
}
::HIR::Trait LowerHIR_Trait(const ::AST::Trait& f)
{
+ ::std::string lifetime;
+
::std::vector< ::HIR::GenericPath> supertraits;
- for(const auto& st : f.supertraits())
- supertraits.push_back( LowerHIR_GenericPath(st) );
+ for(const auto& st : f.supertraits()) {
+ if( st.is_valid() ) {
+ supertraits.push_back( LowerHIR_GenericPath(Span(), st) );
+ }
+ else {
+ lifetime = "static";
+ }
+ }
::HIR::Trait rv {
LowerHIR_GenericParams(f.params()),
+ mv$(lifetime),
mv$(supertraits),
{},
{}