rewrite class file stub builder as full decompiler (workaround SOE)
[idea/community.git] / java / java-psi-impl / src / com / intellij / psi / impl / compiled / ClassFileDecompiler.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.psi.impl.compiled;
3
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.fileTypes.BinaryFileDecompiler;
6 import com.intellij.openapi.project.DefaultProjectFactory;
7 import com.intellij.openapi.vfs.VirtualFile;
8 import com.intellij.psi.PsiManager;
9 import com.intellij.psi.compiled.ClassFileDecompilers;
10 import org.jetbrains.annotations.NotNull;
11
12 public class ClassFileDecompiler implements BinaryFileDecompiler {
13   private static final Logger LOG = Logger.getInstance(ClassFileDecompiler.class);
14
15   @Override
16   public @NotNull CharSequence decompile(@NotNull VirtualFile file) {
17     ClassFileDecompilers.Decompiler decompiler = ClassFileDecompilers.getInstance().find(file, ClassFileDecompilers.Decompiler.class);
18     if (decompiler instanceof ClsDecompilerImpl) {
19       return ClsFileImpl.decompile(file);
20     }
21
22     if (decompiler instanceof ClassFileDecompilers.Full) {
23       PsiManager manager = PsiManager.getInstance(DefaultProjectFactory.getInstance().getDefaultProject());
24       return ((ClassFileDecompilers.Full)decompiler).createFileViewProvider(file, manager, true).getContents();
25     }
26
27     if (decompiler instanceof ClassFileDecompilers.Light) {
28       try {
29         return ((ClassFileDecompilers.Light)decompiler).getText(file);
30       }
31       catch (ClassFileDecompilers.Light.CannotDecompileException e) {
32         LOG.warn("decompiler: " + decompiler.getClass(), e);
33       }
34     }
35
36     throw new IllegalStateException(decompiler.getClass().getName() +
37                                     " should be on of " +
38                                     ClassFileDecompilers.Full.class.getName() +
39                                     " or " +
40                                     ClassFileDecompilers.Light.class.getName());
41   }
42 }