// 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
{
/// <summary>
/// Хранилище языков, поддерживаемых платформой (Singletone)
/// </summary>
public class LanguageProvider
private static readonly Lazy<LanguageProvider> lazyInstanceWrapper = new Lazy<LanguageProvider>(() => new LanguageProvider(), true);
public static LanguageProvider Instance { get { return lazyInstanceWrapper.Value; } }
/// Список всех языков, заполняется классом LanguageIntegrator
public List<ILanguage> Languages { get; private set; } = new List<ILanguage>();
/// Основной язык платформы - PascalABC.NET
public ILanguage MainLanguage
get
return Languages[0];
}
/// Выбор языка по расширению файла - бросает ошибку некорректного расширения
/// <param name="fileName">Имя файла или просто расширение</param>
/// <returns></returns>
/// <exception cref="ParserBadFileExtension"></exception>
public ILanguage SelectLanguageByExtension(string fileName)
return SelectLanguageByExtensionSafe(fileName) ?? throw new ParserBadFileExtension(fileName);
/// Выбор языка по расширению файла - возвращает null, если расширение не то
/// <param name="fileName"></param>
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)
/// <param name="languageName">Имя языка</param>
public ILanguage SelectLanguageByName(string languageName)
if (language.Name == languageName)