5 #include "ast/AstNode.h"
8 #include "utils/Generator.h"
9 #include "utils/Utils.h"
20 std::string_view simpleName()
const {
22 auto unresTy = cast<UnresolvedType*>(type);
25 SourceRange location()
const {
return type->location(); }
33 auto const* body()
const {
return body_; }
34 auto const* bodyAsDecl()
const {
return dyn_cast_or_null<
Decl>(body_); }
35 auto mut_bodyAsDecl() {
return dyn_cast_or_null<
Decl>(body_); }
36 std::ostream& print(std::ostream& os,
int indentation = 0)
const override;
37 int printDotNode(DotPrinter& dp)
const override;
38 string_view getPackageName()
const {
39 assert(package_ &&
"Package can never be null");
41 auto package = cast<UnresolvedType*>(package_);
46 auto const* package()
const {
return package_; }
47 auto imports()
const {
return std::views::all(imports_); }
48 auto isDefaultPackage()
const {
49 if(!package_)
return true;
51 auto unresTy = cast<UnresolvedType*>(package_);
52 return unresTy->parts().size() == 0;
56 for(
auto import : imports_)
co_yield import.type;
59 auto mut_body() {
return body_; }
60 bool isStdLib()
const {
62 auto package = cast<UnresolvedType*>(package_);
63 return package->parts().size() >= 1 && package->parts().front() ==
"java";
75 LinkingUnit(BumpAllocator& alloc,
76 array_ref<CompilationUnit*> compilationUnits)
noexcept;
77 auto compliationUnits()
const {
return std::views::all(compilationUnits_); }
78 std::ostream& print(std::ostream& os,
int indentation = 0)
const override;
79 int printDotNode(DotPrinter& dp)
const override;
81 for(
auto cu : compilationUnits_)
co_yield cu;
85 pmr_vector<CompilationUnit*> compilationUnits_;
92 array_ref<ReferenceType*> interfaces,
93 array_ref<Decl*> classBodyDecls)
throw();
94 auto fields()
const {
return std::views::all(fields_); }
95 auto methods()
const {
return std::views::all(methods_); }
96 auto constructors()
const {
return std::views::all(constructors_); }
97 auto interfaces()
const {
return std::views::all(interfaces_); }
101 auto& mut_superClasses() {
return superClasses_; }
102 auto modifiers()
const {
return modifiers_; }
104 std::ostream& print(std::ostream& os,
int indentation = 0)
const override;
105 int printDotNode(DotPrinter& dp)
const override;
109 DeclContext const* asDeclContext()
const override {
return this; }
110 Decl const* asDecl()
const override {
return this; }
112 for(
auto field : fields_)
co_yield field;
113 for(
auto method : methods_)
co_yield reinterpret_cast<Decl*>(method);
114 for(
auto constructor : constructors_)
115 co_yield reinterpret_cast<Decl*>(constructor);
116 for(
auto interface : interfaces_)
co_yield interface;
117 for(
auto superClass : superClasses_)
co_yield superClass;
119 bool hasDefaultCtor()
const;
124 pmr_vector<ReferenceType*> interfaces_;
125 pmr_vector<FieldDecl*> fields_;
126 pmr_vector<MethodDecl*> methods_;
127 pmr_vector<MethodDecl*> constructors_;
134 string_view name, array_ref<ReferenceType*> extends,
136 array_ref<Decl*> interfaceBodyDecls)
throw();
137 auto extends()
const {
return std::views::all(extends_); }
138 auto methods()
const {
return std::views::all(methods_); }
139 auto modifiers()
const {
return modifiers_; }
140 auto const* objectSuperclass()
const {
return objectSuperclass_; }
142 std::ostream& print(std::ostream& os,
int indentation = 0)
const override;
143 int printDotNode(DotPrinter& dp)
const override;
147 DeclContext const* asDeclContext()
const override {
return this; }
148 Decl const* asDecl()
const override {
return this; }
150 for(
auto method : methods_)
co_yield reinterpret_cast<Decl*>(method);
151 for(
auto superClass : extends_)
co_yield superClass;
156 pmr_vector<ReferenceType*> extends_;
157 pmr_vector<MethodDecl*> methods_;
165 string_view name,
Type* returnType, array_ref<VarDecl*> parameters,
166 bool isConstructor,
Stmt* body)
noexcept
168 modifiers_{modifiers},
169 returnType_{returnType},
172 isConstructor_{isConstructor},
174 location_{location} {
175 utils::move_vector<VarDecl*>(parameters, parameters_);
177 auto modifiers()
const {
return modifiers_; }
178 bool isConstructor()
const {
return isConstructor_; }
179 auto parameters()
const {
return std::views::all(parameters_); }
181 std::ostream& print(std::ostream& os,
int indentation = 0)
const override;
182 int printDotNode(DotPrinter& dp)
const override;
185 template <std::ranges::range T>
186 requires std::same_as<std::ranges::range_value_t<T>, VarDecl*>
187 void addDecls(T decls) {
188 locals_.reserve(decls.size());
189 locals_.insert(locals_.end(), decls.begin(), decls.end());
191 SourceRange location()
const override {
return location_; }
192 ReturnType returnTy()
const {
return ReturnType{returnType_}; }
193 DeclContext
const* asDeclContext()
const override {
return this; }
194 Decl
const* asDecl()
const override {
return this; }
195 Stmt
const* body()
const {
return body_; }
197 utils::Generator<ast::AstNode
const*> children()
const override {
198 co_yield returnType_;
199 for(
auto local : locals_)
co_yield local;
202 std::ostream& printSignature(std::ostream& os)
const;
203 void dumpSignature()
const;
208 pmr_vector<VarDecl*> parameters_;
209 pmr_vector<VarDecl*> locals_;