3 #include <yuni/core/smartptr/intrusive.h> 4 #include <yuni/core/string.h> 5 #include <yuni/core/noncopyable.h> 6 #include <yuni/core/flags.h> 7 #include <yuni/core/tribool.h> 8 #include "details/utils/clid.h" 10 #include "nany/nany.h" 11 #include "details/ir/fwd.h" 12 #include "signature.h" 13 #include <unordered_map> 14 #include <unordered_set> 16 #include "libnanyc-config.h" 17 #include "details/atom/classdef.h" 26 struct ClassdefTableView;
27 namespace ir {
struct Sequence; }
38 :
public Yuni::IIntrusiveSmartPtr<Atom, false, Yuni::Policy::SingleThreaded>
39 , Yuni::NonCopyable<Atom> {
64 pushCapturedVariables,
119 bool append(
const CLID&,
const AnyString& name);
121 uint32_t findByName(
const AnyString& name, uint32_t offset = 0)
const;
123 const std::pair<AnyString, Vardef>& operator [] (uint index)
const;
128 const AnyString& name(uint index)
const;
130 const Vardef& vardef(uint index)
const;
134 template<
class T>
void each(
const T& callback)
const;
138 bool shortcircuitValue =
false;
143 std::pair<AnyString, Vardef> params[config::maxFuncDeclParameterCount];
145 std::unique_ptr<Data> pData;
150 static void extractNames(AnyString& keyword, AnyString& varname,
const AnyString& name);
153 explicit Atom(
const AnyString& name,
Type type);
154 explicit Atom(
Atom& rootparent,
const AnyString& name,
Type type);
159 AnyString name()
const;
165 bool isNamespace()
const;
167 bool isClass()
const;
169 bool isFunction()
const;
171 bool isOperator()
const;
173 bool isSpecial()
const;
177 bool isMemberVariable()
const;
179 bool isClassMember()
const;
181 bool isAnonymousClass()
const;
183 bool isMemberVarDefaultInit()
const;
185 bool isTypeAlias()
const;
193 bool isCloneCtor()
const;
195 bool isFunctor()
const;
197 bool callable()
const;
199 bool isCapturedVariable()
const;
201 bool isProperty()
const;
203 bool isPropertyGet()
const;
205 bool isPropertySet()
const;
207 bool isPropertySetCustom()
const;
209 bool isUnittest()
const;
212 bool isPublicOrPublished()
const;
215 bool hasReturnType()
const;
218 bool hasGenericParameters()
const;
224 bool isContextual()
const;
227 bool canAccessTo(
const Atom&)
const;
230 bool canCaptureVariabes()
const;
236 const Atom* parentScope()
const;
245 bool nameLookupFromParentScope(std::vector<std::reference_wrapper<Atom>>& list,
const AnyString& name);
254 bool nameLookupOnChildren(std::vector<std::reference_wrapper<Atom>>& list,
const AnyString& name,
255 bool* singleHop =
nullptr);
264 bool propertyLookupOnChildren(std::vector<std::reference_wrapper<Atom>>& list,
265 const AnyString& prefix,
const AnyString& name);
268 bool hasMember(
const AnyString& name)
const;
280 template<
class C>
void eachChild(
const C& callback);
281 template<
class C>
void eachChild(
const C& callback)
const;
293 template<
class C>
void eachChild(
const AnyString& needle,
const C& callback);
294 template<
class C>
void eachChild(
const AnyString& needle,
const C& callback)
const;
296 uint32_t findClassAtom(
Atom*& out,
const AnyString& name);
297 uint32_t findFuncAtom(
Atom*& out,
const AnyString& name);
298 uint32_t findVarAtom(
Atom*& out,
const AnyString& name);
299 Atom* findNamespaceAtom(
const AnyString& name);
301 const Atom* findChildByMemberFieldID(uint32_t field)
const;
309 void renameChild(
const AnyString& from,
const AnyString& to);
314 bool findParent(
const Atom& atom)
const;
317 uint32_t childrenCount()
const;
320 bool hasChildren()
const;
326 uint64_t runtimeSizeof()
const;
332 YString fullname()
const;
336 bool parentName =
true)
const;
340 YString caption()
const;
357 AnyString keyword()
const;
364 Ref(
Instances& ref, uint32_t index): m_ref(ref), m_index(index) {}
370 AnyString symbolname()
const;
376 void update(YString&& symbol,
const Classdef& rettype);
386 YString print(
const AtomMap&)
const;
394 Yuni::Tribool::Value isValid(
const Signature& signature, uint32_t& iid,
Classdef&,
Atom*& remapAtom)
const;
397 uint32_t size()
const;
400 Ref operator [] (uint32_t index);
403 void update(uint32_t index, Yuni::String&& symbol,
const Classdef& rettype);
404 void invalidate(uint32_t index,
const Signature&);
406 struct Metadata final {
407 std::unique_ptr<ir::Sequence> ircode;
409 Atom* remapAtom =
nullptr;
413 std::vector<Metadata> m_instances;
415 std::unordered_map<Signature, uint32_t> m_instancesIDs;
420 uint32_t atomid = 0u;
422 Yuni::Flags<Flags> flags = {Flags::suggestInReport};
430 uint16_t fieldindex = 0;
432 uint16_t effectiveFieldIndex = 0;
439 bool isInstanciated =
false;
442 uint16_t nextFieldIndex = 0;
447 uint32_t instanceid = (uint32_t) - 1;
453 uint32_t instanceid = (uint32_t) - 1;
461 nyvisibility_t visibility = nyv_public;
485 uint32_t localVariablesCount = 0u;
487 Atom* scopeForNameResolution =
nullptr;
497 uint32_t stackSizeExtra = 0;
507 nytype_t builtinMapping = nyt_void;
514 std::multimap<AnyString, yuni::Ref<Atom>> m_children;
Yuni::Flags< Flags > flags
Atom flags.
Definition: atom.h:422
Vardef returnType
The return type.
Definition: atom.h:477
YString filename
File source.
Definition: atom.h:468
Yuni::Flags< Category > category
Atom Category.
Definition: atom.h:424
Parameters parameters
Parameters (for functions)
Definition: atom.h:479
Definition: signature.h:15
Class definition.
Definition: classdef.h:24
const Type type
Flag to determine whether this entry is a blueprint or a namespace.
Definition: atom.h:459
Category
Definition: atom.h:82
Parameters tmplparams
Template parameters.
Definition: atom.h:481
Atoms.
Definition: atom-map.h:17
Type
Definition: atom.h:41
Definition of a single class or function.
Definition: atom.h:37
Parameters tmplparamsForPrinting
Template parameters just for printing informations (such as errors)
Definition: atom.h:483
std::unique_ptr< std::unordered_set< AnyString > > candidatesForCapture
List of potential candidates for being captured.
Definition: atom.h:510
Flags
Definition: atom.h:56
AnyString builtinalias
Builtin alias (empty if none)
Definition: atom.h:505
Definition: sequence.h:22
Definition: classdef-table-view.h:9