diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java index e9a468183b67..260c3af884f7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiMethodImpl.java @@ -39,6 +39,7 @@ import java.util.stream.Stream; public class PsiMethodImpl extends JavaStubPsiElement implements PsiMethod, Queryable { private SoftReference myCachedType; + private volatile String myCachedName; public PsiMethodImpl(PsiMethodStub stub) { this(stub, JavaStubElementTypes.METHOD); @@ -60,6 +61,7 @@ public class PsiMethodImpl extends JavaStubPsiElement implements protected void dropCached() { myCachedType = null; + myCachedName = null; } @Override @@ -120,16 +122,18 @@ public class PsiMethodImpl extends JavaStubPsiElement implements @Override @NotNull public String getName() { - String name; - PsiMethodStub stub = getGreenStub(); - if (stub != null) { - name = stub.getName(); + String name = myCachedName; + if (name == null) { + PsiMethodStub stub = getGreenStub(); + if (stub != null) { + name = stub.getName(); + } + else { + PsiIdentifier nameIdentifier = getNameIdentifier(); + name = nameIdentifier == null ? null : nameIdentifier.getText(); + } } - else { - PsiIdentifier nameIdentifier = getNameIdentifier(); - name = nameIdentifier == null ? null : nameIdentifier.getText(); - } - + myCachedName = name; return name != null ? name : ""; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java index 97ad816cc18b..9774e976f8a2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java @@ -33,12 +33,13 @@ public class PsiParameterImpl extends JavaStubPsiElement imple private static final Logger LOG = Logger.getInstance(PsiParameterImpl.class); private volatile Reference myCachedType; + private volatile String myCachedName; public PsiParameterImpl(@NotNull PsiParameterStub stub) { this(stub, JavaStubElementTypes.PARAMETER); } - protected PsiParameterImpl(@NotNull PsiParameterStub stub, @NotNull IStubElementType type) { + protected PsiParameterImpl(@NotNull PsiParameterStub stub, @NotNull IStubElementType type) { super(stub, type); } @@ -46,7 +47,7 @@ public class PsiParameterImpl extends JavaStubPsiElement imple super(node); } - public static PsiType getLambdaParameterType(PsiParameter param) { + private static PsiType getLambdaParameterType(@NotNull PsiParameter param) { PsiElement paramParent = param.getParent(); if (paramParent instanceof PsiParameterList) { int parameterIndex = ((PsiParameterList)paramParent).getParameterIndex(param); @@ -79,13 +80,18 @@ public class PsiParameterImpl extends JavaStubPsiElement imple @Override public void subtreeChanged() { super.subtreeChanged(); + dropCaches(); + } + + private void dropCaches() { myCachedType = null; + myCachedName = null; } @Override protected Object clone() { PsiParameterImpl clone = (PsiParameterImpl)super.clone(); - clone.myCachedType = null; + clone.dropCaches(); return clone; } @@ -93,12 +99,18 @@ public class PsiParameterImpl extends JavaStubPsiElement imple @Override @NotNull public final String getName() { - PsiParameterStub stub = getGreenStub(); - if (stub != null) { - return stub.getName(); + String name = myCachedName; + if (name == null) { + PsiParameterStub stub = getGreenStub(); + if (stub == null) { + name = getNameIdentifier().getText(); + } + else { + name = stub.getName(); + } } - - return getNameIdentifier().getText(); + myCachedName = name; + return name; } @Override @@ -227,18 +239,18 @@ public class PsiParameterImpl extends JavaStubPsiElement imple PsiElement[] children = parent.getChildren(); //noinspection ConstantConditions if (children != null) { - ext: for (int i = 0; i < children.length; i++) { if (children[i].equals(this)) { for (int j = i + 1; j < children.length; j++) { if (children[j] instanceof PsiCodeBlock) return children[j]; } - break ext; + break; } } } LOG.error("Code block not found among parameter' (" + this + ") parent' (" + parent + ") children: " + Arrays.asList(children)); + //noinspection ConstantConditions return null; }