Hi,
I am trying to work out what the best approach to add support for anonymous types to the idltowsdl tool is.

After giving it some thought, it seems to me that a good deal of refactoring is neded in order to enable the idltowsdl tool to support the full range of IDL constructs.

Before I start working, though, I would very much appreciate some feedback on the changes I intend to make to idltowsdl and a reassurance that I am on the right track :-)

I'll try to keep this as short as I can.

I think that the main problems I am facing stem from the fact that original idea was to create Visitor classes that encapsulated what is needed to create XmlSchema or Wsdl types.

However, because the original Visitor classes focus on the resulting XmlSchema or Wsdl types, they cause quite a lot of code duplication. I believe our visitor classes should instead focus on visiting IDL grammar constructs.

An example will hopefully makes this clear: let's take the MessagePartVisitor. Its task is to visit the parameters of a IDL operation and generate the corresponding corba:param and wsdl:part elements. I think its real focus should be to visit the IDL grammar construct (CORBA spec, chapter 3):
<parameter_dcls> ::= "(" <param_dcl> { "," <param_dcl> }* ")"
<param_dcl> ::= <param_attribute> <param_type_spec> <simple_declarator>
<param_attribute> ::= "in"
 | "out"
 | "inout"
<param_type_spec> ::= <base_type_spec>
 | <string_type>
 | <wstring_type>
 | <scoped_name>

However, because its focus is to generate wsdl message parts, it has to visit the return parameter too, which is a different IDL grammar rule <op_type_spec>. This creates a special case that needs to be handle with care and does not fit in with the model.

A cleaner solution would be to have a ParameterDclsVisitor which visits a <parameter_dcls> IDL grammar rule (i.e. the AST nodes created for that rule), which in turn invokes other visitors to visit other IDL grammar rules. For example, when it gets to visiting <string_type> in <param_type_spec>, the StringTypeVisitor should be invoked.

Effectively, what I propose is to partition the IDL grammar rules in sets and have a Visitor class take care of a rule set. This is already what we have in the idltowsdl tool, but the problem is that some Visitors visit overlapping rules, hence code duplication. For example, the TypesVisitor class contains switch statements to visit IDL const and IDL exception types. The same code is in the WSDLVisitor. I think that a clean solution to this kind of problems would be to have WSDLVisitor to visit the IDL grammar rule:
<definition> ::= <type_dlc> ";"
 | <const_dcl> ";"
 | <except_dcl> ";"
 | <interface_dcl> ";"
 | <module_dcl> ";"

and have TypesVisitor visit <type_dlc> instead of visiting <type_spec> and <const_dcl> and <except_dcl> as it currently does.


But perhaps the most important advantage in taking an "IDL grammar rule" approach is that it makes it easy to support correct IDL in general (and anon types in particular).

I can't think of another way to support the anon types, but to mirror the IDL grammar rules within the visitor classes. Provided a visitor can visit all the possible productions of the set of rules it implements, then we are guaranteed that it will produce the right XmlSchema and WSDL.

To give a better idea of the kind of changes I'd like to make, I'll describe the changes I started working on.

I modified the WSDLVisitor to implement the <definition> rule, so now it will invoke the TypesVisitor to visit <type_dlc>, ConstVisitor to visit <const_dcl>, ExceptionVisitor to visit <except_dcl>, PortTypeVisitor to visit <interface_dcl>, and I am considering adding a ModuleVisitor to visit <module_dcl> (which would handle nested modules and building the a.b.c.interface dotted scoped names).

The next step would be to slightly modify the TypesVisitor to implement the <type_declarator> rule and all its children.
Then create a TypeDclVisitor that


So, what are your thoughts on all this?

Cheers,
- Matteo

Reply via email to