1faf4f811133d14047c1a79787b322a2d0f26f12
[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 ClassFileDecompilers.Full) {
19       PsiManager manager = PsiManager.getInstance(DefaultProjectFactory.getInstance().getDefaultProject());
20       return ((ClassFileDecompilers.Full)decompiler).createFileViewProvider(file, manager, true).getContents();
21     }
22
23     if (decompiler instanceof ClassFileDecompilers.Light) {
24       try {
25         return ((ClassFileDecompilers.Light)decompiler).getText(file);
26       }
27       catch (ClassFileDecompilers.Light.CannotDecompileException e) {
28         LOG.warn("decompiler: " + decompiler.getClass(), e);
29       }
30     }
31
32     throw new IllegalStateException(decompiler.getClass().getName() +
33                                     " should be on of " +
34                                     ClassFileDecompilers.Full.class.getName() +
35                                     " or " +
36                                     ClassFileDecompilers.Light.class.getName());
37   }
38 }