Skip to content

Commit

Permalink
[generator] reduce error-prone enumification XPath. (#164)
Browse files Browse the repository at this point in the history
Until now, we (well, I) had been patient to deal with methodmap enumification
which *requires* distinction between class and interface by adding
"[Interface]" mark on interfaces. It was just to distinguish "class" and
"interface" elements under "package" element.

But... why do we need that? Performance? The impact should be actually
trivial. It can be just anything, we identify an element by @name.

On the other hand, it is very annoying to exactly specify "class" or
"interface" very carefully, because if I make a mistake then the mapping
results in a warning that then I have to carefully check.

Just reduce such chances for errors by requiring less-error-prone XPath.
It should save everyone.
  • Loading branch information
atsushieno authored and jonpryor committed Jun 23, 2017
1 parent a34d76d commit cfc2ef3
Showing 1 changed file with 9 additions and 19 deletions.
28 changes: 9 additions & 19 deletions tools/generator/ApiTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,30 +31,20 @@ public void WriteTransform (StreamWriter sw)
{
string preserveAttr = PreserveType ? " preserveType=\"true\"" : null;

string cls = Class.StartsWith ("[Interface]", StringComparison.Ordinal) ? Class.Substring ("[Interface]".Length) : Class;

if (string.IsNullOrEmpty (Parameter)) {
// This is a field
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/field[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);

} else if (Class.StartsWith ("[Interface]") && Parameter == "return") {
// This is the return type on an interface method
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/interface[@name='{1}']/method[@name='{2}']\" name=\"enumReturn\"{4}>{3}</attr>", Package, Class.Substring ("[Interface]".Length), Member, Enum, preserveAttr);

} else if (Class.StartsWith ("[Interface]")) {
// This is the return type on an interface method
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/interface[@name='{1}']/method[@name='{2}']/parameter[@name='{3}']\" name=\"enumType\"{5}>{4}</attr>", Package, Class.Substring ("[Interface]".Length), Member, Parameter, Enum, preserveAttr);

sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/field[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);
} else if (Parameter == "return") {
// This is the return type on a class method
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/method[@name='{2}']\" name=\"enumReturn\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);

// This is the return type
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/method[@name='{2}']\" name=\"enumReturn\"{4}>{3}</attr>", Package, cls, Member, Enum, preserveAttr);
} else if (Member == "ctor" || Member == "constructor") {
// This is the return type on a class constructor
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/constructor/parameter[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, Class, Parameter, Enum, preserveAttr);

// This is the return type
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/constructor/parameter[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, cls, Parameter, Enum, preserveAttr);
} else {
// This is a parameter on a class method
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/method[@name='{2}']/parameter[@name='{3}']\" name=\"enumType\"{5}>{4}</attr>", Package, Class, Member, Parameter, Enum, preserveAttr);

// This is a parameter
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/method[@name='{2}']/parameter[@name='{3}']\" name=\"enumType\"{5}>{4}</attr>", Package, cls, Member, Parameter, Enum, preserveAttr);
}
}
}
Expand Down

0 comments on commit cfc2ef3

Please # to comment.