public static Action GenerateFile(ProjectFile file, SingleFileCustomToolResult result, bool internalClass) { return(delegate { var dnp = file.Project as DotNetProject; if (dnp == null) { var err = "ResXFileCodeGenerator can only be used with .NET projects"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var provider = dnp.LanguageBinding.GetCodeDomProvider(); if (provider == null) { var err = "ResXFileCodeGenerator can only be used with languages that support CodeDOM"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var outputfile = file.FilePath.ChangeExtension(".Designer." + provider.FileExtension); var ns = CustomToolService.GetFileNamespace(file, outputfile); var cn = provider.CreateValidIdentifier(file.FilePath.FileNameWithoutExtension); var rd = new Dictionary <object, object> (); using (var r = new ResXResourceReader(file.FilePath)) { r.UseResXDataNodes = true; r.BasePath = file.FilePath.ParentDirectory; foreach (DictionaryEntry e in r) { rd.Add(e.Key, e.Value); } } string[] unmatchable; var ccu = StronglyTypedResourceBuilder.Create(rd, cn, ns, provider, internalClass, out unmatchable); if (TargetsPcl2Framework(dnp)) { FixupPclTypeInfo(ccu); } foreach (var p in unmatchable) { var msg = string.Format("Could not generate property for resource ID '{0}'", p); result.Errors.Add(new CompilerError(file.FilePath, 0, 0, null, msg)); } using (var w = new StreamWriter(outputfile, false, Encoding.UTF8)) provider.GenerateCodeFromCompileUnit(ccu, w, new CodeGeneratorOptions()); result.GeneratedFilePath = outputfile; }); }
public static Action GenerateFile(ProjectFile file, SingleFileCustomToolResult result, bool internalClass) { return(delegate { var dnp = file.Project as DotNetProject; if (dnp == null) { var err = "ResXFileCodeGenerator can only be used with .NET projects"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var provider = dnp.LanguageBinding.GetCodeDomProvider(); if (provider == null) { var err = "ResXFileCodeGenerator can only be used with languages that support CodeDOM"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var outputfile = file.FilePath.ChangeExtension(".Designer." + provider.FileExtension); var ns = CustomToolService.GetFileNamespace(file, outputfile); var cn = provider.CreateValidIdentifier(file.FilePath.FileNameWithoutExtension); string[] unmatchable; var ccu = StronglyTypedResourceBuilder.Create(file.FilePath, cn, ns, provider, internalClass, out unmatchable); foreach (var p in unmatchable) { var msg = string.Format("Could not generate property for resource ID '{0}'", p); result.Errors.Add(new CompilerError(file.FilePath, 0, 0, null, msg)); } using (var w = new StreamWriter(outputfile, false, Encoding.UTF8)) provider.GenerateCodeFromCompileUnit(ccu, w, new CodeGeneratorOptions()); result.GeneratedFilePath = outputfile; }); }
public async static Task GenerateFile(ProjectFile file, SingleFileCustomToolResult result, bool internalClass) { var dnp = file.Project as DotNetProject; if (dnp == null) { var err = "ResXFileCodeGenerator can only be used with .NET projects"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var provider = dnp.LanguageBinding.GetCodeDomProvider(); if (provider == null) { const string err = "ResXFileCodeGenerator can only be used with languages that support CodeDOM"; result.Errors.Add(new CompilerError(null, 0, 0, null, err)); return; } var outputfile = file.FilePath.ChangeExtension(".Designer." + provider.FileExtension); //use the Visual Studio naming polict, so it matches code generated by VS var codeNamespace = CustomToolService.GetFileNamespace(file, outputfile, true); //no need to escape/cleanup, StronglyTypedResourceBuilder does that var name = file.FilePath.FileNameWithoutExtension; //NOTE: we fix it up later with the real resource ID, this is just a fallback in case that fails var resourcesNamespace = dnp.GetDefaultNamespace(outputfile, true); var rd = new Dictionary <object, object> (); var filePath = file.FilePath; var targetsPcl2Framework = TargetsPcl2Framework(dnp); //Compute the *real* ID of the embedded resource. It can be affected by LogicalName so might not match the //class name, but StronglyTypedResourceBuilder only accepts a single name for both. //Fix this by patching it into the CodeDOM later. var id = file.ResourceId; const string suffix = ".resources"; if (id.Length > suffix.Length && id.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)) { id = id.Substring(0, id.Length - suffix.Length); } await Task.Run(() => { using (var r = new ResXResourceReader(filePath)) { r.BasePath = filePath.ParentDirectory; foreach (DictionaryEntry e in r) { rd.Add(e.Key, e.Value); } } string[] unmatchable; var ccu = StronglyTypedResourceBuilder.Create(rd, name, codeNamespace, resourcesNamespace, provider, internalClass, out unmatchable); if (targetsPcl2Framework) { FixupPclTypeInfo(ccu); } FixupEmbeddedResourceID(ccu, id); foreach (var p in unmatchable) { var msg = string.Format("Could not generate property for resource ID '{0}'", p); result.Errors.Add(new CompilerError(filePath, 0, 0, null, msg)); } lock (file) { // Avoid race if ResXFileCodeGenerator is called more than once for the same file using (var w = new StreamWriter(outputfile, false, Encoding.UTF8)) provider.GenerateCodeFromCompileUnit(ccu, w, new CodeGeneratorOptions()); } result.GeneratedFilePath = outputfile; }); }