/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.flex.compiler.internal.parsing.as; import java.util.List; import org.apache.flex.compiler.internal.parsing.TokenBase; public abstract class BaseTokenizerWithFakeCharacters { /** * Build a token of the appropriate type (used when we need to truncate a * token to strip out fake characters in removeFakeTokens) * * @param tokenType type of token * @param start start of token * @param end end of token * @param line line of token * @param tokenText text of token * @return token of the appropriate type (ASToken, CSSToken, MXMLToken, * etc.) */ protected abstract TokenBase buildToken(int tokenType, int start, int end, int line, int column, String tokenText); /** * Remove any dummy tokens that we created using the fake characters we * appended to the end of the stream. If there is a token that contains both * real characters and fake characters, we'll truncate that token to only * include real characters * * @param lastRealIndex index of last real characters * @param tokenList complete token list */ protected void removeFakeTokens(int lastRealIndex, List<TokenBase> tokenList) { // Remove any dummy tokens we created using the fake characters we appended to // the end of the stream for (int tokenIndex = tokenList.size() - 1; tokenIndex >= 0; tokenIndex--) { TokenBase token = (TokenBase)tokenList.get(tokenIndex); if (token.getEnd() <= lastRealIndex) break; else if (token.getStart() < lastRealIndex && token.getEnd() > lastRealIndex) { // The end of this token is in the fake characters. Truncate it. int actualLength = lastRealIndex - token.getStart(); if (actualLength > token.toString().length()) { actualLength = token.toString().length(); } tokenList.set(tokenIndex, buildToken(token.getType(), token.getStart(), lastRealIndex, -1, -1, token.toString().substring(0, actualLength))); } else { // This entire token is in the fake characters. Discard it. tokenList.remove(tokenIndex); } } } }