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 000000000000..5dbc74db9521 Binary files /dev/null and b/java/java-tests/testData/psi/cls/mirror/pkg/ValuedEnum.class differ 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));