From 448d708281add48c5e5818e841da005e8161c7bf Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 2 May 2013 14:35:28 +0200 Subject: [PATCH] IDEA-106556 (index access under mirror lock eliminated) --- .../psi/impl/compiled/ClsClassImpl.java | 16 ++++++++++---- .../psi/impl/compiled/ClsElementImpl.java | 21 +++++++++---------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java index f17fb5b54557..8f0e58d9619e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsClassImpl.java @@ -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. @@ -406,9 +406,17 @@ public class ClsClassImpl extends ClsMemberImpl> implements PsiE setMirror(getExtendsList(), mirror.getExtendsList()); setMirror(getImplementsList(), mirror.getImplementsList()); - setMirrors(getOwnFields(), mirror.getFields()); - setMirrors(getOwnMethods(), mirror.getMethods()); - setMirrors(getOwnInnerClasses(), mirror.getInnerClasses()); + if (mirror instanceof PsiExtensibleClass) { + PsiExtensibleClass extMirror = (PsiExtensibleClass)mirror; + setMirrors(getOwnFields(), extMirror.getOwnFields()); + setMirrors(getOwnMethods(), extMirror.getOwnMethods()); + setMirrors(getOwnInnerClasses(), extMirror.getOwnInnerClasses()); + } + else { + setMirrors(getOwnFields(), mirror.getFields()); + setMirrors(getOwnMethods(), mirror.getMethods()); + setMirrors(getOwnInnerClasses(), mirror.getInnerClasses()); + } } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsElementImpl.java index c435f97766a4..060ed38ba278 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClsElementImpl.java @@ -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. @@ -310,20 +310,19 @@ public abstract class ClsElementImpl extends PsiElementBase implements PsiCompil } protected static void setMirrors(@NotNull T[] stubs, @NotNull T[] mirrors) throws InvalidMirrorException { - if (stubs.length != mirrors.length) { - throw new InvalidMirrorException(stubs, mirrors); - } - for (int i = 0; i < stubs.length; i++) { - setMirror(stubs[i], mirrors[i]); - } + setMirrors(Arrays.asList(stubs), Arrays.asList(mirrors)); } protected static void setMirrors(@NotNull List stubs, @NotNull T[] mirrors) throws InvalidMirrorException { - if (stubs.size() != mirrors.length) { + setMirrors(stubs, Arrays.asList(mirrors)); + } + + protected static void setMirrors(@NotNull List stubs, @NotNull List mirrors) throws InvalidMirrorException { + if (stubs.size() != mirrors.size()) { throw new InvalidMirrorException(stubs, mirrors); } for (int i = 0; i < stubs.size(); i++) { - setMirror(stubs.get(i), mirrors[i]); + setMirror(stubs.get(i), mirrors.get(i)); } } @@ -340,8 +339,8 @@ public abstract class ClsElementImpl extends PsiElementBase implements PsiCompil this("stub:" + Arrays.toString(stubElements) + "; mirror:" + Arrays.toString(mirrorElements)); } - public InvalidMirrorException(@NotNull List stubElements, @NotNull PsiElement[] mirrorElements) { - this("stub:" + stubElements + "; mirror:" + Arrays.toString(mirrorElements)); + public InvalidMirrorException(@NotNull List stubElements, @NotNull List mirrorElements) { + this("stub:" + stubElements + "; mirror:" + mirrorElements); } } }