61 changes: 59 additions & 2 deletions llvm/tools/llvm-rc/ResourceScriptStmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,23 @@ class MenuItem : public MenuDefinition {
}
};

class MenuExItem : public MenuDefinition {
public:
StringRef Name;
uint32_t Id;
uint32_t Type;
uint32_t State;

MenuExItem(StringRef Caption, uint32_t ItemId, uint32_t Type, uint32_t State)
: Name(Caption), Id(ItemId), Type(Type), State(State) {}
raw_ostream &log(raw_ostream &) const override;

MenuDefKind getKind() const override { return MkMenuItem; }
static bool classof(const MenuDefinition *D) {
return D->getKind() == MkMenuItem;
}
};

// POPUP statement definition.
//
// Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381030(v=vs.85).aspx
Expand All @@ -550,15 +567,36 @@ class PopupItem : public MenuDefinition {
: Name(Caption), Flags(ItemFlags), SubItems(std::move(SubItemsList)) {}
raw_ostream &log(raw_ostream &) const override;

// This has an additional (0x10) flag. It doesn't match with documented
// 0x01 flag, though.
// This has an additional MF_POPUP (0x10) flag.
uint16_t getResFlags() const override { return Flags | 0x10; }
MenuDefKind getKind() const override { return MkPopup; }
static bool classof(const MenuDefinition *D) {
return D->getKind() == MkPopup;
}
};

class PopupExItem : public MenuDefinition {
public:
StringRef Name;
uint32_t Id;
uint32_t Type;
uint32_t State;
uint32_t HelpId;
MenuDefinitionList SubItems;

PopupExItem(StringRef Caption, uint32_t Id, uint32_t Type, uint32_t State,
uint32_t HelpId, MenuDefinitionList &&SubItemsList)
: Name(Caption), Id(Id), Type(Type), State(State), HelpId(HelpId),
SubItems(std::move(SubItemsList)) {}
raw_ostream &log(raw_ostream &) const override;

uint16_t getResFlags() const override { return 0x01; }
MenuDefKind getKind() const override { return MkPopup; }
static bool classof(const MenuDefinition *D) {
return D->getKind() == MkPopup;
}
};

// Menu resource definition.
class MenuResource : public OptStatementsRCResource {
public:
Expand All @@ -579,6 +617,25 @@ class MenuResource : public OptStatementsRCResource {
}
};

class MenuExResource : public OptStatementsRCResource {
public:
MenuDefinitionList Elements;

MenuExResource(MenuDefinitionList &&Items, uint16_t Flags)
: OptStatementsRCResource({}, Flags), Elements(std::move(Items)) {}
raw_ostream &log(raw_ostream &) const override;

IntOrString getResourceType() const override { return RkMenu; }
Twine getResourceTypeName() const override { return "MENUEX"; }
Error visit(Visitor *V) const override {
return V->visitMenuExResource(this);
}
ResourceKind getKind() const override { return RkMenu; }
static bool classof(const RCResource *Res) {
return Res->getKind() == RkMenu;
}
};

// STRINGTABLE resource. Contains a list of strings, each having its unique ID.
//
// Ref: msdn.microsoft.com/en-us/library/windows/desktop/aa381050(v=vs.85).aspx
Expand Down
1 change: 1 addition & 0 deletions llvm/tools/llvm-rc/ResourceVisitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class Visitor {
virtual Error visitHTMLResource(const RCResource *) = 0;
virtual Error visitIconResource(const RCResource *) = 0;
virtual Error visitMenuResource(const RCResource *) = 0;
virtual Error visitMenuExResource(const RCResource *) = 0;
virtual Error visitStringTableResource(const RCResource *) = 0;
virtual Error visitUserDefinedResource(const RCResource *) = 0;
virtual Error visitVersionInfoResource(const RCResource *) = 0;
Expand Down