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); }
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); } }
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 }); }
private Task Send(CodeChangeMessage message) { return(Initializer.mqttClient.Publish(Serializer.SerializeJson(message), Topics.CODE_CHANGE)); }