java: incorrect parsing of bounds in class files fixed

This commit is contained in:
Roman Shevchenko
2013-12-23 20:11:40 +04:00
parent 6d85c557b2
commit f45f27fd20
7 changed files with 44 additions and 13 deletions
@@ -19,8 +19,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.ClassFileViewProvider;
import com.intellij.psi.impl.source.JavaFileElementType;
import com.intellij.psi.stubs.BinaryFileStubBuilder;
import com.intellij.psi.stubs.PsiFileStub;
import com.intellij.psi.stubs.StubElement;
@@ -36,7 +34,7 @@ import java.util.Comparator;
public class ClassFileStubBuilder implements BinaryFileStubBuilder {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.compiled.ClassFileStubBuilder");
public static final int STUB_VERSION = 7;
public static final int STUB_VERSION = 8;
@Override
public boolean acceptsFile(final VirtualFile file) {
@@ -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.
@@ -29,12 +29,13 @@ import com.intellij.psi.impl.java.stubs.impl.PsiTypeParameterStubImpl;
import com.intellij.psi.stubs.StubElement;
import com.intellij.util.ArrayUtil;
import com.intellij.util.cls.ClsFormatException;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.text.CharacterIterator;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"HardCodedStringLiteral"})
public class SignatureParsing {
@@ -69,16 +70,20 @@ public class SignatureParsing {
//todo parse annotations on type param
PsiTypeParameterStub parameterStub = new PsiTypeParameterStubImpl(parent, StringRef.fromString(name.toString()));
ArrayList<String> bounds = null;
List<String> bounds = ContainerUtil.newSmartList();
while (signatureIterator.current() == ':') {
signatureIterator.next();
String bound = parseTopLevelClassRefSignature(signatureIterator);
if (bound != null && !bound.equals(CommonClassNames.JAVA_LANG_OBJECT)) {
if (bounds == null) bounds = new ArrayList<String>();
if (bound != null) {
bounds.add(bound);
}
}
int size = bounds.size();
if (size > 0 && CommonClassNames.JAVA_LANG_OBJECT.equals(bounds.get(size - 1))) {
bounds.remove(size - 1);
}
StubBuildingVisitor.newReferenceList(JavaStubElementTypes.EXTENDS_BOUND_LIST, parameterStub, ArrayUtil.toStringArray(bounds));
return parameterStub;
@@ -0,0 +1,13 @@
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package pkg;
class Bounds {
Bounds() { /* compiled code */ }
public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T> ts) { /* compiled code */ }
public static <T> T max(java.util.Collection<? extends T> ts, java.util.Comparator<? super T> comparator) { /* compiled code */ }
}
@@ -0,0 +1,14 @@
package pkg;
import java.util.Collection;
import java.util.Comparator;
class Bounds {
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
return null;
}
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
return null;
}
}
@@ -1693,7 +1693,7 @@ PsiJavaFileStub [java.util]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiTypeParameter[T]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Comparable<? super T>]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Object, java.lang.Comparable<? super T>]
PsiParameterListStub
PsiParameterStub[p1:java.util.List<? extends T>]
PsiModifierListStub[mask=0]
@@ -1704,7 +1704,7 @@ PsiJavaFileStub [java.util]
PsiModifierListStub[mask=10]
PsiTypeParameterListStub
PsiTypeParameter[T]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Comparable<? super T>]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Object, java.lang.Comparable<? super T>]
PsiParameterListStub
PsiParameterStub[p1:java.util.List<? extends T>]
PsiModifierListStub[mask=0]
@@ -1715,7 +1715,7 @@ PsiJavaFileStub [java.util]
PsiModifierListStub[mask=10]
PsiTypeParameterListStub
PsiTypeParameter[T]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Comparable<? super T>]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Object, java.lang.Comparable<? super T>]
PsiParameterListStub
PsiParameterStub[p1:java.util.List<? extends T>]
PsiModifierListStub[mask=0]
@@ -1843,7 +1843,7 @@ PsiJavaFileStub [java.util]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiTypeParameter[T]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Comparable<? super T>]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Object, java.lang.Comparable<? super T>]
PsiParameterListStub
PsiParameterStub[p1:java.util.Collection<? extends T>]
PsiModifierListStub[mask=0]
@@ -1863,7 +1863,7 @@ PsiJavaFileStub [java.util]
PsiModifierListStub[mask=9]
PsiTypeParameterListStub
PsiTypeParameter[T]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Comparable<? super T>]
PsiRefListStub[EXTENDS_BOUNDS_LIST:java.lang.Object, java.lang.Comparable<? super T>]
PsiParameterListStub
PsiParameterStub[p1:java.util.Collection<? extends T>]
PsiModifierListStub[mask=0]
@@ -47,6 +47,7 @@ public class ClsMirrorBuildingTest extends LightIdeaTestCase {
public void testMiddle$Buck() { doTest(); }
public void testDefaultPackage() { doTest(); }
public void testLocalClass() { doTest(); }
public void testBounds() { doTest(); }
private void doTest() {
doTest(getTestName(false));