Files
UnrealEngine/Engine/Source/Runtime/VerseCompiler/Public/uLang/Semantics/SemanticEnumeration.h
2025-05-18 13:04:45 +08:00

113 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
// uLang Compiler Public API
#pragma once
#include "uLang/Common/Common.h"
#include "uLang/Semantics/Attributable.h"
#include "uLang/Semantics/Definition.h"
#include "uLang/Semantics/MemberOrigin.h"
#include "uLang/Semantics/SemanticScope.h"
#include "uLang/Semantics/SemanticTypes.h"
#include "uLang/Semantics/SmallDefinitionArray.h"
#include "uLang/Semantics/VisitStamp.h"
#define UE_API VERSECOMPILER_API
namespace uLang
{
class CEnumeration;
class CExprEnumLiteral;
class CExprEnumDefinition;
/**
* Description for a single enumerator
**/
class CEnumerator : public CDefinition
{
public:
static constexpr EKind StaticDefinitionKind = EKind::Enumerator;
/// The integer value denoting this enumerator for native representation.
const int32_t _IntValue;
/// Type this enumerator belongs to
CEnumeration* _Enumeration{nullptr};
UE_API CEnumerator(CEnumeration& Enumeration, const CSymbol& Name, int32_t Value);
UE_API CUTF8String AsCode() const;
// CDefinition interface.
UE_API void SetAstNode(CExprEnumLiteral* AstNode);
UE_API CExprEnumLiteral* GetAstNode() const;
UE_API void SetIrNode(CExprEnumLiteral* AstNode);
UE_API CExprEnumLiteral* GetIrNode(bool bForce = false) const;
UE_API virtual bool IsPersistenceCompatConstraint() const override;
};
/**
* Enumeration type
* @jira SOL-1013 : Make enums derive from Class?
**/
class CEnumeration : public CDefinition, public CLogicalScope, public CNominalType
{
public:
static const ETypeKind StaticTypeKind = ETypeKind::Enumeration;
static const CDefinition::EKind StaticDefinitionKind = CDefinition::EKind::Enumeration;
CAttributable _EffectAttributable;
UE_API CEnumeration(const CSymbol& Name, CScope& EnclosingScope);
UE_API CEnumerator& CreateEnumerator(const CSymbol& EnumeratorName, int32_t Value);
// CTypeBase interface.
using CTypeBase::GetProgram;
UE_API virtual SmallDefinitionArray FindTypeMember(const CSymbol& Name, EMemberOrigin Origin, const SQualifier& Qualifier = SQualifier::Unknown(), VisitStampType VisitStamp = CScope::GenerateNewVisitStamp()) const override;
virtual EComparability GetComparability() const override { return EComparability::ComparableAndHashable; }
UE_API virtual bool IsPersistable() const override;
virtual bool IsExplicitlyCastable() const override { return false; }
virtual bool CanBeCustomAccessorDataType() const override { return true; };
// CNominalType interface.
virtual const CDefinition* Definition() const override { return this; }
// CScope interface.
virtual CSymbol GetScopeName() const override { return GetName(); }
virtual const CTypeBase* ScopeAsType() const override { return this; }
virtual const CDefinition* ScopeAsDefinition() const override { return this; }
UE_API virtual SAccessLevel GetDefaultDefinitionAccessLevel() const override;
// CDefinition interface.
UE_API void SetAstNode(CExprEnumDefinition* AstNode);
UE_API CExprEnumDefinition* GetAstNode() const;
UE_API void SetIrNode(CExprEnumDefinition* AstNode);
UE_API CExprEnumDefinition* GetIrNode(bool bForce = false) const;
virtual const CLogicalScope* DefinitionAsLogicalScopeNullable() const override { return this; }
virtual bool IsPersistenceCompatConstraint() const override { return IsPersistable(); }
bool IsOpen() const { return GetOpenness() == EEnumOpenness::Open; }
bool IsClosed() const { return GetOpenness() == EEnumOpenness::Closed; }
enum class EEnumOpenness
{
Closed,
Open,
Invalid,
};
UE_API EEnumOpenness GetOpenness() const;
};
}
#undef UE_API