@Override public boolean isValid() { PsiLanguageInjectionHost.Shred[] shreds; synchronized (myLock) { shreds = myShreds.toArray(new PsiLanguageInjectionHost.Shred[myShreds.size()]); } // can grab PsiLock in SmartPsiPointer.restore() for (PsiLanguageInjectionHost.Shred shred : shreds) { if (!shred.isValid()) return false; } return true; }