27ec4c11f6d4a8c46c0b6565dabd6ee460f03d7b
[mono.git] / mcs / class / referencesource / System.Workflow.Activities / Common / CompilerHelpers.cs
1 // Copyright (c) Microsoft Corporation. All rights reserved. 
2 //  
3 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, 
4 // WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
5 // WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. 
6 // THE ENTIRE RISK OF USE OR RESULTS IN CONNECTION WITH THE USE OF THIS CODE 
7 // AND INFORMATION REMAINS WITH THE USER. 
8 //  
9
10
11 /*********************************************************************
12  * NOTE: A copy of this file exists at: WF\Common\Shared
13  * The two files must be kept in sync.  Any change made here must also
14  * be made to WF\Common\Shared\CompilerHelpers.cs
15 *********************************************************************/
16
17 namespace System.Workflow.Activities.Common
18 {
19     using System;
20     using System.Collections;
21     using System.Collections.Specialized;
22     using System.Collections.Generic;
23     using System.CodeDom;
24     using System.CodeDom.Compiler;
25     using System.Workflow.ComponentModel;
26     using Microsoft.CSharp;
27     using Microsoft.VisualBasic;
28     using System.Reflection;
29     using Microsoft.Win32;
30     using System.Security;
31     using System.ComponentModel;
32     using System.IO;
33     using System.Diagnostics.CodeAnalysis;
34     using System.Workflow.ComponentModel.Compiler;
35
36     internal enum SupportedLanguages
37     {
38         VB,
39         CSharp
40     }
41
42     internal static class CompilerHelpers
43     {
44         private const string CompilerVersionKeyword = "CompilerVersion";
45
46         private static Dictionary<Type, Dictionary<string, CodeDomProvider>> providers = null;
47         private static object providersLock = new object();
48
49         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
50         internal static CodeDomProvider CreateCodeProviderInstance(Type type)
51         {
52             return CreateCodeProviderInstance(type, string.Empty);
53         }
54
55         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
56         internal static CodeDomProvider CreateCodeProviderInstance(Type type, string compilerVersion)
57         {
58             CodeDomProvider provider = null;
59             if (string.IsNullOrEmpty(compilerVersion))
60             {
61                 if (type == typeof(CSharpCodeProvider))
62                     provider = new CSharpCodeProvider();
63                 else if (type == typeof(VBCodeProvider))
64                     provider = new VBCodeProvider();
65                 else
66                     provider = (CodeDomProvider)Activator.CreateInstance(type);
67             }
68             else
69             {
70                 //otherwise pass the compiler version parameter into it
71                 Dictionary<string, string> options = new Dictionary<string, string>();
72                 options.Add(CompilerHelpers.CompilerVersionKeyword, compilerVersion);
73                 provider = (CodeDomProvider)Activator.CreateInstance(type, new object[] { options });
74             }
75
76             return provider;
77         }
78
79         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
80         static CodeDomProvider GetCodeProviderInstance(Type type, string compilerVersion)
81         {
82             CodeDomProvider provider;
83             lock (providersLock)
84             {
85                 if (providers == null)
86                 {
87                     providers = new Dictionary<Type, Dictionary<string, CodeDomProvider>>();
88                 }
89
90                 Dictionary<string, CodeDomProvider> typedProviders;
91                 if (!providers.TryGetValue(type, out typedProviders))
92                 {
93                     typedProviders = new Dictionary<string, CodeDomProvider>();
94                     providers.Add(type, typedProviders);
95                 }
96
97                 if (!typedProviders.TryGetValue(compilerVersion, out provider))
98                 {
99                     provider = CreateCodeProviderInstance(type, compilerVersion);
100                     typedProviders.Add(compilerVersion, provider);
101                 }
102             }
103
104             return provider;
105         }
106
107         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
108         internal static CodeDomProvider GetCodeDomProvider(SupportedLanguages language)
109         {
110             return CompilerHelpers.GetCodeDomProvider(language, string.Empty);
111         }
112
113         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
114         internal static CodeDomProvider GetCodeDomProvider(SupportedLanguages language, string compilerVersion)
115         {
116             if (language == SupportedLanguages.CSharp)
117             {
118                 return GetCodeProviderInstance(typeof(CSharpCodeProvider), compilerVersion);
119             }
120             else
121             {
122                 return GetCodeProviderInstance(typeof(VBCodeProvider), compilerVersion);
123             }
124         }
125
126         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
127         internal static SupportedLanguages GetSupportedLanguage(IServiceProvider serviceProvider)
128         {
129             SupportedLanguages supportedLanguage = SupportedLanguages.CSharp;
130             IWorkflowCompilerOptionsService workflowCompilerOptions = serviceProvider.GetService(typeof(IWorkflowCompilerOptionsService)) as IWorkflowCompilerOptionsService;
131             if (workflowCompilerOptions != null)
132                 supportedLanguage = GetSupportedLanguage(workflowCompilerOptions.Language);
133             return supportedLanguage;
134         }
135
136         [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
137         internal static SupportedLanguages GetSupportedLanguage(string language)
138         {
139             SupportedLanguages supportedLanguage = SupportedLanguages.CSharp;
140             if (!String.IsNullOrEmpty(language) &&
141                 (string.Compare(language, "VB", StringComparison.OrdinalIgnoreCase) == 0 ||
142                 string.Compare(language, "VisualBasic", StringComparison.OrdinalIgnoreCase) == 0))
143                 supportedLanguage = SupportedLanguages.VB;
144             return supportedLanguage;
145         }
146     }
147 }