コード例 #1
0
        private async void Ide_DocumentSaved(object sender, DocumentSavedEventArgs e)
        {
            CodeChangeMessage request = new CodeChangeMessage();

            try
            {
                var oldDocument = currentDocument;
                var newDocument = e.Document;

                var oldSyntaxTree = await oldDocument.GetSyntaxTreeAsync();

                var semanticModel = await newDocument.GetSemanticModelAsync();

                var newSynctaxTree = await newDocument.GetSyntaxTreeAsync();

                var diagnostics = semanticModel.GetDiagnostics().Where(x => x.Severity == DiagnosticSeverity.Error);

                if (diagnostics.Count() == 0)
                {
                    request.CodeChange = CompareTree(newSynctaxTree, oldSyntaxTree, semanticModel);
                    currentDocument    = newDocument;
                }
                else
                {
                    var compileError = "";
                    var errorIndex   = 0;
                    foreach (var diagnostic in diagnostics)
                    {
                        errorIndex++;
                        if (compileError != "")
                        {
                            compileError += "\n";
                        }
                        compileError += errorIndex + ". Error: ";
                        compileError += diagnostic.GetMessage() + "\n";
                        compileError += "    at " + diagnostic.Location.GetLineSpan().Path;
                        compileError += ": " + diagnostic.Location.GetLineSpan().StartLinePosition;
                    }

                    request.Error = new Error
                    {
                        CompileError = compileError
                    };
                }
            }
            catch (Exception ex)
            {
                request.Error = new Error
                {
                    ParsingError = ex.Message,
                };
            }

            await Send(request);
        }
コード例 #2
0
 void MqttMessageHandler_NewCodeChangeFound(CodeChangeMessage message)
 {
     try
     {
         if (message.Error == null)
         {
             Runtime.HandleCodeChange(message.CodeChange);
             RequestHandled?.Invoke();
         }
         else if (message.Error.ParsingError != null)
         {
             ParsingError?.Invoke(message.Error.ParsingError);
         }
         else if (message.Error.CompileError != null)
         {
             CompileError?.Invoke(message.Error.CompileError);
         }
     }
     catch (Exception ex)
     {
         Debug.WriteLine(ex);
         ParsingError?.Invoke(ex.Message);
     }
 }
コード例 #3
0
        public CodeChange CompareTree(SyntaxTree newSyntaxTree, SyntaxTree oldSyntaxTree,
                                      SemanticModel semanticModel)
        {
            var codeChangesVisitor = new CodeChangesVisitor();

            codeChangesVisitor.Visit(newSyntaxTree, oldSyntaxTree);

            var updatedMethods = new List <Method>();

            foreach (var mds in codeChangesVisitor.UpdatedMethods)
            {
                var interpreterHandler = new StatementInterpreterHandler(mds, semanticModel);

                var method = interpreterHandler.GetMethod();
                updatedMethods.Add(method);
            }

            var request = new CodeChangeMessage();

            return(new CodeChange
            {
                Methods = updatedMethods
            });
        }
コード例 #4
0
 private Task Send(CodeChangeMessage message)
 {
     return(Initializer.mqttClient.Publish(Serializer.SerializeJson(message), Topics.CODE_CHANGE));
 }