Skip to content

Commit

Permalink
Fix multiline arrow assignment with multiline arrow type parameters t…
Browse files Browse the repository at this point in the history
…o the object member

Fixes #796
  • Loading branch information
sheetalkamat committed Jan 3, 2020
1 parent c858569 commit b7ef094
Show file tree
Hide file tree
Showing 5 changed files with 299 additions and 0 deletions.
14 changes: 14 additions & 0 deletions TypeScript.YAML-tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -1418,6 +1418,20 @@ repository:
'0': { name: meta.brace.round.ts }
patterns:
- include: '#expression-inside-possibly-arrow-parens'
- begin: '{{lookBehindOfObjectMemberPossiblyMultilineArrow}}\s*(async)?\s*(?=\<\s*$)'
beginCaptures:
'1': { name: storage.modifier.async.ts }
end: (?<=\>)
patterns:
- include: '#type-parameters'
- begin: '(?<=\>)\s*(\()(?=\s*{{possiblyMultilineArrowWParamters}})'
beginCaptures:
'1': { name: meta.brace.round.ts }
end: \)
endCaptures:
'0': { name: meta.brace.round.ts }
patterns:
- include: '#expression-inside-possibly-arrow-parens'
- include: '#possibly-arrow-return-type'
- include: '#expression'
- include: '#punctuation-comma'
Expand Down
50 changes: 50 additions & 0 deletions TypeScript.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -4583,6 +4583,56 @@
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;=:)\s*(async)?\s*(?=\&lt;\s*$)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.modifier.async.ts</string>
</dict>
</dict>
<key>end</key>
<string>(?&lt;=\&gt;)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;=\&gt;)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^&lt;&gt;\(\)\{\}]|\&lt;([^&lt;&gt;]|\&lt;[^&lt;&gt;]+\&gt;)+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^&lt;&gt;\(\)\{\}]|\&lt;([^&lt;&gt;]|\&lt;[^&lt;&gt;]+\&gt;)+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>meta.brace.round.ts</string>
</dict>
</dict>
<key>end</key>
<string>\)</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>meta.brace.round.ts</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-inside-possibly-arrow-parens</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#possibly-arrow-return-type</string>
Expand Down
50 changes: 50 additions & 0 deletions TypeScriptReact.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -4607,6 +4607,56 @@
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;=:)\s*(async)?\s*(?=\&lt;\s*$)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.modifier.async.tsx</string>
</dict>
</dict>
<key>end</key>
<string>(?&lt;=\&gt;)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;=\&gt;)\s*(\()(?=\s*((([\{\[]\s*)?$)|((\{([^\{\}]|(\{[^\{\}]*\}))*\})\s*((:\s*\{?$)|((\s*([^&lt;&gt;\(\)\{\}]|\&lt;([^&lt;&gt;]|\&lt;[^&lt;&gt;]+\&gt;)+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))|((\[([^\[\]]|(\[[^\[\]]*\]))*\])\s*((:\s*\[?$)|((\s*([^&lt;&gt;\(\)\{\}]|\&lt;([^&lt;&gt;]|\&lt;[^&lt;&gt;]+\&gt;)+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+\s*)?=\s*)))))</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>meta.brace.round.tsx</string>
</dict>
</dict>
<key>end</key>
<string>\)</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>meta.brace.round.tsx</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-inside-possibly-arrow-parens</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#possibly-arrow-return-type</string>
Expand Down
174 changes: 174 additions & 0 deletions tests/baselines/Issue796.baseline.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
original file
-----------------------------------
const h = {
setSubProperty: <
T extends A,
K extends keyof T,
J extends keyof T[K]
>(
property: K,
key: J,
value: T[K][J]
) => {}
}
-----------------------------------

Grammar: TypeScript.tmLanguage
-----------------------------------
>const h = {
^^^^^
source.ts meta.var.expr.ts storage.type.ts
^
source.ts meta.var.expr.ts
^
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.constant.ts
^
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
^
source.ts meta.var.expr.ts keyword.operator.assignment.ts
^
source.ts meta.var.expr.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts punctuation.definition.block.ts
> setSubProperty: <
^^
source.ts meta.var.expr.ts meta.objectliteral.ts
^^^^^^^^^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts entity.name.function.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts punctuation.separator.key-value.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
> T extends A,
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts storage.modifier.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts punctuation.separator.comma.ts
> K extends keyof T,
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts storage.modifier.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts keyword.operator.expression.keyof.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts punctuation.separator.comma.ts
> J extends keyof T[K]
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts storage.modifier.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts keyword.operator.expression.keyof.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts meta.type.tuple.ts meta.brace.square.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts meta.type.tuple.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts meta.type.tuple.ts meta.brace.square.ts
> >(
^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.brace.round.ts
> property: K,
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^^^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts variable.parameter.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts punctuation.separator.parameter.ts
> key: J,
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts variable.parameter.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts punctuation.separator.parameter.ts
> value: T[K][J]
^^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts variable.parameter.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts entity.name.type.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
> ) => {}
^^^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.brace.round.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts
^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.arrow.ts storage.type.function.arrow.ts
^^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.arrow.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
^
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
>}
^
source.ts meta.var.expr.ts meta.objectliteral.ts punctuation.definition.block.ts
11 changes: 11 additions & 0 deletions tests/cases/Issue796.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const h = {
setSubProperty: <
T extends A,
K extends keyof T,
J extends keyof T[K]
>(
property: K,
key: J,
value: T[K][J]
) => {}
}

0 comments on commit b7ef094

Please sign in to comment.