static flag for top level classes

This commit is contained in:
Alexey Kudravtsev
2010-02-05 17:13:50 +03:00
parent 7d553ac342
commit 1dabdd4690
11 changed files with 79 additions and 72 deletions
@@ -66,7 +66,7 @@ public class ClsStubBuilder {
final PsiJavaFileStubImpl file = new PsiJavaFileStubImpl("dont.know.yet", true);
try {
final PsiClassStub result = buildClass(vFile, bytes, file, 0);
final PsiClassStub result = buildClass(vFile, bytes, file, Opcodes.ACC_STATIC);
if (result == null) return null;
file.setPackageName(getPackageName(result));
@@ -125,7 +125,7 @@ public class ClsStubBuilder {
final String shortName = PsiNameHelper.getShortClassName(fqn);
final int flags = myAccess == 0 ? access : myAccess;
final int flags = myAccess | access;
boolean isDeprecated = (flags & Opcodes.ACC_DEPRECATED) != 0;
boolean isInterface = (flags & Opcodes.ACC_INTERFACE) != 0;
@@ -228,11 +228,14 @@ public class ClsStubBuilder {
if ((access & Opcodes.ACC_PRIVATE) != 0) {
flags |= ModifierFlags.PRIVATE_MASK;
} else if ((access & Opcodes.ACC_PROTECTED) != 0) {
}
else if ((access & Opcodes.ACC_PROTECTED) != 0) {
flags |= ModifierFlags.PROTECTED_MASK;
} else if ((access & Opcodes.ACC_PUBLIC) != 0) {
}
else if ((access & Opcodes.ACC_PUBLIC) != 0) {
flags |= ModifierFlags.PUBLIC_MASK;
} else {
}
else {
flags |= ModifierFlags.PACKAGE_LOCAL_MASK;
}
@@ -628,7 +631,8 @@ public class ClsStubBuilder {
final double d = ((Double)value).doubleValue();
if (Double.isInfinite(d)) {
return d > 0 ? "1.0 / 0.0" : "-1.0 / 0.0";
} else if (Double.isNaN(d)) {
}
else if (Double.isNaN(d)) {
return "0.0d / 0.0";
}
return Double.toString(d);
@@ -639,9 +643,11 @@ public class ClsStubBuilder {
if (Float.isInfinite(v)) {
return v > 0 ? "1.0f / 0.0" : "-1.0f / 0.0";
} else if (Float.isNaN(v)) {
}
else if (Float.isNaN(v)) {
return "0.0f / 0.0";
} else {
}
else {
return Float.toString(v) + "f";
}
}
@@ -26,6 +26,7 @@ import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiModifierListStub;
import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.impl.source.tree.Factory;
import com.intellij.psi.impl.source.tree.JavaElementType;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
@@ -38,21 +39,21 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Map;
public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub> implements PsiModifierList, Constants {
public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub> implements PsiModifierList {
private static final Map<String, IElementType> NAME_TO_KEYWORD_TYPE_MAP = new THashMap<String, IElementType>();
static{
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PUBLIC, PUBLIC_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PROTECTED, PROTECTED_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PRIVATE, PRIVATE_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.STATIC, STATIC_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.ABSTRACT, ABSTRACT_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.FINAL, FINAL_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.NATIVE, NATIVE_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.SYNCHRONIZED, SYNCHRONIZED_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.STRICTFP, STRICTFP_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.TRANSIENT, TRANSIENT_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.VOLATILE, VOLATILE_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PUBLIC, JavaTokenType.PUBLIC_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PROTECTED, JavaTokenType.PROTECTED_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.PRIVATE, JavaTokenType.PRIVATE_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.STATIC, JavaTokenType.STATIC_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.ABSTRACT, JavaTokenType.ABSTRACT_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.FINAL, JavaTokenType.FINAL_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.NATIVE, JavaTokenType.NATIVE_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.SYNCHRONIZED, JavaTokenType.SYNCHRONIZED_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.STRICTFP, JavaTokenType.STRICTFP_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.TRANSIENT, JavaTokenType.TRANSIENT_KEYWORD);
NAME_TO_KEYWORD_TYPE_MAP.put(PsiModifier.VOLATILE, JavaTokenType.VOLATILE_KEYWORD);
}
public static final TObjectIntHashMap<String> NAME_TO_MODIFIER_FLAG_MAP = new TObjectIntHashMap<String>();
@@ -94,40 +95,40 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
if (parent instanceof PsiClass){
PsiElement pparent = parent.getParent();
if (pparent instanceof PsiClass && ((PsiClass)pparent).isInterface()){
if (type == PUBLIC_KEYWORD){
if (type == JavaTokenType.PUBLIC_KEYWORD){
return true;
}
if (type == null){ // package local
return false;
}
if (type == STATIC_KEYWORD){
if (type == JavaTokenType.STATIC_KEYWORD){
return true;
}
}
if (((PsiClass)parent).isInterface()){
if (type == ABSTRACT_KEYWORD){
if (type == JavaTokenType.ABSTRACT_KEYWORD){
return true;
}
// nested interface is implicitly static
if (pparent instanceof PsiClass) {
if (type == STATIC_KEYWORD){
if (type == JavaTokenType.STATIC_KEYWORD){
return true;
}
}
}
if (((PsiClass)parent).isEnum()){
if (type == STATIC_KEYWORD) {
if (type == JavaTokenType.STATIC_KEYWORD) {
if (!(pparent instanceof PsiFile)) return true;
}
else if (type == FINAL_KEYWORD) {
else if (type == JavaTokenType.FINAL_KEYWORD) {
final PsiField[] fields = ((PsiClass)parent).getFields();
for (PsiField field : fields) {
if (field instanceof PsiEnumConstant && ((PsiEnumConstant)field).getInitializingClass() != null) return false;
}
return true;
}
else if (type == ABSTRACT_KEYWORD) {
else if (type == JavaTokenType.ABSTRACT_KEYWORD) {
final PsiMethod[] methods = ((PsiClass)parent).getMethods();
for (PsiMethod method : methods) {
if (method.hasModifierProperty(PsiModifier.ABSTRACT)) return true;
@@ -139,34 +140,34 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
else if (parent instanceof PsiMethod){
PsiClass aClass = ((PsiMethod)parent).getContainingClass();
if (aClass != null && aClass.isInterface()){
if (type == PUBLIC_KEYWORD){
if (type == JavaTokenType.PUBLIC_KEYWORD){
return true;
}
if (type == null){ // package local
return false;
}
if (type == ABSTRACT_KEYWORD){
if (type == JavaTokenType.ABSTRACT_KEYWORD){
return true;
}
}
}
else if (parent instanceof PsiField){
if (parent instanceof PsiEnumConstant) {
return type == PUBLIC_KEYWORD || type == STATIC_KEYWORD || type == FINAL_KEYWORD;
return type == JavaTokenType.PUBLIC_KEYWORD || type == JavaTokenType.STATIC_KEYWORD || type == JavaTokenType.FINAL_KEYWORD;
}
else {
PsiClass aClass = ((PsiField)parent).getContainingClass();
if (aClass != null && aClass.isInterface()){
if (type == PUBLIC_KEYWORD){
if (type == JavaTokenType.PUBLIC_KEYWORD){
return true;
}
if (type == null){ // package local
return false;
}
if (type == STATIC_KEYWORD){
if (type == JavaTokenType.STATIC_KEYWORD){
return true;
}
if (type == FINAL_KEYWORD){
if (type == JavaTokenType.FINAL_KEYWORD){
return true;
}
}
@@ -194,34 +195,34 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
CompositeElement treeElement = (CompositeElement)getNode();
ASTNode parentTreeElement = treeElement.getTreeParent();
if (value){
if (parentTreeElement.getElementType() == FIELD &&
parentTreeElement.getTreeParent().getElementType() == CLASS &&
if (parentTreeElement.getElementType() == JavaElementType.FIELD &&
parentTreeElement.getTreeParent().getElementType() == JavaElementType.CLASS &&
((PsiClass)SourceTreeToPsiMap.treeElementToPsi(parentTreeElement.getTreeParent())).isInterface()) {
if (type == PUBLIC_KEYWORD || type == STATIC_KEYWORD || type == FINAL_KEYWORD) return;
if (type == JavaTokenType.PUBLIC_KEYWORD || type == JavaTokenType.STATIC_KEYWORD || type == JavaTokenType.FINAL_KEYWORD) return;
}
else if (parentTreeElement.getElementType() == METHOD &&
parentTreeElement.getTreeParent().getElementType() == CLASS &&
else if (parentTreeElement.getElementType() == JavaElementType.METHOD &&
parentTreeElement.getTreeParent().getElementType() == JavaElementType.CLASS &&
((PsiClass)SourceTreeToPsiMap.treeElementToPsi(parentTreeElement.getTreeParent())).isInterface()) {
if (type == PUBLIC_KEYWORD || type == ABSTRACT_KEYWORD) return;
if (type == JavaTokenType.PUBLIC_KEYWORD || type == JavaTokenType.ABSTRACT_KEYWORD) return;
}
else if (parentTreeElement.getElementType() == CLASS &&
parentTreeElement.getTreeParent().getElementType() == CLASS &&
else if (parentTreeElement.getElementType() == JavaElementType.CLASS &&
parentTreeElement.getTreeParent().getElementType() == JavaElementType.CLASS &&
((PsiClass)SourceTreeToPsiMap.treeElementToPsi(parentTreeElement.getTreeParent())).isInterface()) {
if (type == PUBLIC_KEYWORD) return;
if (type == JavaTokenType.PUBLIC_KEYWORD) return;
}
if (type == PUBLIC_KEYWORD
|| type == PRIVATE_KEYWORD
|| type == PROTECTED_KEYWORD
if (type == JavaTokenType.PUBLIC_KEYWORD
|| type == JavaTokenType.PRIVATE_KEYWORD
|| type == JavaTokenType.PROTECTED_KEYWORD
|| type == null /* package local */){
if (type != PUBLIC_KEYWORD){
if (type != JavaTokenType.PUBLIC_KEYWORD){
setModifierProperty(PsiModifier.PUBLIC, false);
}
if (type != PRIVATE_KEYWORD){
if (type != JavaTokenType.PRIVATE_KEYWORD){
setModifierProperty(PsiModifier.PRIVATE, false);
}
if (type != PROTECTED_KEYWORD){
if (type != JavaTokenType.PROTECTED_KEYWORD){
setModifierProperty(PsiModifier.PROTECTED, false);
}
if (type == null) return;
@@ -231,7 +232,8 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
TreeElement keyword = Factory.createSingleLeafElement(type, name, null, getManager());
treeElement.addInternal(keyword, keyword, null, null);
}
if ((type == ABSTRACT_KEYWORD || type == NATIVE_KEYWORD) && parentTreeElement.getElementType() == METHOD){
if ((type == JavaTokenType.ABSTRACT_KEYWORD || type == JavaTokenType.NATIVE_KEYWORD) && parentTreeElement.getElementType() ==
JavaElementType.METHOD){
//Q: remove body?
}
}
@@ -1,6 +1,6 @@
PsiJavaFileStub [org.jetbrains.annotations]
PsiClassStub[interface annotation name=Nullable fqn=org.jetbrains.annotations.Nullable]
PsiModifierListStub[mask=1025]
PsiModifierListStub[mask=1033]
PsiAnnotationStub[@java.lang.annotation.Documented]
PsiAnnotationStub[@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)]
PsiAnnotationStub[@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.FIELD,java.lang.annotation.ElementType.PARAMETER,java.lang.annotation.ElementType.LOCAL_VARIABLE})]
@@ -1,6 +1,6 @@
PsiJavaFileStub [junit.framework]
PsiClassStub[name=TestSuite fqn=junit.framework.TestSuite]
PsiModifierListStub[mask=1]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiRefListStub[EXTENDS_LIST:]
PsiRefListStub[IMPLEMENTS_LIST:junit.framework.Test]
@@ -1,6 +1,6 @@
PsiJavaFileStub [java.util.concurrent]
PsiClassStub[enum name=TimeUnit fqn=java.util.concurrent.TimeUnit]
PsiModifierListStub[mask=17]
PsiModifierListStub[mask=25]
PsiTypeParameterListStub
PsiRefListStub[EXTENDS_LIST:java.lang.Enum<java.util.concurrent.TimeUnit>]
PsiRefListStub[IMPLEMENTS_LIST:]
@@ -1,6 +1,6 @@
PsiJavaFileStub [java.util]
PsiClassStub[name=Collections fqn=java.util.Collections]
PsiModifierListStub[mask=1]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiRefListStub[EXTENDS_LIST:]
PsiRefListStub[IMPLEMENTS_LIST:]
@@ -1,6 +1,6 @@
PsiJavaFileStub [java.util]
PsiClassStub[name=HashMap fqn=java.util.HashMap]
PsiModifierListStub[mask=1]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiTypeParameter[K]
PsiRefListStub[EXTENDS_BOUNDS_LIST:]
@@ -1,6 +1,6 @@
PsiJavaFileStub [java.util]
PsiClassStub[interface name=List fqn=java.util.List]
PsiModifierListStub[mask=1025]
PsiModifierListStub[mask=1033]
PsiTypeParameterListStub
PsiTypeParameter[E]
PsiRefListStub[EXTENDS_BOUNDS_LIST:]
@@ -1,6 +1,6 @@
PsiJavaFileStub [java.util]
PsiClassStub[interface name=Map fqn=java.util.Map]
PsiModifierListStub[mask=1025]
PsiModifierListStub[mask=1033]
PsiTypeParameterListStub
PsiTypeParameter[K]
PsiRefListStub[EXTENDS_BOUNDS_LIST:]
@@ -27,40 +27,39 @@ public class ClsBuilderTest extends LightIdeaTestCase {
return JavaSdkImpl.getMockJdk15("1.5");
}
public void testSimple() throws Exception {
doTest("java/util/List.class", "UtilList.txt");
public void testUtilList() throws Exception {
doTest("java/util/List.class");
}
public void testWithAnnotations() throws Exception {
doTest("org/jetbrains/annotations/Nullable.class", "Nullable.txt");
public void testNullable() throws Exception {
doTest("org/jetbrains/annotations/Nullable.class");
}
public void testManyGenerics() throws Exception {
doTest("java/util/Collections.class", "UtilCollections.txt");
public void testUtilCollections() throws Exception {
doTest("java/util/Collections.class");
}
public void testHashMap() throws Exception {
doTest("java/util/HashMap.class", "UtilHashMap.txt");
public void testUtilHashMap() throws Exception {
doTest("java/util/HashMap.class");
}
public void testMap() throws Exception {
doTest("java/util/Map.class", "UtilMap.txt");
public void testUtilMap() throws Exception {
doTest("java/util/Map.class");
}
public void testTimeUnit() throws Exception {
doTest("java/util/concurrent/TimeUnit.class", "TimeUnit.txt");
doTest("java/util/concurrent/TimeUnit.class");
}
public void testParameterNames() throws Exception {
public void testTestSuite() throws Exception {
final String clsFilePath = JavaTestUtil.getJavaTestDataPath() + "/psi/cls/stubBuilder/TestSuite.class";
VirtualFile clsFile = LocalFileSystem.getInstance().findFileByPath(clsFilePath);
doTest(clsFile, "TestSuite.txt");
}
private void doTest(final String classname, final String goldFile) throws IOException, ClsFormatException {
private void doTest(final String classname) throws IOException, ClsFormatException {
VirtualFile vFile = findFile(classname);
doTest(vFile, goldFile);
doTest(vFile, getTestName(false)+".txt");
}
private static void doTest(VirtualFile vFile, String goldFile) throws ClsFormatException, IOException {
@@ -50,7 +50,7 @@ public class StubUpdatingIndex extends CustomImplementationFileBasedIndexExtensi
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubUpdatingIndex");
public static final ID<Integer, SerializedStubTree> INDEX_ID = ID.create("Stubs");
private static final int VERSION = 17;
private static final int VERSION = 18;
private static final DataExternalizer<SerializedStubTree> KEY_EXTERNALIZER = new DataExternalizer<SerializedStubTree>() {
public void save(final DataOutput out, final SerializedStubTree v) throws IOException {
byte[] value = v.getBytes();