/* * Copyright (c) 2012-2016 The ANTLR Project. All rights reserved. * Use of this file is governed by the BSD 3-clause license that * can be found in the LICENSE.txt file in the project root. */ package org.antlr.v4.runtime.tree.pattern; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.TokenSource; /** * A {@link Token} object representing an entire subtree matched by a parser * rule; e.g., {@code }. These tokens are created for {@link TagChunk} * chunks where the tag corresponds to a parser rule. */ public class RuleTagToken implements Token { /** * This is the backing field for {@link #getRuleName}. */ private final String ruleName; /** * The token type for the current token. This is the token type assigned to * the bypass alternative for the rule during ATN deserialization. */ private final int bypassTokenType; /** * This is the backing field for {@link #getLabel}. */ private final String label; /** * Constructs a new instance of {@link RuleTagToken} with the specified rule * name and bypass token type and no label. * * @param ruleName The name of the parser rule this rule tag matches. * @param bypassTokenType The bypass token type assigned to the parser rule. * * @exception IllegalArgumentException if {@code ruleName} is {@code null} * or empty. */ public RuleTagToken(String ruleName, int bypassTokenType) { this(ruleName, bypassTokenType, null); } /** * Constructs a new instance of {@link RuleTagToken} with the specified rule * name, bypass token type, and label. * * @param ruleName The name of the parser rule this rule tag matches. * @param bypassTokenType The bypass token type assigned to the parser rule. * @param label The label associated with the rule tag, or {@code null} if * the rule tag is unlabeled. * * @exception IllegalArgumentException if {@code ruleName} is {@code null} * or empty. */ public RuleTagToken(String ruleName, int bypassTokenType, String label) { if (ruleName == null || ruleName.isEmpty()) { throw new IllegalArgumentException("ruleName cannot be null or empty."); } this.ruleName = ruleName; this.bypassTokenType = bypassTokenType; this.label = label; } /** * Gets the name of the rule associated with this rule tag. * * @return The name of the parser rule associated with this rule tag. */ public final String getRuleName() { return ruleName; } /** * Gets the label associated with the rule tag. * * @return The name of the label associated with the rule tag, or * {@code null} if this is an unlabeled rule tag. */ public final String getLabel() { return label; } /** * {@inheritDoc} * *

Rule tag tokens are always placed on the {@link #DEFAULT_CHANNEL}.

*/ @Override public int getChannel() { return DEFAULT_CHANNEL; } /** * {@inheritDoc} * *

This method returns the rule tag formatted with {@code <} and {@code >} * delimiters.

*/ @Override public String getText() { if (label != null) { return "<" + label + ":" + ruleName + ">"; } return "<" + ruleName + ">"; } /** * {@inheritDoc} * *

Rule tag tokens have types assigned according to the rule bypass * transitions created during ATN deserialization.

*/ @Override public int getType() { return bypassTokenType; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns 0.

*/ @Override public int getLine() { return 0; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns -1.

*/ @Override public int getCharPositionInLine() { return -1; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns -1.

*/ @Override public int getTokenIndex() { return -1; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns -1.

*/ @Override public int getStartIndex() { return -1; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns -1.

*/ @Override public int getStopIndex() { return -1; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns {@code null}.

*/ @Override public TokenSource getTokenSource() { return null; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} always returns {@code null}.

*/ @Override public CharStream getInputStream() { return null; } /** * {@inheritDoc} * *

The implementation for {@link RuleTagToken} returns a string of the form * {@code ruleName:bypassTokenType}.

*/ @Override public String toString() { return ruleName + ":" + bypassTokenType; } }