// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using PascalABCCompiler.Errors;
namespace Languages.Facade
{
///
/// Хранилище языков, поддерживаемых платформой (Singletone)
///
public class LanguageProvider
{
private static readonly Lazy lazyInstanceWrapper = new Lazy(() => new LanguageProvider(), true);
public static LanguageProvider Instance { get { return lazyInstanceWrapper.Value; } }
///
/// Список всех языков, заполняется классом LanguageIntegrator
///
public List Languages { get; private set; } = new List();
///
/// Основной язык платформы - PascalABC.NET
///
public ILanguage MainLanguage
{
get
{
return Languages[0];
}
}
///
/// Выбор языка по расширению файла - бросает ошибку некорректного расширения
///
/// Имя файла или просто расширение
///
///
public ILanguage SelectLanguageByExtension(string fileName)
{
return SelectLanguageByExtensionSafe(fileName) ?? throw new ParserBadFileExtension(fileName);
}
///
/// Выбор языка по расширению файла - возвращает null, если расширение не то
///
///
///
public ILanguage SelectLanguageByExtensionSafe(string fileName)
{
string extension = Path.GetExtension(fileName).ToLower();
foreach (ILanguage language in Languages)
foreach (string langExtension in language.FilesExtensions)
if (langExtension.ToLower() == extension)
return language;
return null;
}
///
/// Есть ли язык, поддерживающий такое расширение файла
///
///
///
public bool HasLanguageForExtension(string fileName)
{
return SelectLanguageByExtensionSafe(fileName) != null;
}
///
/// Выбор языка по имени (ILanguage.Name)
///
/// Имя языка
///
public ILanguage SelectLanguageByName(string languageName)
{
foreach (ILanguage language in Languages)
if (language.Name == languageName)
return language;
return null;
}
}
}