Check if :: follows name in which case it becomes a qualified name. @param atPos a natural number if we just read an '@' token, else -1 @param memberTypeFlags flags tracking whether we're a '.' or '..' child @return an XmlRef node if it's an attribute access, a child of a '..' operator, or the name
(int atPos, int memberTypeFlags)
| 3444 | * malformed XML expressions. (For now - might change to return a partial XmlRef.) |
| 3445 | */ |
| 3446 | private AstNode propertyName(int atPos, int memberTypeFlags) throws IOException { |
| 3447 | int pos = atPos != -1 ? atPos : ts.tokenBeg, lineno = lineNumber(), column = columnNumber(); |
| 3448 | int colonPos = -1; |
| 3449 | Name name = createNameNode(true, currentToken); |
| 3450 | Name ns = null; |
| 3451 | |
| 3452 | if (matchToken(Token.COLONCOLON, true)) { |
| 3453 | ns = name; |
| 3454 | colonPos = ts.tokenBeg; |
| 3455 | |
| 3456 | int nt = nextToken(); |
| 3457 | switch (nt) { |
| 3458 | // handles name::name |
| 3459 | case Token.NAME: |
| 3460 | name = createNameNode(); |
| 3461 | break; |
| 3462 | case Token.RESERVED: |
| 3463 | { |
| 3464 | String realName = ts.getString(); |
| 3465 | saveNameTokenData(ts.tokenBeg, realName, lineNumber(), columnNumber()); |
| 3466 | name = createNameNode(false, -1); |
| 3467 | break; |
| 3468 | } |
| 3469 | case Token.MUL: |
| 3470 | saveNameTokenData(ts.tokenBeg, "*", lineNumber(), columnNumber()); |
| 3471 | name = createNameNode(false, -1); |
| 3472 | break; |
| 3473 | |
| 3474 | // handles name::[expr] or *::[expr] |
| 3475 | case Token.LB: |
| 3476 | return xmlElemRef(atPos, ns, colonPos); |
| 3477 | |
| 3478 | default: |
| 3479 | { |
| 3480 | if (compilerEnv.isReservedKeywordAsIdentifier()) { |
| 3481 | // allow keywords as property names, e.g. ({if: 1}) |
| 3482 | String realName = Token.keywordToName(nt); |
| 3483 | if (name != null) { |
| 3484 | saveNameTokenData( |
| 3485 | ts.tokenBeg, realName, lineNumber(), columnNumber()); |
| 3486 | name = createNameNode(false, -1); |
| 3487 | break; |
| 3488 | } |
| 3489 | } |
| 3490 | } |
| 3491 | reportError("msg.no.name.after.coloncolon"); |
| 3492 | return makeErrorNode(); |
| 3493 | } |
| 3494 | } |
| 3495 | |
| 3496 | if (ns == null && memberTypeFlags == 0 && atPos == -1) { |
| 3497 | return name; |
| 3498 | } |
| 3499 | |
| 3500 | XmlPropRef ref = new XmlPropRef(pos, getNodeEnd(name) - pos); |
| 3501 | ref.setAtPos(atPos); |
| 3502 | ref.setNamespace(ns); |
| 3503 | ref.setColonPos(colonPos); |
no test coverage detected