| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.psi.compiled; |
| |
| import com.intellij.openapi.extensions.ExtensionPointName; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.psi.FileViewProvider; |
| import com.intellij.psi.PsiManager; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * An API to extend default IDEA .class file decompiler and handle files compiled from sources other than Java. |
| * |
| * @since 134.1050 |
| */ |
| public class ClassFileDecompilers { |
| |
| /** |
| * Actual implementations should extend either {@link Light} or {@link Full} classes - |
| * those that don't are silently ignored. |
| */ |
| public interface Decompiler { |
| boolean accepts(@NotNull VirtualFile file); |
| } |
| |
| |
| /** |
| * <p>"Light" decompilers are intended for augmenting file text constructed by standard IDEA decompiler |
| * without changing it's structure - i.e. providing additional information in comments, |
| * or replacing standard "compiled code" method body comment with something more meaningful.</p> |
| * |
| * <p>Plugins registering extension of this type normally should accept all files and use {@code order="last"} |
| * attribute to avoid interfering with other decompilers.</p> |
| */ |
| public abstract static class Light implements Decompiler { |
| @NotNull |
| public abstract CharSequence getText(@NotNull VirtualFile file); |
| } |
| |
| |
| /** |
| * <p>"Full" decompilers are designed to provide extended support for languages significantly different from Java. |
| * Extensions of this type should take care of building file stubs and properly indexing them - |
| * in return they have an ability to represent decompiled file in a way natural for original language.</p> |
| */ |
| public abstract static class Full implements Decompiler { |
| @NotNull |
| public abstract ClsStubBuilder getStubBuilder(); |
| |
| /** |
| * <h5>Notes for implementers</h5> |
| * |
| * <p>1. Return a correct language from {@link FileViewProvider#getBaseLanguage()}.</p> |
| * |
| * <p>2. This method is called for both PSI file construction and obtaining document text. |
| * In the latter case the PsiManager is based on default project, and the only method called |
| * on a resulting view provider is {@link FileViewProvider#getContents()}.</p> |
| * |
| * <p>3. A language compiler may produce auxiliary .class files which should be handled as part of their parent classes. |
| * A standard practice is to hide such files by returning {@code null} from |
| * {@link FileViewProvider#getPsi(com.intellij.lang.Language)}.</p> |
| */ |
| @NotNull |
| public abstract FileViewProvider createFileViewProvider(@NotNull VirtualFile file, @NotNull PsiManager manager, boolean physical); |
| } |
| |
| |
| public static ExtensionPointName<Decompiler> EP_NAME = ExtensionPointName.create("com.intellij.psi.classFileDecompiler"); |
| |
| private ClassFileDecompilers() { } |
| |
| @Nullable |
| public static Decompiler find(@NotNull VirtualFile file) { |
| for (Decompiler decompiler : EP_NAME.getExtensions()) { |
| if ((decompiler instanceof Light || decompiler instanceof Full) && decompiler.accepts(file)) { |
| return decompiler; |
| } |
| } |
| |
| return null; |
| } |
| } |