Skip to content

Commit

Permalink
This setups an initial frame work for our resolution step for the pip…
Browse files Browse the repository at this point in the history
…eline

More work is required but it takes advantage of the vistior pattern
from the AST so we can do this without RTTI and dynamic_casts.

More passes on the AST AKA our HIR should follow this pattern.

Addresses: #12
  • Loading branch information
philberty committed May 1, 2020
1 parent 550efe8 commit 5daf7bc
Show file tree
Hide file tree
Showing 12 changed files with 973 additions and 313 deletions.
587 changes: 576 additions & 11 deletions gcc/rust/analysis/rust-resolution.cc

Large diffs are not rendered by default.

212 changes: 209 additions & 3 deletions gcc/rust/analysis/rust-resolution.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,233 @@

#include "rust-system.h"
#include "rust-ast-full.h"
#include "rust-ast-visitor.h"
#include "scope.h"

namespace Rust {
namespace Analysis {

class TypeResolution
class TypeResolution : public AST::ASTVisitor
{
public:
static bool ResolveNamesAndTypes (AST::Crate &crate);

~TypeResolution ();

// visitor impl
// rust-ast.h
// virtual void visit(AttrInput& attr_input);
// virtual void visit(TokenTree& token_tree);
// virtual void visit(MacroMatch& macro_match);
virtual void visit (AST::Token &tok);
virtual void visit (AST::DelimTokenTree &delim_tok_tree);
virtual void visit (AST::AttrInputMetaItemContainer &input);
// virtual void visit(MetaItem& meta_item);
// virtual void vsit(Stmt& stmt);
// virtual void visit(Expr& expr);
virtual void visit (AST::IdentifierExpr &ident_expr);
// virtual void visit(Pattern& pattern);
// virtual void visit(Type& type);
// virtual void visit(TypeParamBound& type_param_bound);
virtual void visit (AST::Lifetime &lifetime);
// virtual void visit(GenericParam& generic_param);
virtual void visit (AST::LifetimeParam &lifetime_param);
// virtual void visit(TraitItem& trait_item);
// virtual void visit(InherentImplItem& inherent_impl_item);
// virtual void visit(TraitImplItem& trait_impl_item);
virtual void visit (AST::MacroInvocationSemi &macro);

// rust-path.h
virtual void visit (AST::PathInExpression &path);
virtual void visit (AST::TypePathSegment &segment);
virtual void visit (AST::TypePathSegmentGeneric &segment);
virtual void visit (AST::TypePathSegmentFunction &segment);
virtual void visit (AST::TypePath &path);
virtual void visit (AST::QualifiedPathInExpression &path);
virtual void visit (AST::QualifiedPathInType &path);

// rust-expr.h
virtual void visit (AST::LiteralExpr &expr);
virtual void visit (AST::AttrInputLiteral &attr_input);
virtual void visit (AST::MetaItemLitExpr &meta_item);
virtual void visit (AST::MetaItemPathLit &meta_item);
virtual void visit (AST::BorrowExpr &expr);
virtual void visit (AST::DereferenceExpr &expr);
virtual void visit (AST::ErrorPropagationExpr &expr);
virtual void visit (AST::NegationExpr &expr);
virtual void visit (AST::ArithmeticOrLogicalExpr &expr);
virtual void visit (AST::ComparisonExpr &expr);
virtual void visit (AST::LazyBooleanExpr &expr);
virtual void visit (AST::TypeCastExpr &expr);
virtual void visit (AST::AssignmentExpr &expr);
virtual void visit (AST::CompoundAssignmentExpr &expr);
virtual void visit (AST::GroupedExpr &expr);
// virtual void visit(ArrayElems& elems);
virtual void visit (AST::ArrayElemsValues &elems);
virtual void visit (AST::ArrayElemsCopied &elems);
virtual void visit (AST::ArrayExpr &expr);
virtual void visit (AST::ArrayIndexExpr &expr);
virtual void visit (AST::TupleExpr &expr);
virtual void visit (AST::TupleIndexExpr &expr);
virtual void visit (AST::StructExprStruct &expr);
// virtual void visit(StructExprField& field);
virtual void visit (AST::StructExprFieldIdentifier &field);
virtual void visit (AST::StructExprFieldIdentifierValue &field);
virtual void visit (AST::StructExprFieldIndexValue &field);
virtual void visit (AST::StructExprStructFields &expr);
virtual void visit (AST::StructExprStructBase &expr);
virtual void visit (AST::StructExprTuple &expr);
virtual void visit (AST::StructExprUnit &expr);
// virtual void visit(EnumExprField& field);
virtual void visit (AST::EnumExprFieldIdentifier &field);
virtual void visit (AST::EnumExprFieldIdentifierValue &field);
virtual void visit (AST::EnumExprFieldIndexValue &field);
virtual void visit (AST::EnumExprStruct &expr);
virtual void visit (AST::EnumExprTuple &expr);
virtual void visit (AST::EnumExprFieldless &expr);
virtual void visit (AST::CallExpr &expr);
virtual void visit (AST::MethodCallExpr &expr);
virtual void visit (AST::FieldAccessExpr &expr);
virtual void visit (AST::ClosureExprInner &expr);
virtual void visit (AST::BlockExpr &expr);
virtual void visit (AST::ClosureExprInnerTyped &expr);
virtual void visit (AST::ContinueExpr &expr);
virtual void visit (AST::BreakExpr &expr);
virtual void visit (AST::RangeFromToExpr &expr);
virtual void visit (AST::RangeFromExpr &expr);
virtual void visit (AST::RangeToExpr &expr);
virtual void visit (AST::RangeFullExpr &expr);
virtual void visit (AST::RangeFromToInclExpr &expr);
virtual void visit (AST::RangeToInclExpr &expr);
virtual void visit (AST::ReturnExpr &expr);
virtual void visit (AST::UnsafeBlockExpr &expr);
virtual void visit (AST::LoopExpr &expr);
virtual void visit (AST::WhileLoopExpr &expr);
virtual void visit (AST::WhileLetLoopExpr &expr);
virtual void visit (AST::ForLoopExpr &expr);
virtual void visit (AST::IfExpr &expr);
virtual void visit (AST::IfExprConseqElse &expr);
virtual void visit (AST::IfExprConseqIf &expr);
virtual void visit (AST::IfExprConseqIfLet &expr);
virtual void visit (AST::IfLetExpr &expr);
virtual void visit (AST::IfLetExprConseqElse &expr);
virtual void visit (AST::IfLetExprConseqIf &expr);
virtual void visit (AST::IfLetExprConseqIfLet &expr);
// virtual void visit(MatchCase& match_case);
virtual void visit (AST::MatchCaseBlockExpr &match_case);
virtual void visit (AST::MatchCaseExpr &match_case);
virtual void visit (AST::MatchExpr &expr);
virtual void visit (AST::AwaitExpr &expr);
virtual void visit (AST::AsyncBlockExpr &expr);

// rust-item.h
virtual void visit (AST::TypeParam &param);
// virtual void visit(WhereClauseItem& item);
virtual void visit (AST::LifetimeWhereClauseItem &item);
virtual void visit (AST::TypeBoundWhereClauseItem &item);
virtual void visit (AST::Method &method);
virtual void visit (AST::ModuleBodied &module);
virtual void visit (AST::ModuleNoBody &module);
virtual void visit (AST::ExternCrate &crate);
// virtual void visit(UseTree& use_tree);
virtual void visit (AST::UseTreeGlob &use_tree);
virtual void visit (AST::UseTreeList &use_tree);
virtual void visit (AST::UseTreeRebind &use_tree);
virtual void visit (AST::UseDeclaration &use_decl);
virtual void visit (AST::Function &function);
virtual void visit (AST::TypeAlias &type_alias);
virtual void visit (AST::StructStruct &struct_item);
virtual void visit (AST::TupleStruct &tuple_struct);
virtual void visit (AST::EnumItem &item);
virtual void visit (AST::EnumItemTuple &item);
virtual void visit (AST::EnumItemStruct &item);
virtual void visit (AST::EnumItemDiscriminant &item);
virtual void visit (AST::Enum &enum_item);
virtual void visit (AST::Union &union_item);
virtual void visit (AST::ConstantItem &const_item);
virtual void visit (AST::StaticItem &static_item);
virtual void visit (AST::TraitItemFunc &item);
virtual void visit (AST::TraitItemMethod &item);
virtual void visit (AST::TraitItemConst &item);
virtual void visit (AST::TraitItemType &item);
virtual void visit (AST::Trait &trait);
virtual void visit (AST::InherentImpl &impl);
virtual void visit (AST::TraitImpl &impl);
// virtual void visit(ExternalItem& item);
virtual void visit (AST::ExternalStaticItem &item);
virtual void visit (AST::ExternalFunctionItem &item);
virtual void visit (AST::ExternBlock &block);

// rust-macro.h
virtual void visit (AST::MacroMatchFragment &match);
virtual void visit (AST::MacroMatchRepetition &match);
virtual void visit (AST::MacroMatcher &matcher);
virtual void visit (AST::MacroRulesDefinition &rules_def);
virtual void visit (AST::MacroInvocation &macro_invoc);
virtual void visit (AST::MetaItemPath &meta_item);
virtual void visit (AST::MetaItemSeq &meta_item);
virtual void visit (AST::MetaWord &meta_item);
virtual void visit (AST::MetaNameValueStr &meta_item);
virtual void visit (AST::MetaListPaths &meta_item);
virtual void visit (AST::MetaListNameValueStr &meta_item);

// rust-pattern.h
virtual void visit (AST::LiteralPattern &pattern);
virtual void visit (AST::IdentifierPattern &pattern);
virtual void visit (AST::WildcardPattern &pattern);
// virtual void visit(RangePatternBound& bound);
virtual void visit (AST::RangePatternBoundLiteral &bound);
virtual void visit (AST::RangePatternBoundPath &bound);
virtual void visit (AST::RangePatternBoundQualPath &bound);
virtual void visit (AST::RangePattern &pattern);
virtual void visit (AST::ReferencePattern &pattern);
// virtual void visit(StructPatternField& field);
virtual void visit (AST::StructPatternFieldTuplePat &field);
virtual void visit (AST::StructPatternFieldIdentPat &field);
virtual void visit (AST::StructPatternFieldIdent &field);
virtual void visit (AST::StructPattern &pattern);
// virtual void visit(TupleStructItems& tuple_items);
virtual void visit (AST::TupleStructItemsNoRange &tuple_items);
virtual void visit (AST::TupleStructItemsRange &tuple_items);
virtual void visit (AST::TupleStructPattern &pattern);
// virtual void visit(TuplePatternItems& tuple_items);
virtual void visit (AST::TuplePatternItemsMultiple &tuple_items);
virtual void visit (AST::TuplePatternItemsRanged &tuple_items);
virtual void visit (AST::TuplePattern &pattern);
virtual void visit (AST::GroupedPattern &pattern);
virtual void visit (AST::SlicePattern &pattern);

// rust-stmt.h
virtual void visit (AST::EmptyStmt &stmt);
virtual void visit (AST::LetStmt &stmt);
virtual void visit (AST::ExprStmtWithoutBlock &stmt);
virtual void visit (AST::ExprStmtWithBlock &stmt);

// rust-type.h
virtual void visit (AST::TraitBound &bound);
virtual void visit (AST::ImplTraitType &type);
virtual void visit (AST::TraitObjectType &type);
virtual void visit (AST::ParenthesisedType &type);
virtual void visit (AST::ImplTraitTypeOneBound &type);
virtual void visit (AST::TraitObjectTypeOneBound &type);
virtual void visit (AST::TupleType &type);
virtual void visit (AST::NeverType &type);
virtual void visit (AST::RawPointerType &type);
virtual void visit (AST::ReferenceType &type);
virtual void visit (AST::ArrayType &type);
virtual void visit (AST::SliceType &type);
virtual void visit (AST::InferredType &type);
virtual void visit (AST::BareFunctionType &type);

private:
TypeResolution (AST::Crate &crate);

bool go ();

bool handleItem (std::unique_ptr<Rust::AST::Item> &item);

Scope scope;
AST::Crate &crate;

std::vector<AST::IdentifierPattern> letPatternBuffer;
};

} // namespace Analysis
Expand Down
22 changes: 12 additions & 10 deletions gcc/rust/analysis/scope.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "rust-system.h"
#include "rust-ast-full.h"

namespace Rust {
namespace Analysis {
Expand All @@ -12,41 +13,42 @@ class Scope

~Scope () {}

bool Insert (std::string key, std::string val)
bool Insert (std::string key, AST::Type *val)
{
if (scopeStack.back ().find (key) != scopeStack.back ().end ())
{
return false;
}

scopeStack.back ()[key] = val;
scopeStack.back ().insert (std::make_pair (key, std::move (val)));
return true;
}

bool Lookup (std::string key, std::string &result)
bool Lookup (std::string key, AST::Type **result)
{
for (auto it = scopeStack.rbegin (); it != scopeStack.rend (); ++it)
{
auto lookup = it->find (key);
if (lookup != it->end ())
{
result = lookup->second;
*result = lookup->second;
return true;
}
}
return false;
}

void Push ()
void Push () { scopeStack.push_back ({}); }

std ::map<std::string, AST::Type *> Pop ()
{
std::map<std::string, std::string> layer ();
scopeStack.push_back (layer);
auto toplevel = scopeStack.back ();
scopeStack.pop_back ();
return toplevel;
}

void Pop () { scopeStack.pop_back (); }

private:
std::vector<std::map<std::string, std::string> > scopeStack;
std::vector<std::map<std::string, AST::Type *> > scopeStack;
};

} // namespace Analysis
Expand Down
15 changes: 5 additions & 10 deletions gcc/rust/ast/rust-ast-full-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -783,8 +783,7 @@ UseTreeGlob::as_string () const
return "*";
case GLOBAL:
return "::*";
case PATH_PREFIXED:
{
case PATH_PREFIXED: {
::std::string path_str = path.as_string ();
return path_str + "::*";
}
Expand All @@ -807,8 +806,7 @@ UseTreeList::as_string () const
case GLOBAL:
path_str = "::{";
break;
case PATH_PREFIXED:
{
case PATH_PREFIXED: {
path_str = path.as_string () + "::{";
break;
}
Expand Down Expand Up @@ -4688,8 +4686,7 @@ MacroParser::parse_meta_item_inner ()
case SELF:
case CRATE:
case DOLLAR_SIGN:
case SCOPE_RESOLUTION:
{
case SCOPE_RESOLUTION: {
return parse_path_meta_item ();
}
default:
Expand Down Expand Up @@ -4830,16 +4827,14 @@ MacroParser::parse_path_meta_item ()

switch (peek_token ()->get_id ())
{
case LEFT_PAREN:
{
case LEFT_PAREN: {
::std::vector< ::std::unique_ptr<MetaItemInner> > meta_items
= parse_meta_item_seq ();

return ::std::unique_ptr<MetaItemSeq> (
new MetaItemSeq (::std::move (path), ::std::move (meta_items)));
}
case EQUAL:
{
case EQUAL: {
skip_token ();

Location locus = peek_token ()->get_locus ();
Expand Down
4 changes: 3 additions & 1 deletion gcc/rust/ast/rust-ast.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ class DelimTokenTree : public TokenTree, public AttrInput
// tok) const;
//::std::vector< ::std::unique_ptr<MetaItemInner> > parse_meta_item_seq(const
//::std::vector< ::std::unique_ptr<Token> >& token_stream, int& i) const;
//Literal
// Literal
// parse_literal(const ::std::unique_ptr<Token>& tok) const;
//::std::unique_ptr<MetaItem> parse_path_meta_item(const ::std::vector<
//::std::unique_ptr<Token> >& token_stream, int& i) const; bool
Expand Down Expand Up @@ -819,6 +819,8 @@ class Item : public Stmt
add_crate_name (::std::vector< ::std::string> &names ATTRIBUTE_UNUSED) const
{}

virtual void accept_vis (ASTVisitor &vis ATTRIBUTE_UNUSED) {}

protected:
// Constructor
Item (::std::vector<Attribute> outer_attribs = ::std::vector<Attribute> ())
Expand Down
Loading

0 comments on commit 5daf7bc

Please sign in to comment.