in Common/Tools/BuildTasks/ExtractLambdasFromXaml.cs [145:244]
private bool ParseInput() {
XamlXmlReader reader = null;
try {
try {
reader = new XamlXmlReader(InputFileName.ItemSpec, new XamlXmlReaderSettings { ProvideLineInfo = true });
} catch (FileNotFoundException ex) {
LogError(1001, ex.Message);
return false;
}
bool classNameExpected = false, classModifierExpected = false;
bool lambdaBodyExpected = false, importedNamespacesExpected = false;
int nestingLevel = 0, lambdaNestingLevel = -1;
while (reader.Read()) {
switch (reader.NodeType) {
case XamlNodeType.GetObject:
++nestingLevel;
break;
case XamlNodeType.StartObject:
++nestingLevel;
if (nestingLevel == 1) {
classNameLineNumber = reader.LineNumber;
}
if ((reader.Type.Name == "Lambda" || reader.Type.Name == "LambdaExtension") && IsLambdaNamespace(reader.Type.PreferredXamlNamespace)) {
lambdaNestingLevel = nestingLevel;
}
break;
case XamlNodeType.EndObject:
--nestingLevel;
if (nestingLevel < lambdaNestingLevel) {
lambdaNestingLevel = -1;
}
break;
case XamlNodeType.StartMember:
if (nestingLevel == 1) {
if (reader.Member.PreferredXamlNamespace == XamlLanguage.Xaml2006Namespace) {
switch (reader.Member.Name) {
case "Class": {
classNameExpected = true;
} break;
case "ClassModifier": {
classModifierExpected = true;
} break;
}
} else if (reader.Member.DeclaringType != null && IsLambdaNamespace(reader.Member.DeclaringType.PreferredXamlNamespace)) {
if (reader.Member.Name == "ImportedNamespaces" && reader.Member.DeclaringType.Name == "LambdaProperties") {
importedNamespacesExpected = true;
}
}
} else if (nestingLevel == lambdaNestingLevel) {
if (reader.Member == XamlLanguage.UnknownContent || reader.Member == XamlLanguage.PositionalParameters || reader.Member.Name == "Lambda") {
lambdaBodyExpected = true;
}
}
break;
case XamlNodeType.EndMember:
classNameExpected = lambdaBodyExpected = importedNamespacesExpected = false;
break;
case XamlNodeType.Value:
if (classNameExpected) {
classNameExpected = false;
className = (string)reader.Value;
classNameLineNumber = reader.LineNumber;
} else if (classModifierExpected) {
classModifierExpected = false;
classModifier = (string)reader.Value;
classModifierLineNumber = reader.LineNumber;
} else if (importedNamespacesExpected) {
importedNamespaces.Clear();
importedNamespaces.AddRange(((string)reader.Value).Split(" \f\n\r\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
importedNamespacesLineNumber = reader.LineNumber;
} else if (lambdaBodyExpected) {
lambdas.Add(new LambdaInfo { Code = (string)reader.Value, LineNumber = reader.LineNumber });
}
break;
}
}
} catch (IOException ex) {
LogError(1002, ex.Message);
return false;
} catch (XmlException ex) {
LogError(1003, ex.Message);
return false;
} catch (XamlException ex) {
LogError(1004, ex.Message);
return false;
} finally {
if (reader != null) {
reader.Close();
}
}
return true;
}