diff --git a/plugins/astyle/astyle_plugin.h b/plugins/astyle/astyle_plugin.h --- a/plugins/astyle/astyle_plugin.h +++ b/plugins/astyle/astyle_plugin.h @@ -22,6 +22,8 @@ #ifndef ASTYLEPLUGIN_H #define ASTYLEPLUGIN_H +#include "astyle_preferences.h" + #include #include @@ -66,8 +68,8 @@ */ Indentation indentation(const QUrl &url) const override; - static QString formattingSample(); - static QString indentingSample(); + static QString formattingSample(AStylePreferences::Language lang); + static QString indentingSample(AStylePreferences::Language lang); private: QScopedPointer m_formatter; diff --git a/plugins/astyle/astyle_plugin.cpp b/plugins/astyle/astyle_plugin.cpp --- a/plugins/astyle/astyle_plugin.cpp +++ b/plugins/astyle/astyle_plugin.cpp @@ -33,6 +33,186 @@ #include #include +static const char formattingCxxSample[] = + "void func(){\n" + "\tif(isFoo(a,b))\n" + "\tbar(a,b);\n" + "if(isFoo)\n" + "\ta=bar((b-c)*a,*d--);\n" + "if( isFoo( a,b ) )\n" + "\tbar(a, b);\n" + "if (isFoo) {isFoo=false;cat << isFoo <::const_iterator it = list.begin();\n" + "}\n" + "namespace A {\n" + "namespace B {\n" + "class someClass {\n" + "void foo() {\n" + " if (true) {\n" + " func();\n" + " } else {\n" + " // bla\n" + " }\n" + "}\n" + "};\n" + "}\n" + "}\n"; + +static const char formattingObjCSample[] = + "void func(){\n" + "\tif(isFoo(a,b))\n" + "\tbar(a,b);\n" + "if(isFoo)\n" + "\ta=bar((b-c)*a,*d--);\n" + "if( isFoo( a,b ) )\n" + "\tbar(a, b);\n" + "if (isFoo) {isFoo=false;cat << isFoo <\n" + "\n" + "#define foobar(A)\\\n" + "\t{Foo();Bar();}\n" + "#define anotherFoo(B)\\\n" + "\treturn Bar()\n" + "\n" + "@interface Foo : Bar {\n" + "@private\n" + "\tid Baz;\n" + "}\n" + "- (void) init;\n" + "- (NSString*) description;\n" + "@property (retain) id Baz;\n" + "@end\n" + "\n" + "@interface Foo (Bar)\n" + "- (void)bar:(int) foo;\n" + "@end\n" + "\n" + "@implementation Foo (Bar)\n" + "\n" + "- (void) bar:(int) foo\n" + "{\n" + "\tswitch (foo) {\n" + "case 1:\n" + "a += 1;\n" + "break;\n" + "case 2: {\n" + "a += 2;\n" + "break;\n" + "}\n" + "}\n" + "if (isFoo) {\n" + "bar();\n" + "} else {\n" + "[anotherBar withFoo:self];\n" + "}\n" + "}\n" + "\n" + "@end\n" + "int foo()\n" + "while (isFoo)\n" + "{\n" + "\t// ...\n" + "\tgoto error;\n" + "\t/* .... */\n" + "error:\n" + "\t//...\n" + "}\n" + "\n" + "fooArray[] = { red,\n" + "\tgreen,\n" + "\tdarkblue};\n" + "fooFunction(barArg1,\n" + "\tbarArg2,\n" + "\tbarArg3);\n" + "struct foo { int bar() {} };\n"; + using namespace KDevelop; K_PLUGIN_FACTORY_WITH_JSON(AStyleFactory, "kdevastyle.json", registerPlugin();) @@ -96,11 +276,14 @@ { return { {QStringLiteral("text/x-c++src"), QStringLiteral("C++")}, + {QStringLiteral("text/x-csrc"), QStringLiteral("C")}, {QStringLiteral("text/x-chdr"), QStringLiteral("C")}, {QStringLiteral("text/x-c++hdr"), QStringLiteral("C++")}, - {QStringLiteral("text/x-csrc"), QStringLiteral("C")}, {QStringLiteral("text/x-java"), QStringLiteral("Java")}, {QStringLiteral("text/x-csharp"), QStringLiteral("C#")}, + {QStringLiteral("text/x-objcsrc"), QStringLiteral("Objective-C")}, + {QStringLiteral("text/x-objc++src"), QStringLiteral("Objective-C++")}, + {QStringLiteral("text/x-objchdr"), QStringLiteral("Objective-C")}, }; } @@ -137,17 +320,31 @@ SettingsWidget* AStylePlugin::editStyleWidget(const QMimeType& mime) const { AStylePreferences::Language lang = AStylePreferences::CPP; - if(mime.inherits(QStringLiteral("text/x-java"))) + if (mime.inherits(QStringLiteral("text/x-java"))) lang = AStylePreferences::Java; - else if(mime.inherits(QStringLiteral("text/x-csharp"))) + else if (mime.inherits(QStringLiteral("text/x-csharp"))) lang = AStylePreferences::CSharp; + else if (mime.inherits(QStringLiteral("text/x-objcsrc")) || mime.inherits(QStringLiteral("text/x-objc++src"))) { + // x-objc++src *should* inherit x-objcsrc but that is not always the case in practice + lang = AStylePreferences::ObjC; + } return new AStylePreferences(lang); } -QString AStylePlugin::previewText(const SourceFormatterStyle& /*style*/, const QMimeType& /*mime*/) const +QString AStylePlugin::previewText(const SourceFormatterStyle& /*style*/, const QMimeType& mime) const { - return QLatin1String("// Indentation\n") + indentingSample() + QLatin1String("\t// Formatting\n") - + formattingSample(); + AStylePreferences::Language lang; + if (mime.inherits(QStringLiteral("text/x-objcsrc")) || mime.inherits(QStringLiteral("text/x-objc++src"))) { + lang = AStylePreferences::ObjC; + } else { + lang = AStylePreferences::CPP; + } + // TODO: add previews for the other supported languages + return + QLatin1String("// Indentation\n") + + indentingSample(lang) + + QLatin1String("\t// Formatting\n") + + formattingSample(lang); } AStylePlugin::Indentation AStylePlugin::indentation(const QUrl& url) const @@ -172,100 +369,26 @@ return ret; } -QString AStylePlugin::formattingSample() +QString AStylePlugin::formattingSample(AStylePreferences::Language lang) { - return QStringLiteral( - "void func(){\n" - "\tif(isFoo(a,b))\n" - "\tbar(a,b);\n" - "if(isFoo)\n" - "\ta=bar((b-c)*a,*d--);\n" - "if( isFoo( a,b ) )\n" - "\tbar(a, b);\n" - "if (isFoo) {isFoo=false;cat << isFoo <::const_iterator it = list.begin();\n" - "}\n" - "namespace A {\n" - "namespace B {\n" - "class someClass {\n" - "void foo() {\n" - " if (true) {\n" - " func();\n" - " } else {\n" - " // bla\n" - " }\n" - "}\n" - "};\n" - "}\n" - "}\n" - ); + switch (lang) { + case AStylePreferences::ObjC: + return QLatin1String(formattingObjCSample); + default: + return QLatin1String(formattingCxxSample); + } + Q_UNREACHABLE(); } -QString AStylePlugin::indentingSample() +QString AStylePlugin::indentingSample(AStylePreferences::Language lang) { - return QStringLiteral( - "#define foobar(A)\\\n" - "{Foo();Bar();}\n" - "#define anotherFoo(B)\\\n" - "return Bar()\n" - "\n" - "namespace Bar\n" - "{\n" - "class Foo\n" - "{public:\n" - "Foo();\n" - "virtual ~Foo();\n" - "};\n" - "void bar(int foo)\n" - "{\n" - "switch (foo)\n" - "{\n" - "case 1:\n" - "a+=1;\n" - "break;\n" - "case 2:\n" - "{\n" - "a += 2;\n" - " break;\n" - "}\n" - "}\n" - "if (isFoo)\n" - "{\n" - "bar();\n" - "}\n" - "else\n" - "{\n" - "anotherBar();\n" - "}\n" - "}\n" - "int foo()\n" - "\twhile(isFoo)\n" - "\t\t{\n" - "\t\t\t// ...\n" - "\t\t\tgoto error;\n" - "\t\t/* .... */\n" - "\t\terror:\n" - "\t\t\t//...\n" - "\t\t}\n" - "\t}\n" - "fooArray[]={ red,\n" - "\tgreen,\n" - "\tdarkblue};\n" - "fooFunction(barArg1,\n" - "\tbarArg2,\n" - "\tbarArg3);\n" - "struct foo{ int bar() {} };\n" - ); + switch (lang) { + case AStylePreferences::ObjC: + return QLatin1String(indentingObjCSample); + default: + return QLatin1String(indentingCxxSample); + } + Q_UNREACHABLE(); } #include "astyle_plugin.moc" diff --git a/plugins/astyle/astyle_preferences.h b/plugins/astyle/astyle_preferences.h --- a/plugins/astyle/astyle_preferences.h +++ b/plugins/astyle/astyle_preferences.h @@ -31,7 +31,7 @@ Q_OBJECT public: - enum Language { CPP, Java, CSharp}; + enum Language { CPP, Java, CSharp, ObjC}; explicit AStylePreferences(Language lang=CPP, QWidget *parent=nullptr); ~AStylePreferences() override; @@ -59,6 +59,7 @@ private: QScopedPointer m_formatter; bool m_enableWidgetSignals; + const Language m_currentLanguage; }; #endif // ASTYLEPREFERENCES_H diff --git a/plugins/astyle/astyle_preferences.cpp b/plugins/astyle/astyle_preferences.cpp --- a/plugins/astyle/astyle_preferences.cpp +++ b/plugins/astyle/astyle_preferences.cpp @@ -62,10 +62,12 @@ AStylePreferences::AStylePreferences(Language lang, QWidget *parent) : SettingsWidget(parent) , m_formatter(new AStyleFormatter) + , m_currentLanguage(lang) { setupUi(this); switch(lang) { case AStylePreferences::CPP: + case AStylePreferences::ObjC: m_formatter->setCStyle(); break; case AStylePreferences::Java: @@ -250,9 +252,9 @@ { Q_UNUSED(emitChangedSignal); if(tabWidget->currentIndex() == 0) - emit previewTextChanged(AStylePlugin::indentingSample()); + emit previewTextChanged(AStylePlugin::indentingSample(m_currentLanguage)); else - emit previewTextChanged(AStylePlugin::formattingSample()); + emit previewTextChanged(AStylePlugin::formattingSample(m_currentLanguage)); } void AStylePreferences::currentTabChanged()