blob: d14a396dd86c3bdd7b783691507938dcdb7bd967 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.util;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.compiler.ITerminalSymbols;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.internal.compiler.parser.Scanner;
import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
/**
* This class acts as a facade to the internal Scanner implementation and delegates
* all the work to the internal Scanner instance.
*
* <p>
* <b>Note for maintainers</b>
* No additional logic should be added here except adopting NON-API constants
* returned by {@link #getNextToken()} from {@link TerminalTokens} to {@link ITerminalSymbols}.
*/
public class PublicScanner implements IScanner, ITerminalSymbols {
private final Scanner delegate;
public PublicScanner(
boolean tokenizeComments,
boolean tokenizeWhiteSpace,
boolean checkNonExternalizedStringLiterals,
long sourceLevel,
long complianceLevel,
char[][] taskTags,
char[][] taskPriorities,
boolean isTaskCaseSensitive,
boolean isPreviewEnabled,
boolean recordLineSeparator) {
this.delegate = createScanner(tokenizeComments, tokenizeWhiteSpace, checkNonExternalizedStringLiterals, sourceLevel,
complianceLevel, taskTags, taskPriorities, isTaskCaseSensitive, isPreviewEnabled);
this.delegate.recordLineSeparator = recordLineSeparator;
}
protected Scanner createScanner(boolean tokenizeComments, boolean tokenizeWhiteSpace,
boolean checkNonExternalizedStringLiterals, long sourceLevel, long complianceLevel, char[][] taskTags,
char[][] taskPriorities, boolean isTaskCaseSensitive, boolean isPreviewEnabled) {
return new Scanner(tokenizeComments, tokenizeWhiteSpace, checkNonExternalizedStringLiterals,
sourceLevel, complianceLevel, taskTags, taskPriorities, isTaskCaseSensitive, isPreviewEnabled);
}
@Override
public int getCurrentTokenEndPosition(){
return this.delegate.getCurrentTokenEndPosition();
}
@Override
public char[] getCurrentTokenSource() {
return this.delegate.getCurrentTokenSource();
}
@Override
public final char[] getRawTokenSource() {
return this.delegate.getRawTokenSource();
}
@Override
public int getCurrentTokenStartPosition(){
return this.delegate.startPosition;
}
/*
* Search the source position corresponding to the end of a given line number
*
* Line numbers are 1-based, and relative to the scanner initialPosition.
* Character positions are 0-based.
*
* In case the given line number is inconsistent, answers -1.
*/
@Override
public final int getLineEnd(int lineNumber) {
return this.delegate.getLineEnd(lineNumber);
}
@Override
public final int[] getLineEnds() {
return this.delegate.getLineEnds();
}
/**
* Search the source position corresponding to the beginning of a given line number
*
* Line numbers are 1-based, and relative to the scanner initialPosition.
* Character positions are 0-based.
*
* e.g. getLineStart(1) --> 0 indicates that the first line starts at character 0.
*
* In case the given line number is inconsistent, answers -1.
*
* @param lineNumber int
* @return int
*/
@Override
public final int getLineStart(int lineNumber) {
return this.delegate.getLineStart(lineNumber);
}
@Override
public int getNextToken() throws InvalidInputException {
int nextToken = this.delegate.getNextToken();
int symbol = translateTokenToTerminalSymbol(nextToken);
return symbol;
}
/**
* Translates internal generated constants from {@link TerminalTokens} to public constants defined in
* {@link ITerminalSymbols}.
* <p>
* There is PublicScannerTest that validates the translation and can generate switch body for this method
* on changes in Scanner / TerminalTokens.
* <p>
* Note for maintainers: new tokens from {@link TerminalTokens} should be added to {@link ITerminalSymbols} with
* <b>adopted</b> numerical values (they differ in each interface).
*/
@Deprecated // uses deprecated TerminalTokensIdentifier
private int translateTokenToTerminalSymbol(int nextToken) throws InvalidInputException {
switch (nextToken) {
case TerminalTokens.TokenNameAND : nextToken = ITerminalSymbols.TokenNameAND; break;
case TerminalTokens.TokenNameAND_AND : nextToken = ITerminalSymbols.TokenNameAND_AND; break;
case TerminalTokens.TokenNameAND_EQUAL : nextToken = ITerminalSymbols.TokenNameAND_EQUAL; break;
case TerminalTokens.TokenNameARROW : nextToken = ITerminalSymbols.TokenNameARROW; break;
case TerminalTokens.TokenNameAT : nextToken = ITerminalSymbols.TokenNameAT; break;
case TerminalTokens.TokenNameAT308 : nextToken = ITerminalSymbols.TokenNameAT; break;
case TerminalTokens.TokenNameAT308DOTDOTDOT : nextToken = ITerminalSymbols.TokenNameAT; break;
case TerminalTokens.TokenNameATOT : nextToken = ITerminalSymbols.TokenNameAT; break;
case TerminalTokens.TokenNameBINDIN : nextToken = ITerminalSymbols.TokenNameBINDIN; break;
case TerminalTokens.TokenNameBINDOUT : nextToken = ITerminalSymbols.TokenNameARROW; break;
case TerminalTokens.TokenNameBeginCaseElement : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameBeginCaseExpr : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameBeginIntersectionCast : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameBeginLambda : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameBeginTypeArguments : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameCALLOUT_OVERRIDE : nextToken = ITerminalSymbols.TokenNameCALLOUT_OVERRIDE; break;
case TerminalTokens.TokenNameCOLON : nextToken = ITerminalSymbols.TokenNameCOLON; break;
case TerminalTokens.TokenNameCOLON_COLON : nextToken = ITerminalSymbols.TokenNameCOLON_COLON; break;
case TerminalTokens.TokenNameCOMMA : nextToken = ITerminalSymbols.TokenNameCOMMA; break;
case TerminalTokens.TokenNameCOMMENT_BLOCK : nextToken = ITerminalSymbols.TokenNameCOMMENT_BLOCK; break;
case TerminalTokens.TokenNameCOMMENT_JAVADOC : nextToken = ITerminalSymbols.TokenNameCOMMENT_JAVADOC; break;
case TerminalTokens.TokenNameCOMMENT_LINE : nextToken = ITerminalSymbols.TokenNameCOMMENT_LINE; break;
case TerminalTokens.TokenNameCharacterLiteral : nextToken = ITerminalSymbols.TokenNameCharacterLiteral; break;
case TerminalTokens.TokenNameDIVIDE : nextToken = ITerminalSymbols.TokenNameDIVIDE; break;
case TerminalTokens.TokenNameDIVIDE_EQUAL : nextToken = ITerminalSymbols.TokenNameDIVIDE_EQUAL; break;
case TerminalTokens.TokenNameDOT : nextToken = ITerminalSymbols.TokenNameDOT; break;
case TerminalTokens.TokenNameDoubleLiteral : nextToken = ITerminalSymbols.TokenNameDoubleLiteral; break;
case TerminalTokens.TokenNameELLIPSIS : nextToken = ITerminalSymbols.TokenNameELLIPSIS; break;
case TerminalTokens.TokenNameEOF : nextToken = ITerminalSymbols.TokenNameEOF; break;
case TerminalTokens.TokenNameEQUAL : nextToken = ITerminalSymbols.TokenNameEQUAL; break;
case TerminalTokens.TokenNameEQUAL_EQUAL : nextToken = ITerminalSymbols.TokenNameEQUAL_EQUAL; break;
case TerminalTokens.TokenNameERROR : nextToken = ITerminalSymbols.TokenNameERROR; break;
case TerminalTokens.TokenNameElidedSemicolonAndRightBrace : nextToken = getNextToken(); break;
case TerminalTokens.TokenNameFloatingPointLiteral : nextToken = ITerminalSymbols.TokenNameFloatingPointLiteral; break;
case TerminalTokens.TokenNameGREATER : nextToken = ITerminalSymbols.TokenNameGREATER; break;
case TerminalTokens.TokenNameGREATER_EQUAL : nextToken = ITerminalSymbols.TokenNameGREATER_EQUAL; break;
case TerminalTokens.TokenNameIdentifier : nextToken = ITerminalSymbols.TokenNameIdentifier; break;
case TerminalTokens.TokenNameIntegerLiteral : nextToken = ITerminalSymbols.TokenNameIntegerLiteral; break;
case TerminalTokens.TokenNameLBRACE : nextToken = ITerminalSymbols.TokenNameLBRACE; break;
case TerminalTokens.TokenNameLBRACKET : nextToken = ITerminalSymbols.TokenNameLBRACKET; break;
case TerminalTokens.TokenNameLEFT_SHIFT : nextToken = ITerminalSymbols.TokenNameLEFT_SHIFT; break;
case TerminalTokens.TokenNameLEFT_SHIFT_EQUAL : nextToken = ITerminalSymbols.TokenNameLEFT_SHIFT_EQUAL; break;
case TerminalTokens.TokenNameLESS : nextToken = ITerminalSymbols.TokenNameLESS; break;
case TerminalTokens.TokenNameLESS_EQUAL : nextToken = ITerminalSymbols.TokenNameLESS_EQUAL; break;
case TerminalTokens.TokenNameLPAREN : nextToken = ITerminalSymbols.TokenNameLPAREN; break;
case TerminalTokens.TokenNameLongLiteral : nextToken = ITerminalSymbols.TokenNameLongLiteral; break;
case TerminalTokens.TokenNameMINUS : nextToken = ITerminalSymbols.TokenNameMINUS; break;
case TerminalTokens.TokenNameMINUS_EQUAL : nextToken = ITerminalSymbols.TokenNameMINUS_EQUAL; break;
case TerminalTokens.TokenNameMINUS_MINUS : nextToken = ITerminalSymbols.TokenNameMINUS_MINUS; break;
case TerminalTokens.TokenNameMULTIPLY : nextToken = ITerminalSymbols.TokenNameMULTIPLY; break;
case TerminalTokens.TokenNameMULTIPLY_EQUAL : nextToken = ITerminalSymbols.TokenNameMULTIPLY_EQUAL; break;
case TerminalTokens.TokenNameNOT : nextToken = ITerminalSymbols.TokenNameNOT; break;
case TerminalTokens.TokenNameNOT_EQUAL : nextToken = ITerminalSymbols.TokenNameNOT_EQUAL; break;
case TerminalTokens.TokenNameNotAToken : nextToken = ITerminalSymbols.TokenNameNotAToken; break;
case TerminalTokens.TokenNameOR : nextToken = ITerminalSymbols.TokenNameOR; break;
case TerminalTokens.TokenNameOR_EQUAL : nextToken = ITerminalSymbols.TokenNameOR_EQUAL; break;
case TerminalTokens.TokenNameOR_OR : nextToken = ITerminalSymbols.TokenNameOR_OR; break;
case TerminalTokens.TokenNamePLUS : nextToken = ITerminalSymbols.TokenNamePLUS; break;
case TerminalTokens.TokenNamePLUS_EQUAL : nextToken = ITerminalSymbols.TokenNamePLUS_EQUAL; break;
case TerminalTokens.TokenNamePLUS_PLUS : nextToken = ITerminalSymbols.TokenNamePLUS_PLUS; break;
case TerminalTokens.TokenNameQUESTION : nextToken = ITerminalSymbols.TokenNameQUESTION; break;
case TerminalTokens.TokenNameRBRACE : nextToken = ITerminalSymbols.TokenNameRBRACE; break;
case TerminalTokens.TokenNameRBRACKET : nextToken = ITerminalSymbols.TokenNameRBRACKET; break;
case TerminalTokens.TokenNameREMAINDER : nextToken = ITerminalSymbols.TokenNameREMAINDER; break;
case TerminalTokens.TokenNameREMAINDER_EQUAL : nextToken = ITerminalSymbols.TokenNameREMAINDER_EQUAL; break;
case TerminalTokens.TokenNameRIGHT_SHIFT : nextToken = ITerminalSymbols.TokenNameRIGHT_SHIFT; break;
case TerminalTokens.TokenNameRIGHT_SHIFT_EQUAL : nextToken = ITerminalSymbols.TokenNameRIGHT_SHIFT_EQUAL; break;
case TerminalTokens.TokenNameRPAREN : nextToken = ITerminalSymbols.TokenNameRPAREN; break;
case TerminalTokens.TokenNameRestrictedIdentifierYield : nextToken = ITerminalSymbols.TokenNameRestrictedIdentifierYield; break;
case TerminalTokens.TokenNameRestrictedIdentifierpermits : nextToken = ITerminalSymbols.TokenNameRestrictedIdentifierpermits; break;
case TerminalTokens.TokenNameRestrictedIdentifierrecord : nextToken = ITerminalSymbols.TokenNameRestrictedIdentifierrecord; break;
case TerminalTokens.TokenNameRestrictedIdentifiersealed : nextToken = ITerminalSymbols.TokenNameRestrictedIdentifiersealed; break;
case TerminalTokens.TokenNameSEMICOLON : nextToken = ITerminalSymbols.TokenNameSEMICOLON; break;
case TerminalTokens.TokenNameSingleQuoteStringLiteral : nextToken = ITerminalSymbols.TokenNameSingleQuoteStringLiteral; break;
case TerminalTokens.TokenNameStringLiteral : nextToken = ITerminalSymbols.TokenNameStringLiteral; break;
case TerminalTokens.TokenNameTWIDDLE : nextToken = ITerminalSymbols.TokenNameTWIDDLE; break;
case TerminalTokens.TokenNameTextBlock : nextToken = ITerminalSymbols.TokenNameTextBlock; break;
case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT : nextToken = ITerminalSymbols.TokenNameUNSIGNED_RIGHT_SHIFT; break;
case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL : nextToken = ITerminalSymbols.TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL; break;
case TerminalTokens.TokenNameWHITESPACE : nextToken = ITerminalSymbols.TokenNameWHITESPACE; break;
case TerminalTokens.TokenNameXOR : nextToken = ITerminalSymbols.TokenNameXOR; break;
case TerminalTokens.TokenNameXOR_EQUAL : nextToken = ITerminalSymbols.TokenNameXOR_EQUAL; break;
case TerminalTokens.TokenNameabstract : nextToken = ITerminalSymbols.TokenNameabstract; break;
case TerminalTokens.TokenNameafter : nextToken = ITerminalSymbols.TokenNameafter; break;
case TerminalTokens.TokenNameas : nextToken = ITerminalSymbols.TokenNameas; break;
case TerminalTokens.TokenNameassert : nextToken = ITerminalSymbols.TokenNameassert; break;
case TerminalTokens.TokenNamebase : nextToken = ITerminalSymbols.TokenNamebase; break;
case TerminalTokens.TokenNamebefore : nextToken = ITerminalSymbols.TokenNamebefore; break;
case TerminalTokens.TokenNameboolean : nextToken = ITerminalSymbols.TokenNameboolean; break;
case TerminalTokens.TokenNamebreak : nextToken = ITerminalSymbols.TokenNamebreak; break;
case TerminalTokens.TokenNamebyte : nextToken = ITerminalSymbols.TokenNamebyte; break;
case TerminalTokens.TokenNamecallin : nextToken = ITerminalSymbols.TokenNamecallin; break;
case TerminalTokens.TokenNamecase : nextToken = ITerminalSymbols.TokenNamecase; break;
case TerminalTokens.TokenNamecatch : nextToken = ITerminalSymbols.TokenNamecatch; break;
case TerminalTokens.TokenNamechar : nextToken = ITerminalSymbols.TokenNamechar; break;
case TerminalTokens.TokenNameclass : nextToken = ITerminalSymbols.TokenNameclass; break;
case TerminalTokens.TokenNameconst : nextToken = ITerminalSymbols.TokenNameconst; break;
case TerminalTokens.TokenNamecontinue : nextToken = ITerminalSymbols.TokenNamecontinue; break;
case TerminalTokens.TokenNamedefault : nextToken = ITerminalSymbols.TokenNamedefault; break;
case TerminalTokens.TokenNamedo : nextToken = ITerminalSymbols.TokenNamedo; break;
case TerminalTokens.TokenNamedouble : nextToken = ITerminalSymbols.TokenNamedouble; break;
case TerminalTokens.TokenNameelse : nextToken = ITerminalSymbols.TokenNameelse; break;
case TerminalTokens.TokenNameenum : nextToken = ITerminalSymbols.TokenNameenum; break;
case TerminalTokens.TokenNameextends : nextToken = ITerminalSymbols.TokenNameextends; break;
case TerminalTokens.TokenNamefalse : nextToken = ITerminalSymbols.TokenNamefalse; break;
case TerminalTokens.TokenNamefinal : nextToken = ITerminalSymbols.TokenNamefinal; break;
case TerminalTokens.TokenNamefinally : nextToken = ITerminalSymbols.TokenNamefinally; break;
case TerminalTokens.TokenNamefloat : nextToken = ITerminalSymbols.TokenNamefloat; break;
case TerminalTokens.TokenNamefor : nextToken = ITerminalSymbols.TokenNamefor; break;
case TerminalTokens.TokenNameget : nextToken = ITerminalSymbols.TokenNameget; break;
case TerminalTokens.TokenNamegoto : nextToken = ITerminalSymbols.TokenNamegoto; break;
case TerminalTokens.TokenNameif : nextToken = ITerminalSymbols.TokenNameif; break;
case TerminalTokens.TokenNameimplements : nextToken = ITerminalSymbols.TokenNameimplements; break;
case TerminalTokens.TokenNameimport : nextToken = ITerminalSymbols.TokenNameimport; break;
case TerminalTokens.TokenNameinstanceof : nextToken = ITerminalSymbols.TokenNameinstanceof; break;
case TerminalTokens.TokenNameint : nextToken = ITerminalSymbols.TokenNameint; break;
case TerminalTokens.TokenNameinterface : nextToken = ITerminalSymbols.TokenNameinterface; break;
case TerminalTokens.TokenNamelong : nextToken = ITerminalSymbols.TokenNamelong; break;
case TerminalTokens.TokenNamenative : nextToken = ITerminalSymbols.TokenNamenative; break;
case TerminalTokens.TokenNamenew : nextToken = ITerminalSymbols.TokenNamenew; break;
case TerminalTokens.TokenNamenon_sealed : nextToken = ITerminalSymbols.TokenNamenon_sealed; break;
case TerminalTokens.TokenNamenull : nextToken = ITerminalSymbols.TokenNamenull; break;
case TerminalTokens.TokenNamepackage : nextToken = ITerminalSymbols.TokenNamepackage; break;
case TerminalTokens.TokenNameplayedBy : nextToken = ITerminalSymbols.TokenNameplayedBy; break;
case TerminalTokens.TokenNameprecedence : nextToken = ITerminalSymbols.TokenNameprecedence; break;
case TerminalTokens.TokenNameprivate : nextToken = ITerminalSymbols.TokenNameprivate; break;
case TerminalTokens.TokenNameprotected : nextToken = ITerminalSymbols.TokenNameprotected; break;
case TerminalTokens.TokenNamepublic : nextToken = ITerminalSymbols.TokenNamepublic; break;
case TerminalTokens.TokenNamereplace : nextToken = ITerminalSymbols.TokenNamereplace; break;
case TerminalTokens.TokenNamereturn : nextToken = ITerminalSymbols.TokenNamereturn; break;
case TerminalTokens.TokenNameset : nextToken = ITerminalSymbols.TokenNameset; break;
case TerminalTokens.TokenNameshort : nextToken = ITerminalSymbols.TokenNameshort; break;
case TerminalTokens.TokenNamestatic : nextToken = ITerminalSymbols.TokenNamestatic; break;
case TerminalTokens.TokenNamestrictfp : nextToken = ITerminalSymbols.TokenNamestrictfp; break;
case TerminalTokens.TokenNamesuper : nextToken = ITerminalSymbols.TokenNamesuper; break;
case TerminalTokens.TokenNameswitch : nextToken = ITerminalSymbols.TokenNameswitch; break;
case TerminalTokens.TokenNamesynchronized : nextToken = ITerminalSymbols.TokenNamesynchronized; break;
case TerminalTokens.TokenNameteam : nextToken = ITerminalSymbols.TokenNameteam; break;
case TerminalTokens.TokenNamethis : nextToken = ITerminalSymbols.TokenNamethis; break;
case TerminalTokens.TokenNamethrow : nextToken = ITerminalSymbols.TokenNamethrow; break;
case TerminalTokens.TokenNamethrows : nextToken = ITerminalSymbols.TokenNamethrows; break;
case TerminalTokens.TokenNametransient : nextToken = ITerminalSymbols.TokenNametransient; break;
case TerminalTokens.TokenNametrue : nextToken = ITerminalSymbols.TokenNametrue; break;
case TerminalTokens.TokenNametry : nextToken = ITerminalSymbols.TokenNametry; break;
case TerminalTokens.TokenNametsuper : nextToken = ITerminalSymbols.TokenNametsuper; break;
case TerminalTokens.TokenNamevoid : nextToken = ITerminalSymbols.TokenNamevoid; break;
case TerminalTokens.TokenNamevolatile : nextToken = ITerminalSymbols.TokenNamevolatile; break;
case TerminalTokens.TokenNamewhen : nextToken = ITerminalSymbols.TokenNamewhen; break;
case TerminalTokens.TokenNamewhile : nextToken = ITerminalSymbols.TokenNamewhile; break;
case TerminalTokens.TokenNamewith : nextToken = ITerminalSymbols.TokenNamewith; break;
case TerminalTokens.TokenNamewithin : nextToken = ITerminalSymbols.TokenNamewithin; break;
default:
throw new InvalidInputException("Unknown token (check Scanner/TerminalTokens): " + nextToken); //$NON-NLS-1$
}
return nextToken;
}
@Override
public char[] getSource(){
return this.delegate.getSource();
}
/**
* Reposition the scanner on some portion of the original source. The given endPosition is the last valid position.
* Beyond this position, the scanner will answer EOF tokens (<code>ITerminalSymbols.TokenNameEOF</code>).
*
* @param begin the given start position
* @param end the given end position
*/
@Override
public void resetTo(int begin, int end) {
this.delegate.resetTo(begin, end);
}
/**
* Search the line number corresponding to a specific position
* @param position int
* @return int
*/
@Override
public final int getLineNumber(int position) {
return this.delegate.getLineNumber(position);
}
@Override
public final void setSource(char[] sourceString){
this.delegate.setSource(sourceString);
}
@Override
public String toString() {
return this.delegate.toString();
}
}