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