Skip to content

Commit cfc2ef3

Browse files
atsushienojonpryor
authored andcommitted
[generator] reduce error-prone enumification XPath. (#164)
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.
1 parent a34d76d commit cfc2ef3

File tree

1 file changed

+9
-19
lines changed

1 file changed

+9
-19
lines changed

tools/generator/ApiTransform.cs

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,20 @@ public void WriteTransform (StreamWriter sw)
3131
{
3232
string preserveAttr = PreserveType ? " preserveType=\"true\"" : null;
3333

34+
string cls = Class.StartsWith ("[Interface]", StringComparison.Ordinal) ? Class.Substring ("[Interface]".Length) : Class;
35+
3436
if (string.IsNullOrEmpty (Parameter)) {
3537
// This is a field
36-
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/field[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);
37-
38-
} else if (Class.StartsWith ("[Interface]") && Parameter == "return") {
39-
// This is the return type on an interface method
40-
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);
41-
42-
} else if (Class.StartsWith ("[Interface]")) {
43-
// This is the return type on an interface method
44-
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);
45-
38+
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/field[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);
4639
} else if (Parameter == "return") {
47-
// This is the return type on a class method
48-
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/class[@name='{1}']/method[@name='{2}']\" name=\"enumReturn\"{4}>{3}</attr>", Package, Class, Member, Enum, preserveAttr);
49-
40+
// This is the return type
41+
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/method[@name='{2}']\" name=\"enumReturn\"{4}>{3}</attr>", Package, cls, Member, Enum, preserveAttr);
5042
} else if (Member == "ctor" || Member == "constructor") {
51-
// This is the return type on a class constructor
52-
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);
53-
43+
// This is the return type
44+
sw.WriteLine (" <attr path=\"/api/package[@name='{0}']/*[@name='{1}']/constructor/parameter[@name='{2}']\" name=\"enumType\"{4}>{3}</attr>", Package, cls, Parameter, Enum, preserveAttr);
5445
} else {
55-
// This is a parameter on a class method
56-
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);
57-
46+
// This is a parameter
47+
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);
5848
}
5949
}
6050
}

0 commit comments

Comments
 (0)