diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index e33f920fe146..7d5698fc9aee 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -554,14 +554,7 @@ public def layoutCommunityPlugins(String home) { } } - pluginDir("java-decompiler") { - dir("lib") { - jar("java-decompiler.jar") { - module("java-decompiler") - } - fileset(file: "$home/plugins/java-decompiler/lib/fernflower.jar") - } - } + layoutPlugin("java-decompiler") } } diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 5319444eaae6..081cc4cfccc1 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -285,4 +285,3 @@ jetbrainsLibrary("JPS") jetbrainsLibrary("Maven Embedder") jetbrainsLibrary("tcServiceMessages") jetbrainsLibrary("optimizedFileManager.jar") -jetbrainsLibrary("fernflower.jar") diff --git a/community-tests/src/tests/testGroups.properties b/community-tests/src/tests/testGroups.properties index a528fa8840df..5104b681ee6f 100644 --- a/community-tests/src/tests/testGroups.properties +++ b/community-tests/src/tests/testGroups.properties @@ -4,6 +4,3 @@ org.jetbrains.idea.svn.* org.jetbrains.idea.svn16.* com.intellij.util.net.ssl.* com.intellij.tasks.integration.live.* - -[DECOMPILER_TESTS] -org.jetbrains.java.decompiler.* diff --git a/plugins/java-decompiler/java-decompiler.iml b/plugins/java-decompiler/java-decompiler.iml index cf37a2991f2f..b25775f3666b 100644 --- a/plugins/java-decompiler/java-decompiler.iml +++ b/plugins/java-decompiler/java-decompiler.iml @@ -5,6 +5,9 @@ + + + @@ -13,15 +16,6 @@ - - - - - - - - - diff --git a/plugins/java-decompiler/lib/fernflower.jar b/plugins/java-decompiler/lib/fernflower.jar deleted file mode 100644 index d8589afbb097..000000000000 Binary files a/plugins/java-decompiler/lib/fernflower.jar and /dev/null differ diff --git a/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaDecompiler.java b/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaDecompiler.java index f57ea6a4087b..8acdb8c78ab0 100644 --- a/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaDecompiler.java +++ b/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaDecompiler.java @@ -30,12 +30,12 @@ import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.compiled.ClassFileDecompilers; import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.util.containers.ContainerUtil; -import de.fernflower.main.decompiler.IdeDecompiler; -import de.fernflower.main.extern.IBytecodeProvider; -import de.fernflower.main.extern.IDecompilatSaver; -import de.fernflower.main.extern.IFernflowerLogger; -import de.fernflower.main.extern.IFernflowerPreferences; import org.jetbrains.annotations.NotNull; +import org.jetbrains.java.decompiler.main.decompiler.IdeDecompiler; +import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider; +import org.jetbrains.java.decompiler.main.extern.IDecompilatSaver; +import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger; +import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences; import org.jetbrains.org.objectweb.asm.ClassReader; import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.Opcodes; @@ -51,10 +51,10 @@ public class IdeaDecompiler extends ClassFileDecompilers.Light { private static final Logger LOG = Logger.getInstance(IdeaDecompiler.class); private static final String BANNER = - "//\n" + - "// Source code recreated from a .class file by IntelliJ IDEA\n" + - "// (powered by Fernflower decompiler)\n" + - "//\n\n"; + "//\n" + + "// Source code recreated from a .class file by IntelliJ IDEA\n" + + "// (powered by Fernflower decompiler)\n" + + "//\n\n"; private final IFernflowerLogger myLogger = new IdeaLogger(); private final HashMap myOptions = new HashMap(); diff --git a/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaLogger.java b/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaLogger.java index 904af9bf31b3..48d9bed21bec 100644 --- a/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaLogger.java +++ b/plugins/java-decompiler/src/org/jetbrains/java/decompiler/IdeaLogger.java @@ -16,7 +16,7 @@ package org.jetbrains.java.decompiler; import com.intellij.openapi.diagnostic.Logger; -import de.fernflower.main.extern.IFernflowerLogger; +import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger; public class IdeaLogger implements IFernflowerLogger { private final static Logger LOG = Logger.getInstance(IdeaDecompiler.class); diff --git a/plugins/java-decompiler/test/org/jetbrains/java/decompiler/IdeaDecompilerTest.java b/plugins/java-decompiler/test/org/jetbrains/java/decompiler/IdeaDecompilerTest.java index d7ad94d18fbe..941f677d618b 100644 --- a/plugins/java-decompiler/test/org/jetbrains/java/decompiler/IdeaDecompilerTest.java +++ b/plugins/java-decompiler/test/org/jetbrains/java/decompiler/IdeaDecompilerTest.java @@ -15,30 +15,32 @@ */ package org.jetbrains.java.decompiler; -import com.intellij.openapi.application.PathManager; import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileVisitor; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.io.IOException; public class IdeaDecompilerTest extends LightCodeInsightFixtureTestCase { + private static final String BANNER = + "//\n" + + "// Source code recreated from a .class file by IntelliJ IDEA\n" + + "// (powered by Fernflower decompiler)\n" + + "//\n\n"; + public void testSimple() { String path = PlatformTestUtil.getRtJarPath() + "!/java/lang/String.class"; VirtualFile file = StandardFileSystems.jar().findFileByPath(path); assertNotNull(path, file); String decompiled = new IdeaDecompiler().getText(file).toString(); + assertTrue(decompiled.startsWith(BANNER + "package java.lang;\n")); assertTrue(decompiled, decompiled.contains("public final class String")); assertTrue(decompiled, decompiled.contains("@deprecated")); assertTrue(decompiled, decompiled.contains("private static class CaseInsensitiveComparator")); @@ -46,83 +48,29 @@ public class IdeaDecompilerTest extends LightCodeInsightFixtureTestCase { assertFalse(decompiled, decompiled.contains("synthetic")); } - public void testStubCompatibilityRt() { - String path = PlatformTestUtil.getRtJarPath() + "!/"; + public void testStubCompatibility() { + String path = PlatformTestUtil.getRtJarPath() + "!/java"; VirtualFile dir = StandardFileSystems.jar().findFileByPath(path); assertNotNull(path, dir); doTestStubCompatibility(dir); } - public void testStubCompatibilityIdea() { - String path = PathManager.getHomePath() + "/out/production"; - if (!new File(path).exists()) path = PathManager.getHomePath() + "/out/classes/production"; - VirtualFile dir = StandardFileSystems.local().refreshAndFindFileByPath(path); - assertNotNull(path, dir); - doTestStubCompatibility(dir); - } - private void doTestStubCompatibility(VirtualFile root) { - doTestStubCompatibility(root, null); - } - - private void doTestStubCompatibility(VirtualFile root, @Nullable final String textPath) { - final int pathStart = root.getPath().length(); - final boolean compare = textPath != null && new File(textPath).exists(); - VfsUtilCore.visitChildrenRecursively(root, new VirtualFileVisitor() { @Override public boolean visitFile(@NotNull VirtualFile file) { - if (!file.isDirectory() && file.getFileType() == StdFileTypes.CLASS && !file.getName().contains("$")) { + if (file.isDirectory()) { + System.out.println(file.getPath()); + } + else if (file.getFileType() == StdFileTypes.CLASS && !file.getName().contains("$")) { PsiFile clsFile = getPsiManager().findFile(file); assertNotNull(file.getPath(), clsFile); - - PsiElement mirror = ((ClsFileImpl)clsFile).getMirror().copy(); - if (textPath != null) { - collapseCodeBlocks(mirror); - } + PsiElement mirror = ((ClsFileImpl)clsFile).getMirror(); String decompiled = mirror.getText(); assertTrue(file.getPath(), decompiled.contains(file.getNameWithoutExtension())); - - if (textPath != null) { - try { - File txtFile = new File(textPath, file.getPath().substring(pathStart)); - if (!compare) { - FileUtil.writeToFile(txtFile, decompiled.getBytes("UTF-8")); - } - else { - String expected = FileUtil.loadFile(txtFile, "UTF-8"); - assertEquals(file.getPath(), expected, decompiled); - } - } - catch (IOException e) { - throw new RuntimeException(e); - } - } } return true; } }); } - - private static void collapseCodeBlocks(PsiElement original) { - final PsiElementFactory factory = PsiElementFactory.SERVICE.getInstance(original.getProject()); - original.accept(new JavaRecursiveElementWalkingVisitor() { - @Override - public void visitMethod(PsiMethod method) { - PsiCodeBlock body = method.getBody(); - if (body != null) { - body.replace(factory.createCodeBlockFromText("{ /* collapsed */}", null)); - } - } - - @Override - public void visitClass(PsiClass aClass) { - for (PsiClassInitializer initializer : aClass.getInitializers()) { - PsiCodeBlock body = initializer.getBody(); - body.replace(factory.createCodeBlockFromText("{ /* collapsed */}", null)); - } - super.visitClass(aClass); - } - }); - } }