/*
 * 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.netbeans.modules.lexer.nbbridge;

import java.util.Map;
import org.netbeans.spi.editor.mimelookup.MimeLocation;
import org.netbeans.spi.lexer.LanguageEmbedding;

/**
 *
 * @author vita
 */
@MimeLocation(subfolderName="languagesEmbeddingMap")
public final class LanguagesEmbeddingMap {
    
    private Map<String, LanguageEmbedding<?>> map;
    
    /** Creates a new instance of LanguagesEmbeddingMap */
    public LanguagesEmbeddingMap(Map<String, LanguageEmbedding<?>> map) {
        this.map = map;
    }
    
    public synchronized LanguageEmbedding<?> getLanguageEmbeddingForTokenName(String tokenName) {
        return map.get(tokenName);
    }
}
