예제 #1
0
파일: Main.cs 프로젝트: JamesTryand/OpenIDE
 public static void Main(string[] args)
 {
     Bootstrapper.Initialize();
     args = Bootstrapper.Settings.Parse(args);
     if (args.Length == 0)
     {
         printUsage();
         return;
     }
     var execute = Bootstrapper.GetDispatcher();
     var parser = new CommandStringParser();
     execute.For(
         parser.GetCommand(args),
         parser.GetArguments(args));
 }
예제 #2
0
 void handle(string commandMessage)
 {
     var msg = CommandMessage.New(commandMessage);
     var command = new CommandStringParser().GetArgumentString(msg.Arguments.ToArray());
     var fullCommand = msg.Command + " " + command;
     handle(new MessageArgs(Guid.Empty, fullCommand.Trim()));
 }
예제 #3
0
 public void Execute(string[] arguments)
 {
     var instance = _codeEngineFactory.GetInstance(Environment.CurrentDirectory);
     if (instance == null)
         return;
     var args = "";
     if (arguments.Length == 1)
         args = arguments[0];
     else
         args = new CommandStringParser().GetArgumentString(arguments);
     run(instance, args);
 }
예제 #4
0
 void Handle_editorRecievedMessage(object sender, MessageArgs e)
 {
     var msg = CommandMessage.New(e.Message);
     var command = new CommandStringParser().GetArgumentString(msg.Arguments);
     var fullCommand = msg.Command + " " + command;
     handle(new MessageArgs(Guid.Empty, fullCommand.Trim()));
 }
예제 #5
0
        private static bool handleOiLnk(ref string command, ref string arguments,
                                        string workingDir,
                                        Action<bool, string> onRecievedLine,
                                        KeyValuePair<string,string>[] replacements)
        {
            if (Path.GetExtension(command) != ".oilnk")
                return false;
            var args = new CommandStringParser(' ').Parse(arguments);
            var lnk = OiLnkReader.Read(File.ReadAllText(command));
            foreach (var handler in lnk.Handlers) {
                if (handler.Matches(args.ToArray())) {
                    handler.WriteResponses((line) => onRecievedLine(false, line));
                    return true;
                }
            }
            if (lnk.LinkCommand == null)
                return true;

            var fileDir = Path.GetDirectoryName(command);
            if (fileDir != null && File.Exists(Path.Combine(fileDir, lnk.LinkCommand)))
                command = Path.Combine(fileDir, lnk.LinkCommand);
            else if (File.Exists(Path.Combine(workingDir, lnk.LinkCommand)))
                command = Path.Combine(workingDir, lnk.LinkCommand);
            else
                command = lnk.LinkCommand;

            var originalArguments = arguments;
            foreach (var replacement in replacements)
                originalArguments = originalArguments.Replace(replacement.Key, "");
            arguments =
                lnk.LinkArguments
                    .Replace("{args}", originalArguments).Trim();
            return false;
        }
예제 #6
0
        private void dispatchAndCompleteMessage(string command, Action onCommandCompleted)
        {
            Logger.Write("Dispatching " + command);
            if (command.Length == 0) {
                Console.WriteLine();
            } else if (isError(command)) {
                printError(command);
            } else if (isWarning(command)) {
                printWarning(command);
            } else if (isCommand(command) || isEvent(command)) {
                lock (_commandProcessLock) {
                    _commandsInProcessing++;
                }
                ThreadPool.QueueUserWorkItem((m) => {
                    if (isCommand(command)) {
                        var prefix = getCommandPrefix(command);
                        var parser = new CommandStringParser();
                        var args =
                            parser.Parse(
                                command.Substring(prefix.Length, command.Length - prefix.Length))
                                .ToArray();
                        if (args.Length == 0) {
                            Logger.Write("No commands specified for " + command);
                        }
                        DefinitionCacheItem cmd = null;
                        if (prefix == "command|")
                            cmd = GetDefinitionBuilder().Get(args);
                        else if (prefix == "command-builtin|")
                            cmd = GetDefinitionBuilder().GetBuiltIn(args);
                        else if (prefix == "command-language|")
                            cmd = GetDefinitionBuilder().GetLanguage(args);
                        else if (prefix == "command-languagescript|")
                            cmd = GetDefinitionBuilder().GetLanguageScript(args);
                        else if (prefix == "command-script|")
                            cmd = GetDefinitionBuilder().GetScript(args);
                        else if (prefix == "command-original|")
                            cmd = GetDefinitionBuilder().GetOriginal(args);

                        if (cmd != null) {
                            new CommandRunner(EventDispatcher)
                                .Run(cmd, args);
                        } else {
                            Logger.Write("Could not find handler for " + command);
                        }
                        onCommandCompleted();
                    } else if (isEvent(command)) {
                        var prefix = "event|";
                        EventDispatcher()
                            .Forward(command.Substring(prefix.Length, command.Length - prefix.Length));
                    }
                    lock (_commandProcessLock) {
                        _commandsInProcessing--;
                    }
                }, null);
            } else {
                Console.WriteLine(command);
            }
        }
예제 #7
0
        public string[] Parse(string[] args)
        {
            var newArgs = new List<string>();
            foreach (var arg in args)
            {
                if (arg.StartsWith(DEFAULT_LANGUAGE))
                {
                    DefaultLanguage = arg
                        .Substring(DEFAULT_LANGUAGE.Length, arg.Length - DEFAULT_LANGUAGE.Length);
                    continue;
                }
                else if (arg.StartsWith(ENABLED_LANGUAGES))
                {
                    EnabledLanguages =
                        new CommandStringParser(',')
                            .Parse(arg
                                .Substring(
                                    ENABLED_LANGUAGES.Length,
                                    arg.Length - ENABLED_LANGUAGES.Length)).ToArray();
                    continue;
                } else if (arg == ENABLE_LOGGING) {
                    LoggingEnabled = true;
                    continue;
                } else if (arg == RAW_OUTPUT) {
                    RawOutput = true;
                    continue;
                }

                newArgs.Add(arg);
            }
            return newArgs.ToArray();
        }
예제 #8
0
        private static bool handleOiLnk(ref string command, ref string arguments,
                                        string workingDir,
                                        Action<bool, string> onRecievedLine,
                                        KeyValuePair<string,string>[] replacements)
        {
            if (Path.GetExtension(command) != ".oilnk")
                return false;
            var fileDir = Path.GetDirectoryName(command);
            var args = new CommandStringParser(' ').Parse(arguments);
            var lnk = OiLnkReader.Read(File.ReadAllText(command));

            if ((args.Count() == 2 && args.ElementAt(1) == "get-command-definitions") || (args.Count() == 1 && args.ElementAt(0) == "reactive-script-reacts-to")) {
                // Run preparer if exists
                if (lnk.Preparer != null) {
                    var preparerArgs = new CommandStringParser(' ').Parse(lnk.Preparer);
                    if (preparerArgs.Count() > 0) {
                        var preparerFile = Path.Combine(fileDir, Path.GetFileNameWithoutExtension(command)+"-files", preparerArgs.ElementAt(0));
                        var preparerArguments = "";
                        if (preparerArgs.Count() > 1)
                            preparerArguments = new CommandStringParser(' ').GetArgumentString(preparerArgs.Skip(1).ToArray());
                        Logger.Write("Running preparer: "+preparerFile);
                        if (File.Exists(preparerFile)) {
                            string[] errors;
                            var output = new Process()
                                .QueryAll(preparerFile, preparerArguments, false, workingDir, out errors);
                            var hasErrors = false;
                            foreach (var line in output) {
                                if (line.StartsWith("error|")) {
                                    onRecievedLine(true, line.Substring(6, line.Length-6));
                                    hasErrors = true;
                                }
                            }
                            foreach (var line in errors) {
                                if (line.Trim().Length > 0) {
                                    onRecievedLine(true, line);
                                    hasErrors = true;
                                }
                            }
                            if (hasErrors)
                                return true;
                        }
                    }
                } else {
                    Logger.Write("No preparer registered");
                }
            }

            foreach (var handler in lnk.Handlers) {
                if (handler.Matches(args.ToArray())) {
                    handler.WriteResponses((line) => onRecievedLine(false, line));
                    return true;
                }
            }
            if (lnk.LinkCommand == null)
                return true;

            if (fileDir != null && File.Exists(Path.Combine(fileDir, lnk.LinkCommand)))
                command = Path.Combine(fileDir, lnk.LinkCommand);
            else if (File.Exists(Path.Combine(workingDir, lnk.LinkCommand)))
                command = Path.Combine(workingDir, lnk.LinkCommand);
            else
                command = lnk.LinkCommand;

            // This is a terrible hack, shame on me!!!!!!!
            // If get command definitions don't mess with arguments
            if (
                (args.Count() == 2 && args.ElementAt(1) == "get-command-definitions") ||
                (args.Count() == 1 && args.ElementAt(0) == "reactive-script-reacts-to")
            )
            {
                return false;
            }

            var originalArguments = arguments;
            foreach (var replacement in replacements)
                originalArguments = originalArguments.Replace(replacement.Key, "");
            arguments =
                lnk.LinkArguments
                    .Replace("{args}", originalArguments).Trim();
            return false;
        }
 public void Setup()
 {
     _parser = new CommandStringParser();
 }
예제 #10
0
 private void dispatchMessage(string command)
 {
     if (command.Length == 0)
         return;
     var parser = new CommandStringParser();
     var args = parser.Parse(command);
     if (isError(command))
     {
         printError(command);
         return;
     }
     if (isComment(command))
     {
         printComment(command);
         return;
     }
     _dispatcher.For(
         parser.GetCommand(args),
         parser.GetArguments(args));
 }
예제 #11
0
 private void userSelect(MessageArgs message, Editor editor)
 {
     var state = new ConfigReader(_endpoint.Token).Get("oi.userselect.ui.fallback");
     if (state == "disabled")
         return;
     _ctx.Post((s) =>
         {
             try {
                 var args = new CommandStringParser().Parse(message.Message).ToArray();
                 var items = new List<string>();
                 var keys = new List<string>();
                 foreach (var item in args[3].Split(new[] {','})) {
                     var chunks = item.Split(new[] {"||"}, StringSplitOptions.None);
                     if (chunks.Length > 1) {
                         keys.Add(chunks[0]);
                         items.Add(chunks[1]);
                     } else {
                         keys.Add(item);
                         items.Add(item);
                     }
                 }
                 var command = "user-selected";
                 if (message.Message.StartsWith("user-select-at-caret "))
                     command = "user-selected-at-caret";
                 var form = new UserSelectForm(items, keys, (item) => {
                     if (item != null)
                         _endpoint.PublishEvent(command+" '" + args[2] + "' '"  + item + "'");
                     else
                         _endpoint.PublishEvent(command+" '" + args[2] + "' 'user-cancelled'");
                     editor.SetFocus();
                 });
                 form.Show(this);
                 setToForeground(form);
             } catch {
             }
         }, null);
 }
예제 #12
0
 private void userInput(MessageArgs message, Editor editor)
 {
     Logger.Write("Getting state for userinput fallback");
     var state = new ConfigReader(_endpoint.Token).Get("oi.userinput.ui.fallback");
     Logger.Write("State is "+state);
     if (state == "disabled")
         return;
     _ctx.Post((s) =>
         {
             Logger.Write("Launching user input form");
             try {
                 var args = new CommandStringParser().Parse(message.Message).ToArray();
                 var defaultValue = "";
                 if (args.Length > 3)
                     defaultValue = args[3];
                 var form = new UserInputForm(defaultValue, (item) => {
                     if (item != null)
                         _endpoint.PublishEvent("user-inputted '" + args[2] + "' '"  + item + "'");
                     else
                         _endpoint.PublishEvent("user-inputted '" + args[2] + "' 'user-cancelled'");
                     editor.SetFocus();
                 });
                 form.Show(this);
                 setToForeground(form);
             } catch (Exception ex) {
                 Logger.Write(ex);
             }
         }, null);
 }