Skip to content

Commit 955beff

Browse files
take a quoted string in @_documentation(metadata:)
1 parent 510ea7e commit 955beff

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

include/swift/AST/DiagnosticsParse.def

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,8 +1778,9 @@ ERROR(documentation_attr_unknown_access_level,none,
17781778
(StringRef))
17791779
ERROR(documentation_attr_duplicate_visibility,none,
17801780
"cannot give more than one visibility to the same item", ())
1781-
ERROR(documentation_attr_metadata_expected_identifier,none,
1782-
"@_documentation attribute's 'metadata' argument expected a plain identifier",
1781+
ERROR(documentation_attr_metadata_expected_text,none,
1782+
"@_documentation attribute's 'metadata' argument expected an identifier or "
1783+
"quoted string",
17831784
())
17841785
ERROR(documentation_attr_duplicate_metadata,none,
17851786
"cannot give more than one metadata argument to the same item", ())

lib/Parse/ParseDecl.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,18 +1985,22 @@ bool Parser::parseDocumentationAttributeArgument(Optional<StringRef> &Metadata,
19851985
consumeToken();
19861986
Visibility = ParsedVisibility;
19871987
} else if (ArgumentName == "metadata") {
1988-
if (Tok.isNot(tok::identifier)) {
1989-
diagnose(Tok.getLoc(), diag::documentation_attr_metadata_expected_identifier);
1988+
if (!Tok.isAny(tok::identifier, tok::string_literal)) {
1989+
diagnose(Tok.getLoc(), diag::documentation_attr_metadata_expected_text);
19901990
return false;
19911991
}
19921992
auto ArgumentValue = Tok.getText();
1993+
if (ArgumentValue.front() == '\"' && ArgumentValue.back() == '\"') {
1994+
// String literals get saved with surrounding quotes. Trim them off if they're present.
1995+
ArgumentValue = ArgumentValue.slice(1, ArgumentValue.size() - 1);
1996+
}
19931997

19941998
if (Metadata) {
19951999
diagnose(Tok.getLoc(), diag::documentation_attr_duplicate_metadata);
19962000
return false;
19972001
}
19982002

1999-
consumeToken(tok::identifier);
2003+
consumeToken();
20002004
Metadata = ArgumentValue;
20012005
} else {
20022006
llvm_unreachable("unimplemented @_documentation attr argument");

test/SymbolGraph/Symbols/DocumentationMetadata.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %target-swift-symbolgraph-extract -module-name DocumentationMetadata -I %t -pretty-print -output-dir %t
44
// RUN: %FileCheck %s --input-file %t/DocumentationMetadata.symbols.json
55

6-
// CHECK: "metadata": "cool_stuff"
6+
// CHECK-DAG: "metadata": "cool_stuff"
77
@_documentation(metadata: cool_stuff) public class SomeClass {}
88

9+
// CHECK-DAG: "metadata": "this is a longer string"
10+
@_documentation(metadata: "this is a longer string") public class OtherClass {}
11+

0 commit comments

Comments
 (0)