From d9286c9fc1baa1ab551bf659140d0a6e6d00e91f Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 20 May 2013 13:08:09 +0200 Subject: [PATCH] EA-46236 (parse mirrors with a correct language level) --- .../com/intellij/pom/java/LanguageLevel.java | 30 +++++------------- .../psi/impl/compiled/ClsFileImpl.java | 11 +++++-- .../impl/java/stubs/JavaClassElementType.java | 15 +++++---- .../java/stubs/impl/PsiClassStubImpl.java | 2 +- .../psi/impl/source/JavaFileElementType.java | 2 +- .../testData/psi/cls/mirror/ValuedEnum.txt | 19 +++++++++++ .../psi/cls/mirror/pkg/ValuedEnum.class | Bin 0 -> 1965 bytes .../intellij/psi/ClsMirrorBuildingTest.java | 1 + 8 files changed, 48 insertions(+), 32 deletions(-) create mode 100644 java/java-tests/testData/psi/cls/mirror/ValuedEnum.txt create mode 100644 java/java-tests/testData/psi/cls/mirror/pkg/ValuedEnum.class diff --git a/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java b/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java index 9774133bad24..e980c0a01c10 100644 --- a/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java +++ b/java/java-psi-api/src/com/intellij/pom/java/LanguageLevel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -17,6 +17,8 @@ package com.intellij.pom.java; import com.intellij.core.JavaCoreBundle; import com.intellij.openapi.util.Key; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -35,38 +37,22 @@ public enum LanguageLevel { private final String myPresentableText; - private LanguageLevel(final String presentableText) { + LanguageLevel(@NotNull @Nls String presentableText) { myPresentableText = presentableText; } - /** @deprecated (to remove in IDEA 13) */ - @SuppressWarnings("UnusedDeclaration") - public int getIndex() { - return ordinal() + 3; // solely for backward compatibility - } - - /** @deprecated (to remove in IDEA 13) */ - @SuppressWarnings("UnusedDeclaration") - public boolean hasAssertKeyword() { - return isAtLeast(JDK_1_4); - } - - /** @deprecated use {@linkplain com.intellij.psi.util.PsiUtil#isLanguageLevel5OrHigher(com.intellij.psi.PsiElement)} (to remove in IDEA 13) */ - @SuppressWarnings("UnusedDeclaration") - public boolean hasEnumKeywordAndAutoboxing() { - return isAtLeast(JDK_1_5); - } - + @NotNull + @Nls public String getPresentableText() { return myPresentableText; } - public boolean isAtLeast(final LanguageLevel level) { + public boolean isAtLeast(@NotNull LanguageLevel level) { return compareTo(level) >= 0; } @Nullable - public static LanguageLevel parse(final String value) { + public static LanguageLevel parse(@Nullable String value) { if ("1.3".equals(value)) return JDK_1_3; if ("1.4".equals(value)) return JDK_1_4; if ("1.5".equals(value)) return JDK_1_5; 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 b5b107708768..24d131232e87 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 @@ -45,6 +45,7 @@ import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.impl.source.tree.TreeElement; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.stubs.*; +import com.intellij.psi.util.PsiUtil; import com.intellij.reference.SoftReference; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; @@ -214,8 +215,7 @@ public class ClsFileImpl extends ClsRepositoryPsiElement @Override @NotNull public LanguageLevel getLanguageLevel() { - final List stubs = getStub().getChildrenStubs(); - return stubs.size() > 0 ? ((PsiClassStub)stubs.get(0)).getLanguageLevel() : LanguageLevel.HIGHEST; + return LanguageLevel.HIGHEST; // library classes should inherit language level from modules where they are referenced } @Override @@ -290,6 +290,7 @@ public class ClsFileImpl extends ClsRepositoryPsiElement String fileName = (classes.length > 0 ? classes[0].getName() : file.getNameWithoutExtension()) + "." + ext; PsiFileFactory factory = PsiFileFactory.getInstance(getManager().getProject()); PsiFile mirror = factory.createFileFromText(fileName, JavaLanguage.INSTANCE, mirrorText, false, false); + mirror.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, getSourceLanguageLevel()); mirrorTreeElement = SourceTreeToPsiMap.psiToTreeNotNull(mirror); // IMPORTANT: do not take lock too early - FileDocumentManager.saveToString() can run write action @@ -311,6 +312,12 @@ public class ClsFileImpl extends ClsRepositoryPsiElement return mirrorTreeElement.getPsi(); } + @NotNull + private LanguageLevel getSourceLanguageLevel() { + final List stubs = getStub().getChildrenStubs(); + return stubs.size() > 0 ? ((PsiClassStub)stubs.get(0)).getLanguageLevel() : LanguageLevel.HIGHEST; + } + @Override public PsiFile getDecompiledPsiFile() { for (ClsFileDecompiledPsiFileProvider provider : Extensions.getExtensions(ClsFileDecompiledPsiFileProvider.EP_NAME)) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java index 95888e04931c..8d6000647162 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.java.stubs; import com.intellij.lang.ASTNode; import com.intellij.lang.LighterAST; import com.intellij.lang.LighterASTNode; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiNameHelper; @@ -152,6 +153,7 @@ public abstract class JavaClassElementType extends JavaStubElementType extends StubBase implements @Override public LanguageLevel getLanguageLevel() { - return myLanguageLevel != null ? myLanguageLevel : LanguageLevel.HIGHEST; // TODO!!! + return myLanguageLevel != null ? myLanguageLevel : LanguageLevel.HIGHEST; } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java index d81b84dec40b..f9244e22b5d9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java @@ -38,7 +38,7 @@ import java.io.IOException; * @author max */ public class JavaFileElementType extends ILightStubFileElementType { - public static final int STUB_VERSION = 16; + public static final int STUB_VERSION = 17; public JavaFileElementType() { super("java.FILE", JavaLanguage.INSTANCE); diff --git a/java/java-tests/testData/psi/cls/mirror/ValuedEnum.txt b/java/java-tests/testData/psi/cls/mirror/ValuedEnum.txt new file mode 100644 index 000000000000..eec6980ae61c --- /dev/null +++ b/java/java-tests/testData/psi/cls/mirror/ValuedEnum.txt @@ -0,0 +1,19 @@ + + // IntelliJ API Decompiler stub source generated from a class file + // Implementation of methods is not available + +package org.apache.commons.lang.enum; + +public abstract class ValuedEnum extends org.apache.commons.lang.enum.Enum { + private final int iValue; + + protected ValuedEnum(java.lang.String name, int value) { /* compiled code */ } + + protected static org.apache.commons.lang.enum.Enum getEnum(java.lang.Class enumClass, int value) { /* compiled code */ } + + public final int getValue() { /* compiled code */ } + + public int compareTo(java.lang.Object other) { /* compiled code */ } + + public java.lang.String toString() { /* compiled code */ } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/cls/mirror/pkg/ValuedEnum.class b/java/java-tests/testData/psi/cls/mirror/pkg/ValuedEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..5dbc74db952132a5d765b4463efabd6888881142 GIT binary patch literal 1965 zcma)7Yj4|B7=BKg)T!g%(yq`8EZtyhldj=1HdxngbYZ)ztZd~RhZsOwDk>gDL z9f0`27hnR01RpkOq>M>`_=1GQMf?T+2k;!*ZOn!yKEyufJ@4gtpZ7V=&wqXU9lCG~ z4Hcu9>p>4rE0|B>j7syIG@ec2c`T%G4vPw2Q0cKGH|JHnh-DQ8Tu|{6it=$$!HS9j ztjfpBNnDcg7m|2I?$?r7m+w~rFrByE(?z&#GXh|2HvTkkYt||ASG49pOroeR3ajSW~p_gk$ zzUaKv8l3|IFYSE83$1(F09(%LmOO=5f4 zbwhWJbw}Vp6!U6n+bDZ;(kJ0~HN%xmc3KaQnbC8CF|hR1bi^YZ4ofs^j_a-X>~%F9 z(yp#KEw^l(H|2c#J1o!2{2C_knualq3mobcELfIN)vX1$+NvA2x3p6>8lLIc0teS? zMn;mC@hQsGTTL%xJ6@(_WbBq@X?Pu*3NCB7f;SYrso^cWEpYUIj$T6^PiVLbT|r4h z85ISFhAo^>P}NX_sbL%MP?{aELGR~UTU&-J`yqxp2vuC+Z(eRlw;+;da6(}6fkttCyX7bxxFC& zR_;qfsp-uX-+@}YOv!c#3VZ@RhFTx`SCT!o_jh7KKY7OjF-7w2NifBm<`wLUv9r2G zcvA&m3=FDkGzJRoFS6}L@2*GdZS_36@i&3k$ZIC7Z(hew`=^rvWBPeNq!JV z0q_DzRdbarlXpMUf&L*9dm_mQD36S!j% zhqz-P4&yNU;0pw2c>y7%@~640Sd;K<^mey)rn*?)a+Qo8(77$w=V1PiiloW+$>X?`W9r z1EQ3ZTF$niwb5J54a~ODH$M^k2&vpe{A!#3KX);(xr@PE8|m~AAM_oT>jS}BZDS<; z5Z7%y+~IV@=jj(D@hkfA8;0>a74nCVEExB4h%Cwf+LQjc`|%u}^~Wu^lEj?)2lofS AkN^Mx literal 0 HcmV?d00001 diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java index 14c2e2927c9b..0217607f1793 100644 --- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java @@ -42,6 +42,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase { public void testEA40568() { doTest(); } public void testBooleans() { doTest(); } public void testClassRefs() { doTest(); } + public void testEA46236() { doTest("ValuedEnum"); } private void doTest() { doTest(getTestName(false));