mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
java: incorrect parsing of bounds in class files fixed
This commit is contained in:
@@ -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 */ }
|
||||
}
|
||||
Binary file not shown.
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user