From c82446fc1876c6b17ddaa7736f11bbf24f96b323 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 24 Mar 2014 18:14:44 +0100 Subject: [PATCH] java: .class stub builder API cleaned from explicit ASM dependency --- .../psi/impl/compiled/ClsFileImpl.java | 10 ++++------ .../compiled/InnerClassSourceStrategy.java | 13 +++++-------- .../psi/impl/compiled/StubBuildingVisitor.java | 18 +++++++++--------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java index 4d3cdbfc3bcc..35d74e351145 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsFileImpl.java @@ -567,15 +567,13 @@ public class ClsFileImpl extends ClsRepositoryPsiElement return dir.findChild(baseName + "$" + innerName + ".class"); } - @Nullable @Override - public ClassReader readerForInnerClass(VirtualFile innerClass) { + public void accept(VirtualFile innerClass, StubBuildingVisitor visitor) { try { - return new ClassReader(innerClass.contentsToByteArray()); - } - catch (IOException e) { - return null; + byte[] bytes = innerClass.contentsToByteArray(); + new ClassReader(bytes).accept(visitor, ClassReader.SKIP_FRAMES); } + catch (IOException ignored) { } } }; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/InnerClassSourceStrategy.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/InnerClassSourceStrategy.java index 8ebb87d2276d..a686088b7776 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/InnerClassSourceStrategy.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/InnerClassSourceStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * 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. @@ -13,19 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/* - * @author max - */ package com.intellij.psi.impl.compiled; import org.jetbrains.annotations.Nullable; -import org.jetbrains.org.objectweb.asm.ClassReader; +/** + * @author max + */ public interface InnerClassSourceStrategy { @Nullable T findInnerClass(String name, T outerClass); - @Nullable - ClassReader readerForInnerClass(T innerClass); + void accept(T innerClass, StubBuildingVisitor visitor); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java index fdc14c8fc637..041e51d33931 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/StubBuildingVisitor.java @@ -56,7 +56,7 @@ public class StubBuildingVisitor extends ClassVisitor { public static final String FLOAT_NEGATIVE_INF = "-1.0f / 0.0"; public static final String FLOAT_NAN = "0.0f / 0.0"; - public static final int ASM_API = Opcodes.ASM5; + private static final int ASM_API = Opcodes.ASM5; @NonNls private static final String SYNTHETIC_CLASS_INIT_METHOD = ""; @NonNls private static final String SYNTHETIC_INIT_METHOD = ""; @@ -207,6 +207,9 @@ public class StubBuildingVisitor extends ClassVisitor { case Opcodes.V1_7: return LanguageLevel.JDK_1_7; + case Opcodes.V1_8: + return LanguageLevel.JDK_1_8; + default: return LanguageLevel.HIGHEST; } @@ -320,14 +323,11 @@ public class StubBuildingVisitor extends ClassVisitor { return; } - final T innerSource = myInnersStrategy.findInnerClass(innerName, mySource); - if (innerSource == null) return; - - final ClassReader reader = myInnersStrategy.readerForInnerClass(innerSource); - if (reader == null) return; - - final StubBuildingVisitor classVisitor = new StubBuildingVisitor(innerSource, myInnersStrategy, myResult, access, innerName); - reader.accept(classVisitor, ClassReader.SKIP_FRAMES); + T innerClass = myInnersStrategy.findInnerClass(innerName, mySource); + if (innerClass != null) { + StubBuildingVisitor visitor = new StubBuildingVisitor(innerClass, myInnersStrategy, myResult, access, innerName); + myInnersStrategy.accept(innerClass, visitor); + } } private static boolean isCorrectName(String name) {