private void SaveScript(object parameter) { ConceptNodeViewModel concept = Shell.SelectedTabViewModel as ConceptNodeViewModel; if (concept == null) { MessageBox.Show("Script is not selected!", ONE_C_SHARP, MessageBoxButton.OK, MessageBoxImage.Information); return; } if (!(concept.SyntaxNode is ScriptConcept script)) { return; } SyntaxTreeJsonSerializer _serializer = new SyntaxTreeJsonSerializer(); var knownTypes = _serializer.Binder.KnownTypes; knownTypes.Add(typeof(ScriptConcept).FullName, typeof(ScriptConcept)); knownTypes.Add(typeof(LanguageConcept).FullName, typeof(LanguageConcept)); foreach (LanguageConcept language in script.Languages) { if (language.Assembly == null) { continue; } foreach (Type type in language.Assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(SyntaxNode)))) { knownTypes.Add(type.FullName, type); } } if (knownTypes.Count == 0) { return; } string filePath = ScriptFilePath; string json = _serializer.ToJson(script); using (StreamWriter writer = File.CreateText(filePath)) { writer.Write(json); } MessageBox.Show("Script has been saved successfully!", ONE_C_SHARP, MessageBoxButton.OK, MessageBoxImage.Information); }