Skip to content

Commit 4012f6e

Browse files
committed
Fix spec-title and add tests for early cutoff
1 parent 07439ae commit 4012f6e

File tree

2 files changed

+65
-19
lines changed

2 files changed

+65
-19
lines changed

grammars/jsdoc.cson

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@
452452
'patterns': [
453453
{
454454
# {unclosed
455-
'match': '\\G{[^}]+$'
455+
'match': '\\G{(?:[^}*]|\\*[^/}])+$'
456456
'name': 'invalid.illegal.type.jsdoc'
457457
}
458458
{

spec/jsdoc-spec.coffee

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
describe "JSDoc", ->
1+
describe "JSDoc grammar", ->
22
grammar = null
33

44
beforeEach ->
@@ -8,23 +8,6 @@ describe "JSDoc", ->
88
runs ->
99
grammar = atom.grammars.grammarForScopeName("source.js")
1010

11-
it "tokenises simple tags", ->
12-
{tokens} = grammar.tokenizeLine('/** @mixins */')
13-
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
14-
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
15-
expect(tokens[3]).toEqual value: 'mixins', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
16-
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
17-
expect(tokens[5]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
18-
19-
{tokens} = grammar.tokenizeLine('/** @global @static */')
20-
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
21-
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
22-
expect(tokens[3]).toEqual value: 'global', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
23-
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
24-
expect(tokens[5]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
25-
expect(tokens[6]).toEqual value: 'static', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
26-
expect(tokens[7]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
27-
expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
2811

2912
describe "inline tags", ->
3013
it "tokenises tags without descriptions", ->
@@ -132,6 +115,24 @@ describe "JSDoc", ->
132115
expect(tokens[19]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
133116

134117
describe "block tags", ->
118+
it "tokenises simple tags", ->
119+
{tokens} = grammar.tokenizeLine('/** @mixins */')
120+
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
121+
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
122+
expect(tokens[3]).toEqual value: 'mixins', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
123+
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
124+
expect(tokens[5]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
125+
126+
{tokens} = grammar.tokenizeLine('/** @global @static */')
127+
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
128+
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
129+
expect(tokens[3]).toEqual value: 'global', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
130+
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
131+
expect(tokens[5]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
132+
expect(tokens[6]).toEqual value: 'static', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
133+
expect(tokens[7]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js']
134+
expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
135+
135136
it "tokenises tags with type expressions", ->
136137
{tokens} = grammar.tokenizeLine('/** @const {object} */')
137138
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
@@ -1018,3 +1019,48 @@ describe "JSDoc", ->
10181019
expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.begin.jsdoc']
10191020
expect(tokens[6]).toEqual value: 'function(string) : number', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc']
10201021
expect(tokens[7]).toEqual value: '}', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.end.jsdoc']
1022+
1023+
describe "when the containing comment ends unexpectedly", ->
1024+
it "terminates any unclosed tags", ->
1025+
{tokens} = grammar.tokenizeLine('/** @param {String */ aa')
1026+
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
1027+
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
1028+
expect(tokens[3]).toEqual value: 'param', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
1029+
expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.begin.jsdoc']
1030+
expect(tokens[6]).toEqual value: 'String ', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc']
1031+
expect(tokens[7]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
1032+
expect(tokens[8]).toEqual value: ' aa', scopes: ['source.js']
1033+
1034+
{tokens} = grammar.tokenizeLine('/** @param {*} [name={value: {a:[{*/}}]}] */')
1035+
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
1036+
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
1037+
expect(tokens[3]).toEqual value: 'param', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
1038+
expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.begin.jsdoc']
1039+
expect(tokens[6]).toEqual value: '*', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc']
1040+
expect(tokens[7]).toEqual value: '}', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.end.jsdoc']
1041+
expect(tokens[9]).toEqual value: '[', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1042+
expect(tokens[10]).toEqual value: 'name=', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1043+
expect(tokens[11]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1044+
expect(tokens[12]).toEqual value: 'value: ', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1045+
expect(tokens[13]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1046+
expect(tokens[14]).toEqual value: 'a:', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1047+
expect(tokens[15]).toEqual value: '[', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1048+
expect(tokens[16]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'variable.other.jsdoc']
1049+
expect(tokens[17]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
1050+
expect(tokens[18]).toEqual value: '}}', scopes: ['source.js']
1051+
expect(tokens[19]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js']
1052+
expect(tokens[20]).toEqual value: '}', scopes: ['source.js']
1053+
expect(tokens[21]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js']
1054+
expect(tokens[23]).toEqual value: '*', scopes: ['source.js', 'keyword.operator.js']
1055+
expect(tokens[24]).toEqual value: '/', scopes: ['source.js', 'keyword.operator.js']
1056+
1057+
{tokens} = grammar.tokenizeLine('/** @param {string="Foo*/oo"} bar')
1058+
expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.begin.comment.js']
1059+
expect(tokens[2]).toEqual value: '@', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc', 'punctuation.definition.block.tag.jsdoc']
1060+
expect(tokens[3]).toEqual value: 'param', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc']
1061+
expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc', 'punctuation.definition.bracket.curly.begin.jsdoc']
1062+
expect(tokens[6]).toEqual value: 'string="Foo', scopes: ['source.js', 'comment.block.documentation.js', 'entity.name.type.instance.jsdoc']
1063+
expect(tokens[7]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.section.end.comment.js']
1064+
expect(tokens[8]).toEqual value: 'oo', scopes: ['source.js']
1065+
expect(tokens[9]).toEqual value: '"', scopes: ['source.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
1066+
expect(tokens[10]).toEqual value: '} bar', scopes: ['source.js', 'string.quoted.double.js', 'invalid.illegal.string.js']

0 commit comments

Comments
 (0)