Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 7d9c975

Browse files
committed
Comment to XML conversion: escape XML special chars correctly; use correct
regex for version tuples. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165104 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 2bf8980 commit 7d9c975

File tree

5 files changed

+106
-77
lines changed

5 files changed

+106
-77
lines changed

bindings/xml/comment-xml-schema.rng

+53-47
Original file line numberDiff line numberDiff line change
@@ -293,53 +293,6 @@
293293
</element>
294294
</define>
295295

296-
<define name="Availability">
297-
<element name="Availability">
298-
<attribute name="distribution">
299-
<data type="string" />
300-
</attribute>
301-
<optional>
302-
<element name="IntroducedInVersion">
303-
<data type="float" />
304-
</element>
305-
</optional>
306-
<optional>
307-
<element name="DeprecatedInVersion">
308-
<data type="float" />
309-
</element>
310-
</optional>
311-
<optional>
312-
<element name="RemovedAfterVersion">
313-
<data type="float" />
314-
</element>
315-
</optional>
316-
<optional>
317-
<element name="DeprecationSummary">
318-
<data type="string" />
319-
</element>
320-
</optional>
321-
<optional>
322-
<ref name="Unavailable" />
323-
</optional>
324-
</element>
325-
</define>
326-
327-
<define name="Deprecated">
328-
<element name="Deprecated">
329-
<optional>
330-
<data type="string" />
331-
</optional>
332-
</element>
333-
</define>
334-
335-
<define name="Unavailable">
336-
<element name="Unavailable">
337-
<optional>
338-
<data type="string" />
339-
</optional>
340-
</element>
341-
</define>
342-
343296
<define name="Abstract">
344297
<element name="Abstract">
345298
<zeroOrMore>
@@ -425,6 +378,59 @@
425378
</element>
426379
</define>
427380

381+
<define name="Availability">
382+
<element name="Availability">
383+
<attribute name="distribution">
384+
<data type="string" />
385+
</attribute>
386+
<optional>
387+
<element name="IntroducedInVersion">
388+
<data type="string">
389+
<param name="pattern">\d+|\d+\.\d+|\d+\.\d+.\d+</param>
390+
</data>
391+
</element>
392+
</optional>
393+
<optional>
394+
<element name="DeprecatedInVersion">
395+
<data type="string">
396+
<param name="pattern">\d+|\d+\.\d+|\d+\.\d+.\d+</param>
397+
</data>
398+
</element>
399+
</optional>
400+
<optional>
401+
<element name="RemovedAfterVersion">
402+
<data type="string">
403+
<param name="pattern">\d+|\d+\.\d+|\d+\.\d+.\d+</param>
404+
</data>
405+
</element>
406+
</optional>
407+
<optional>
408+
<element name="DeprecationSummary">
409+
<data type="string" />
410+
</element>
411+
</optional>
412+
<optional>
413+
<ref name="Unavailable" />
414+
</optional>
415+
</element>
416+
</define>
417+
418+
<define name="Deprecated">
419+
<element name="Deprecated">
420+
<optional>
421+
<data type="string" />
422+
</optional>
423+
</element>
424+
</define>
425+
426+
<define name="Unavailable">
427+
<element name="Unavailable">
428+
<optional>
429+
<data type="string" />
430+
</optional>
431+
</element>
432+
</define>
433+
428434
<define name="ResultDiscussion">
429435
<element name="ResultDiscussion">
430436
<zeroOrMore>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Function>
3+
<Name>aaa</Name>
4+
<Abstract><Para>Aaa.</Para></Abstract>
5+
<Availability distribution="OS X">
6+
<IntroducedInVersion>8.0.1</IntroducedInVersion>
7+
<DeprecatedInVersion>9.0.1</DeprecatedInVersion>
8+
<RemovedAfterVersion>10.0.1</RemovedAfterVersion>
9+
<DeprecationSummary>use availability_test</DeprecationSummary>
10+
</Availability>
11+
</Function>

test/Index/annotate-comments-availability-attrs.cpp

+32-19
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,42 @@
1-
// RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng %s | FileCheck %s
21
// rdar://12378879
32

4-
/**
5-
* \param[in] arg1 ZZZ
6-
* \param[out] d xxx
7-
*/
8-
void cfunction_availability(int arg1, double d) __attribute__((availability(macosx,obsoleted=10.0,introduced=8.0,deprecated=9.0, message="use availability_test")))
9-
__attribute__((availability(ios,unavailable, message="not for iOS")));
3+
// RUN: rm -rf %t
4+
// RUN: mkdir %t
5+
// RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng %s > %t/out
6+
// RUN: FileCheck %s < %t/out
107

8+
// Ensure that XML we generate is not invalid.
9+
// RUN: FileCheck %s -check-prefix=WRONG < %t/out
10+
// WRONG-NOT: CommentXMLInvalid
1111

12-
// CHECK: annotate-comments-availability-attrs.cpp:8:6: FunctionDecl=cfunction_availability:{{.*}} FullCommentAsXML=[<Function file="{{.*}}annotate-comments-availability-attrs.cpp" line="8" column="6"><Name>cfunction_availability</Name><USR>c:@F@cfunction_availability#I#d#</USR><Parameters><Parameter><Name>arg1</Name><Index>0</Index><Direction isExplicit="1">in</Direction><Discussion><Para> ZZZ </Para></Discussion></Parameter><Parameter><Name>d</Name><Index>1</Index><Direction isExplicit="1">out</Direction><Discussion><Para> xxx</Para></Discussion></Parameter></Parameters><Availability distribution="iOS"> <DeprecationSummary>not for iOS</DeprecationSummary><Unavailable/></Availability><Availability distribution="OS X"><IntroducedInVersion>8.0</IntroducedInVersion><DeprecatedInVersion>9.0</DeprecatedInVersion><RemovedAfterVersion>10.0</RemovedAfterVersion> <DeprecationSummary>use availability_test</DeprecationSummary></Availability></Function>]
12+
/// Aaa.
13+
void attr_availability_1() __attribute__((availability(macosx,obsoleted=10.0,introduced=8.0,deprecated=9.0, message="use availability_test in <foo.h>")))
14+
__attribute__((availability(ios,unavailable, message="not for iOS")));
1315

16+
// CHECK: annotate-comments-availability-attrs.cpp:13:6: FunctionDecl=attr_availability_1:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="13" column="6"><Name>attr_availability_1</Name><USR>c:@F@attr_availability_1#</USR><Abstract><Para> Aaa.</Para></Abstract><Availability distribution="iOS"><DeprecationSummary>not for iOS</DeprecationSummary><Unavailable/></Availability><Availability distribution="OS X"><IntroducedInVersion>8.0</IntroducedInVersion><DeprecatedInVersion>9.0</DeprecatedInVersion><RemovedAfterVersion>10.0</RemovedAfterVersion><DeprecationSummary>use availability_test in &lt;foo.h&gt;</DeprecationSummary></Availability></Function>]
1417

15-
/**
16-
* \param[in] arg1 ZZZ
17-
* \param[out] d xxx
18-
*/
19-
void dep(int arg1, double d) __attribute__((deprecated));
18+
/// Aaa.
19+
void attr_availability_2() __attribute__((availability(macosx,obsoleted=10.0.1,introduced=8.0.1,deprecated=9.0.1)));
2020

21-
// CHECK: annotate-comments-availability-attrs.cpp:19:6: FunctionDecl=dep:{{.*}} FullCommentAsXML=[<Function file="{{.*}}annotate-comments-availability-attrs.cpp" line="19" column="6"><Name>dep</Name><USR>c:@F@dep#I#d#</USR><Parameters><Parameter><Name>arg1</Name><Index>0</Index><Direction isExplicit="1">in</Direction><Discussion><Para> ZZZ </Para></Discussion></Parameter><Parameter><Name>d</Name><Index>1</Index><Direction isExplicit="1">out</Direction><Discussion><Para> xxx </Para></Discussion></Parameter></Parameters><Deprecated/></Function>
21+
// CHECK: annotate-comments-availability-attrs.cpp:19:6: FunctionDecl=attr_availability_2:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="19" column="6"><Name>attr_availability_2</Name><USR>c:@F@attr_availability_2#</USR><Abstract><Para> Aaa.</Para></Abstract><Availability distribution="OS X"><IntroducedInVersion>8.0.1</IntroducedInVersion><DeprecatedInVersion>9.0.1</DeprecatedInVersion><RemovedAfterVersion>10.0.1</RemovedAfterVersion></Availability></Function>]
2222

23+
/// Aaa.
24+
void attr_deprecated_1() __attribute__((deprecated));
2325

24-
/**
25-
* \param[in] arg1 ZZZ
26-
*/
27-
void unv(int arg1) __attribute__((unavailable));
26+
// CHECK: annotate-comments-availability-attrs.cpp:24:6: FunctionDecl=attr_deprecated_1:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="24" column="6"><Name>attr_deprecated_1</Name><USR>c:@F@attr_deprecated_1#</USR><Abstract><Para> Aaa.</Para></Abstract><Deprecated/></Function>]
27+
28+
/// Aaa.
29+
void attr_deprecated_2() __attribute__((deprecated("message 1 <foo.h>")));
30+
31+
// CHECK: annotate-comments-availability-attrs.cpp:29:6: FunctionDecl=attr_deprecated_2:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="29" column="6"><Name>attr_deprecated_2</Name><USR>c:@F@attr_deprecated_2#</USR><Abstract><Para> Aaa.</Para></Abstract><Deprecated>message 1 &lt;foo.h&gt;</Deprecated></Function>]
32+
33+
/// Aaa.
34+
void attr_unavailable_1() __attribute__((unavailable));
35+
36+
// CHECK: annotate-comments-availability-attrs.cpp:34:6: FunctionDecl=attr_unavailable_1:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="34" column="6"><Name>attr_unavailable_1</Name><USR>c:@F@attr_unavailable_1#</USR><Abstract><Para> Aaa.</Para></Abstract><Unavailable/></Function>]
37+
38+
/// Aaa.
39+
void attr_unavailable_2() __attribute__((unavailable("message 2 <foo.h>")));
40+
41+
// CHECK: annotate-comments-availability-attrs.cpp:39:6: FunctionDecl=attr_unavailable_2:{{.*}} FullCommentAsXML=[<Function file="{{[^"]+}}annotate-comments-availability-attrs.cpp" line="39" column="6"><Name>attr_unavailable_2</Name><USR>c:@F@attr_unavailable_2#</USR><Abstract><Para> Aaa.</Para></Abstract><Unavailable>message 2 &lt;foo.h&gt;</Unavailable></Function>]
2842

29-
// CHECK: annotate-comments-availability-attrs.cpp:27:6: FunctionDecl=unv:{{.*}} FullCommentAsXML=[<Function file="{{.*}}annotate-comments-availability-attrs.cpp" line="27" column="6"><Name>unv</Name><USR>c:@F@unv#I#</USR><Parameters><Parameter><Name>arg1</Name><Index>0</Index><Direction isExplicit="1">in</Direction><Discussion><Para> ZZZ </Para></Discussion></Parameter></Parameters><Unavailable/></Function>

test/Index/comment-xml-schema.c

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-function-09.xml
1414
//
1515
// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-availability-attr-01.xml
16+
// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-availability-attr-02.xml
1617
// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-deprecated-attr.xml
1718
// RUN: xmllint --noout --relaxng %S/../../bindings/xml/comment-xml-schema.rng %S/Inputs/CommentXML/valid-unavailable-attr.xml
1819
//

tools/libclang/CXComment.cpp

+9-11
Original file line numberDiff line numberDiff line change
@@ -1180,18 +1180,18 @@ void CommentASTToXMLConverter::visitFullComment(const FullComment *C) {
11801180
if (DA->getMessage().empty())
11811181
Result << "<Deprecated/>";
11821182
else {
1183-
Result << "<Deprecated>"
1184-
<< DA->getMessage()
1185-
<< "</Deprecated>";
1183+
Result << "<Deprecated>";
1184+
appendToResultWithXMLEscaping(DA->getMessage());
1185+
Result << "</Deprecated>";
11861186
}
11871187
}
11881188
else if (const UnavailableAttr *UA = dyn_cast<UnavailableAttr>(Attrs[i])) {
11891189
if (UA->getMessage().empty())
11901190
Result << "<Unavailable/>";
11911191
else {
1192-
Result << "<Unavailable>"
1193-
<< UA->getMessage()
1194-
<< "</Unavailable>";
1192+
Result << "<Unavailable>";
1193+
appendToResultWithXMLEscaping(UA->getMessage());
1194+
Result << "</Unavailable>";
11951195
}
11961196
}
11971197
continue;
@@ -1225,14 +1225,12 @@ void CommentASTToXMLConverter::visitFullComment(const FullComment *C) {
12251225
<< RemovedAfterVersion.getAsString()
12261226
<< "</RemovedAfterVersion>";
12271227
}
1228-
// 'deprecated' attribute.
12291228
StringRef DeprecationSummary = AA->getMessage();
12301229
if (!DeprecationSummary.empty()) {
1231-
Result << " <DeprecationSummary>"
1232-
<< DeprecationSummary
1233-
<< "</DeprecationSummary>";
1230+
Result << "<DeprecationSummary>";
1231+
appendToResultWithXMLEscaping(DeprecationSummary);
1232+
Result << "</DeprecationSummary>";
12341233
}
1235-
// 'unavailable' attribute.
12361234
if (AA->getUnavailable())
12371235
Result << "<Unavailable/>";
12381236
Result << "</Availability>";

0 commit comments

Comments
 (0)