rewrite class file stub builder as full decompiler
[idea/community.git] / java / java-psi-impl / src / com / intellij / psi / impl / compiled / ClassFileStubBuilder.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.vfs.VirtualFile;
6 import com.intellij.psi.compiled.ClassFileDecompilers;
7 import com.intellij.psi.stubs.BinaryFileStubBuilder;
8 import com.intellij.psi.stubs.Stub;
9 import com.intellij.util.cls.ClsFormatException;
10 import com.intellij.util.indexing.FileContent;
11 import org.jetbrains.annotations.NotNull;
12 import org.jetbrains.annotations.Nullable;
13
14 import java.util.stream.Stream;
15
16 import static com.intellij.psi.compiled.ClassFileDecompilers.Full;
17
18 public class ClassFileStubBuilder implements BinaryFileStubBuilder.CompositeBinaryFileStubBuilder<Full> {
19   private static final Logger LOG = Logger.getInstance(ClassFileStubBuilder.class);
20
21   public static final int STUB_VERSION = 26;
22
23   @Override
24   public boolean acceptsFile(@NotNull VirtualFile file) {
25     return true;
26   }
27
28   @Override
29   public @NotNull Stream<Full> getAllSubBuilders() {
30     return ClassFileDecompilers.getInstance().EP_NAME.extensions().filter(d -> d instanceof Full).map(d -> (Full) d);
31   }
32
33   @Override
34   public @Nullable Full getSubBuilder(@NotNull FileContent fileContent) {
35     return fileContent.getFile()
36       .computeWithPreloadedContentHint(fileContent.getContent(), () -> ClassFileDecompilers.getInstance().find(fileContent.getFile(), Full.class));
37   }
38
39   @Override
40   public @NotNull String getSubBuilderVersion(@Nullable Full decompiler) {
41     if (decompiler == null) return "default";
42     int version = decompiler.getStubBuilder().getStubVersion();
43     return decompiler.getClass().getName() + ":" + version;
44   }
45
46   @Override
47   public @Nullable Stub buildStubTree(@NotNull FileContent fileContent, @Nullable Full decompiler) {
48     if (decompiler == null) return null;
49     return fileContent.getFile().computeWithPreloadedContentHint(fileContent.getContent(), () -> {
50       VirtualFile file = fileContent.getFile();
51       try {
52         return decompiler.getStubBuilder().buildFileStub(fileContent);
53       }
54       catch (ClsFormatException e) {
55         if (LOG.isDebugEnabled()) LOG.debug(file.getPath(), e);
56         else LOG.info(file.getPath() + ": " + e.getMessage());
57       }
58       return null;
59     });
60   }
61
62   @Override
63   public int getStubVersion() {
64     return STUB_VERSION;
65   }
66 }