in compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java [1388:1507]
private ASToken tryParseMetadata(ASToken nextToken) throws Exception
{
// Do not initialize this variable so that Java flow-analysis can check if
// the following rules cover all the possibilities.
final boolean isNextMetadata;
if (!config.findMetadata)
{
// The lexer is configured to not recognize metadata.
isNextMetadata = false;
}
else if (lastToken == null || lastTokenNotRegularComment == null)
{
// An "[" at the beginning of a script is always a part of a metadata.
// allow single line and multiline comments before an "[", but fall
// through for asdoc comments before an "[".
isNextMetadata = true;
}
else
{
switch (lastTokenNotRegularComment.getType())
{
case TOKEN_ASDOC_COMMENT:
case TOKEN_SEMICOLON:
case TOKEN_ATTRIBUTE:
case TOKEN_BLOCK_OPEN:
// "[" after these tokens are always part of a metadata token.
isNextMetadata = true;
break;
case TOKEN_SQUARE_CLOSE:
case TOKEN_IDENTIFIER:
// "[" following a "]" is an array access.
// "[" following an identifier is an array access.
isNextMetadata = false;
break;
case TOKEN_KEYWORD_INCLUDE:
case TOKEN_BLOCK_CLOSE:
case TOKEN_OPERATOR_STAR:
// "[" after these tokens are part of a metadata token, if
// the "[" is on a new line.
isNextMetadata = !lastToken.matchesLine(nextToken);
break;
default:
// If we are lexing an entire file
// then at this point we "know" that the next token
// is not meta-data.
if (config.completeContent)
{
isNextMetadata = false;
}
else
{
// In "fragment" mode which is used by the syntax coloring code
// in builder, we assume the following list of tokens can not
// precede meta-data because they all start or occur in expressions.
switch (lastToken.getType())
{
case TOKEN_OPERATOR_EQUAL:
case TOKEN_OPERATOR_TERNARY:
case TOKEN_COLON:
case TOKEN_OPERATOR_PLUS:
case TOKEN_OPERATOR_MINUS:
case TOKEN_OPERATOR_STAR:
case TOKEN_OPERATOR_DIVISION:
case TOKEN_OPERATOR_MODULO:
case TOKEN_OPERATOR_BITWISE_AND:
case TOKEN_OPERATOR_BITWISE_OR:
case TOKEN_OPERATOR_NULLISH_COALESCING:
case TOKEN_KEYWORD_AS:
case TOKEN_OPERATOR_BITWISE_XOR:
case TOKEN_OPERATOR_LOGICAL_AND:
case TOKEN_OPERATOR_LOGICAL_OR:
case TOKEN_PAREN_OPEN:
case TOKEN_COMMA:
case TOKEN_OPERATOR_BITWISE_NOT:
case TOKEN_OPERATOR_LOGICAL_NOT:
case TOKEN_OPERATOR_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_LEFT_SHIFT:
case TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT:
case TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT:
case TOKEN_OPERATOR_LESS_THAN:
case TOKEN_OPERATOR_GREATER_THAN:
case TOKEN_OPERATOR_LESS_THAN_EQUALS:
case TOKEN_OPERATOR_GREATER_THAN_EQUALS:
case TOKEN_OPERATOR_NOT_EQUAL:
case TOKEN_OPERATOR_STRICT_EQUAL:
case TOKEN_OPERATOR_STRICT_NOT_EQUAL:
case TOKEN_OPERATOR_PLUS_ASSIGNMENT:
case TOKEN_OPERATOR_MINUS_ASSIGNMENT:
case TOKEN_OPERATOR_MULTIPLICATION_ASSIGNMENT:
case TOKEN_OPERATOR_DIVISION_ASSIGNMENT:
case TOKEN_OPERATOR_MODULO_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_AND_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_OR_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_XOR_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_LEFT_SHIFT_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT_ASSIGNMENT:
case TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
isNextMetadata = false;
break;
default:
isNextMetadata = true;
break;
}
}
break;
}
}
final ASToken result;
if (isNextMetadata)
result = consumeMetadata(nextToken);
else
result = nextToken;
return result;
}