From 08c14cb030c9ba6017df0401f39ac518bb19e646 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 26 May 2014 19:35:12 +0400 Subject: [PATCH] Cleanup (optimization) --- .../psi/impl/compiled/SignatureParsing.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java index 6033e54f712c..ab24aca1dce7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/SignatureParsing.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -39,18 +39,16 @@ import java.util.List; @SuppressWarnings({"HardCodedStringLiteral"}) public class SignatureParsing { - private SignatureParsing() { - } + private SignatureParsing() { } - public static PsiTypeParameterListStub parseTypeParametersDeclaration(CharacterIterator signatureIterator, StubElement parentStub) - throws ClsFormatException { + public static PsiTypeParameterListStub parseTypeParametersDeclaration(CharacterIterator iterator, StubElement parentStub) throws ClsFormatException { PsiTypeParameterListStub list = new PsiTypeParameterListStubImpl(parentStub); - if (signatureIterator.current() == '<') { - signatureIterator.next(); - while (signatureIterator.current() != '>') { - parseTypeParameter(signatureIterator, list); + if (iterator.current() == '<') { + iterator.next(); + while (iterator.current() != '>') { + parseTypeParameter(iterator, list); } - signatureIterator.next(); + iterator.next(); } return list; @@ -69,18 +67,22 @@ public class SignatureParsing { //todo parse annotations on type param PsiTypeParameterStub parameterStub = new PsiTypeParameterStubImpl(parent, StringRef.fromString(name.toString())); - List bounds = ContainerUtil.newSmartList(); + // postpone list allocation till a second bound is seen; ignore sole Object bound + List bounds = null; + boolean jlo = false; while (iterator.current() == ':') { iterator.next(); String bound = parseTopLevelClassRefSignature(iterator); - if (bound != null) { - bounds.add(bound); + if (bound == null) continue; + if (bounds == null) { + if (CommonClassNames.JAVA_LANG_OBJECT.equals(bound)) { + jlo = true; + continue; + } } - } - - int size = bounds.size(); - if (size > 0 && CommonClassNames.JAVA_LANG_OBJECT.equals(bounds.get(size - 1))) { - bounds.remove(size - 1); + bounds = ContainerUtil.newSmartList(); + if (jlo) bounds.add(CommonClassNames.JAVA_LANG_OBJECT); + bounds.add(bound); } StubBuildingVisitor.newReferenceList(JavaStubElementTypes.EXTENDS_BOUND_LIST, parameterStub, ArrayUtil.toStringArray(bounds));