diff --git a/mlir/include/mlir/IR/OpImplementation.h b/mlir/include/mlir/IR/OpImplementation.h --- a/mlir/include/mlir/IR/OpImplementation.h +++ b/mlir/include/mlir/IR/OpImplementation.h @@ -639,28 +639,6 @@ return parseAttribute(result, Type(), attrName, attrs); } - /// Parse an optional attribute. - virtual OptionalParseResult parseOptionalAttribute(Attribute &result, - Type type, - StringRef attrName, - NamedAttrList &attrs) = 0; - template - OptionalParseResult parseOptionalAttribute(AttrT &result, StringRef attrName, - NamedAttrList &attrs) { - return parseOptionalAttribute(result, Type(), attrName, attrs); - } - - /// Specialized variants of `parseOptionalAttribute` that remove potential - /// ambiguities in syntax. - virtual OptionalParseResult parseOptionalAttribute(ArrayAttr &result, - Type type, - StringRef attrName, - NamedAttrList &attrs) = 0; - virtual OptionalParseResult parseOptionalAttribute(StringAttr &result, - Type type, - StringRef attrName, - NamedAttrList &attrs) = 0; - /// Parse an arbitrary attribute of a given type and return it in result. This /// also adds the attribute to the specified attribute list with the specified /// name. @@ -683,6 +661,40 @@ return success(); } + /// Parse an arbitrary optional attribute of a given type and return it in + /// result. + virtual OptionalParseResult parseOptionalAttribute(Attribute &result, + Type type = {}) = 0; + + /// Parse an optional array attribute and return it in result. + virtual OptionalParseResult parseOptionalAttribute(ArrayAttr &result, + Type type = {}) = 0; + + /// Parse an optional string attribute and return it in result. + virtual OptionalParseResult parseOptionalAttribute(StringAttr &result, + Type type = {}) = 0; + + /// Parse an optional attribute of a specific type and add it to the list with + /// the specified name. + template + OptionalParseResult parseOptionalAttribute(AttrType &result, + StringRef attrName, + NamedAttrList &attrs) { + return parseOptionalAttribute(result, Type(), attrName, attrs); + } + + /// Parse an optional attribute of a specific type and add it to the list with + /// the specified name. + template + OptionalParseResult parseOptionalAttribute(AttrType &result, Type type, + StringRef attrName, + NamedAttrList &attrs) { + OptionalParseResult parseResult = parseOptionalAttribute(result, type); + if (parseResult.hasValue() && succeeded(*parseResult)) + attrs.append(attrName, result); + return parseResult; + } + /// Parse a named dictionary into 'result' if it is present. virtual ParseResult parseOptionalAttrDict(NamedAttrList &result) = 0; diff --git a/mlir/lib/Parser/AsmParserImpl.h b/mlir/lib/Parser/AsmParserImpl.h --- a/mlir/lib/Parser/AsmParserImpl.h +++ b/mlir/lib/Parser/AsmParserImpl.h @@ -343,31 +343,17 @@ return success(static_cast(result)); } - /// Parse an optional attribute. - template - OptionalParseResult - parseOptionalAttributeAndAddToList(AttrT &result, Type type, - StringRef attrName, NamedAttrList &attrs) { - OptionalParseResult parseResult = - parser.parseOptionalAttribute(result, type); - if (parseResult.hasValue() && succeeded(*parseResult)) - attrs.push_back(parser.builder.getNamedAttr(attrName, result)); - return parseResult; - } - OptionalParseResult parseOptionalAttribute(Attribute &result, Type type, - StringRef attrName, - NamedAttrList &attrs) override { - return parseOptionalAttributeAndAddToList(result, type, attrName, attrs); - } - OptionalParseResult parseOptionalAttribute(ArrayAttr &result, Type type, - StringRef attrName, - NamedAttrList &attrs) override { - return parseOptionalAttributeAndAddToList(result, type, attrName, attrs); - } - OptionalParseResult parseOptionalAttribute(StringAttr &result, Type type, - StringRef attrName, - NamedAttrList &attrs) override { - return parseOptionalAttributeAndAddToList(result, type, attrName, attrs); + OptionalParseResult parseOptionalAttribute(Attribute &result, + Type type) override { + return parser.parseOptionalAttribute(result, type); + } + OptionalParseResult parseOptionalAttribute(ArrayAttr &result, + Type type) override { + return parser.parseOptionalAttribute(result, type); + } + OptionalParseResult parseOptionalAttribute(StringAttr &result, + Type type) override { + return parser.parseOptionalAttribute(result, type); } /// Parse a named dictionary into 'result' if it is present.