From 67dad103a674658e41e35ef7622a74ae139ba636 Mon Sep 17 00:00:00 2001 From: realxu Date: Mon, 15 May 2017 17:03:07 +0800 Subject: [PATCH 1/3] add support tu Kotlin --- META-INF/plugin.xml | 1 + .../offing_harbor/ConvertAction.java | 18 +++++++--- .../offing_harbor/ConvertConfig.java | 5 ++- .../offing_harbor/ConvertConfigDialog.java | 13 +++++++ .../offing_harbor/ConvertExecutor.java | 35 +++++++++++++++---- 5 files changed, 58 insertions(+), 14 deletions(-) diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index b4abd5c..4f708a9 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -13,6 +13,7 @@ 1.6: Fix NPE on Android Studio 2.3 / Update ButterKnife annotation
1.5: Use JDK 1.6 for build.
1.4: Quick-fix for NullPointerException.
diff --git a/src/jp/funnything/offing_harbor/ConvertAction.java b/src/jp/funnything/offing_harbor/ConvertAction.java index 4d9d960..c2ef862 100644 --- a/src/jp/funnything/offing_harbor/ConvertAction.java +++ b/src/jp/funnything/offing_harbor/ConvertAction.java @@ -7,11 +7,8 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataKeys; import com.intellij.openapi.vfs.VirtualFile; -import org.apache.commons.io.IOUtils; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -74,10 +71,21 @@ private String extractLayoutFileNameFromJavaFile(VirtualFile file) { } catch (IOException e) { throw new RuntimeException(e); } finally { - IOUtils.closeQuietly(reader); + closeQuietly(reader); } } + private static void closeQuietly(Reader input) { + try { + if (input != null) { + input.close(); + } + } catch (IOException ioe) { + // ignore + } + } + + /** * 基準ファイルから子を優先して探索する */ diff --git a/src/jp/funnything/offing_harbor/ConvertConfig.java b/src/jp/funnything/offing_harbor/ConvertConfig.java index 321f284..aabfe57 100644 --- a/src/jp/funnything/offing_harbor/ConvertConfig.java +++ b/src/jp/funnything/offing_harbor/ConvertConfig.java @@ -10,10 +10,10 @@ public boolean willModify() { } public enum ConvertFormat { - PLAIN, ANDROID_ANNOTATIONS, BUTTER_KNIFE; + PLAIN, ANDROID_ANNOTATIONS, BUTTER_KNIFE, KOTLIN; public boolean requireAssignMethod() { - return this == PLAIN; + return this == PLAIN || this == KOTLIN; } } @@ -35,4 +35,3 @@ public ConvertConfig() { useSmartType = false; } } - diff --git a/src/jp/funnything/offing_harbor/ConvertConfigDialog.java b/src/jp/funnything/offing_harbor/ConvertConfigDialog.java index 3ae15ac..4cf56b4 100644 --- a/src/jp/funnything/offing_harbor/ConvertConfigDialog.java +++ b/src/jp/funnything/offing_harbor/ConvertConfigDialog.java @@ -25,6 +25,7 @@ public class ConvertConfigDialog extends DialogWrapper { private JRadioButton mFormatPlainRadioButton; private JRadioButton mFormatAndroidAnnotationsRadioButton; private JRadioButton mFormatButterKnifeRadioButton; + private JRadioButton mFormatKotlinRadioButton; private JRadioButton mVisibilityPrivate; private JRadioButton mVisibilityPackagePrivate; private JRadioButton mVisibilityProtected; @@ -83,6 +84,7 @@ protected JComponent createCenterPanel() { mFormatPlainRadioButton = new JRadioButton("for plain Android frameworks"); mFormatAndroidAnnotationsRadioButton = new JRadioButton("for AndroidAnnotations"); mFormatButterKnifeRadioButton = new JRadioButton("for ButterKnife"); + mFormatKotlinRadioButton = new JRadioButton("for Kotlin"); ActionListener formatChangeListener = new ActionListener() { @Override @@ -93,6 +95,8 @@ public void actionPerformed(ActionEvent actionEvent) { applyVisibilityConstraint(ConvertConfig.ConvertFormat.ANDROID_ANNOTATIONS); } else if (actionEvent.getSource() == mFormatButterKnifeRadioButton) { applyVisibilityConstraint(ConvertConfig.ConvertFormat.BUTTER_KNIFE); + } else if (actionEvent.getSource() == mFormatKotlinRadioButton) { + applyVisibilityConstraint(ConvertConfig.ConvertFormat.KOTLIN); } } }; @@ -100,15 +104,18 @@ public void actionPerformed(ActionEvent actionEvent) { mFormatPlainRadioButton.addActionListener(formatChangeListener); mFormatAndroidAnnotationsRadioButton.addActionListener(formatChangeListener); mFormatButterKnifeRadioButton.addActionListener(formatChangeListener); + mFormatKotlinRadioButton.addActionListener(formatChangeListener); ButtonGroup formatButtonGroup = new ButtonGroup(); formatButtonGroup.add(mFormatPlainRadioButton); formatButtonGroup.add(mFormatAndroidAnnotationsRadioButton); formatButtonGroup.add(mFormatButterKnifeRadioButton); + formatButtonGroup.add(mFormatKotlinRadioButton); formatBox.add(mFormatPlainRadioButton); formatBox.add(mFormatAndroidAnnotationsRadioButton); formatBox.add(mFormatButterKnifeRadioButton); + formatBox.add(mFormatKotlinRadioButton); box.add(Box.createHorizontalStrut(5)); box.add(formatBox); @@ -204,6 +211,8 @@ private ConvertConfig.ConvertFormat getFormat() { return ConvertConfig.ConvertFormat.ANDROID_ANNOTATIONS; } else if (mFormatButterKnifeRadioButton.isSelected()) { return ConvertConfig.ConvertFormat.BUTTER_KNIFE; + } else if (mFormatKotlinRadioButton.isSelected()) { + return ConvertConfig.ConvertFormat.KOTLIN; } else { throw new IllegalStateException("assert"); } @@ -220,6 +229,9 @@ private void setFormat(ConvertConfig.ConvertFormat format) { case BUTTER_KNIFE: mFormatButterKnifeRadioButton.setSelected(true); break; + case KOTLIN: + mFormatKotlinRadioButton.setSelected(true); + break; default: throw new IllegalStateException("assert"); } @@ -228,6 +240,7 @@ private void setFormat(ConvertConfig.ConvertFormat format) { private void applyVisibilityConstraint(ConvertConfig.ConvertFormat format) { switch (format) { case PLAIN: + case KOTLIN: mVisibilityPrivate.setEnabled(true); mVisibilityPackagePrivate.setEnabled(true); mVisibilityProtected.setEnabled(true); diff --git a/src/jp/funnything/offing_harbor/ConvertExecutor.java b/src/jp/funnything/offing_harbor/ConvertExecutor.java index 69719ab..a40e780 100644 --- a/src/jp/funnything/offing_harbor/ConvertExecutor.java +++ b/src/jp/funnything/offing_harbor/ConvertExecutor.java @@ -14,7 +14,6 @@ import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; import org.apache.commons.lang.StringUtils; -import org.apache.commons.io.IOUtils; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; @@ -145,7 +144,7 @@ public void execute(Project project, VirtualFile file, ConvertConfig config) { } catch (IOException e) { throw new RuntimeException(e); } finally { - IOUtils.closeQuietly(is); + closeQuietly(is); } Tree viewNameTree = config.useSmartType ? prepareViewNames(project) : null; @@ -157,6 +156,16 @@ public void execute(Project project, VirtualFile file, ConvertConfig config) { Notifications.Bus.notify(new Notification("OffingHarbor", "OffingHarbor", "Code is copied to clipboard", NotificationType.INFORMATION), project); } + private static void closeQuietly(InputStream input) { + try { + if (input != null) { + input.close(); + } + } catch (IOException ioe) { + // ignore + } + } + private List extractViewInfos(InputStream is) { try { return traverseViewInfos(DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is)); @@ -219,7 +228,11 @@ private String generateJavaCode(List infos, Tree viewNameTree, throw new IllegalStateException("assert"); } - methodJavaCode.append("private void assignViews() {" + NL); + if (config.format == ConvertConfig.ConvertFormat.KOTLIN) { + methodJavaCode.append("private fun assignViews() {" + NL); + } else { + methodJavaCode.append("private void assignViews() {" + NL); + } for (AndroidViewInfo info : infos) { String type = config.useSmartType ? info.findOptimalType(viewNameTree) : info.type; @@ -234,14 +247,24 @@ private String generateJavaCode(List infos, Tree viewNameTree, } else if (config.format == ConvertConfig.ConvertFormat.BUTTER_KNIFE) { // Butter Knife always requires resource-id fieldJavaCode.append(String.format("@BindView(R.id.%s)" + NL + "%s%s %s;" + NL, info.id, visibility, type, symbol)); + } else if (config.format == ConvertConfig.ConvertFormat.KOTLIN) { + fieldJavaCode.append(String.format("%slateinit var %s: %s" + NL, visibility, symbol, type)); } else { fieldJavaCode.append(String.format("%s%s %s;" + NL, visibility, type, symbol)); } - if (type.equals("View")) { - methodJavaCode.append(String.format(" %s = findViewById(R.id.%s);" + NL, symbol, info.id)); + if (config.format == ConvertConfig.ConvertFormat.KOTLIN) { + if (type.equals("View")) { + methodJavaCode.append(String.format(" %s = findViewById(R.id.%s)" + NL, symbol, info.id)); + } else { + methodJavaCode.append(String.format(" %s = findViewById(R.id.%s) as %s" + NL, symbol, info.id, type)); + } } else { - methodJavaCode.append(String.format(" %s = (%s) findViewById(R.id.%s);" + NL, symbol, type, info.id)); + if (type.equals("View")) { + methodJavaCode.append(String.format(" %s = findViewById(R.id.%s);" + NL, symbol, info.id)); + } else { + methodJavaCode.append(String.format(" %s = (%s) findViewById(R.id.%s);" + NL, symbol, type, info.id)); + } } } From 79dfb76952aa21857a1d7782b8a78c0bbfa3a193 Mon Sep 17 00:00:00 2001 From: realxu Date: Mon, 15 May 2017 17:05:51 +0800 Subject: [PATCH 2/3] modify:use full class name --- src/jp/funnything/offing_harbor/ConvertAction.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/jp/funnything/offing_harbor/ConvertAction.java b/src/jp/funnything/offing_harbor/ConvertAction.java index c2ef862..cf43d3b 100644 --- a/src/jp/funnything/offing_harbor/ConvertAction.java +++ b/src/jp/funnything/offing_harbor/ConvertAction.java @@ -8,7 +8,9 @@ import com.intellij.openapi.actionSystem.DataKeys; import com.intellij.openapi.vfs.VirtualFile; -import java.io.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; From e2934bf31abb95e59a24122ce085718a2a693087 Mon Sep 17 00:00:00 2001 From: realxu Date: Mon, 15 May 2017 17:14:00 +0800 Subject: [PATCH 3/3] modify:use full class name --- src/jp/funnything/offing_harbor/ConvertAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/jp/funnything/offing_harbor/ConvertAction.java b/src/jp/funnything/offing_harbor/ConvertAction.java index cf43d3b..e141a11 100644 --- a/src/jp/funnything/offing_harbor/ConvertAction.java +++ b/src/jp/funnything/offing_harbor/ConvertAction.java @@ -11,6 +11,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.Reader; import java.util.regex.Matcher; import java.util.regex.Pattern;