Skip to content

Commit efbe8cc

Browse files
committed
Resolve the type from an ArrayIndexExpression
Adds new TypeVisitor to resolve Types from the AST via Visitor Pattern, so the element type can be extracted. Addresses: gcc-mirror#27 gcc-mirror#55
1 parent 886b230 commit efbe8cc

File tree

3 files changed

+290
-9
lines changed

3 files changed

+290
-9
lines changed

gcc/rust/analysis/rust-type-resolution.cc

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "rust-type-resolution.h"
22
#include "rust-diagnostics.h"
3+
#include "rust-type-visitor.h"
34

45
#define ADD_BUILTIN_TYPE(_X, _S) \
56
do \
@@ -470,8 +471,6 @@ TypeResolution::visit (AST::ArrayExpr &expr)
470471
void
471472
TypeResolution::visit (AST::ArrayIndexExpr &expr)
472473
{
473-
printf ("ArrayIndexExpr: %s\n", expr.as_string ().c_str ());
474-
475474
auto before = typeBuffer.size ();
476475
expr.get_array_expr ()->accept_vis (*this);
477476
if (typeBuffer.size () <= before)
@@ -495,16 +494,20 @@ TypeResolution::visit (AST::ArrayIndexExpr &expr)
495494
AST::Type *array_index_type = typeBuffer.back ();
496495
typeBuffer.pop_back ();
497496

498-
printf ("Array expr type %s array index expr type: [%s]\n",
499-
array_expr_type->as_string ().c_str (),
500-
array_index_type->as_string ().c_str ());
501-
502-
// the the element type from the array_expr_type and it _must_ be an array
503-
// TODO
504-
505497
// check the index_type should be an i32 which should really be
506498
// more permissive
507499
// TODO
500+
501+
// the the element type from the array_expr_type and it _must_ be an array
502+
AST::ArrayType *resolved = ArrayTypeVisitor::Resolve (array_expr_type);
503+
if (resolved == nullptr)
504+
{
505+
rust_error_at (expr.get_locus_slow (),
506+
"unable to resolve type for array expression");
507+
return;
508+
}
509+
510+
typeBuffer.push_back (resolved->get_element_type ());
508511
}
509512

510513
void

gcc/rust/analysis/rust-type-resolution.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
// Copyright (C) 2020 Free Software Foundation, Inc.
2+
3+
// This file is part of GCC.
4+
5+
// GCC is free software; you can redistribute it and/or modify it under
6+
// the terms of the GNU General Public License as published by the Free
7+
// Software Foundation; either version 3, or (at your option) any later
8+
// version.
9+
10+
// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11+
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
12+
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13+
// for more details.
14+
15+
// You should have received a copy of the GNU General Public License
16+
// along with GCC; see the file COPYING3. If not see
17+
// <http://www.gnu.org/licenses/>.
118
#pragma once
219

320
#include "rust-resolution.h"

gcc/rust/analysis/rust-type-visitor.h

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
// rust-type-visitor.h -- Rust AST Visitor to AST::Type specific
2+
// Copyright (C) 2020 Free Software Foundation, Inc.
3+
4+
// This file is part of GCC.
5+
6+
// GCC is free software; you can redistribute it and/or modify it under
7+
// the terms of the GNU General Public License as published by the Free
8+
// Software Foundation; either version 3, or (at your option) any later
9+
// version.
10+
11+
// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12+
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
// for more details.
15+
16+
// You should have received a copy of the GNU General Public License
17+
// along with GCC; see the file COPYING3. If not see
18+
// <http://www.gnu.org/licenses/>.
19+
20+
#ifndef RUST_TYPE_VISITOR_H
21+
#define RUST_TYPE_VISITOR_H
22+
23+
#include "rust-system.h"
24+
#include "rust-ast-full.h"
25+
#include "rust-ast-visitor.h"
26+
#include "rust-scan.h"
27+
28+
namespace Rust {
29+
namespace Analysis {
30+
31+
class BaseTypeVisitor : public AST::ASTVisitor
32+
{
33+
public:
34+
// visitor impl
35+
// rust-ast.h
36+
// virtual void visit(AttrInput& attr_input);
37+
// virtual void visit(TokenTree& token_tree);
38+
// virtual void visit(MacroMatch& macro_match);
39+
virtual void visit (AST::Token &tok) override {}
40+
virtual void visit (AST::DelimTokenTree &delim_tok_tree) override {}
41+
virtual void visit (AST::AttrInputMetaItemContainer &input) override {}
42+
// virtual void visit(MetaItem& meta_item) override {}
43+
// void vsit(Stmt& stmt) override {}
44+
// virtual void visit(Expr& expr) override {}
45+
virtual void visit (AST::IdentifierExpr &ident_expr) override {}
46+
// virtual void visit(Pattern& pattern) override {}
47+
// virtual void visit(Type& type) override {}
48+
// virtual void visit(TypeParamBound& type_param_bound) override {}
49+
virtual void visit (AST::Lifetime &lifetime) override {}
50+
// virtual void visit(GenericParam& generic_param) override {}
51+
virtual void visit (AST::LifetimeParam &lifetime_param) override {}
52+
// virtual void visit(TraitItem& trait_item) override {}
53+
// virtual void visit(InherentImplItem& inherent_impl_item) override {}
54+
// virtual void visit(TraitImplItem& trait_impl_item) override {}
55+
virtual void visit (AST::MacroInvocationSemi &macro) override {}
56+
57+
// rust-path.h
58+
virtual void visit (AST::PathInExpression &path) override {}
59+
virtual void visit (AST::TypePathSegment &segment) override {}
60+
virtual void visit (AST::TypePathSegmentGeneric &segment) override {}
61+
virtual void visit (AST::TypePathSegmentFunction &segment) override {}
62+
virtual void visit (AST::TypePath &path) override {}
63+
virtual void visit (AST::QualifiedPathInExpression &path) override {}
64+
virtual void visit (AST::QualifiedPathInType &path) override {}
65+
66+
// rust-expr.h
67+
virtual void visit (AST::LiteralExpr &expr) override {}
68+
virtual void visit (AST::AttrInputLiteral &attr_input) override {}
69+
virtual void visit (AST::MetaItemLitExpr &meta_item) override {}
70+
virtual void visit (AST::MetaItemPathLit &meta_item) override {}
71+
virtual void visit (AST::BorrowExpr &expr) override {}
72+
virtual void visit (AST::DereferenceExpr &expr) override {}
73+
virtual void visit (AST::ErrorPropagationExpr &expr) override {}
74+
virtual void visit (AST::NegationExpr &expr) override {}
75+
virtual void visit (AST::ArithmeticOrLogicalExpr &expr) override {}
76+
virtual void visit (AST::ComparisonExpr &expr) override {}
77+
virtual void visit (AST::LazyBooleanExpr &expr) override {}
78+
virtual void visit (AST::TypeCastExpr &expr) override {}
79+
virtual void visit (AST::AssignmentExpr &expr) override {}
80+
virtual void visit (AST::CompoundAssignmentExpr &expr) override {}
81+
virtual void visit (AST::GroupedExpr &expr) override {}
82+
// virtual void visit(ArrayElems& elems) override {}
83+
virtual void visit (AST::ArrayElemsValues &elems) override {}
84+
virtual void visit (AST::ArrayElemsCopied &elems) override {}
85+
virtual void visit (AST::ArrayExpr &expr) override {}
86+
virtual void visit (AST::ArrayIndexExpr &expr) override {}
87+
virtual void visit (AST::TupleExpr &expr) override {}
88+
virtual void visit (AST::TupleIndexExpr &expr) override {}
89+
virtual void visit (AST::StructExprStruct &expr) override {}
90+
// virtual void visit(StructExprField& field) override {}
91+
virtual void visit (AST::StructExprFieldIdentifier &field) override {}
92+
virtual void visit (AST::StructExprFieldIdentifierValue &field) override {}
93+
virtual void visit (AST::StructExprFieldIndexValue &field) override {}
94+
virtual void visit (AST::StructExprStructFields &expr) override {}
95+
virtual void visit (AST::StructExprStructBase &expr) override {}
96+
virtual void visit (AST::StructExprTuple &expr) override {}
97+
virtual void visit (AST::StructExprUnit &expr) override {}
98+
// virtual void visit(EnumExprField& field) override {}
99+
virtual void visit (AST::EnumExprFieldIdentifier &field) override {}
100+
virtual void visit (AST::EnumExprFieldIdentifierValue &field) override {}
101+
virtual void visit (AST::EnumExprFieldIndexValue &field) override {}
102+
virtual void visit (AST::EnumExprStruct &expr) override {}
103+
virtual void visit (AST::EnumExprTuple &expr) override {}
104+
virtual void visit (AST::EnumExprFieldless &expr) override {}
105+
virtual void visit (AST::CallExpr &expr) override {}
106+
virtual void visit (AST::MethodCallExpr &expr) override {}
107+
virtual void visit (AST::FieldAccessExpr &expr) override {}
108+
virtual void visit (AST::ClosureExprInner &expr) override {}
109+
virtual void visit (AST::BlockExpr &expr) override {}
110+
virtual void visit (AST::ClosureExprInnerTyped &expr) override {}
111+
virtual void visit (AST::ContinueExpr &expr) override {}
112+
virtual void visit (AST::BreakExpr &expr) override {}
113+
virtual void visit (AST::RangeFromToExpr &expr) override {}
114+
virtual void visit (AST::RangeFromExpr &expr) override {}
115+
virtual void visit (AST::RangeToExpr &expr) override {}
116+
virtual void visit (AST::RangeFullExpr &expr) override {}
117+
virtual void visit (AST::RangeFromToInclExpr &expr) override {}
118+
virtual void visit (AST::RangeToInclExpr &expr) override {}
119+
virtual void visit (AST::ReturnExpr &expr) override {}
120+
virtual void visit (AST::UnsafeBlockExpr &expr) override {}
121+
virtual void visit (AST::LoopExpr &expr) override {}
122+
virtual void visit (AST::WhileLoopExpr &expr) override {}
123+
virtual void visit (AST::WhileLetLoopExpr &expr) override {}
124+
virtual void visit (AST::ForLoopExpr &expr) override {}
125+
virtual void visit (AST::IfExpr &expr) override {}
126+
virtual void visit (AST::IfExprConseqElse &expr) override {}
127+
virtual void visit (AST::IfExprConseqIf &expr) override {}
128+
virtual void visit (AST::IfExprConseqIfLet &expr) override {}
129+
virtual void visit (AST::IfLetExpr &expr) override {}
130+
virtual void visit (AST::IfLetExprConseqElse &expr) override {}
131+
virtual void visit (AST::IfLetExprConseqIf &expr) override {}
132+
virtual void visit (AST::IfLetExprConseqIfLet &expr) override {}
133+
// virtual void visit(MatchCase& match_case) override {}
134+
// virtual void visit (AST::MatchCaseBlockExpr &match_case) override {}
135+
// virtual void visit (AST::MatchCaseExpr &match_case) override {}
136+
virtual void visit (AST::MatchExpr &expr) override {}
137+
virtual void visit (AST::AwaitExpr &expr) override {}
138+
virtual void visit (AST::AsyncBlockExpr &expr) override {}
139+
140+
// rust-item.h
141+
virtual void visit (AST::TypeParam &param) override {}
142+
// virtual void visit(WhereClauseItem& item) override {}
143+
virtual void visit (AST::LifetimeWhereClauseItem &item) override {}
144+
virtual void visit (AST::TypeBoundWhereClauseItem &item) override {}
145+
virtual void visit (AST::Method &method) override {}
146+
virtual void visit (AST::ModuleBodied &module) override {}
147+
virtual void visit (AST::ModuleNoBody &module) override {}
148+
virtual void visit (AST::ExternCrate &crate) override {}
149+
// virtual void visit(UseTree& use_tree) override {}
150+
virtual void visit (AST::UseTreeGlob &use_tree) override {}
151+
virtual void visit (AST::UseTreeList &use_tree) override {}
152+
virtual void visit (AST::UseTreeRebind &use_tree) override {}
153+
virtual void visit (AST::UseDeclaration &use_decl) override {}
154+
virtual void visit (AST::Function &function) override {}
155+
virtual void visit (AST::TypeAlias &type_alias) override {}
156+
virtual void visit (AST::StructStruct &struct_item) override {}
157+
virtual void visit (AST::TupleStruct &tuple_struct) override {}
158+
virtual void visit (AST::EnumItem &item) override {}
159+
virtual void visit (AST::EnumItemTuple &item) override {}
160+
virtual void visit (AST::EnumItemStruct &item) override {}
161+
virtual void visit (AST::EnumItemDiscriminant &item) override {}
162+
virtual void visit (AST::Enum &enum_item) override {}
163+
virtual void visit (AST::Union &union_item) override {}
164+
virtual void visit (AST::ConstantItem &const_item) override {}
165+
virtual void visit (AST::StaticItem &static_item) override {}
166+
virtual void visit (AST::TraitItemFunc &item) override {}
167+
virtual void visit (AST::TraitItemMethod &item) override {}
168+
virtual void visit (AST::TraitItemConst &item) override {}
169+
virtual void visit (AST::TraitItemType &item) override {}
170+
virtual void visit (AST::Trait &trait) override {}
171+
virtual void visit (AST::InherentImpl &impl) override {}
172+
virtual void visit (AST::TraitImpl &impl) override {}
173+
// virtual void visit(ExternalItem& item) override {}
174+
virtual void visit (AST::ExternalStaticItem &item) override {}
175+
virtual void visit (AST::ExternalFunctionItem &item) override {}
176+
virtual void visit (AST::ExternBlock &block) override {}
177+
178+
// rust-macro.h
179+
virtual void visit (AST::MacroMatchFragment &match) override {}
180+
virtual void visit (AST::MacroMatchRepetition &match) override {}
181+
virtual void visit (AST::MacroMatcher &matcher) override {}
182+
virtual void visit (AST::MacroRulesDefinition &rules_def) override {}
183+
virtual void visit (AST::MacroInvocation &macro_invoc) override {}
184+
virtual void visit (AST::MetaItemPath &meta_item) override {}
185+
virtual void visit (AST::MetaItemSeq &meta_item) override {}
186+
virtual void visit (AST::MetaWord &meta_item) override {}
187+
virtual void visit (AST::MetaNameValueStr &meta_item) override {}
188+
virtual void visit (AST::MetaListPaths &meta_item) override {}
189+
virtual void visit (AST::MetaListNameValueStr &meta_item) override {}
190+
191+
// rust-pattern.h
192+
virtual void visit (AST::LiteralPattern &pattern) override {}
193+
virtual void visit (AST::IdentifierPattern &pattern) override {}
194+
virtual void visit (AST::WildcardPattern &pattern) override {}
195+
// virtual void visit(RangePatternBound& bound) override {}
196+
virtual void visit (AST::RangePatternBoundLiteral &bound) override {}
197+
virtual void visit (AST::RangePatternBoundPath &bound) override {}
198+
virtual void visit (AST::RangePatternBoundQualPath &bound) override {}
199+
virtual void visit (AST::RangePattern &pattern) override {}
200+
virtual void visit (AST::ReferencePattern &pattern) override {}
201+
// virtual void visit(StructPatternField& field) override {}
202+
virtual void visit (AST::StructPatternFieldTuplePat &field) override {}
203+
virtual void visit (AST::StructPatternFieldIdentPat &field) override {}
204+
virtual void visit (AST::StructPatternFieldIdent &field) override {}
205+
virtual void visit (AST::StructPattern &pattern) override {}
206+
// virtual void visit(TupleStructItems& tuple_items) override {}
207+
virtual void visit (AST::TupleStructItemsNoRange &tuple_items) override {}
208+
virtual void visit (AST::TupleStructItemsRange &tuple_items) override {}
209+
virtual void visit (AST::TupleStructPattern &pattern) override {}
210+
// virtual void visit(TuplePatternItems& tuple_items) override {}
211+
virtual void visit (AST::TuplePatternItemsMultiple &tuple_items) override {}
212+
virtual void visit (AST::TuplePatternItemsRanged &tuple_items) override {}
213+
virtual void visit (AST::TuplePattern &pattern) override {}
214+
virtual void visit (AST::GroupedPattern &pattern) override {}
215+
virtual void visit (AST::SlicePattern &pattern) override {}
216+
217+
// rust-stmt.h
218+
virtual void visit (AST::EmptyStmt &stmt) override {}
219+
virtual void visit (AST::LetStmt &stmt) override {}
220+
virtual void visit (AST::ExprStmtWithoutBlock &stmt) override {}
221+
virtual void visit (AST::ExprStmtWithBlock &stmt) override {}
222+
223+
// rust-type.h
224+
virtual void visit (AST::TraitBound &bound) override {}
225+
virtual void visit (AST::ImplTraitType &type) override {}
226+
virtual void visit (AST::TraitObjectType &type) override {}
227+
virtual void visit (AST::ParenthesisedType &type) override {}
228+
virtual void visit (AST::ImplTraitTypeOneBound &type) override {}
229+
virtual void visit (AST::TraitObjectTypeOneBound &type) override {}
230+
virtual void visit (AST::TupleType &type) override {}
231+
virtual void visit (AST::NeverType &type) override {}
232+
virtual void visit (AST::RawPointerType &type) override {}
233+
virtual void visit (AST::ReferenceType &type) override {}
234+
virtual void visit (AST::ArrayType &type) override {}
235+
virtual void visit (AST::SliceType &type) override {}
236+
virtual void visit (AST::InferredType &type) override {}
237+
virtual void visit (AST::BareFunctionType &type) override {}
238+
};
239+
240+
class ArrayTypeVisitor : public BaseTypeVisitor
241+
{
242+
public:
243+
static AST::ArrayType *Resolve (AST::Type *type)
244+
{
245+
ArrayTypeVisitor vis;
246+
type->accept_vis (vis);
247+
return vis.resolved;
248+
}
249+
250+
virtual void visit (AST::ArrayType &type) override { resolved = &type; };
251+
252+
private:
253+
ArrayTypeVisitor () : resolved (nullptr) {}
254+
255+
AST::ArrayType *resolved;
256+
};
257+
258+
} // namespace Analysis
259+
} // namespace Rust
260+
261+
#endif // RUST_TYPE_VISITOR_H

0 commit comments

Comments
 (0)