private static void ProcessCompilersElement(CodeDomCompilationConfiguration result, XmlNode node)
{
// reject attributes
HandlerBase.CheckForUnrecognizedAttributes(node);
String configFile = ConfigurationErrorsException.GetFilename(node);
foreach (XmlNode child in node.ChildNodes)
{
int configLineNumber = ConfigurationErrorsException.GetLineNumber(child);
// skip whitespace and comments
// reject nonelements
if (HandlerBase.IsIgnorableAlsoCheckForNonElement(child))
{
continue;
}
if (child.Name != "compiler")
{
HandlerBase.ThrowUnrecognizedElement(child);
}
String languages = String.Empty;
XmlNode languageNode = HandlerBase.GetAndRemoveRequiredNonEmptyStringAttribute(child, "language", ref languages);
String extensions = String.Empty;
HandlerBase.GetAndRemoveRequiredNonEmptyStringAttribute(child, "extension", ref extensions);
String compilerTypeName = null;
HandlerBase.GetAndRemoveRequiredNonEmptyStringAttribute(child, "type", ref compilerTypeName);
// Create a CompilerParameters for this compiler.
CompilerParameters compilerParams = new CompilerParameters();
int warningLevel = 0;
if (HandlerBase.GetAndRemoveNonNegativeIntegerAttribute(child, "warningLevel", ref warningLevel) != null)
{
compilerParams.WarningLevel = warningLevel;
// Need to be false if the warning level is 0
compilerParams.TreatWarningsAsErrors = (warningLevel > 0);
}
String compilerOptions = null;
if (HandlerBase.GetAndRemoveStringAttribute(child, "compilerOptions", ref compilerOptions) != null)
{
compilerParams.CompilerOptions = compilerOptions;
}
HandlerBase.CheckForUnrecognizedAttributes(child);
HandlerBase.CheckForChildNodes(child);
// Create a CompilerInfo structure for this compiler
CompilerInfo compilerInfo = new CompilerInfo(compilerParams, compilerTypeName);
compilerInfo.configFileName = configFile;
compilerInfo.configFileLineNumber = configLineNumber;
// Parse the semicolon separated lists
string[] languageList = languages.Split(s_fieldSeparators);
string[] extensionList = extensions.Split(s_fieldSeparators);
for (int i = 0; i < languageList.Length; i++)
{
languageList[i] = languageList[i].Trim();
}
for (int i = 0; i < extensionList.Length; i++)
{
extensionList[i] = extensionList[i].Trim();
}
// Validate language names, language names must have length and extensions must start with a period.
foreach (string language in languageList)
{
if (language.Length == 0)
{
throw new ConfigurationErrorsException(SR.GetString(SR.Language_Names_Cannot_Be_Empty));
}
}
foreach (string extension in extensionList)
{
if (extension.Length == 0 || extension[0] != '.')
{
throw new ConfigurationErrorsException(SR.GetString(SR.Extension_Names_Cannot_Be_Empty_Or_Non_Period_Based));
}
}
compilerInfo._compilerLanguages = languageList;
compilerInfo._compilerExtensions = extensionList;
result.AddCompilerInfo(compilerInfo);
}
// Allow config options to replace redundant compiler entries
result.RemoveUnmapped();
}