Changes in src/AST/Decl.hpp [07de76b:e67991f]
- File:
-
- 1 edited
-
src/AST/Decl.hpp (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Decl.hpp
r07de76b re67991f 9 9 // Author : Aaron B. Moss 10 10 // Created On : Thu May 9 10:00:00 2019 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Dec 13 17:38:33201913 // Update Count : 2911 // Last Modified By : Aaron B. Moss 12 // Last Modified On : Thu May 9 10:00:00 2019 13 // Update Count : 1 14 14 // 15 15 … … 20 20 #include <unordered_map> 21 21 #include <vector> 22 #include <algorithm>23 22 24 23 #include "FunctionSpec.hpp" … … 28 27 #include "ParseNode.hpp" 29 28 #include "StorageClasses.hpp" 29 #include "TypeVar.hpp" 30 30 #include "Visitor.hpp" 31 #include "Common/utility.h" 32 #include "Common/SemanticError.h" // error_str 31 #include "Parser/ParseNode.h" // for DeclarationNode::Aggregate 33 32 34 33 // Must be included in *all* AST classes; should be #undef'd at the end of the file … … 126 125 std::vector< ptr<Expr> > withExprs; 127 126 128 FunctionDecl( const CodeLocation & loc, const std::string & name, FunctionType * type,127 FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type, 129 128 CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C, 130 129 std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {}) … … 137 136 bool has_body() const { return stmts; } 138 137 139 const DeclWithType * accept( Visitor & v ) const override { return v.visit( this ); }138 const DeclWithType * accept( Visitor &v ) const override { return v.visit( this ); } 140 139 private: 141 140 FunctionDecl * clone() const override { return new FunctionDecl( *this ); } … … 155 154 156 155 /// Produces a name for the kind of alias 157 virtual const char *typeString() const = 0;156 virtual std::string typeString() const = 0; 158 157 159 158 private: … … 164 163 /// Cforall type variable: `dtype T` 165 164 class TypeDecl final : public NamedTypeDecl { 166 public: 167 enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS }; 168 169 Kind kind; 165 public: 166 TypeVar::Kind kind; 170 167 bool sized; 171 168 ptr<Type> init; … … 173 170 /// Data extracted from a type decl 174 171 struct Data { 175 Kind kind;172 TypeVar::Kind kind; 176 173 bool isComplete; 177 174 178 Data() : kind( NUMBER_OF_KINDS), isComplete( false ) {}175 Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {} 179 176 Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {} 180 Data( Kind k, bool c ) : kind( k ), isComplete( c ) {}177 Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {} 181 178 Data( const Data & d1, const Data & d2 ) 182 : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {} 183 184 bool operator==( const Data & o ) const { return kind == o.kind && isComplete == o.isComplete; } 185 bool operator!=( const Data & o ) const { return !(*this == o); } 179 : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {} 180 181 bool operator== ( const Data & o ) const { 182 return kind == o.kind && isComplete == o.isComplete; 183 } 184 bool operator!= ( const Data & o ) const { return !(*this == o); } 186 185 }; 187 186 188 TypeDecl( const CodeLocation & loc, const std::string & name, Storage::Classes storage, Type* b,189 Kind k, bool s, Type* i = nullptr )190 : NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k ==Ttype || s ),191 init( i ) {}192 193 const char *typeString() const override;187 TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b, 188 TypeVar::Kind k, bool s, Type* i = nullptr ) 189 : NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ), 190 init( i ) {} 191 192 std::string typeString() const override; 194 193 /// Produces a name for generated code 195 const char *genTypeString() const;194 std::string genTypeString() const; 196 195 197 196 /// convenience accessor to match Type::isComplete() … … 199 198 200 199 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } 201 private:200 private: 202 201 TypeDecl * clone() const override { return new TypeDecl{ *this }; } 203 202 MUTATE_FRIEND … … 213 212 : NamedTypeDecl( loc, name, storage, b, spec ) {} 214 213 215 const char *typeString() const override { return "typedef"; }214 std::string typeString() const override { return "typedef"; } 216 215 217 216 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } … … 224 223 class AggregateDecl : public Decl { 225 224 public: 226 enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };227 static const char * aggrString( Aggregate aggr );228 229 225 std::vector<ptr<Decl>> members; 230 226 std::vector<ptr<TypeDecl>> params; … … 241 237 242 238 /// Produces a name for the kind of aggregate 243 virtual const char *typeString() const = 0;239 virtual std::string typeString() const = 0; 244 240 245 241 private: … … 251 247 class StructDecl final : public AggregateDecl { 252 248 public: 253 Aggregate kind;249 DeclarationNode::Aggregate kind; 254 250 255 251 StructDecl( const CodeLocation& loc, const std::string& name, 256 Aggregate kind =Struct,252 DeclarationNode::Aggregate kind = DeclarationNode::Struct, 257 253 std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall ) 258 254 : AggregateDecl( loc, name, std::move(attrs), linkage ), kind( kind ) {} 259 255 260 bool is_coroutine() { return kind == Coroutine; }261 bool is_monitor() { return kind == Monitor; }262 bool is_thread() { return kind == Thread; }263 264 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } 265 266 const char * typeString() const override { return aggrString( kind ); }256 bool is_coroutine() { return kind == DeclarationNode::Coroutine; } 257 bool is_monitor() { return kind == DeclarationNode::Monitor; } 258 bool is_thread() { return kind == DeclarationNode::Thread; } 259 260 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } 261 262 std::string typeString() const override { return "struct"; } 267 263 268 264 private: … … 280 276 const Decl * accept( Visitor& v ) const override { return v.visit( this ); } 281 277 282 const char * typeString() const override { return aggrString( Union ); }278 std::string typeString() const override { return "union"; } 283 279 284 280 private: … … 299 295 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } 300 296 301 const char * typeString() const override { return aggrString( Enum ); }297 std::string typeString() const override { return "enum"; } 302 298 303 299 private: … … 318 314 const Decl * accept( Visitor & v ) const override { return v.visit( this ); } 319 315 320 const char *typeString() const override { return "trait"; }316 std::string typeString() const override { return "trait"; } 321 317 322 318 private: … … 344 340 ptr<AsmStmt> stmt; 345 341 346 AsmDecl( const CodeLocation & loc, AsmStmt * stmt )342 AsmDecl( const CodeLocation & loc, AsmStmt *stmt ) 347 343 : Decl( loc, "", {}, {} ), stmt(stmt) {} 348 344 349 const AsmDecl * accept( Visitor & v ) const override { return v.visit( this ); }350 private: 351 AsmDecl * clone() const override { return new AsmDecl( *this ); }345 const AsmDecl * accept( Visitor &v ) const override { return v.visit( this ); } 346 private: 347 AsmDecl *clone() const override { return new AsmDecl( *this ); } 352 348 MUTATE_FRIEND 353 349 }; … … 361 357 : Decl( loc, "", {}, {} ), cond( condition ), msg( msg ) {} 362 358 363 const StaticAssertDecl * accept( Visitor & v ) const override { return v.visit( this ); }359 const StaticAssertDecl * accept( Visitor &v ) const override { return v.visit( this ); } 364 360 private: 365 361 StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
Note:
See TracChangeset
for help on using the changeset viewer.