private static async Task VerifyOptionSetsAsync(Workspace workspace, string language) { var assetBuilder = new AssetBuilder(workspace.CurrentSolution); var serializer = new Serializer(workspace.Services); var asset = assetBuilder.Build(workspace.Options, language, CancellationToken.None); using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize <OptionSet>(asset.Kind, reader, CancellationToken.None); var assetFromStorage = assetBuilder.Build(recovered, language, CancellationToken.None); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); // option should be exactly same Assert.Equal(0, recovered.GetChangedOptions(workspace.Options).Count()); } } }
public void EmptyAssetChecksumTest() { var document = new AdhocWorkspace().CurrentSolution.AddProject("empty", "empty", LanguageNames.CSharp).AddDocument("empty", SourceText.From("")); var assetBuilder = new AssetBuilder(document.Project.Solution); var source = assetBuilder.Build(document.State, document.GetTextAsync().Result, CancellationToken.None); var metadata = assetBuilder.Build(new MissingMetadataReference(), CancellationToken.None); var analyzer = assetBuilder.Build(new AnalyzerFileReference("missing", new MissingAnalyzerLoader()), CancellationToken.None); Assert.NotEqual(source.Checksum, metadata.Checksum); Assert.NotEqual(source.Checksum, analyzer.Checksum); Assert.NotEqual(metadata.Checksum, analyzer.Checksum); }
private static Asset BuildAsset(AssetBuilder builder, string kind, object value) { switch (kind) { case WellKnownChecksumObjects.AnalyzerReference: return(builder.Build((AnalyzerReference)value, CancellationToken.None)); case WellKnownChecksumObjects.MetadataReference: return(builder.Build((MetadataReference)value, CancellationToken.None)); default: throw ExceptionUtilities.UnexpectedValue(kind); } }
public static void Main(string[] args) { // Create dictionary of strings Dictionary <string, string> strings = new Dictionary <string, string> { { "en:hello", "Hello World!" } }; #region Snippet // Create AssetBuilder IAssetBuilder builder = new AssetBuilder(); // Add IAssetSource that adds cache builder.AddCache(); // Add IAssetSource that adds strings builder.AddStrings(strings, LineParameterPrinter.Default); #endregion Snippet // Instantiate IAsset IAsset asset = builder.Build(); // Create string key ILine key = new LineRoot().Key("hello").Culture("en"); // Request string IString value = asset.GetLine(key).GetString(); // Print result Console.WriteLine(value); }
public static void Main(string[] args) { #region Snippet // Create dictionary of strings Dictionary <string, string> strings = new Dictionary <string, string> { { "en:hello", "Hello World!" } }; // Create IAssetSource that adds cache IAssetSource assetSource_0 = new AssetCacheSource(c => c.AddResourceCache().AddStringsCache().AddCulturesCache()); // Create IAssetSource that static reference of IAsset (string dictionary) IAssetSource assetSource_1 = new AssetInstanceSource(new StringAsset(strings, LineParameterPrinter.Default)); // Create AssetBuilder IAssetBuilder builder = new AssetBuilder(assetSource_0, assetSource_1); // Instantiate IAsset IAsset asset = builder.Build(); // Create string key ILine key = new LineRoot().Key("hello").Culture("en"); // Request value IString value = asset.GetLine(key).GetString(); // Print result Console.WriteLine(value); #endregion Snippet }
public void Apply(PolusShipStatus shipStatus) { if (!MapHandler.Load()) { return; } MapData map = MapHandler.GetMap(); PolusHandler polus = new PolusHandler(shipStatus); AssetBuilder builder = new AssetBuilder(polus); polus.ClearTasks(); polus.MoveToTemp(); for (int i = 0; i < map.objs.Length; i++) { MapAsset asset = map.objs[i]; bool success = builder.Build(asset); if (!success) { LILogger.LogError("Failed to build " + asset.name); } else if (i % 1000 == 0) { LILogger.LogMsg(i + " - Objects"); } } polus.DeleteTemp(); LILogger.LogInfo("Applied Map Data"); }
private void AddGlobalAssets(CancellationToken cancellationToken) { using (Logger.LogBlock(FunctionId.RemoteHostClientService_AddGlobalAssetsAsync, cancellationToken)) { var snapshotService = _workspace.Services.GetService <ISolutionChecksumService>(); var assetBuilder = new AssetBuilder(_workspace.CurrentSolution); foreach (var reference in _analyzerService.GetHostAnalyzerReferences()) { var asset = assetBuilder.Build(reference, cancellationToken); snapshotService.AddGlobalAsset(reference, asset, cancellationToken); } } }
public async Task Missing_Analyzer_Serailization_Test() { var workspace = new AdhocWorkspace(); var reference = new AnalyzerFileReference("missing_reference", new MissingAnalyzerLoader()); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNode(workspace.CurrentSolution.State)); // make sure this doesn't throw var assetFromFile = assetBuilder.Build(reference, CancellationToken.None); var assetFromStorage = await CloneAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
public async Task MetadataReference_RoundTrip_Test() { var hostServices = MefHostServices.Create( MefHostServices.DefaultAssemblies.Add(typeof(Host.TemporaryStorageServiceFactory.TemporaryStorageService).Assembly)); var workspace = new AdhocWorkspace(hostServices); var reference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNode(workspace.CurrentSolution.State)); var assetFromFile = assetBuilder.Build(reference, CancellationToken.None); var assetFromStorage = await CloneAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
private static async Task <Asset> CloneMetadataReferenceAssetAsync(Serializer serializer, AssetBuilder assetBuilder, Asset asset) { using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize <MetadataReference>(asset.Kind, reader, CancellationToken.None); var assetFromStorage = assetBuilder.Build(recovered, CancellationToken.None); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); return(assetFromStorage); } } }
private Asset GetOptionsAsset(Solution solution, string language, CancellationToken cancellationToken) { // TODO: we need better way to deal with options. optionSet itself is green node but // it is not part of snapshot and can't save option to solution since we can't use language // specific option without loading related language specific dlls var options = solution.Options; // we have cached options ValueTuple <OptionSet, Asset> value; if (_lastOptionSetPerLanguage.TryGetValue(language, out value) && value.Item1 == options) { return(value.Item2); } // otherwise, we need to build one. var assetBuilder = new AssetBuilder(solution); var asset = assetBuilder.Build(options, language, cancellationToken); _lastOptionSetPerLanguage[language] = ValueTuple.Create(options, asset); return(asset); }
public static void Main(string[] args) { { #region Snippet_0a ILineFileFormat format = LineReaderMap.Default["ini"]; #endregion Snippet_0a } { #region Snippet_0b ILineFileFormat format = IniLinesReader.Default; #endregion Snippet_0b ILineFileFormat format2a = LineReaderMap.Default["json"]; ILineFileFormat format2b = JsonLinesReader.Default; ILineFileFormat format3a = LineReaderMap.Default["xml"]; ILineFileFormat format3b = XmlLinesReader.Default; ILineFileFormat format4a = LineReaderMap.Default["resx"]; ILineFileFormat format4b = ResxLinesReader.Default; ILineFileFormat format5a = LineReaderMap.Default["resources"]; ILineFileFormat format5b = ResourcesLineReader.Default; } { #region Snippet_1a IEnumerable <ILine> key_lines = LineReaderMap.Default.ReadLines( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_1a } { #region Snippet_1b IEnumerable <KeyValuePair <string, IString> > string_lines = LineReaderMap.Default.ReadStringLines( filename: "localization.ini", lineFormat: LineFormat.Parameters, throwIfNotFound: true); #endregion Snippet_1b } { #region Snippet_1c ILineTree tree = LineReaderMap.Default.ReadLineTree( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_1c } { #region Snippet_2a IEnumerable <ILine> key_lines_reader = LineReaderMap.Default.FileReader( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_2a } { #region Snippet_2b IEnumerable <KeyValuePair <string, IString> > string_lines_reader = LineReaderMap.Default.FileReaderAsStringLines( filename: "localization.ini", lineFormat: LineFormat.Parameters, throwIfNotFound: true); #endregion Snippet_2b var lines = string_lines_reader.ToArray(); } { #region Snippet_2c IEnumerable <ILineTree> tree_reader = LineReaderMap.Default.FileReaderAsLineTree( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_2c var lines = tree_reader.ToArray(); } { #region Snippet_3a Assembly asm = typeof(LocalizationReader_Examples).Assembly; IEnumerable <ILine> key_lines_reader = LineReaderMap.Default.EmbeddedReader( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_3a var lines = key_lines_reader.ToArray(); } { Assembly asm = typeof(LocalizationReader_Examples).Assembly; #region Snippet_3b IEnumerable <KeyValuePair <string, IString> > string_lines_reader = LineReaderMap.Default.EmbeddedReaderAsStringLines( assembly: asm, resourceName: "docs.localization.ini", lineFormat: LineFormat.Parameters, throwIfNotFound: true); #endregion Snippet_3b var lines = string_lines_reader.ToArray(); } { Assembly asm = typeof(LocalizationReader_Examples).Assembly; #region Snippet_3c IEnumerable <ILineTree> tree_reader = LineReaderMap.Default.EmbeddedReaderAsLineTree( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_3c var lines = tree_reader.ToArray(); } { #region Snippet_4a IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); IEnumerable <ILine> key_lines_reader = LineReaderMap.Default.FileProviderReader( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_4a var lines = key_lines_reader.ToArray(); } { #region Snippet_4b IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); IEnumerable <KeyValuePair <string, IString> > string_lines_reader = LineReaderMap.Default.FileProviderReaderAsStringLines( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_4b var lines = string_lines_reader.ToArray(); } { #region Snippet_4c IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); IEnumerable <ILineTree> tree_reader = LineReaderMap.Default.FileProviderReaderAsLineTree( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_4c var lines = tree_reader.ToArray(); } { #region Snippet_5a using (Stream s = new FileStream("localization.ini", FileMode.Open, FileAccess.Read)) { IEnumerable <ILine> key_lines = IniLinesReader.Default.ReadLines(s); } #endregion Snippet_5a } { #region Snippet_5b using (Stream s = new FileStream("localization.ini", FileMode.Open, FileAccess.Read)) { IEnumerable <KeyValuePair <string, IString> > string_lines = IniLinesReader.Default.ReadStringLines( stream: s, lineFormat: LineFormat.Parameters); } #endregion Snippet_5b } { #region Snippet_5c using (Stream s = new FileStream("localization.ini", FileMode.Open, FileAccess.Read)) { ILineTree tree = IniLinesReader.Default.ReadLineTree(s); } #endregion Snippet_5c } { #region Snippet_6a string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; using (TextReader tr = new StringReader(text)) { IEnumerable <ILine> key_lines = IniLinesReader.Default.ReadLines(tr); } #endregion Snippet_6a } { string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; #region Snippet_6b using (TextReader tr = new StringReader(text)) { IEnumerable <KeyValuePair <string, IString> > string_lines = IniLinesReader.Default.ReadStringLines( srcText: tr, lineFormat: LineFormat.Parameters); } #endregion Snippet_6b } { string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; #region Snippet_6c using (TextReader tr = new StringReader(text)) { ILineTree tree = IniLinesReader.Default.ReadLineTree(tr); } #endregion Snippet_6c } { #region Snippet_7a string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; IEnumerable <ILine> key_lines = IniLinesReader.Default.ReadString( srcText: text); #endregion Snippet_7a } { string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; #region Snippet_7b IEnumerable <KeyValuePair <string, IString> > string_lines = IniLinesReader.Default.ReadStringAsStringLines( srcText: text, lineFormat: LineFormat.Parameters); #endregion Snippet_7b } { string text = "Culture:en:Type:MyController:Key:Hello = Hello World!\n"; #region Snippet_7c ILineTree tree = IniLinesReader.Default.ReadStringAsLineTree( srcText: text); #endregion Snippet_7c } { #region Snippet_10a IAsset asset = IniLinesReader.Default.FileAsset( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_10a } { #region Snippet_10b Assembly asm = typeof(LocalizationReader_Examples).Assembly; IAsset asset = IniLinesReader.Default.EmbeddedAsset( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_10b } { #region Snippet_10c IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); IAsset asset = IniLinesReader.Default.FileProviderAsset( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_10c } { Assembly asm = typeof(LocalizationReader_Examples).Assembly; IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); #region Snippet_10a2 IAsset asset = LineReaderMap.Default.FileAsset( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_10a2 #region Snippet_10b2 asset = LineReaderMap.Default.EmbeddedAsset( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_10b2 #region Snippet_10c2 asset = LineReaderMap.Default.FileProviderAsset( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_10c2 } { #region Snippet_11a IAssetSource assetSource = IniLinesReader.Default.FileAssetSource( filename: "localization.ini", throwIfNotFound: true); IAssetBuilder assetBuilder = new AssetBuilder().AddSource(assetSource); IAsset asset = assetBuilder.Build(); #endregion Snippet_11a } { #region Snippet_11b Assembly asm = typeof(LocalizationReader_Examples).Assembly; IAssetSource assetSource = IniLinesReader.Default.EmbeddedAssetSource( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_11b } { #region Snippet_11c IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); IAssetSource assetSource = IniLinesReader.Default.FileProviderAssetSource( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_11c } { #region Snippet_11a2 IAssetSource assetSource = LineReaderMap.Default.FileAssetSource( filename: "localization.ini", throwIfNotFound: true); #endregion Snippet_11a2 } { Assembly asm = typeof(LocalizationReader_Examples).Assembly; #region Snippet_11b2 IAssetSource assetSource = LineReaderMap.Default.EmbeddedAssetSource( assembly: asm, resourceName: "docs.localization.ini", throwIfNotFound: true); #endregion Snippet_11b2 } { IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); #region Snippet_11c2 IAssetSource assetSource = LineReaderMap.Default.FileProviderAssetSource( fileProvider: fileProvider, filepath: "localization.ini", throwIfNotFound: true); #endregion Snippet_11c2 } { #region Snippet_7 #endregion Snippet_7 } { #region Snippet_8 #endregion Snippet_8 } { #region Snippet_9 #endregion Snippet_9 } { #region Snippet_12 #endregion Snippet_12 } { #region Snippet_13 #endregion Snippet_13 } { #region Snippet_14 #endregion Snippet_14 } { #region Snippet_15 #endregion Snippet_15 } { #region Snippet_16 #endregion Snippet_16 } { #region Snippet_17 #endregion Snippet_17 } { #region Snippet_18 #endregion Snippet_18 } { #region Snippet_30a // Create writer ILineReader format = new ExtFileFormatReader(); // Clone formats LineFileFormatMap formats = LineReaderMap.Default.Clone(); // Add to clone formats.Add(format); // Or if in deploying application project, format can be added to the global singleton (LineReaderMap.Default as IDictionary <string, ILineFileFormat>).Add(format); #endregion Snippet_30a } }
private static Asset BuildAsset(AssetBuilder builder, string kind, object value) { switch (kind) { case WellKnownChecksumObjects.AnalyzerReference: return builder.Build((AnalyzerReference)value, CancellationToken.None); case WellKnownChecksumObjects.MetadataReference: return builder.Build((MetadataReference)value, CancellationToken.None); default: throw ExceptionUtilities.UnexpectedValue(kind); } }
private void AddGlobalAssets(CancellationToken cancellationToken) { using (Logger.LogBlock(FunctionId.RemoteHostClientService_AddGlobalAssetsAsync, cancellationToken)) { var snapshotService = _workspace.Services.GetService<ISolutionChecksumService>(); var assetBuilder = new AssetBuilder(_workspace.CurrentSolution); foreach (var reference in _analyzerService.GetHostAnalyzerReferences()) { var asset = assetBuilder.Build(reference, cancellationToken); snapshotService.AddGlobalAsset(reference, asset, cancellationToken); } } }
private static async Task<Asset> CloneMetadataReferenceAssetAsync(Serializer serializer, AssetBuilder assetBuilder, Asset asset) { using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize<MetadataReference>(asset.Kind, reader, CancellationToken.None); var assetFromStorage = assetBuilder.Build(recovered, CancellationToken.None); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); return assetFromStorage; } } }
public async Task MetadataReference_RoundTrip_Test() { var hostServices = MefHostServices.Create( MefHostServices.DefaultAssemblies.Add(typeof(Host.TemporaryStorageServiceFactory.TemporaryStorageService).Assembly)); var workspace = new AdhocWorkspace(hostServices); var reference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNode(workspace.CurrentSolution.State)); var assetFromFile = assetBuilder.Build(reference, CancellationToken.None); var assetFromStorage = await CloneMetadataReferenceAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneMetadataReferenceAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
/// <summary> /// 编译FireML /// </summary> public FireMLRoot CompileFireML() { FireMLRoot root = new FireMLRoot(); #region 读取Asset AssetBuilder assetBuilder = new AssetBuilder(this); assetBuilder.Build(assetFiles, root); #endregion #region 构造AST ASTBuilder astBuilder = new ASTBuilder(this); astBuilder.Build(plotFiles, root); #endregion #region AST合法性检查 ASTChecker astChecker = new ASTChecker(this); astChecker.Check(root); #endregion #region 生成ID号 IDGenerator idGenerator = new IDGenerator(); idGenerator.Generate(root); #endregion #region 资源存在性检查 //ContentChecker contentChecker = new ContentChecker(this); //contentChecker.Check(root); #endregion if (errorList.Count > 0) return null; else return root; }
public async Task Missing_Metadata_Serailization_Test() { var workspace = new AdhocWorkspace(); var reference = new MissingMetadataReference(); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNode(workspace.CurrentSolution.State)); // make sure this doesn't throw var assetFromFile = assetBuilder.Build(reference, CancellationToken.None); var assetFromStorage = await CloneAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
private static async Task VerifyOptionSetsAsync(Workspace workspace, string language) { var assetBuilder = new AssetBuilder(workspace.CurrentSolution); var serializer = new Serializer(workspace.Services); var asset = assetBuilder.Build(workspace.Options, language, CancellationToken.None); using (var stream = SerializableBytes.CreateWritableStream()) using (var writer = new ObjectWriter(stream)) { await asset.WriteObjectToAsync(writer, CancellationToken.None).ConfigureAwait(false); stream.Position = 0; using (var reader = new ObjectReader(stream)) { var recovered = serializer.Deserialize<OptionSet>(asset.Kind, reader, CancellationToken.None); var assetFromStorage = assetBuilder.Build(recovered, language, CancellationToken.None); Assert.Equal(asset.Checksum, assetFromStorage.Checksum); // option should be exactly same Assert.Equal(0, recovered.GetChangedOptions(workspace.Options).Count()); } } }
public async Task Missing_Analyzer_Serailization_Desktop_Test() { var hostServices = MefHostServices.Create( MefHostServices.DefaultAssemblies.Add(typeof(Host.TemporaryStorageServiceFactory.TemporaryStorageService).Assembly)); var workspace = new AdhocWorkspace(hostServices); var reference = new AnalyzerFileReference("missing_reference", new MissingAnalyzerLoader()); var serializer = new Serializer(workspace.Services); var trees = new ChecksumTreeCollection(); var assetBuilder = new AssetBuilder(trees.CreateRootTreeNode(workspace.CurrentSolution.State)); // make sure this doesn't throw var assetFromFile = assetBuilder.Build(reference, CancellationToken.None); var assetFromStorage = await CloneAssetAsync(serializer, assetBuilder, assetFromFile).ConfigureAwait(false); var assetFromStorage2 = await CloneAssetAsync(serializer, assetBuilder, assetFromStorage).ConfigureAwait(false); }
private Asset GetOptionsAsset(Solution solution, string language, CancellationToken cancellationToken) { // TODO: we need better way to deal with options. optionSet itself is green node but // it is not part of snapshot and can't save option to solution since we can't use language // specific option without loading related language specific dlls var options = solution.Options; // we have cached options ValueTuple<OptionSet, Asset> value; if (_lastOptionSetPerLanguage.TryGetValue(language, out value) && value.Item1 == options) { return value.Item2; } // otherwise, we need to build one. var assetBuilder = new AssetBuilder(solution); var asset = assetBuilder.Build(options, language, cancellationToken); _lastOptionSetPerLanguage[language] = ValueTuple.Create(options, asset); return asset; }
public static Asset Default(AssetBuilder builder) => builder.Build();