// 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; } } }