Commit 83f36fdd authored by Allen Bauer's avatar Allen Bauer Committed by Chromium LUCI CQ

Added metadata macro for use on nested classes.

For a nested class use BEGIN_NESTED_METADATA(outer_class, class_name, parent_class_name)

The use of the other macros remain the same.

Bug: 1166802
Change-Id: I125dce952969d529e0277559ab739ef89bae9afa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2631607Reviewed-by: default avatarWei Li <weili@chromium.org>
Reviewed-by: default avatarJames Cook <jamescook@chromium.org>
Commit-Queue: Allen Bauer <kylixrd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#846185}
parent 416e2a08
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
#include "ui/views/metadata/metadata_header_macros.h"
#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/view_targeter.h" #include "ui/views/view_targeter.h"
...@@ -156,6 +157,7 @@ class NonClientFrameViewAshImmersiveHelper : public WindowStateObserver, ...@@ -156,6 +157,7 @@ class NonClientFrameViewAshImmersiveHelper : public WindowStateObserver,
class NonClientFrameViewAsh::OverlayView : public views::View, class NonClientFrameViewAsh::OverlayView : public views::View,
public views::ViewTargeterDelegate { public views::ViewTargeterDelegate {
public: public:
METADATA_HEADER(OverlayView);
explicit OverlayView(HeaderView* header_view); explicit OverlayView(HeaderView* header_view);
OverlayView(const OverlayView&) = delete; OverlayView(const OverlayView&) = delete;
OverlayView& operator=(const OverlayView&) = delete; OverlayView& operator=(const OverlayView&) = delete;
...@@ -163,7 +165,6 @@ class NonClientFrameViewAsh::OverlayView : public views::View, ...@@ -163,7 +165,6 @@ class NonClientFrameViewAsh::OverlayView : public views::View,
// views::View: // views::View:
void Layout() override; void Layout() override;
const char* GetClassName() const override { return "OverlayView"; }
private: private:
// views::ViewTargeterDelegate: // views::ViewTargeterDelegate:
...@@ -208,6 +209,9 @@ bool NonClientFrameViewAsh::OverlayView::DoesIntersectRect( ...@@ -208,6 +209,9 @@ bool NonClientFrameViewAsh::OverlayView::DoesIntersectRect(
return header_view_->HitTestRect(rect); return header_view_->HitTestRect(rect);
} }
BEGIN_NESTED_METADATA(NonClientFrameViewAsh, OverlayView, views::View)
END_METADATA
NonClientFrameViewAsh::NonClientFrameViewAsh(views::Widget* frame) NonClientFrameViewAsh::NonClientFrameViewAsh(views::Widget* frame)
: frame_(frame), : frame_(frame),
header_view_(new HeaderView(frame, this)), header_view_(new HeaderView(frame, this)),
......
...@@ -16,12 +16,19 @@ ...@@ -16,12 +16,19 @@
// Generate the implementation of the metadata accessors and internal class with // Generate the implementation of the metadata accessors and internal class with
// additional macros for defining the class' properties. // additional macros for defining the class' properties.
#define BEGIN_METADATA_BASE(class_name) BEGIN_METADATA_INTERNAL(class_name) #define BEGIN_METADATA_BASE(class_name) \
BEGIN_METADATA_INTERNAL( \
class_name, METADATA_CLASS_NAME_INTERNAL(class_name), class_name)
#define BEGIN_NESTED_METADATA(outer_class, class_name, parent_class_name) \
BEGIN_METADATA_INTERNAL(outer_class::class_name, \
METADATA_CLASS_NAME_INTERNAL(class_name), \
parent_class_name) \
METADATA_PARENT_CLASS_INTERNAL(parent_class_name)
#define BEGIN_METADATA(class_name, parent_class_name) \ #define BEGIN_METADATA(class_name, parent_class_name) \
static_assert(std::is_base_of<parent_class_name, class_name>::value, \ BEGIN_METADATA_INTERNAL( \
"class not child of parent"); \ class_name, METADATA_CLASS_NAME_INTERNAL(class_name), parent_class_name) \
BEGIN_METADATA_INTERNAL(class_name) \
METADATA_PARENT_CLASS_INTERNAL(parent_class_name) METADATA_PARENT_CLASS_INTERNAL(parent_class_name)
#define END_METADATA } #define END_METADATA }
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
// Internal Metadata Generation Helpers --------------------------------------- // Internal Metadata Generation Helpers ---------------------------------------
#define METADATA_CLASS_NAME_INTERNAL(class_name) class_name##_MetaData #define METADATA_CLASS_NAME_INTERNAL(class_name) class_name##_MetaData
#define METADATA_FUNCTION_PREFIX_INTERNAL(class_name) \
class_name::METADATA_CLASS_NAME_INTERNAL(class_name)
// Metadata Accessors --------------------------------------------------------- // Metadata Accessors ---------------------------------------------------------
#define METADATA_ACCESSORS_INTERNAL(class_name) \ #define METADATA_ACCESSORS_INTERNAL(class_name) \
...@@ -66,30 +64,34 @@ ...@@ -66,30 +64,34 @@
decltype(std::declval<ViewClass>().Get##property_name()), \ decltype(std::declval<ViewClass>().Get##property_name()), \
&ViewClass::Get##property_name> &ViewClass::Get##property_name>
#define BEGIN_METADATA_INTERNAL(class_name) \ #define BEGIN_METADATA_INTERNAL(qualified_class_name, metadata_class_name, \
views::metadata::ClassMetaData* class_name::METADATA_CLASS_NAME_INTERNAL( \ parent_class_name) \
class_name)::meta_data_ = nullptr; \ views::metadata::ClassMetaData* \
\ qualified_class_name::metadata_class_name::meta_data_ = nullptr; \
views::metadata::ClassMetaData* class_name::MetaData() { \ \
if (!METADATA_CLASS_NAME_INTERNAL(class_name)::meta_data_) { \ views::metadata::ClassMetaData* qualified_class_name::MetaData() { \
METADATA_CLASS_NAME_INTERNAL(class_name)::meta_data_ = \ static_assert( \
views::metadata::MakeAndRegisterClassInfo< \ std::is_base_of<parent_class_name, qualified_class_name>::value, \
METADATA_CLASS_NAME_INTERNAL(class_name)>(); \ "class not child of parent"); \
} \ if (!qualified_class_name::metadata_class_name::meta_data_) { \
return METADATA_CLASS_NAME_INTERNAL(class_name)::meta_data_; \ qualified_class_name::metadata_class_name::meta_data_ = \
} \ views::metadata::MakeAndRegisterClassInfo< \
\ qualified_class_name::metadata_class_name>(); \
views::metadata::ClassMetaData* class_name::GetClassMetaData() { \ } \
return MetaData(); \ return qualified_class_name::metadata_class_name::meta_data_; \
} \ } \
\ \
const char* class_name::GetClassName() const { \ views::metadata::ClassMetaData* qualified_class_name::GetClassMetaData() { \
return class_name::kViewClassName; \ return MetaData(); \
} \ } \
const char class_name::kViewClassName[] = #class_name; \ \
\ const char* qualified_class_name::GetClassName() const { \
void METADATA_FUNCTION_PREFIX_INTERNAL(class_name)::BuildMetaData() { \ return kViewClassName; \
SetTypeName(std::string(#class_name)); } \
const char qualified_class_name::kViewClassName[] = #qualified_class_name; \
\
void qualified_class_name::metadata_class_name::BuildMetaData() { \
SetTypeName(std::string(#qualified_class_name));
#define METADATA_PARENT_CLASS_INTERNAL(parent_class_name) \ #define METADATA_PARENT_CLASS_INTERNAL(parent_class_name) \
SetParentClassMetaData(parent_class_name::MetaData()); SetParentClassMetaData(parent_class_name::MetaData());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment