Beispiel #1
0
        public void Parse()
        {
            Targets.Clear();
            SetCommands.Clear();
            allCommands.Clear();
            blocks.Clear();
            Children.Clear();
            projectName = "";

            contentFile = new TextFile(file);
            foreach (Match m in ReadNextCommand())
            {
                try {
                    ParseCommand(m);
                } catch (Exception ex) {
                    throw new Exception(string.Format("Exception: {0}\nFile: {1}", ex.Message, file));
                }
            }

            VariableManager = new CMakeVariableManager(this);

            foreach (CMakeCommand command in targetCommands)
            {
                CMakeTarget target = new CMakeTarget(command, this);

                if (!target.IsAliasOrImported)
                {
                    Targets.Add(string.Format("{0}:{1}", target.Name, command.Offset), target);
                    target.PrintTarget();
                }
            }

            targetCommands.Clear();

            foreach (CMakeFileFormat f in Children.Values)
            {
                targets = targets.Concat(f.Targets).ToDictionary(x => x.Key, x => x.Value);
            }

            if (blocks.Count > 0)
            {
                CMakeCommand c = blocks.Pop();
                throw new Exception(string.Format("Unmatched block command '{0}' in file '{1}' offset '{2}'.", c.Name, file, c.Offset));
            }

            LoggingService.LogDebug("CMake file '{0}' is Loaded.", file);
        }
Beispiel #2
0
        void TraverseArguments(CMakeCommand command, Action <string, CMakeCommand> callback, HashSet <CMakeCommand> commands = null)
        {
            CMakeVariableManager vm = parent.VariableManager;

            if (commands == null)
            {
                commands = new HashSet <CMakeCommand> ();
            }

            if (commands.Contains(command))
            {
                return;
            }

            commands.Add(command);

            foreach (var arg in command.Arguments)
            {
                foreach (var val in arg.GetValues())
                {
                    if (vm.IsVariable(val))
                    {
                        CMakeVariable v = vm.GetVariable(val.Substring(2, val.Length - 3));
                        if (v == null)
                        {
                            continue;
                        }

                        foreach (var c in v.Commands)
                        {
                            TraverseArguments(c, callback, commands);
                        }
                    }
                    else
                    {
                        callback(val, command);
                    }
                }
            }
        }