@@ -65,6 +65,7 @@ interface XPathData {
65
65
function ?: BaseToken ;
66
66
functionArity ?: number ;
67
67
isRangeVar ?: boolean ;
68
+ awaitingMapKey ?: boolean ;
68
69
curlyBraceType ?: CurlyBraceType ;
69
70
}
70
71
@@ -1126,6 +1127,18 @@ export class XsltTokenDiagnostics {
1126
1127
let tv = token . value ;
1127
1128
1128
1129
// start checks
1130
+ const stackItem : XPathData | undefined = xpathStack . length > 0 ? xpathStack [ xpathStack . length - 1 ] : undefined ;
1131
+ if ( stackItem && stackItem . curlyBraceType === CurlyBraceType . Map ) {
1132
+ if ( tv === ',' ) {
1133
+ if ( stackItem . awaitingMapKey ) {
1134
+ isXPathError = true ;
1135
+ } else {
1136
+ stackItem . awaitingMapKey = true ;
1137
+ }
1138
+ } else if ( tv === '}' && stackItem . awaitingMapKey ) {
1139
+ isXPathError = true ;
1140
+ }
1141
+ }
1129
1142
if ( prevToken ?. tokenType === TokenLevelState . uriLiteral ) {
1130
1143
token [ 'error' ] = ErrorType . XPathUnexpected ;
1131
1144
problemTokens . push ( token ) ;
@@ -1134,8 +1147,12 @@ export class XsltTokenDiagnostics {
1134
1147
let currCharType = < CharLevelState > token . charType ;
1135
1148
let nextToken = index + 1 < allTokens . length ? allTokens [ index + 1 ] : undefined ;
1136
1149
if ( tv === ':' ) {
1137
- if ( xpathStack . length > 0 && xpathStack [ xpathStack . length - 1 ] . curlyBraceType === CurlyBraceType . Map ) {
1138
- // not an error in a map
1150
+ if ( stackItem && stackItem . curlyBraceType === CurlyBraceType . Map ) {
1151
+ if ( stackItem . awaitingMapKey ) {
1152
+ stackItem . awaitingMapKey = false ;
1153
+ } else {
1154
+ isXPathError = true ;
1155
+ }
1139
1156
} else if ( prevToken . tokenType === TokenLevelState . nodeNameTest || prevToken . tokenType === TokenLevelState . attributeNameTest ) {
1140
1157
isXPathError = ! ( prevToken . startCharacter + prevToken . length === token . startCharacter && nextToken ?. value === '*' ) ;
1141
1158
} else {
@@ -1251,8 +1268,11 @@ export class XsltTokenDiagnostics {
1251
1268
curlyBraceType = CurlyBraceType . Array ;
1252
1269
}
1253
1270
}
1254
-
1255
- xpathStack . push ( { token : token , variables : inScopeXPathVariablesList , preXPathVariable : preXPathVariable , xpathVariableCurrentlyBeingDefined : xpathVariableCurrentlyBeingDefined , curlyBraceType } ) ;
1271
+ const stackItem : XPathData = { token : token , variables : inScopeXPathVariablesList , preXPathVariable : preXPathVariable , xpathVariableCurrentlyBeingDefined : xpathVariableCurrentlyBeingDefined , curlyBraceType } ;
1272
+ if ( curlyBraceType === CurlyBraceType . Map ) {
1273
+ stackItem . awaitingMapKey = true ;
1274
+ }
1275
+ xpathStack . push ( stackItem ) ;
1256
1276
if ( anonymousFunctionParams ) {
1257
1277
// handle case: function($a) {$a + 8} pass params to inside '{...}'
1258
1278
inScopeXPathVariablesList = anonymousFunctionParamList ;
0 commit comments