// Copyright Epic Games, Inc. All Rights Reserved. // uLang Compiler Public API #pragma once #include "uLang/Common/Common.h" #include "uLang/Common/Containers/SharedPointerArray.h" #include "uLang/Common/Text/UTF8String.h" #define UE_API VERSECOMPILER_API namespace uLang { class CClass; class CExpressionBase; class CFunction; class CSemanticProgram; struct SAttribute { enum class EType { Attribute, // Attribute which is used with prefix @attr syntax Specifier // Attribute which is used with suffix syntax }; TSRef _Expression; EType _Type; VERSECOMPILER_API TOptional GetTextValue() const; }; VERSECOMPILER_API bool IsAttributeHack(const SAttribute&, const CClass* AttributeClass, const CSemanticProgram&); VERSECOMPILER_API bool IsAttributeHack(const SAttribute&, const CFunction* AttributeFunction, const CSemanticProgram&); template TIterator FindAttributeHack(TIterator First, TIterator Last, const ClassOrFunction* AttributeClassOrFunction, const CSemanticProgram& Program) { for (; First != Last; ++First) { if (IsAttributeHack(*First, AttributeClassOrFunction, Program)) { break; } } return First; } /// Base class for everything that can have attributes attached to it (classes, expressions, etc.) class CAttributable { public: TArray _Attributes; bool HasAttributes() const { return _Attributes.Num() > 0; } UE_API bool HasAttributeClass(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API int32_t GetAttributeClassCount(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API TArray GetAttributesWithAttribute(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API const CExpressionBase* FindAttributeExpr(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API const TArray FindAttributeExprs(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API TOptional FindAttribute(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API TArray FindAttributes(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API void AddAttributeClass(const CClass* AttributeClass); UE_API void AddAttribute(SAttribute Attribute); UE_API void RemoveAttributeClass(const CClass* AttributeClass, const CSemanticProgram& Program); // @HACK: SOL-972, We need full proper support for compile-time evaluation of attribute types UE_API TOptional GetAttributeTextValue(const CClass* AttributeClass, const CSemanticProgram& Program) const; static UE_API TOptional GetAttributeTextValue(const TArray& Attributes, const CClass* AttributeClass, const CSemanticProgram& Program); // Specifies the attribute scope for expressions (e.g. should only respect class-scoped attributes, etc.) enum class EAttributableScope : uint8_t { Module, Class, Struct, Data, Function, Enum, Enumerator, AttributeClass, Interface, Expression, TypeDefinition, ScopedAccessLevel, ClassTypeFunction, AttributeClassTypeFunction, InterfaceTypeFunction, }; CAttributable& operator=(const CAttributable& Other) = delete; CAttributable& operator=(CAttributable&& Other) = delete; UE_API bool HasAttributeClassHack(const CClass* AttributeClass, const CSemanticProgram&) const; UE_API bool HasAttributeFunctionHack(const CFunction* AttributeFunction, const CSemanticProgram&) const; private: UE_API TOptional FindAttributeImpl(const CClass* AttributeClass, const CSemanticProgram& Program) const; UE_API TArray FindAttributesImpl(const CClass* AttributeClass, const CSemanticProgram& Program) const; }; } #undef UE_API