private bool ParseInput()

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;
        }