SelfElementInfo(
      @NotNull Project project,
      @Nullable ProperTextRange range,
      @NotNull AnchorTypeInfo info,
      @NotNull PsiFile containingFile,
      boolean forInjected) {
    myForInjected = forInjected;
    myType = info;

    myManager = (SmartPointerManagerImpl) SmartPointerManager.getInstance(project);
    myMarkerCache = myManager.getMarkerCache(containingFile.getViewProvider().getVirtualFile());
    setRange(range);
    myMarkerCache.rangeChanged();
  }
 @Override
 @Nullable
 public Segment getRange() {
   if (hasRange()) {
     Document document = getDocumentToSynchronize();
     if (document != null) {
       PsiDocumentManagerBase documentManager = myManager.getPsiDocumentManager();
       List<DocumentEvent> events = documentManager.getEventsSinceCommit(document);
       if (!events.isEmpty()) {
         return myMarkerCache.getUpdatedRange(
             this, (FrozenDocument) documentManager.getLastCommittedDocument(document), events);
       }
     }
   }
   return calcPsiRange();
 }
 /**
  * Get the ClusterItem from a marker
  *
  * @param marker which you will obtain its ClusterItem
  * @return a ClusterItem from a marker or null if it does not exists
  */
 public T getClusterItem(Marker marker) {
   return mMarkerCache.get(marker);
 }
 /**
  * Get the marker from a ClusterItem
  *
  * @param clusterItem ClusterItem which you will obtain its marker
  * @return a marker from a ClusterItem or null if it does not exists
  */
 public Marker getMarker(T clusterItem) {
   return mMarkerCache.get(clusterItem);
 }
 @Override
 @NotNull
 public final VirtualFile getVirtualFile() {
   return myMarkerCache.getVirtualFile();
 }