Skip to content

Commit b235e9a

Browse files
Handle TypeScript optional property syntax
1 parent 38ac5ad commit b235e9a

File tree

3 files changed

+137
-24
lines changed

3 files changed

+137
-24
lines changed

index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,17 @@ exports.defineTags = function (dictionary) {
546546
case '\\':
547547
// Skip escaped character
548548
++i;
549+
break;
550+
case '?':
551+
// Remove optional property question marks
552+
if (
553+
!isWithinString &&
554+
openCurly > 1 &&
555+
/^\s*:/.test(tagText.slice(i + 1))
556+
) {
557+
replacements.push([i, i + 1, '']);
558+
}
559+
549560
break;
550561
case '"':
551562
case "'":

test/dest/expected.json

Lines changed: 120 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -742,14 +742,110 @@
742742
"params": []
743743
},
744744
{
745-
"comment": "/**\n * {@link module:test/sub/NumberStore~NumberStore NumberStore}\n */",
745+
"comment": "/** @type {{ foo?: string; bar: string?, baz ? : string? }} */",
746746
"meta": {
747747
"range": [
748-
1424,
749-
1456
748+
1456,
749+
1521
750+
],
751+
"filename": "index.js",
752+
"lineno": 65,
753+
"columnno": 0,
754+
"code": {
755+
"name": "exports.optionalProperties",
756+
"type": "VariableDeclaration"
757+
}
758+
},
759+
"type": {
760+
"names": [
761+
"Object"
762+
]
763+
},
764+
"name": "optionalProperties",
765+
"longname": "module:test.optionalProperties",
766+
"kind": "constant",
767+
"memberof": "module:test",
768+
"scope": "static"
769+
},
770+
{
771+
"comment": "",
772+
"meta": {
773+
"range": [
774+
1469,
775+
1520
776+
],
777+
"filename": "index.js",
778+
"lineno": 65,
779+
"columnno": 13,
780+
"code": {
781+
"name": "optionalProperties",
782+
"type": "ObjectExpression",
783+
"value": "{\"foo\":\"bar\",\"bar\":null}"
784+
}
785+
},
786+
"undocumented": true,
787+
"name": "optionalProperties",
788+
"longname": "module:test~optionalProperties",
789+
"kind": "constant",
790+
"scope": "inner",
791+
"memberof": "module:test",
792+
"params": []
793+
},
794+
{
795+
"comment": "",
796+
"meta": {
797+
"range": [
798+
1494,
799+
1504
800+
],
801+
"filename": "index.js",
802+
"lineno": 66,
803+
"columnno": 2,
804+
"code": {
805+
"name": "foo",
806+
"type": "Literal",
807+
"value": "bar"
808+
}
809+
},
810+
"undocumented": true,
811+
"name": "foo",
812+
"longname": "module:test~optionalProperties.foo",
813+
"kind": "member",
814+
"memberof": "module:test~optionalProperties",
815+
"scope": "static"
816+
},
817+
{
818+
"comment": "",
819+
"meta": {
820+
"range": [
821+
1508,
822+
1517
750823
],
751824
"filename": "index.js",
752825
"lineno": 67,
826+
"columnno": 2,
827+
"code": {
828+
"name": "bar",
829+
"type": "Literal",
830+
"value": null
831+
}
832+
},
833+
"undocumented": true,
834+
"name": "bar",
835+
"longname": "module:test~optionalProperties.bar",
836+
"kind": "member",
837+
"memberof": "module:test~optionalProperties",
838+
"scope": "static"
839+
},
840+
{
841+
"comment": "/**\n * {@link module:test/sub/NumberStore~NumberStore NumberStore}\n */",
842+
"meta": {
843+
"range": [
844+
1554,
845+
1586
846+
],
847+
"filename": "index.js",
848+
"lineno": 73,
753849
"columnno": 0,
754850
"code": {
755851
"name": "exports.Link",
@@ -767,11 +863,11 @@
767863
"comment": "",
768864
"meta": {
769865
"range": [
770-
1437,
771-
1455
866+
1567,
867+
1585
772868
],
773869
"filename": "index.js",
774-
"lineno": 67,
870+
"lineno": 73,
775871
"columnno": 13,
776872
"code": {
777873
"name": "Link",
@@ -791,11 +887,11 @@
791887
"comment": "/**\n * {@link module:test/sub/NumberStore~NumberStore Num}\n */",
792888
"meta": {
793889
"range": [
794-
1493,
795-
1533
890+
1623,
891+
1663
796892
],
797893
"filename": "index.js",
798-
"lineno": 72,
894+
"lineno": 78,
799895
"columnno": 0,
800896
"code": {
801897
"name": "exports.LinkWithText",
@@ -813,11 +909,11 @@
813909
"comment": "",
814910
"meta": {
815911
"range": [
816-
1506,
817-
1532
912+
1636,
913+
1662
818914
],
819915
"filename": "index.js",
820-
"lineno": 72,
916+
"lineno": 78,
821917
"columnno": 13,
822918
"code": {
823919
"name": "LinkWithText",
@@ -837,11 +933,11 @@
837933
"comment": "/**\n * {@link module:test/sub/NumberStore~NumberStore NumberStore.getNumber}\n */",
838934
"meta": {
839935
"range": [
840-
1576,
841-
1626
936+
1706,
937+
1756
842938
],
843939
"filename": "index.js",
844-
"lineno": 77,
940+
"lineno": 83,
845941
"columnno": 0,
846942
"code": {
847943
"name": "exports.LinkWithMemberAccessor",
@@ -859,11 +955,11 @@
859955
"comment": "",
860956
"meta": {
861957
"range": [
862-
1589,
863-
1625
958+
1719,
959+
1755
864960
],
865961
"filename": "index.js",
866-
"lineno": 77,
962+
"lineno": 83,
867963
"columnno": 13,
868964
"code": {
869965
"name": "LinkWithMemberAccessor",
@@ -883,11 +979,11 @@
883979
"comment": "/**\n * {@link module:test/sub/NumberStore~NumberStore Num}\n */",
884980
"meta": {
885981
"range": [
886-
1673,
887-
1730
982+
1803,
983+
1860
888984
],
889985
"filename": "index.js",
890-
"lineno": 82,
986+
"lineno": 88,
891987
"columnno": 0,
892988
"code": {
893989
"name": "exports.LinkWithMemberAccessorAndText",
@@ -905,11 +1001,11 @@
9051001
"comment": "",
9061002
"meta": {
9071003
"range": [
908-
1686,
909-
1729
1004+
1816,
1005+
1859
9101006
],
9111007
"filename": "index.js",
912-
"lineno": 82,
1008+
"lineno": 88,
9131009
"columnno": 13,
9141010
"code": {
9151011
"name": "LinkWithMemberAccessorAndText",

test/src/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ export const bracketNotation = 1;
6161
/** @type {[number, [number, string], "[number, boolean]"]} */
6262
export const nesteedTuples = [1, [1, 'a'], '[number, boolean]'];
6363

64+
/** @type {{ foo?: string; bar: string?, baz ? : string? }} */
65+
export const optionalProperties = {
66+
foo: 'bar',
67+
bar: null,
68+
};
69+
6470
/**
6571
* {@link NumberStore}
6672
*/

0 commit comments

Comments
 (0)