[education/rkward] rkward/core: Set QT_NO_CAST_FROM_ASCII in core folder

Thomas Friedrichsmeier null at kde.org
Thu Apr 24 12:46:32 BST 2025


Git commit 2ae44633579ac590ff7be9e2e9f865f6dddd83cd by Thomas Friedrichsmeier.
Committed on 24/04/2025 at 11:46.
Pushed by tfry into branch 'master'.

Set QT_NO_CAST_FROM_ASCII in core folder

M  +1    -0    rkward/core/CMakeLists.txt
M  +17   -17   rkward/core/rcontainerobject.cpp
M  +28   -31   rkward/core/renvironmentobject.cpp
M  +8    -8    rkward/core/rfunctionobject.cpp
M  +17   -17   rkward/core/rkmodificationtracker.cpp
M  +26   -25   rkward/core/rkpseudoobjects.cpp
M  +16   -16   rkward/core/rkrownames.cpp
M  +115  -115  rkward/core/rkvariable.cpp
M  +144  -135  rkward/core/robject.cpp
M  +2    -0    rkward/core/robject.h
M  +25   -27   rkward/core/robjectlist.cpp

https://invent.kde.org/education/rkward/-/commit/2ae44633579ac590ff7be9e2e9f865f6dddd83cd

diff --git a/rkward/core/CMakeLists.txt b/rkward/core/CMakeLists.txt
index 57e93b587..0d45b956f 100644
--- a/rkward/core/CMakeLists.txt
+++ b/rkward/core/CMakeLists.txt
@@ -18,4 +18,5 @@ SET(core_STAT_SRCS
 
 ADD_LIBRARY(core STATIC ${core_STAT_SRCS})
 TARGET_LINK_LIBRARIES(core Qt6::Core Qt6::Widgets KF6::WidgetsAddons KF6::I18n KF6::Parts)
+add_definitions(-DQT_NO_CAST_FROM_ASCII) # TODO remove, here, once enabled on top level
 
diff --git a/rkward/core/rcontainerobject.cpp b/rkward/core/rcontainerobject.cpp
index cbeb8a4c2..3281dec5a 100644
--- a/rkward/core/rcontainerobject.cpp
+++ b/rkward/core/rcontainerobject.cpp
@@ -356,38 +356,38 @@ void RContainerObject::removeChild (RObject *object, bool removed_in_workspace)
 	delete object;
 }
 
-QString RContainerObject::removeChildCommand (RObject *object) const {
-	RK_TRACE (OBJECTS);
+QString RContainerObject::removeChildCommand(RObject *object) const {
+	RK_TRACE(OBJECTS);
 
-	return (object->getFullName () + " <- NULL");
+	return (object->getFullName() + u" <- NULL"_s);
 }
 
-QString RContainerObject::renameChildCommand (RObject *object, const QString &new_name) const {
-	RK_TRACE (OBJECTS);
+QString RContainerObject::renameChildCommand(RObject *object, const QString &new_name) const {
+	RK_TRACE(OBJECTS);
 
-	return ("rk.rename.in.container (" + getFullName () + ", \"" + object->getShortName () + "\", \"" + new_name + "\")");
+	return (u"rk.rename.in.container ("_s + getFullName() + u", \""_s + object->getShortName() + u"\", \""_s + new_name + u"\")"_s);
 }
 
-QString RContainerObject::validizeName (const QString &child_name, bool unique) const {
-	RK_TRACE (OBJECTS);
-	RK_ASSERT (isType (GlobalEnv) || isInGlobalEnv ());
+QString RContainerObject::validizeName(const QString &child_name, bool unique) const {
+	RK_TRACE(OBJECTS);
+	RK_ASSERT(isType(GlobalEnv) || isInGlobalEnv());
 	static const QRegularExpression validizename1(QStringLiteral("[^a-zA-Z0-9_]"));
 	static const QRegularExpression validizename2(QStringLiteral("^\\.*[0-9]+"));
 
 	QString ret = child_name;
-	if (ret.isEmpty ()) ret = QLatin1String("var");
+	if (ret.isEmpty()) ret = u"var"_s;
 	else {
-		ret = ret.replace(validizename1, QLatin1String("."));
-		ret = ret.replace(validizename2, QLatin1String("."));
+		ret = ret.replace(validizename1, u"."_s);
+		ret = ret.replace(validizename2, u"."_s);
 	}
 	if (!unique) return ret;
 
-// NOTE: this is potentially a quadratic time algorithm with respect to number of children.
-// Its only called on user actions, though, and hopefully users will not keep all objects named "varX".
-	int i=0;
+	// NOTE: this is potentially a quadratic time algorithm with respect to number of children.
+	// Its only called on user actions, though, and hopefully users will not keep all objects named "varX".
+	int i = 0;
 	QString postfix;
-	while (findChildByName (ret + postfix)) {
-		postfix.setNum (++i);
+	while (findChildByName(ret + postfix)) {
+		postfix.setNum(++i);
 	}
 	return (ret + postfix);
 }
diff --git a/rkward/core/renvironmentobject.cpp b/rkward/core/renvironmentobject.cpp
index 872e0065c..33b573ceb 100644
--- a/rkward/core/renvironmentobject.cpp
+++ b/rkward/core/renvironmentobject.cpp
@@ -18,17 +18,17 @@ SPDX-License-Identifier: GPL-2.0-or-later
 
 #include "../debug.h"
 
-REnvironmentObject::REnvironmentObject (RContainerObject *parent, const QString &name) : RContainerObject (parent, name) {
-	RK_TRACE (OBJECTS);
+REnvironmentObject::REnvironmentObject(RContainerObject *parent, const QString &name) : RContainerObject(parent, name) {
+	RK_TRACE(OBJECTS);
 
 	type = Environment;
-	if (parent == RObjectList::getObjectList ()) {
+	if (parent == RObjectList::getObjectList()) {
 		type |= ToplevelEnv;
-		if (name.contains (':')) {
+		if (name.contains(u':')) {
 			type |= PackageEnv;
 		}
 	} else if (parent == nullptr) {
-		RK_ASSERT(name == QStringLiteral(".GlobalEnv"));
+		RK_ASSERT(name == u".GlobalEnv"_s);
 		type |= ToplevelEnv | GlobalEnv;
 	}
 }
@@ -44,43 +44,40 @@ QString REnvironmentObject::getObjectDescription () const {
 	return RContainerObject::getObjectDescription ();
 }
 
-QString REnvironmentObject::packageName () const {
-	RK_ASSERT (isType (PackageEnv));
-	if (!isType (PackageEnv)) RK_DEBUG (OBJECTS, DL_WARNING, "%s", qPrintable (name));
-	return name.section (':', 1);
+QString REnvironmentObject::packageName() const {
+	RK_ASSERT(isType(PackageEnv));
+	if (!isType(PackageEnv)) RK_DEBUG(OBJECTS, DL_WARNING, "%s", qPrintable(name));
+	return name.section(u':', 1);
 }
 
-QString REnvironmentObject::getFullName (int options) const {
-	RK_TRACE (OBJECTS);
+QString REnvironmentObject::getFullName(int options) const {
+	RK_TRACE(OBJECTS);
 
-	if (type & GlobalEnv) return name;	// .GlobalEnv
-	if ((type & ToplevelEnv) && (options & IncludeEnvirIfNotGlobalEnv)) return ("as.environment (" + rQuote (name) + ')');
+	if (type & GlobalEnv) return name;  // .GlobalEnv
+	if ((type & ToplevelEnv) && (options & IncludeEnvirIfNotGlobalEnv)) return (u"as.environment ("_s + rQuote(name) + u')');
 	return parent->makeChildName(name, options);
 }
 
-QString REnvironmentObject::makeChildName (const QString &short_child_name, int options) const {
-	RK_TRACE (OBJECTS);
+QString REnvironmentObject::makeChildName(const QString &short_child_name, int options) const {
+	RK_TRACE(OBJECTS);
 
 	QString safe_name;
 	bool irregular = false;
-	if (irregularShortName (short_child_name)) {
+	if (irregularShortName(short_child_name)) {
 		irregular = true;
-		safe_name = rQuote (short_child_name);
+		safe_name = rQuote(short_child_name);
 	} else safe_name = short_child_name;
 
-	if (type & GlobalEnv) {		// don't print as ".GlobalEnv$something" unless asked to, or childname needs fixing
-		if (irregular || (options & IncludeEnvirForGlobalEnv)) return (getShortName () + '$' + safe_name);
+	if (type & GlobalEnv) {  // don't print as ".GlobalEnv$something" unless asked to, or childname needs fixing
+		if (irregular || (options & IncludeEnvirForGlobalEnv)) return (getShortName() + u'$' + safe_name);
 		return (safe_name);
 	}
 	if (type & ToplevelEnv) {
 		if (!(options & IncludeEnvirIfNotGlobalEnv)) return (short_child_name);
-/* Some items are placed outside of their native namespace. E.g. in package:boot item "motor". It can be retrieved using as.environment ("package:boot")$motor. This is extremely ugly. We need to give them (and only them) this special treatment. */
-// TODO: hopefully one day operator "::" will work even in those cases. So check back later, and remove after a sufficient amount of backwards compatibility time
-// NOTE: This appears to have been fixed in R 2.14.0, when all packages were forced to have namespaces. Currently backend has a version check to set "misplaced", appropriately.
-		if (type & PackageEnv) return (packageName() + "::" + safe_name);
-		return (getFullName(options) + '$' + safe_name);
+		if (type & PackageEnv) return (packageName() + u"::"_s + safe_name);
+		return (getFullName(options) + u'$' + safe_name);
 	}
-	return (getFullName (options) + '$' + safe_name);
+	return (getFullName(options) + u'$' + safe_name);
 }
 
 void REnvironmentObject::writeMetaData (RCommandChain *chain) {
@@ -165,14 +162,14 @@ void REnvironmentObject::updateNamespace (RData* new_data) {
 	}
 }
 
-QString REnvironmentObject::renameChildCommand (RObject *object, const QString &new_name) const {
-	RK_TRACE (OBJECTS);
+QString REnvironmentObject::renameChildCommand(RObject *object, const QString &new_name) const {
+	RK_TRACE(OBJECTS);
 
-	return (makeChildName(new_name, IncludeEnvirIfNotGlobalEnv) + " <- " + object->getFullName() + '\n' + removeChildCommand(object));
+	return (makeChildName(new_name, IncludeEnvirIfNotGlobalEnv) + u" <- "_s + object->getFullName() + u'\n' + removeChildCommand(object));
 }
 
-QString REnvironmentObject::removeChildCommand (RObject *object) const {
-	RK_TRACE (OBJECTS);
+QString REnvironmentObject::removeChildCommand(RObject *object) const {
+	RK_TRACE(OBJECTS);
 
-	return ("remove (" + object->getFullName () + ')');
+	return (u"remove ("_s + object->getFullName() + u')');
 }
diff --git a/rkward/core/rfunctionobject.cpp b/rkward/core/rfunctionobject.cpp
index 9c685e756..79f71b544 100644
--- a/rkward/core/rfunctionobject.cpp
+++ b/rkward/core/rfunctionobject.cpp
@@ -21,16 +21,16 @@ RFunctionObject::~RFunctionObject () {
 	RK_TRACE (OBJECTS);
 }
 
-QString RFunctionObject::printArgs () const {
-	RK_TRACE (OBJECTS);
+QString RFunctionObject::printArgs() const {
+	RK_TRACE(OBJECTS);
 
 	QString ret;
-	for (int i = 0; i < argnames.size (); ++i) {
-		if (i) ret.append (", ");
-		ret.append (argnames[i]);
-		if (!argvalues[i].isEmpty ()) {
-			ret.append ("=");
-			ret.append (argvalues[i]);
+	for (int i = 0; i < argnames.size(); ++i) {
+		if (i) ret.append(u", "_s);
+		ret.append(argnames[i]);
+		if (!argvalues[i].isEmpty()) {
+			ret.append(u'=');
+			ret.append(argvalues[i]);
 		}
 	}
 	return ret;
diff --git a/rkward/core/rkmodificationtracker.cpp b/rkward/core/rkmodificationtracker.cpp
index d03cd0531..b642eca8f 100644
--- a/rkward/core/rkmodificationtracker.cpp
+++ b/rkward/core/rkmodificationtracker.cpp
@@ -306,40 +306,40 @@ int RKObjectListModel::columnCount (const QModelIndex&) const {
 	return ColumnCount;
 }
 
-QVariant RKObjectListModel::data (const QModelIndex& index, int role) const {
-	RK_TRACE (OBJECTS);
+QVariant RKObjectListModel::data(const QModelIndex& index, int role) const {
+	RK_TRACE(OBJECTS);
 
-	int col = index.column ();
-	RObject *object = static_cast<RObject*> (index.internalPointer ());
+	int col = index.column();
+	RObject* object = static_cast<RObject*>(index.internalPointer());
 
 	if (!object) {
-		RK_ASSERT (object);
-		return QVariant ();
+		RK_ASSERT(object);
+		return QVariant();
 	}
 
 	if (role == Qt::DisplayRole) {
-		if (col == NameColumn) return object->getShortName ();
-		if (col == LabelColumn) return object->getLabel ();
+		if (col == NameColumn) return object->getShortName();
+		if (col == LabelColumn) return object->getLabel();
 		if (col == TypeColumn) {
-			if (object->isVariable ()) return RObject::typeToText (object->getDataType ());
-			return QVariant ();
+			if (object->isVariable()) return RObject::typeToText(object->getDataType());
+			return QVariant();
 		}
-		if ((col == ClassColumn) && (!object->isPseudoObject ())) return object->makeClassString (QStringLiteral("; "));
+		if ((col == ClassColumn) && (!object->isPseudoObject())) return object->makeClassString(QStringLiteral("; "));
 	} else if (role == Qt::FontRole) {
-		if (col == NameColumn && object->isPseudoObject ()) {
+		if (col == NameColumn && object->isPseudoObject()) {
 			QFont font;
-			font.setItalic (true);
+			font.setItalic(true);
 			return (font);
 		}
 	} else if (role == Qt::DecorationRole) {
-		if (col == NameColumn) return RKStandardIcons::iconForObject (object);
+		if (col == NameColumn) return RKStandardIcons::iconForObject(object);
 	} else if (role == Qt::ToolTipRole) {
-		QString ret = QStringLiteral("<i>") + object->getShortName().replace('<', QLatin1String("<")) + "</i><br>" + object->getObjectDescription();
+		QString ret = u"<i>"_s + object->getShortName().replace(u'<', u"<"_s) + u"</i><br>"_s + object->getObjectDescription();
 		return ret;
 	}
 
-	RK_ASSERT (col < columnCount ());
-	return QVariant ();
+	RK_ASSERT(col < columnCount());
+	return QVariant();
 }
 
 QVariant RKObjectListModel::headerData (int section, Qt::Orientation orientation, int role) const {
diff --git a/rkward/core/rkpseudoobjects.cpp b/rkward/core/rkpseudoobjects.cpp
index a028afc53..4ef0e7bf1 100644
--- a/rkward/core/rkpseudoobjects.cpp
+++ b/rkward/core/rkpseudoobjects.cpp
@@ -22,46 +22,47 @@ RSlotsPseudoObject::~RSlotsPseudoObject () {
 	pseudo_object_types.remove (this);
 }
 
-QString RSlotsPseudoObject::getFullName (int options) const {
-	RK_TRACE (OBJECTS);
+QString RSlotsPseudoObject::getFullName(int options) const {
+	RK_TRACE(OBJECTS);
 
-	return (".rk.get.slots (" + parent->getFullName (options) + ')');
+	return (u".rk.get.slots ("_s + parent->getFullName(options) + u')');
 }
 
 QString RSlotsPseudoObject::makeChildName(const QString &short_child_name, int options) const {
-	RK_TRACE (OBJECTS);
+	RK_TRACE(OBJECTS);
 
 	if (options & ExplicitSlotsExpansion) {
-		return (QStringLiteral("slot(") + parent->getFullName (options) + QStringLiteral(", ") + rQuote(short_child_name) + ')');
+		return (u"slot("_s + parent->getFullName(options) + u", "_s + rQuote(short_child_name) + u')');
 	}
 	QString safe_name = short_child_name;
-	if (irregularShortName (safe_name)) safe_name = rQuote (short_child_name);
-	return (parent->getFullName (options) + '@' + safe_name);
+	if (irregularShortName(safe_name)) safe_name = rQuote(short_child_name);
+	return (parent->getFullName(options) + u'@' + safe_name);
 }
 
-RKNamespaceObject::RKNamespaceObject (REnvironmentObject* package, const QString &name) : REnvironmentObject (package, name.isNull () ? QStringLiteral("NAMESPACE") : name) {
-	RK_TRACE (OBJECTS);
+RKNamespaceObject::RKNamespaceObject(REnvironmentObject* package, const QString& name)
+    : REnvironmentObject(package, name.isNull() ? u"NAMESPACE"_s : name) {
+	RK_TRACE(OBJECTS);
 	type |= PseudoObject;
-	pseudo_object_types.insert (this, NamespaceObject);
-	if (name.isNull ()) namespace_name = package->packageName ();
+	pseudo_object_types.insert(this, NamespaceObject);
+	if (name.isNull()) namespace_name = package->packageName();
 	else namespace_name = name;
 }
 
-RKNamespaceObject::~RKNamespaceObject () {
-	RK_TRACE (OBJECTS);
-	pseudo_object_types.remove (this);
+RKNamespaceObject::~RKNamespaceObject() {
+	RK_TRACE(OBJECTS);
+	pseudo_object_types.remove(this);
 }
 
-QString RKNamespaceObject::getFullName (int) const {
-	RK_TRACE (OBJECTS);
-	return ("asNamespace (" + rQuote (namespace_name) + ')');
+QString RKNamespaceObject::getFullName(int) const {
+	RK_TRACE(OBJECTS);
+	return (u"asNamespace ("_s + rQuote(namespace_name) + u')');
 }
 
 QString RKNamespaceObject::makeChildName(const QString& short_child_name, int) const {
-	RK_TRACE (OBJECTS);
+	RK_TRACE(OBJECTS);
 	QString safe_name = short_child_name;
-	if (irregularShortName (safe_name)) safe_name = rQuote (short_child_name);
-	return (namespace_name + ":::" + safe_name);
+	if (irregularShortName(safe_name)) safe_name = rQuote(short_child_name);
+	return (namespace_name + u":::"_s + safe_name);
 }
 
 #include "robjectlist.h"
@@ -79,14 +80,14 @@ RKOrphanNamespacesObject::~RKOrphanNamespacesObject () {
 	pseudo_object_types.remove (this);
 }
 
-QString RKOrphanNamespacesObject::getFullName (int) const {
-	RK_TRACE (OBJECTS);
-	return ("loadedNamespaces ()");
+QString RKOrphanNamespacesObject::getFullName(int) const {
+	RK_TRACE(OBJECTS);
+	return u"loadedNamespaces ()"_s;
 }
 
 QString RKOrphanNamespacesObject::makeChildName(const QString& short_child_name, int) const {
-	RK_TRACE (OBJECTS);
-	return ("asNamespace (" + rQuote (short_child_name) + ')');
+	RK_TRACE(OBJECTS);
+	return (u"asNamespace ("_s + rQuote(short_child_name) + u')');
 }
 
 void RKOrphanNamespacesObject::updateFromR (RCommandChain* chain) {
diff --git a/rkward/core/rkrownames.cpp b/rkward/core/rkrownames.cpp
index 71cda5fb9..93f107d98 100644
--- a/rkward/core/rkrownames.cpp
+++ b/rkward/core/rkrownames.cpp
@@ -51,32 +51,32 @@ void RKRowNames::beginEdit () {
 	}
 }
 
-QString RKRowNames::getFullName (int options) const {
-//	RK_TRACE (OBJECTS);
+QString RKRowNames::getFullName(int options) const {
+	//	RK_TRACE (OBJECTS);
 
-	return ("row.names (" + parent->getFullName (options) + ')');
+	return (u"row.names ("_s + parent->getFullName(options) + u')');
 }
 
-void RKRowNames::writeData (int from_row, int to_row, RCommandChain *chain) {
-	RK_TRACE (OBJECTS);
+void RKRowNames::writeData(int from_row, int to_row, RCommandChain *chain) {
+	RK_TRACE(OBJECTS);
 
-	if (isSequential ()) {
-		RCommand *command = new RCommand(getFullName(DefaultObjectNameOptions) + " <- NULL", RCommand::App | RCommand::Sync);
+	if (isSequential()) {
+		RCommand *command = new RCommand(getFullName(DefaultObjectNameOptions) + u" <- NULL"_s, RCommand::App | RCommand::Sync);
 		command->setUpdatesObject(this);
 		RInterface::issueCommand(command, chain);
 	} else {
 		// unfortunately, we always need to write the whole data, as row.names<- does not support indexing.
-		QString data_string = QStringLiteral("c (");
-		for (int row = 0; row < getLength (); ++row) {
+		QString data_string = u"c ("_s;
+		for (int row = 0; row < getLength(); ++row) {
 			// TODO: use getCharacter and direct setting of vectors.
-			data_string.append (getRText (row));
-			if (row != (getLength () - 1)) {
-				data_string.append (", ");
+			data_string.append(getRText(row));
+			if (row != (getLength() - 1)) {
+				data_string.append(u", "_s);
 			}
 		}
-		data_string.append (")");
+		data_string.append(u')');
 
-		RCommand* command = new RCommand(getFullName(DefaultObjectNameOptions) + " <- " + data_string, RCommand::App | RCommand::Sync);
+		RCommand *command = new RCommand(getFullName(DefaultObjectNameOptions) + u" <- "_s + data_string, RCommand::App | RCommand::Sync);
 		command->setUpdatesObject(this);
 		RInterface::issueCommand(command, chain);
 	}
@@ -84,7 +84,7 @@ void RKRowNames::writeData (int from_row, int to_row, RCommandChain *chain) {
 	ChangeSet *set = new ChangeSet;
 	set->from_index = from_row;
 	set->to_index = to_row;
-	RKModificationTracker::instance()->objectDataChanged (this, set);
+	RKModificationTracker::instance()->objectDataChanged(this, set);
 }
 
 void RKRowNames::setText (int row, const QString &text) {
@@ -156,7 +156,7 @@ bool RKRowNames::makeUnique (QString *text, bool non_sequentials_only) {
 		}
 
 		// try adjusted text on next iteration
-		dummy = *text + '.' + QString::number (i);
+		dummy = *text + u'.' + QString::number(i);
 	}
 
 	RK_ASSERT (false);
diff --git a/rkward/core/rkvariable.cpp b/rkward/core/rkvariable.cpp
index 88b821e7f..59828dc65 100644
--- a/rkward/core/rkvariable.cpp
+++ b/rkward/core/rkvariable.cpp
@@ -76,12 +76,12 @@ void RKVariable::setVarType (RObject::RDataType new_type, bool sync) {
 		for (int i = list.size () - 1; i >= 0; --i) setText (i, list[i]);
 
 		if (sync) {
-			QString command = ".rk.set.vector.mode(" + getFullName () + ", ";
-			if (new_type == RObject::DataCharacter) command += QLatin1String("as.character");
-			else if (new_type == RObject::DataNumeric) command += QLatin1String("as.numeric");
-			else if (new_type == RObject::DataLogical) command += QLatin1String("as.logical");
-			else if (new_type == RObject::DataFactor) command += QLatin1String("as.factor");
-			command += ')';
+			QString command = u".rk.set.vector.mode("_s + getFullName() + u", "_s;
+			if (new_type == RObject::DataCharacter) command += u"as.character"_s;
+			else if (new_type == RObject::DataNumeric) command += u"as.numeric"_s;
+			else if (new_type == RObject::DataLogical) command += u"as.logical"_s;
+			else if (new_type == RObject::DataFactor) command += u"as.factor"_s;
+			command += u')';
 			RCommand *rcommand = new RCommand(command, RCommand::App | RCommand::Sync);
 			rcommand->setUpdatesObject(this);
 			RInterface::issueCommand(rcommand);
@@ -199,7 +199,7 @@ void RKVariable::updateDataFromR (RCommandChain *chain) {
 	RK_TRACE (OBJECTS);
 	if (!data) return;
 
-	RCommand *c = new RCommand(".rk.get.vector.data (" + getFullName () + ')', RCommand::App | RCommand::Sync | RCommand::GetStructuredData);
+	RCommand *c = new RCommand(u".rk.get.vector.data ("_s + getFullName() + u')', RCommand::App | RCommand::Sync | RCommand::GetStructuredData);
 	whenCommandFinished(c, [this](RCommand* command) {
 		if (!data) return;	// this can happen, if the editor is closed while a data update is still queued.
 
@@ -318,84 +318,84 @@ void RKVariable::restore (RCommandChain *chain) {
 	writeMetaData (chain);
 }
 
-void RKVariable::writeInvalidFields (QList<int> rows, RCommandChain *chain) {
-	RK_TRACE (OBJECTS);
+void RKVariable::writeInvalidFields(QList<int> rows, RCommandChain *chain) {
+	RK_TRACE(OBJECTS);
 
-	if (rows.isEmpty ()) return;
+	if (rows.isEmpty()) return;
 
 	QString set;
 	QString values;
 	QString clear;
 
-	for (int i = 0; i < rows.size (); ++i) {
+	for (int i = 0; i < rows.size(); ++i) {
 		int row = rows[i];
 
-		if (data->invalid_fields.contains (row)) {
-			if (!set.isEmpty ()) {
-				set.append (", ");
-				values.append (", ");
+		if (data->invalid_fields.contains(row)) {
+			if (!set.isEmpty()) {
+				set.append(u", "_s);
+				values.append(u", "_s);
 			}
-			set.append (QString::number (row+1));
-			values.append (rQuote (data->invalid_fields[row]));
+			set.append(QString::number(row + 1));
+			values.append(rQuote(data->invalid_fields[row]));
 		} else {
-			if (!clear.isEmpty ()) clear.append (", ");
-			clear.append (QString::number (row+1));
+			if (!clear.isEmpty()) clear.append(u", "_s);
+			clear.append(QString::number(row + 1));
 		}
 
 		data->cell_states[row] -= (data->cell_states[row] & RKVarEditData::UnsyncedInvalidState);
 	}
 
-	if (!set.isEmpty ()) {
-		set = "set=c(" + set + "), ";
-		values = "values=c(" + values + ')';
+	if (!set.isEmpty()) {
+		set = u"set=c("_s + set + u"), "_s;
+		values = u"values=c("_s + values + u')';
 	}
-	if (!clear.isEmpty ()) {
-		clear = "clear=c(" + clear + ')';
-		if (!values.isEmpty ()) values.append (",");
+	if (!clear.isEmpty()) {
+		clear = u"clear=c("_s + clear + u')';
+		if (!values.isEmpty()) values.append(u',');
 	}
 
-	RCommand *command = new RCommand(".rk.set.invalid.fields (" + getFullName () + ", " + set + values + clear + ')', RCommand::App | RCommand::Sync);
+	RCommand *command = new RCommand(u".rk.set.invalid.fields ("_s + getFullName() + u", "_s + set + values + clear + u')', RCommand::App | RCommand::Sync);
 	command->setUpdatesObject(this);
 	RInterface::issueCommand(command, chain);
 
-	if (data->previously_valid != data->invalid_fields.isEmpty ()) {
-		data->previously_valid = data->invalid_fields.isEmpty ();
-		RKModificationTracker::instance()->objectMetaChanged (this);
+	if (data->previously_valid != data->invalid_fields.isEmpty()) {
+		data->previously_valid = data->invalid_fields.isEmpty();
+		RKModificationTracker::instance()->objectMetaChanged(this);
 	}
 }
 
-void RKVariable::writeData (int from_row, int to_row, RCommandChain *chain) {
-	RK_TRACE (OBJECTS);
+void RKVariable::writeData(int from_row, int to_row, RCommandChain *chain) {
+	RK_TRACE(OBJECTS);
 	if (from_row == -1) return;
 
 	QList<int> changed_invalids;
 
 	// TODO: try to sync in correct storage mode
 	if (from_row == to_row) {
-		RCommand *command = new RCommand(getFullName() + '[' + QString::number(from_row+1) + "] <- " + getRText(from_row), RCommand::App | RCommand::Sync);
+		RCommand *command = new RCommand(getFullName() + u'[' + QString::number(from_row + 1) + u"] <- "_s + getRText(from_row), RCommand::App | RCommand::Sync);
 		command->setUpdatesObject(this);
 		RInterface::issueCommand(command, chain);
-		if (data->cell_states[from_row] & RKVarEditData::UnsyncedInvalidState) changed_invalids.append (from_row);
+		if (data->cell_states[from_row] & RKVarEditData::UnsyncedInvalidState) changed_invalids.append(from_row);
 	} else {
-		QString data_string = QStringLiteral("c (");
+		QString data_string = u"c ("_s;
 		for (int row = from_row; row <= to_row; ++row) {
 			// TODO: use getCharacter and direct setting of vectors.
-			data_string.append (getRText (row));
+			data_string.append(getRText(row));
 			if (row != to_row) {
-				data_string.append (", ");
+				data_string.append(u", "_s);
 			}
-			if (data->cell_states[row] & RKVarEditData::UnsyncedInvalidState) changed_invalids.append (row);
+			if (data->cell_states[row] & RKVarEditData::UnsyncedInvalidState) changed_invalids.append(row);
 		}
-		data_string.append (")");
-		RCommand* command = new RCommand(getFullName() + '[' + QString::number(from_row + 1) + ':' + QString::number(to_row + 1) + "] <- " + data_string, RCommand::App | RCommand::Sync);
+		data_string.append(u')');
+		RCommand *command = new RCommand(getFullName() + u'[' + QString::number(from_row + 1) + u':' + QString::number(to_row + 1) + u"] <- "_s + data_string, RCommand::App | RCommand::Sync);
 		command->setUpdatesObject(this);
 		RInterface::issueCommand(command, chain);
 	}
 
-	if (!changed_invalids.isEmpty ()) writeInvalidFields (changed_invalids, chain);
+	if (!changed_invalids.isEmpty()) writeInvalidFields(changed_invalids, chain);
 
-	ChangeSet *set = new ChangeSet (from_row, to_row);
-	RKModificationTracker::instance()->objectDataChanged (this, set);
+	ChangeSet *set = new ChangeSet(from_row, to_row);
+	RKModificationTracker::instance()->objectDataChanged(this, set);
 }
 
 void RKVariable::cellsChanged (int from_row, int to_row) {
@@ -474,24 +474,24 @@ QString RKVariable::getText (int row, bool pretty) const {
 	return ret;
 }
 
-QString RKVariable::getRText (int row) const {
-	RK_TRACE (OBJECTS);
-	
-	Status cell_state = cellStatus (row);
-	
+QString RKVariable::getRText(int row) const {
+	RK_TRACE(OBJECTS);
+
+	Status cell_state = cellStatus(row);
+
 	if ((cell_state == ValueUnused) || (cell_state == ValueInvalid)) {
-		return ("NA");
-	} else if (getDataType () == DataFactor) {
-		return (rQuote (getText (row, true)));
-	} else if (getDataType () == DataCharacter) {
-		return (rQuote (getText (row)));
-	} else if (getDataType () == DataLogical) {
-		RK_ASSERT (!data->cell_doubles.isEmpty ());
-		if (data->cell_doubles[row] == 0) return ("FALSE");
-		else return ("TRUE");
+		return u"NA"_s;
+	} else if (getDataType() == DataFactor) {
+		return (rQuote(getText(row, true)));
+	} else if (getDataType() == DataCharacter) {
+		return (rQuote(getText(row)));
+	} else if (getDataType() == DataLogical) {
+		RK_ASSERT(!data->cell_doubles.isEmpty());
+		if (data->cell_doubles[row] == 0) return u"FALSE"_s;
+		else return u"TRUE"_s;
 	} else {
-		RK_ASSERT (!data->cell_doubles.isEmpty ());
-		return (QString::number (data->cell_doubles[row], 'g', MAX_PRECISION));
+		RK_ASSERT(!data->cell_doubles.isEmpty());
+		return (QString::number(data->cell_doubles[row], 'g', MAX_PRECISION));
 	}
 }
 
@@ -735,63 +735,63 @@ void RKVariable::updateValueLabels () {
 	// TODO: find out whether the object is valid after the operation and update accordingly!
 }
 
-void RKVariable::writeValueLabels (RCommandChain *chain) const {
-	RK_TRACE (OBJECTS);
-	RK_ASSERT (data);
+void RKVariable::writeValueLabels(RCommandChain* chain) const {
+	RK_TRACE(OBJECTS);
+	RK_ASSERT(data);
 
 	QString level_string;
 	if (data->value_labels && (!data->value_labels->isEmpty())) {
 		int i = 1;
-		level_string = QLatin1String("c (");
-		while (data->value_labels->contains (QString::number (i))) {
-			level_string.append (rQuote ((*(data->value_labels))[QString::number (i)]));
-			if (data->value_labels->contains (QString::number (++i))) {
-				level_string.append (", ");
+		level_string = u"c ("_s;
+		while (data->value_labels->contains(QString::number(i))) {
+			level_string.append(rQuote((*(data->value_labels))[QString::number(i)]));
+			if (data->value_labels->contains(QString::number(++i))) {
+				level_string.append(u", "_s);
 			}
 		}
-		level_string.append (")");
+		level_string.append(u')');
 	} else {
-		level_string = QLatin1String("NULL");
+		level_string = u"NULL"_s;
 	}
 
-	RCommand* command = new RCommand(".rk.set.levels(" + getFullName() + ", " + level_string + ')', RCommand::App | RCommand::Sync);
+	RCommand* command = new RCommand(u".rk.set.levels("_s + getFullName() + u", "_s + level_string + u')', RCommand::App | RCommand::Sync);
 	command->setUpdatesObject(this);
 	RInterface::issueCommand(command, chain);
 }
 
-QString RKVariable::getValueLabelString () const {
-	RK_TRACE (OBJECTS);
-	RK_ASSERT (data);
+QString RKVariable::getValueLabelString() const {
+	RK_TRACE(OBJECTS);
+	RK_ASSERT(data);
 
 	if (data->value_labels) {
 		int i = 1;
 		QString level_string;
-		while (data->value_labels->contains (QString::number (i))) {
-			level_string.append ((*(data->value_labels))[QString::number (i)]);
-			if (data->value_labels->contains (QString::number (++i))) {
-				level_string.append ("#,#");
+		while (data->value_labels->contains(QString::number(i))) {
+			level_string.append((*(data->value_labels))[QString::number(i)]);
+			if (data->value_labels->contains(QString::number(++i))) {
+				level_string.append(u"#,#"_s);
 			}
 		}
-		
+
 		return level_string;
 	} else {
-		return QString ();
+		return QString();
 	}
 }
 
-void RKVariable::setValueLabelString (const QString &string) {
-	RK_TRACE (OBJECTS);
-	RK_ASSERT (data);
+void RKVariable::setValueLabelString(const QString &string) {
+	RK_TRACE(OBJECTS);
+	RK_ASSERT(data);
 
-	ValueLabels new_labels;	
-	QStringList list = string.split (QStringLiteral("#,#"));
+	ValueLabels new_labels;
+	QStringList list = string.split(u"#,#"_s);
 
 	int i = 1;
-	for (QStringList::const_iterator it = list.constBegin (); it != list.constEnd (); ++it) {
-		new_labels.insert (QString::number (i), *it);
+	for (QStringList::const_iterator it = list.constBegin(); it != list.constEnd(); ++it) {
+		new_labels.insert(QString::number(i), *it);
 		++i;
 	}
-	setValueLabels (new_labels);
+	setValueLabels(new_labels);
 }
 
 RKVariable::FormattingOptions RKVariable::getFormattingOptions () const {
@@ -830,21 +830,21 @@ void RKVariable::setFormattingOptionsString (const QString &string) {
 }
 
 // static
-QString RKVariable::formattingOptionsToString (const FormattingOptions& options) {
-	RK_TRACE (OBJECTS);
+QString RKVariable::formattingOptionsToString(const FormattingOptions& options) {
+	RK_TRACE(OBJECTS);
 
 	QString format_string;
-	if (options.alignment != (int) FormattingOptions::AlignDefault) {
-		format_string.append ("align:" + QString::number (options.alignment));
+	if (options.alignment != (int)FormattingOptions::AlignDefault) {
+		format_string.append(u"align:"_s + QString::number(options.alignment));
 	}
 
-	if (options.precision_mode != (int) FormattingOptions::PrecisionDefault) {
-		if (!format_string.isEmpty ()) format_string.append ("#");
-		format_string.append ("prec:");
-		if (options.precision_mode == (int) FormattingOptions::PrecisionRequired) {
-			format_string.append ("v");
+	if (options.precision_mode != (int)FormattingOptions::PrecisionDefault) {
+		if (!format_string.isEmpty()) format_string.append(u'#');
+		format_string.append(u"prec:"_s);
+		if (options.precision_mode == (int)FormattingOptions::PrecisionRequired) {
+			format_string.append(u'v');
 		} else {
-			format_string.append (QString::number (options.precision));
+			format_string.append(QString::number(options.precision));
 		}
 	}
 
@@ -852,44 +852,44 @@ QString RKVariable::formattingOptionsToString (const FormattingOptions& options)
 }
 
 // static
-RKVariable::FormattingOptions RKVariable::parseFormattingOptionsString (const QString &string) {
-	RK_TRACE (OBJECTS);
+RKVariable::FormattingOptions RKVariable::parseFormattingOptionsString(const QString &string) {
+	RK_TRACE(OBJECTS);
 
 	FormattingOptions formatting_options;
 	formatting_options.alignment = FormattingOptions::AlignDefault;
 	formatting_options.precision_mode = FormattingOptions::PrecisionDefault;
 	formatting_options.precision = 0;
 
-	QStringList list = string.split ('#', Qt::SkipEmptyParts);
+	QStringList list = string.split(u'#', Qt::SkipEmptyParts);
 	QString option, parameter;
-	for (QStringList::const_iterator it = list.constBegin (); it != list.constEnd (); ++it) {
-		option = (*it).section (':', 0, 0);
-		parameter = (*it).section (':', 1, 1);
-		
-		if (parameter.isEmpty ()) continue;
-		
-		if (option == QLatin1String("align")) {
-			int al = parameter.toInt ();
-			if ((al >= (int) FormattingOptions::AlignDefault) && (al <= (int) FormattingOptions::AlignRight)) {
-				formatting_options.alignment = (FormattingOptions::Alignment) al;
+	for (QStringList::const_iterator it = list.constBegin(); it != list.constEnd(); ++it) {
+		option = (*it).section(u':', 0, 0);
+		parameter = (*it).section(u':', 1, 1);
+
+		if (parameter.isEmpty()) continue;
+
+		if (option == "align"_L1) {
+			int al = parameter.toInt();
+			if ((al >= (int)FormattingOptions::AlignDefault) && (al <= (int)FormattingOptions::AlignRight)) {
+				formatting_options.alignment = (FormattingOptions::Alignment)al;
 			}
-		} else if (option == QLatin1String("prec")) {
-			if (parameter == QLatin1String("d")) {
+		} else if (option == "prec"_L1) {
+			if (parameter == "d"_L1) {
 				formatting_options.precision_mode = FormattingOptions::PrecisionDefault;
-			} else if (parameter == QLatin1String("v")) {
+			} else if (parameter == "v"_L1) {
 				formatting_options.precision_mode = FormattingOptions::PrecisionRequired;
 			} else {
-				int digits = parameter.toInt ();
+				int digits = parameter.toInt();
 				if ((digits >= 0) && (digits <= 15)) {
 					formatting_options.precision_mode = FormattingOptions::PrecisionFixed;
 					formatting_options.precision = digits;
 				}
 			}
 		} else {
-			RK_ASSERT (false);
+			RK_ASSERT(false);
 		}
 	}
-	
+
 	return formatting_options;
 }
 
diff --git a/rkward/core/robject.cpp b/rkward/core/robject.cpp
index 2d4491ebc..63b007846 100644
--- a/rkward/core/robject.cpp
+++ b/rkward/core/robject.cpp
@@ -93,7 +93,7 @@ RObject::~RObject () {
 	if (hasPseudoObject (RowNamesObject)) delete rownames_objects.take (this);
 }
 
-bool RObject::irregularShortName (const QString &name) {
+bool RObject::irregularShortName(const QString &name) {
 	// no trace
 	const int len = name.length();
 	for (int i = 0; i < len; ++i) {
@@ -101,32 +101,32 @@ bool RObject::irregularShortName (const QString &name) {
 		// letters are allowed anywhere in the name
 		// underscore is allowed, but not as the first character
 		// dot, and digits are allowed, too unless they make the name start with a number (or with ...)
-		if(c.isLetter()) continue;
-		if(!i) {
-			if(c.isDigit()) return true;
-			if(c == '.') {
-				if(len > 1 && name[1].isDigit()) return true;
-				if(name == QStringLiteral("...")) return true;
+		if (c.isLetter()) continue;
+		if (!i) {
+			if (c.isDigit()) return true;
+			if (c == u'.') {
+				if (len > 1 && name[1].isDigit()) return true;
+				if (name == "..."_L1) return true;
 				continue;
 			}
 		} else {
-			if(c.isDigit()) continue;
-			if(c == '.') continue;
-			if(c == '_') continue;
+			if (c.isDigit()) continue;
+			if (c == u'.') continue;
+			if (c == u'_') continue;
 		}
 		return true;
 	}
-	return(false);
+	return (false);
 }
 
-QString RObject::getFullName (int options) const {
-	RK_TRACE (OBJECTS);
+QString RObject::getFullName(int options) const {
+	RK_TRACE(OBJECTS);
 	return parent->makeChildName(RObject::name, options);
 }
 
-QString RObject::getLabel () const {
-	RK_TRACE (OBJECTS);
-	return getMetaProperty (QStringLiteral("label"));
+QString RObject::getLabel() const {
+	RK_TRACE(OBJECTS);
+	return getMetaProperty(u"label"_s);
 }
 
 RObject::ObjectList RObject::findObjects (const QStringList &path, bool partial, const QString &op) {
@@ -144,62 +144,62 @@ QString RObject::getMetaProperty (const QString &id) const {
 	return QString ();
 }
 
-QString RObject::getDescription () const {
-	RK_TRACE (OBJECTS);
+QString RObject::getDescription() const {
+	RK_TRACE(OBJECTS);
 	if (meta_map) {
-		QString label = meta_map->value (QStringLiteral("label"));
-		if (!label.isEmpty ()) return (getShortName () + " (" + label + ')');
+		QString label = meta_map->value(u"label"_s);
+		if (!label.isEmpty()) return (getShortName() + u" ("_s + label + u')');
+	}
+	return getShortName();
+}
+
+QString RObject::getObjectDescription() const {
+	RK_TRACE(OBJECTS);
+
+#define ESCS replace(u'<', u"<"_s)
+
+	QString ret = u"<b>"_s + i18n("Full location:") + u" </b>"_s + getFullName().ESCS;
+	QString lab = getLabel();
+	if (!lab.isEmpty()) ret.append(u"<br><b>"_s + i18n("Label:") + u" </b>"_s + lab.ESCS);
+	ret.append(u"<br><b>"_s + i18n("Type:") + u" </b>"_s);
+
+	if (isType(Function)) {
+		ret.append(i18n("Function"));
+		ret.append(u"<br><b>"_s + i18n("Usage: ") + u" </b>"_s + getShortName().ESCS + u'(' + static_cast<const RFunctionObject *>(this)->printArgs().ESCS + u')');
+	} else if (isType(DataFrame)) {
+		ret.append(i18n("Data frame"));
+	} else if (isType(Array)) {
+		ret.append(i18n("Array"));
+	} else if (isType(Matrix)) {
+		ret.append(i18n("Matrix"));
+	} else if (isType(List)) {
+		ret.append(i18n("List"));
+	} else if (isType(Variable)) {
+		ret.append(i18nc("Noun; in brackets, data type of the var is stated", "Variable (%1)", typeToText(getDataType())));
+	} else if (isType(Environment)) {
+		ret.append(i18n("Environment"));
 	}
-	return getShortName ();
-}
-
-QString RObject::getObjectDescription () const {
-	RK_TRACE (OBJECTS);
-
-#define ESCS replace ('<', "<")
 
-	QString ret = "<b>" + i18n("Full location:") + " </b>" + getFullName().ESCS;
-	QString lab = getLabel ();
-	if (!lab.isEmpty ()) ret.append ("<br><b>" + i18n ("Label:") + " </b>" + lab.ESCS);
-	ret.append ("<br><b>" + i18n ("Type:") + " </b>");
-
-	if (isType (Function)) {
-		ret.append (i18n ("Function"));
-		ret.append ("<br><b>" + i18n ("Usage: ") + " </b>" + getShortName ().ESCS + '(' + static_cast<const RFunctionObject *> (this)->printArgs ().ESCS + ')');
-	} else if (isType (DataFrame)) {
-		ret.append (i18n ("Data frame"));
-	} else if (isType (Array)) {
-		ret.append (i18n ("Array"));
-	} else if (isType (Matrix)) {
-		ret.append (i18n ("Matrix"));
-	} else if (isType (List)) {
-		ret.append (i18n ("List"));
-	} else if (isType (Variable)) {
-		ret.append(i18nc("Noun; in brackets, data type of the var is stated", "Variable (%1)", typeToText(getDataType())));
-	} else if (isType (Environment)) {
-		ret.append (i18n ("Environment"));
-	}
-
-	if (isType (Container | Variable)) {
-		if (dimensions.size () == 1) {
-			ret.append ("<br><b>" + i18n ("Length: ") + " </b>"  + QString::number (dimensions[0]));
-		} else if (dimensions.size () > 1) {
-			ret.append ("<br><b>" + i18n ("Dimensions: ") + " </b>");
-			for (int i=0; i < dimensions.size (); ++i) {
-				if (i) ret.append (", ");
-				ret.append (QString::number (dimensions[i]));
+	if (isType(Container | Variable)) {
+		if (dimensions.size() == 1) {
+			ret.append(u"<br><b>"_s + i18n("Length: ") + u" </b>"_s + QString::number(dimensions[0]));
+		} else if (dimensions.size() > 1) {
+			ret.append(u"<br><b>"_s + i18n("Dimensions: ") + u" </b>"_s);
+			for (int i = 0; i < dimensions.size(); ++i) {
+				if (i) ret.append(u", "_s);
+				ret.append(QString::number(dimensions[i]));
 			}
 		}
 	}
 
-	if (!isType(Function)) ret.append("<br><b>" + i18n("Class(es):") + " </b>" + makeClassString(QStringLiteral(",")).ESCS);
+	if (!isType(Function)) ret.append(u"<br><b>"_s + i18n("Class(es):") + u" </b>"_s + makeClassString(u","_s).ESCS);
 
 	return ret;
 }
 
-void RObject::setLabel (const QString &value, bool sync) {
-	RK_TRACE (OBJECTS);
-	setMetaProperty (QStringLiteral("label"), value, sync);
+void RObject::setLabel(const QString &value, bool sync) {
+	RK_TRACE(OBJECTS);
+	setMetaProperty(u"label"_s, value, sync);
 }
 
 void RObject::setMetaProperty (const QString &id, const QString &value, bool sync) {
@@ -230,76 +230,85 @@ bool RObject::inherits (const QString &class_name) const {
 }
 
 QString RObject::makeChildName(const QString &short_child_name, int options) const {
-	RK_TRACE (OBJECTS);
+	RK_TRACE(OBJECTS);
 	if (options & DollarExpansion) {
-		if (irregularShortName (short_child_name)) return (getFullName (options) + '$' + rQuote (short_child_name));
-		return (getFullName (options) + '$' + short_child_name);  // Do not return list$"member", unless necessary
+		if (irregularShortName(short_child_name)) return (getFullName(options) + u'$' + rQuote(short_child_name));
+		return (getFullName(options) + u'$' + short_child_name);  // Do not return list$"member", unless necessary
 	}
-	return (getFullName (options) + "[[" + rQuote (short_child_name) + "]]");
+	return (getFullName(options) + u"[["_s + rQuote(short_child_name) + u"]]"_s);
 }
 
-void RObject::writeMetaData (RCommandChain *chain) {
-	RK_TRACE (OBJECTS);
+void RObject::writeMetaData(RCommandChain *chain) {
+	RK_TRACE(OBJECTS);
 
 	if (!meta_map) return;
 
 	QString map_string;
-	if (meta_map->isEmpty ()) {
-		map_string.append ("NULL");
+	if (meta_map->isEmpty()) {
+		map_string.append(u"NULL"_s);
 
-		delete meta_map;	// now that it is synced, delete it
+		delete meta_map;  // now that it is synced, delete it
 		meta_map = nullptr;
 	} else {
-		for (MetaMap::const_iterator it = meta_map->constBegin (); it != meta_map->constEnd (); ++it) {
-			if (!map_string.isEmpty ()) map_string.append (", ");
-			map_string.append (rQuote (it.key ()) + '=' + rQuote (it.value ()));
+		for (MetaMap::const_iterator it = meta_map->constBegin(); it != meta_map->constEnd(); ++it) {
+			if (!map_string.isEmpty()) map_string.append(u", "_s);
+			map_string.append(rQuote(it.key()) + u'=' + rQuote(it.value()));
 		}
-		map_string = "c (" + map_string + ')';
+		map_string = u"c ("_s + map_string + u')';
 	}
 
-	RCommand *command = new RCommand (".rk.set.meta (" + getFullName () + ", " + map_string + ')', RCommand::App | RCommand::Sync);
+	RCommand *command = new RCommand(u".rk.set.meta ("_s + getFullName() + u", "_s + map_string + u')', RCommand::App | RCommand::Sync);
 	command->setUpdatesObject(this);
-	RInterface::issueCommand (command, chain);
+	RInterface::issueCommand(command, chain);
 }
 
-void RObject::updateFromR (RCommandChain *chain) {
-	RK_TRACE (OBJECTS);
+void RObject::updateFromR(RCommandChain *chain) {
+	RK_TRACE(OBJECTS);
 
 	QString commandstring;
-	if (parentObject () == RObjectList::getGlobalEnv ()) {
-// We handle objects directly in .GlobalEnv differently. That's to avoid forcing promises, when addressing the object directly. In the long run, .rk.get.structure should be reworked to simply not need the value-argument in any case.
-		commandstring = ".rk.get.structure.global (" + rQuote (getShortName ()) + ')';
+	if (parentObject() == RObjectList::getGlobalEnv()) {
+		// We handle objects directly in .GlobalEnv differently. That's to avoid forcing promises, when addressing the object directly. In the long run,
+		// .rk.get.structure should be reworked to simply not need the value-argument in any case.
+		commandstring = u".rk.get.structure.global ("_s + rQuote(getShortName()) + u')';
 	} else if (isType(Environment)) {
-		REnvironmentObject *env = static_cast<REnvironmentObject*>(this);
+		REnvironmentObject *env = static_cast<REnvironmentObject *>(this);
 		if (isType(PackageEnv) && RKSettingsModuleObjectBrowser::isPackageBlacklisted(env->packageName())) {
[suppressed due to size limit]
+			KMessageBox::information(
+			    nullptr,
+			    i18n("The package '%1' (probably you just loaded it) is currently blacklisted for retrieving structure information. Practically this means, "
+			         "the objects in this package will not appear in the object browser, and there will be no object name completion or function argument "
+			         "hinting for objects in this package.\nPackages will typically be blacklisted, if they contain huge amount of data, that would take too "
+			         "long to load. To unlist the package, visit Settings->Configure RKWard->Workspace.",
+			         env->packageName()),
+			    i18n("Package blacklisted"), u"packageblacklist"_s + env->packageName());
 			return;
 		}
-		commandstring = ".rk.get.structure (" + getFullName(DefaultObjectNameOptions) + ", " + rQuote(getShortName());
-		if (isType(GlobalEnv)) commandstring += QLatin1String(", envlevel=-1");  // in the .GlobalEnv recurse one more level
-		if (isType(PackageEnv)) commandstring += ", namespacename=" + rQuote(env->packageName());
-		commandstring += ')';
+		commandstring = u".rk.get.structure ("_s + getFullName(DefaultObjectNameOptions) + u", "_s + rQuote(getShortName());
+		if (isType(GlobalEnv)) commandstring += u", envlevel=-1"_s;  // in the .GlobalEnv recurse one more level
+		if (isType(PackageEnv)) commandstring += u", namespacename="_s + rQuote(env->packageName());
+		commandstring += u')';
 	} else {
-// This is the less common branch, but we do call .rk.get.structure on sub-object, e.g. when fetching more levels in the Workspace Browser, or when calling rk.sync(), explicitly
-		commandstring = ".rk.get.structure (" + getFullName () + ", " + rQuote (getShortName ()) + ')';
+		// This is the less common branch, but we do call .rk.get.structure on sub-object, e.g. when fetching more levels in the Workspace Browser, or when
+		// calling rk.sync(), explicitly
+		commandstring = u".rk.get.structure ("_s + getFullName() + u", "_s + rQuote(getShortName()) + u')';
 	}
 	RCommand *command = new RCommand(commandstring, RCommand::App | RCommand::Sync | RCommand::GetStructuredData);
-	whenCommandFinished(command, [this](RCommand* command) {
-		if (command->failed ()) {
-			RK_DEBUG (OBJECTS, DL_INFO, "command failed while trying to update object '%s'. No longer present?", getShortName ().toLatin1 ().data ());
+	whenCommandFinished(command, [this](RCommand *command) {
+		if (command->failed()) {
+			RK_DEBUG(OBJECTS, DL_INFO, "command failed while trying to update object '%s'. No longer present?", getShortName().toLatin1().data());
 			// this may happen, if the object has been removed in the workspace in between
 			RKModificationTracker::instance()->removeObject(this, nullptr, true);
 			return;
 		}
 		if (parent && parent->isContainer()) {
-			static_cast<RContainerObject*>(parent)->updateChildStructure(this, command);		// this may result in a delete, so nothing after this!
+			static_cast<RContainerObject *>(parent)->updateChildStructure(this, command);  // this may result in a delete, so nothing after this!
 		} else {
-			updateStructure(command);		// no (container) parent can happen for RObjectList and pseudo objects
+			updateStructure(command);  // no (container) parent can happen for RObjectList and pseudo objects
 		}
 	});
 	RInterface::issueCommand(command, chain);
 
-	type |= Updating;	// will be cleared, implicitly, when the new structure gets set
+	type |= Updating;  // will be cleared, implicitly, when the new structure gets set
 }
 
 void RObject::fetchMoreIfNeeded (int levels) {
@@ -700,78 +709,78 @@ QString RObject::rQuote (const QString &string) {
 	return (RKRSharedFunctionality::quote (string));
 }
 
-//static 
-QStringList RObject::parseObjectPath (const QString &path) {
-	RK_TRACE (OBJECTS);
+// static
+QStringList RObject::parseObjectPath(const QString &path) {
+	RK_TRACE(OBJECTS);
 
 	QStringList ret;
 	QString fragment;
 
-	int end = path.length ();
+	int end = path.length();
 	QChar quote_char;
 	bool escaped = false;
 	bool seek_bracket_end = false;
 	for (int i = 0; i < end; ++i) {
-		QChar c = path.at (i);
-		if (quote_char.isNull ()) {
-			if (c == '\'' || c == '\"' || c == '`') {
+		QChar c = path.at(i);
+		if (quote_char.isNull()) {
+			if (c == u'\'' || c == u'\"' || c == u'`') {
 				quote_char = c;
 			} else {
 				if (!seek_bracket_end) {
-					if (c == '$') {
-						ret.append (fragment);
-						ret.append (QStringLiteral("$"));
-						fragment.clear ();
-					} else if (c == '[') {
-						ret.append (fragment);
-						ret.append (QStringLiteral("$"));
-						fragment.clear ();
-						if ((i+1 < end) && (path.at (i+1) == '[')) ++i;
+					if (c == u'$') {
+						ret.append(fragment);
+						ret.append(u"$"_s);
+						fragment.clear();
+					} else if (c == u'[') {
+						ret.append(fragment);
+						ret.append(u"$"_s);
+						fragment.clear();
+						if ((i + 1 < end) && (path.at(i + 1) == u'[')) ++i;
 						seek_bracket_end = true;
-					} else if (c == ':') {
-						ret.append (fragment);
-						if ((i+1 < end) && (path.at (i+1) == ':')) ++i;
-						if ((i+1 < end) && (path.at (i+1) == ':')) {
+					} else if (c == u':') {
+						ret.append(fragment);
+						if ((i + 1 < end) && (path.at(i + 1) == u':')) ++i;
+						if ((i + 1 < end) && (path.at(i + 1) == u':')) {
 							++i;
-							ret.append (QStringLiteral(":::"));
-						} else ret.append (QStringLiteral("::"));
-						fragment.clear ();
-					} else if (c == '@') {
-						ret.append (fragment);
-						ret.append (QStringLiteral("@"));
-						fragment.clear ();
+							ret.append(u":::"_s);
+						} else ret.append(u"::"_s);
+						fragment.clear();
+					} else if (c == u'@') {
+						ret.append(fragment);
+						ret.append(u"@"_s);
+						fragment.clear();
 					} else {
-						fragment.append (c);
+						fragment.append(c);
 					}
 				} else {
-					if (c == ']') {
-						if ((i+1 < end) && (path.at (i+1) == ']')) ++i;
+					if (c == u']') {
+						if ((i + 1 < end) && (path.at(i + 1) == u']')) ++i;
 						seek_bracket_end = false;
 						continue;
 					} else {
-						fragment.append (c);
+						fragment.append(c);
 					}
 				}
 			}
-		} else {	// inside a quote
-			if (c == '\\') escaped = !escaped;
+		} else {  // inside a quote
+			if (c == u'\\') escaped = !escaped;
 			else {
 				if (escaped) {
-					if (c == 't') fragment.append ('\t');
-					else if (c == 'n') fragment.append ('\n');
-					else fragment.append ('\\' + c);
+					if (c == u't') fragment.append(u'\t');
+					else if (c == u'n') fragment.append(u'\n');
+					else fragment.append(u'\\' + c);
 				} else {
 					if (c == quote_char) {
-						quote_char = QChar ();
+						quote_char = QChar();
 					} else {
-						fragment.append (c);
+						fragment.append(c);
 					}
 				}
 			}
 		}
 	}
-	if (!fragment.isEmpty ()) ret.append (fragment);
-	RK_DEBUG (OBJECTS, DL_DEBUG, "parsed object path %s into %s", qPrintable (path), qPrintable (ret.join ("-")));
+	if (!fragment.isEmpty()) ret.append(fragment);
+	RK_DEBUG(OBJECTS, DL_DEBUG, "parsed object path %s into %s", qPrintable(path), qPrintable(ret.join(u"-"_s)));
 	return ret;
 }
 
diff --git a/rkward/core/robject.h b/rkward/core/robject.h
index 491e1bd81..a8d041727 100644
--- a/rkward/core/robject.h
+++ b/rkward/core/robject.h
@@ -24,6 +24,8 @@ class RData;
 class RObjectLifeTimeGuard;
 class RCommand;
 
+using namespace Qt::Literals::StringLiterals;
+
 /**
 Base class for representations of objects in the R-workspace. RObject is never used directly (contains pure virtual functions).
 
diff --git a/rkward/core/robjectlist.cpp b/rkward/core/robjectlist.cpp
index 754cf9bdf..386a546ef 100644
--- a/rkward/core/robjectlist.cpp
+++ b/rkward/core/robjectlist.cpp
@@ -93,7 +93,7 @@ QStringList RObjectList::detachPackages (const QStringList &packages, RCommandCh
 		}
 	}
 	for (int i = 0; i < remove.size (); ++i) {
-		RCommand *command = new RCommand ("detach (" + rQuote (remove[i]) + ')', RCommand::App | RCommand::ObjectListUpdate);
+		RCommand *command = new RCommand(u"detach ("_s + rQuote(remove[i]) + u')', RCommand::App | RCommand::ObjectListUpdate);
 
 		if (control) control->addRCommand (command);
 		RInterface::issueCommand (command, chain);
@@ -173,7 +173,7 @@ void RObjectList::updateEnvironments (const QStringList &_env_names, bool force_
 	QStringList env_names = _env_names;
 	if (!env_names.isEmpty ()) {
 		QString dummy = env_names.takeFirst ();
-		RK_ASSERT (dummy == ".GlobalEnv");
+		RK_ASSERT(dummy == ".GlobalEnv"_L1);
 		if (force_globalenv_update) {
 			// for now, we only update the .GlobalEnv. All others we assume to be static
 			getGlobalEnv ()->updateFromR (update_chain);
@@ -235,32 +235,32 @@ REnvironmentObject *RObjectList::createTopLevelEnvironment (const QString &name)
 	return envobj;
 }
 
-RObject::ObjectList RObjectList::findObjects (const QStringList &path, bool partial, const QString &op) {
-	RK_TRACE (OBJECTS);
-	RK_ASSERT (op == "$");
+RObject::ObjectList RObjectList::findObjects(const QStringList &path, bool partial, const QString &op) {
+	RK_TRACE(OBJECTS);
+	RK_ASSERT(op == "$"_L1);
 
 	RObject::ObjectList ret;
-	if (path.value (1) == QLatin1String("::")) {
-		RObject *environment = findPackage (path[0]);
-		if (environment) return (environment->findObjects (path.mid (2), partial, QStringLiteral("$")));
+	if (path.value(1) == "::"_L1) {
+		RObject *environment = findPackage(path[0]);
+		if (environment) return (environment->findObjects(path.mid(2), partial, u"$"_s));
 		return ret;
-	} else if (path.value (1) == QLatin1String(":::")) {
-		RObject *environment = findPackage (path[0]);
-		if (environment) environment = static_cast<REnvironmentObject*> (environment)->namespaceEnvironment ();
-		if (!environment) environment = orphan_namespaces->findOrphanNamespace (path[0]);
-		if (environment) return (environment->findObjects (path.mid (2), partial, QStringLiteral("$")));
+	} else if (path.value(1) == ":::"_L1) {
+		RObject *environment = findPackage(path[0]);
+		if (environment) environment = static_cast<REnvironmentObject *>(environment)->namespaceEnvironment();
+		if (!environment) environment = orphan_namespaces->findOrphanNamespace(path[0]);
+		if (environment) return (environment->findObjects(path.mid(2), partial, u"$"_s));
 		return ret;
-	} else if (path.value (0) == QLatin1String(".GlobalEnv")) {
-		if (path.length () > 1) return getGlobalEnv ()->findObjects (path.mid (2), partial, QStringLiteral("$"));
+	} else if (path.value(0) == ".GlobalEnv"_L1) {
+		if (path.length() > 1) return getGlobalEnv()->findObjects(path.mid(2), partial, u"$"_s);
 		// else we'll find base::.GlobalEnv, below
 	}
 
 	// no namespace given. Search all environments for matches, .GlobalEnv, first
-	ret = getGlobalEnv ()->findObjects (path, partial, QStringLiteral("$"));
-	for (int i = 0; i < childmap.size (); ++i) {
-		if (!(partial || ret.isEmpty ())) return ret;
+	ret = getGlobalEnv()->findObjects(path, partial, u"$"_s);
+	for (int i = 0; i < childmap.size(); ++i) {
+		if (!(partial || ret.isEmpty())) return ret;
 
-		ret.append (childmap[i]->findObjects (path, partial, QStringLiteral("$")));
+		ret.append(childmap[i]->findObjects(path, partial, u"$"_s));
 	}
 	return ret;
 }
@@ -311,16 +311,14 @@ bool RObjectList::updateStructure (RData *) {
 	return true;
 }
 
-QString RObjectList::renameChildCommand (RObject *object, const QString &new_name) const {
-	RK_TRACE (OBJECTS);
+QString RObjectList::renameChildCommand(RObject *object, const QString &new_name) const {
+	RK_TRACE(OBJECTS);
 
-	return (makeChildName(new_name, IncludeEnvirIfNotGlobalEnv) + " <- " + object->getFullName() + '\n' + removeChildCommand(object));
+	return (makeChildName(new_name, IncludeEnvirIfNotGlobalEnv) + u" <- "_s + object->getFullName() + u'\n' + removeChildCommand(object));
 }
 
-QString RObjectList::removeChildCommand (RObject *object) const {
-	RK_TRACE (OBJECTS);
+QString RObjectList::removeChildCommand(RObject *object) const {
+	RK_TRACE(OBJECTS);
 
-	return ("remove (" + object->getFullName () + ')');
+	return (u"remove ("_s + object->getFullName() + u')');
 }
-
-


More information about the rkward-tracker mailing list