This commit is contained in:
Roman Shevchenko
2012-11-15 13:33:17 +01:00
parent 88e2a708cc
commit 9c2f2df4b1
4 changed files with 23 additions and 25 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2012 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.
@@ -21,11 +21,9 @@ package com.intellij.psi.impl.compiled;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.PsiReferenceList;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiTypeParameterListStub;
import com.intellij.psi.impl.java.stubs.PsiTypeParameterStub;
import com.intellij.psi.impl.java.stubs.impl.PsiClassReferenceListStubImpl;
import com.intellij.psi.impl.java.stubs.impl.PsiTypeParameterListStubImpl;
import com.intellij.psi.impl.java.stubs.impl.PsiTypeParameterStubImpl;
import com.intellij.psi.stubs.StubElement;
@@ -37,7 +35,6 @@ import org.jetbrains.annotations.Nullable;
import java.text.CharacterIterator;
import java.util.ArrayList;
import java.util.Collections;
@SuppressWarnings({"HardCodedStringLiteral"})
public class SignatureParsing {
@@ -58,14 +55,14 @@ public class SignatureParsing {
return list;
}
private static PsiTypeParameterStub parseTypeParameter(CharacterIterator singatureIterator, PsiTypeParameterListStub parent)
private static PsiTypeParameterStub parseTypeParameter(CharacterIterator signatureIterator, PsiTypeParameterListStub parent)
throws ClsFormatException {
StringBuffer name = new StringBuffer();
while (singatureIterator.current() != ':' && singatureIterator.current() != CharacterIterator.DONE) {
name.append(singatureIterator.current());
singatureIterator.next();
StringBuilder name = new StringBuilder();
while (signatureIterator.current() != ':' && signatureIterator.current() != CharacterIterator.DONE) {
name.append(signatureIterator.current());
signatureIterator.next();
}
if (singatureIterator.current() == CharacterIterator.DONE) {
if (signatureIterator.current() == CharacterIterator.DONE) {
throw new ClsFormatException();
}
@@ -73,23 +70,22 @@ public class SignatureParsing {
PsiTypeParameterStub parameterStub = new PsiTypeParameterStubImpl(parent, StringRef.fromString(name.toString()));
ArrayList<String> bounds = null;
while (singatureIterator.current() == ':') {
singatureIterator.next();
String bound = parseToplevelClassRefSignature(singatureIterator);
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>();
bounds.add(bound);
}
}
String[] sbounds = ArrayUtil.toStringArray(bounds == null ? Collections.<String>emptyList() : bounds);
new PsiClassReferenceListStubImpl(JavaStubElementTypes.EXTENDS_BOUND_LIST, parameterStub, sbounds, PsiReferenceList.Role.EXTENDS_BOUNDS_LIST);
StubBuildingVisitor.newReferenceList(JavaStubElementTypes.EXTENDS_BOUND_LIST, parameterStub, ArrayUtil.toStringArray(bounds));
return parameterStub;
}
@Nullable
public static String parseToplevelClassRefSignature(CharacterIterator signature) throws ClsFormatException {
public static String parseTopLevelClassRefSignature(CharacterIterator signature) throws ClsFormatException {
if (signature.current() == 'L') {
return parseParameterizedClassRefSignature(signature);
}
@@ -101,7 +97,7 @@ public class SignatureParsing {
private static String parseTypeVariableRefSignature(CharacterIterator signature) {
signature.next();
StringBuffer id = new StringBuffer();
StringBuilder id = new StringBuilder();
while (signature.current() != ';' && signature.current() != '>') {
id.append(signature.current());
signature.next();
@@ -247,7 +243,7 @@ public class SignatureParsing {
case '.':
case '=':
signature.next();
// fall thru
// fall through
default:
variance = '\0';
}
@@ -153,11 +153,12 @@ public class StubBuildingVisitor<T> extends ClassVisitor {
}
}
private static void newReferenceList(JavaClassReferenceListElementType type, StubElement parent, String... types) {
public static void newReferenceList(JavaClassReferenceListElementType type, StubElement parent, String... types) {
PsiReferenceList.Role role;
if (type == JavaStubElementTypes.EXTENDS_LIST) role = PsiReferenceList.Role.EXTENDS_LIST;
else if (type == JavaStubElementTypes.IMPLEMENTS_LIST) role = PsiReferenceList.Role.IMPLEMENTS_LIST;
else if (type == JavaStubElementTypes.THROWS_LIST) role = PsiReferenceList.Role.THROWS_LIST;
else if (type == JavaStubElementTypes.EXTENDS_BOUND_LIST) role = PsiReferenceList.Role.EXTENDS_BOUNDS_LIST;
else throw new IllegalArgumentException("Unknown type: " + type);
new PsiClassReferenceListStubImpl(type, parent, types, role);
@@ -175,9 +176,9 @@ public class StubBuildingVisitor<T> extends ClassVisitor {
@Nullable
private static String parseClassSignature(final CharacterIterator signatureIterator, final List<String> convertedInterfaces)
throws ClsFormatException {
final String convertedSuper = SignatureParsing.parseToplevelClassRefSignature(signatureIterator);
final String convertedSuper = SignatureParsing.parseTopLevelClassRefSignature(signatureIterator);
while (signatureIterator.current() != CharacterIterator.DONE) {
final String ifs = SignatureParsing.parseToplevelClassRefSignature(signatureIterator);
final String ifs = SignatureParsing.parseTopLevelClassRefSignature(signatureIterator);
if (ifs == null) throw new ClsFormatException();
convertedInterfaces.add(ifs);
@@ -17,6 +17,7 @@ package com.intellij.util;
import org.jetbrains.annotations.NotNull;
import com.intellij.util.containers.ContainerUtilRt;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collection;
@@ -43,9 +44,9 @@ public class ArrayUtilRt {
public static final Runnable[] EMPTY_RUNNABLE_ARRAY = new Runnable[0];
@NotNull
public static String[] toStringArray(@NotNull Collection<String> collection) {
if (collection.isEmpty()) return EMPTY_STRING_ARRAY;
return ContainerUtilRt.toArray(collection, new String[collection.size()]);
public static String[] toStringArray(@Nullable Collection<String> collection) {
return collection == null || collection.isEmpty()
? EMPTY_STRING_ARRAY : ContainerUtilRt.toArray(collection, new String[collection.size()]);
}
/**
@@ -710,7 +710,7 @@ public class ArrayUtil extends ArrayUtilRt {
}
@NotNull
public static String[] toStringArray(@NotNull Collection<String> collection) {
public static String[] toStringArray(@Nullable Collection<String> collection) {
return ArrayUtilRt.toStringArray(collection);
}