/*
 *
 *  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.royale.compiler.parsing;

import org.apache.royale.compiler.internal.parsing.mxml.MXMLToken;

/**
 * A factory class that creates {@link IMXMLToken} objects.
 */
public final class MXMLTokenFactory
{
    /**
     * Hides constructor.
     */
    private MXMLTokenFactory()
    {
        // do nothing
    }

    /**
     * Creates an {@link IMXMLToken} instance.
     * 
     * @param tokenType token type
     * @param start start offset
     * @param end end offset
     * @param line line number
     * @param column column number
     * @param tokenText token text
     * @return {@link IMXMLToken} instance
     */
    public static IMXMLToken create(int tokenType, int start, int end, int line, int column, CharSequence tokenText)
    {
        return new MXMLToken(tokenType, start, end, line, column, tokenText);
    }
}
