// Copyright Epic Games, Inc. All Rights Reserved. // uLang Compiler Public API #pragma once #include "uLang/Semantics/Definition.h" #include "uLang/Semantics/SemanticScope.h" #include "uLang/Common/Text/Symbol.h" #include "uLang/Common/Misc/Optional.h" #include "uLang/Common/Containers/SharedPointer.h" #include "uLang/Common/Containers/Map.h" #define UE_API VERSECOMPILER_API namespace uLang { class CExprDefinition; class CExprIdentifierFunction; class CTypeBase; static SAccessLevel::EKind DefaultVarAccessLevelKind = SAccessLevel::EKind::Public; struct SClassVarAccessorFunctions { TMap Getters; TMap Setters; CSymbol GetterName; CSymbol SetterName; explicit operator bool() const { return Getters.Num() && Setters.Num(); } }; /** * Joining structure, making data-members attributable. **/ class CDataDefinition : public CDefinition { public: static const CDefinition::EKind StaticDefinitionKind = CDefinition::EKind::Data; friend class CExprDataDefinition; bool _bNamed = false; // Named member - must be explicitly ?named rather than determined by index // The type of this data definition in the negative position. const CTypeBase* _NegativeType = nullptr; // A parameter `X` of type `type` is encoded as `:type(X, X) where X:type`. // `_ImplicitParam` points to the corresponding type variable. const CTypeVariable* _ImplicitParam = nullptr; CDataDefinition(const CSymbol& IdentName, CScope& EnclosingScope) : CDataDefinition(IdentName, EnclosingScope, nullptr) { } CDataDefinition(const CSymbol& IdentName, CScope& EnclosingScope, const CTypeBase* Type) : CDefinition(StaticDefinitionKind, EnclosingScope, IdentName) , _Type(Type) { } // CDefinition interface. void SetPrototypeDefinition(const CDataDefinition& PrototypeDefinition) { CDefinition::SetPrototypeDefinition(PrototypeDefinition); } const CDataDefinition* GetPrototypeDefinition() const { return static_cast(CDefinition::GetPrototypeDefinition()); } UE_API void SetAstNode(CExprDefinition* AstNode); UE_API CExprDefinition* GetAstNode() const; UE_API void SetIrNode(CExprDefinition* AstNode); UE_API CExprDefinition* GetIrNode(bool bForce = false) const; void SetType(const CTypeBase* Type) { _Type = Type; } const CTypeBase* GetType() const { return _Type; } UE_API CUTF8String GetScopePath(uLang::UTF8Char SeparatorChar = '.', CScope::EPathMode Mode = CScope::EPathMode::Default) const; void SetOverriddenDefinition(const CDataDefinition& OverriddenDefinition) { CDefinition::SetOverriddenDefinition(OverriddenDefinition); } const CDataDefinition* GetOverriddenDefinition() const { const CDefinition* OverriddenDefinition = CDefinition::GetOverriddenDefinition(); return OverriddenDefinition ? &OverriddenDefinition->AsChecked() : nullptr; } const CDataDefinition& GetBaseOverriddenDefinition() const { return CDefinition::GetBaseOverriddenDefinition().AsChecked(); } const CDataDefinition& GetBaseClassOverriddenDefinition() const { return CDefinition::GetBaseClassOverriddenDefinition().AsChecked(); } void SetHasInitializer() { ULANG_ASSERT(GetPrototypeDefinition() == this); _bHasInitializer = true; } bool HasInitializer() const { return GetPrototypeDefinition()->_bHasInitializer; } void SetVarAccessLevel(TOptional&& AccessLevel) { ULANG_ASSERT(GetPrototypeDefinition() == this); ULANG_ASSERT(IsVar()); _VarAccessLevel = Move(AccessLevel); } void SetIsVar() { ULANG_ASSERT(GetPrototypeDefinition() == this); _bIsVar = true; } const TOptional& SelfVarAccessLevel() const { ULANG_ASSERT(IsVar()); return GetPrototypeDefinition()->_VarAccessLevel; } bool IsVar() const { return GetPrototypeDefinition()->_bIsVar; } SAccessLevel DerivedVarAccessLevel() const { ULANG_ASSERT(IsVar()); return GetDefinitionAccessibilityRoot().AsChecked().SelfVarAccessLevel().Get(DefaultVarAccessLevelKind); } UE_API bool IsVarWritableFrom(const CScope&) const; const CDataDefinition& GetDefinitionVarAccessibilityRoot() const { return GetDefinitionAccessibilityRoot().AsChecked(); } UE_API bool IsModuleScopedVar() const; UE_API void MarkPersistenceCompatConstraint() const; UE_API virtual bool IsPersistenceCompatConstraint() const override; SClassVarAccessorFunctions _OptionalAccessors; UE_API bool CanHaveCustomAccessors() const; UE_API bool HasCustomAccessors() const; UE_API bool HasPredictsAttribute() const; UE_API bool CanBeAccessedFromPredicts() const; // Used for default value of data definitions in interfaces. TSPtr DefaultValue; private: TOptional _VarAccessLevel; const CTypeBase* _Type{nullptr}; mutable bool _bPersistenceCompatConstraint{false}; bool _bIsVar{false}; bool _bHasInitializer{ false }; }; } // namespace uLang #undef UE_API