Improvements to Op trait implementation:
 - Generalize TwoOperands and TwoResults to NOperands and NResults, which can
   be used for any fixed N.
 - Rename OpImpl namespace to OpTrait, OpImpl::Base to OpBase, and TraitImpl to
   TraitBase to better reflect what these are.

PiperOrigin-RevId: 206588634
diff --git a/lib/IR/OperationSet.cpp b/lib/IR/OperationSet.cpp
index 43a65aa..9bbc84e 100644
--- a/lib/IR/OperationSet.cpp
+++ b/lib/IR/OperationSet.cpp
@@ -27,13 +27,13 @@
 OpAsmParser::~OpAsmParser() {}
 
 // The fallback for the printer is to reject the short form.
-OpAsmParserResult OpImpl::BaseState::parse(OpAsmParser *parser) {
+OpAsmParserResult OpBaseState::parse(OpAsmParser *parser) {
   parser->emitError(parser->getNameLoc(), "has no concise form");
   return {};
 }
 
 // The fallback for the printer is to print it the longhand form.
-void OpImpl::BaseState::print(OpAsmPrinter *p) const {
+void OpBaseState::print(OpAsmPrinter *p) const {
   p->printDefaultOp(getOperation());
 }