Пример #1
0
  /**
   * Transfers names, macros and includes from another file to this one and deletes the other file.
   *
   * @param sourceFile the file to transfer the local bindings from.
   * @throws CoreException
   */
  public void replaceContentsFrom(PDOMFile sourceFile) throws CoreException {
    // Delete current content
    clear();

    // Link in the using directives
    setLastUsingDirective(sourceFile.getLastUsingDirectiveRec());

    // Link in the includes, replace the owner.
    PDOMInclude include = sourceFile.getFirstInclude();
    setFirstInclude(include);
    for (; include != null; include = include.getNextInIncludes()) {
      include.setIncludedBy(this);
    }

    // In the unexpected case that there is an included by relation, append it.
    transferIncluders(sourceFile);

    // Link in the macros.
    PDOMMacro macro = sourceFile.getFirstMacro();
    setFirstMacro(macro);
    for (; macro != null; macro = macro.getNextMacro()) {
      macro.setFile(this);
    }

    // Link in macro references
    PDOMMacroReferenceName mref = sourceFile.getFirstMacroReference();
    setFirstMacroReference(mref);
    for (; mref != null; mref = mref.getNextInFile()) {
      mref.setFile(this);
    }

    // Replace all the names in this file
    PDOMName name = sourceFile.getFirstName();
    setFirstName(name);
    for (; name != null; name = name.getNextInFile()) {
      name.setFile(this);
    }

    setTimestamp(sourceFile.getTimestamp());
    setSourceReadTime(sourceFile.getSourceReadTime());
    setSizeAndEncodingHashcode(sourceFile.getSizeAndEncodingHashcode());
    setContentsHash(sourceFile.getContentsHash());

    // Transfer the flags.
    Database db = fLinkage.getDB();
    db.putByte(record + FLAGS, db.getByte(sourceFile.record + FLAGS));

    // Transfer the replacement header.
    db.putRecPtr(record + REPLACEMENT_HEADER, db.getRecPtr(sourceFile.record + REPLACEMENT_HEADER));
    db.putRecPtr(sourceFile.record + REPLACEMENT_HEADER, 0);

    // Delete the source file
    sourceFile.delete();
  }
Пример #2
0
 @Override
 public void clearUncommittedFile() throws CoreException {
   if (uncommittedFile != null) {
     try {
       uncommittedFile.clear();
       uncommittedFile.delete();
     } finally {
       uncommittedFile = null;
       uncommittedKey = null;
       fileBeingUpdated = null;
     }
   }
 }
Пример #3
0
  @Override
  public void clearFile(IIndexFragmentFile file) throws CoreException {
    assert file.getIndexFragment() == this;
    IIndexFileLocation location = file.getLocation();
    PDOMFile pdomFile = (PDOMFile) file;
    pdomFile.clear();
    IIndexInclude include = pdomFile.getParsedInContext();
    if (include != null) {
      PDOMFile includedBy = (PDOMFile) include.getIncludedBy();
      if (includedBy.getTimestamp() > 0)
        getIndexOfFilesWithUnresolvedIncludes().insert(includedBy.getRecord());
    }

    fEvent.fClearedFiles.add(location);
  }
Пример #4
0
  /**
   * Uses the specified location converter to update each internal representation of a file
   * location. The file index is rebuilt with the new representations. Individual PDOMFile records
   * are unmoved so as to maintain referential integrity with other PDOM records.
   *
   * <p><b>A write-lock must be obtained before calling this method</b>
   *
   * @param newConverter the converter to use to update internal file representations
   * @throws CoreException
   */
  public void rewriteLocations(final IIndexLocationConverter newConverter) throws CoreException {
    final List<PDOMFile> pdomfiles = new ArrayList<PDOMFile>();
    getFileIndex()
        .accept(
            new IBTreeVisitor() {
              @Override
              public int compare(long record) throws CoreException {
                return 0;
              }

              @Override
              public boolean visit(long record) throws CoreException {
                PDOMFile file = PDOMFile.recreateFile(WritablePDOM.this, record);
                pdomfiles.add(file);
                return true;
              }
            });

    clearFileIndex();
    final List<PDOMFile> notConverted = new ArrayList<PDOMFile>();
    for (PDOMFile file : pdomfiles) {
      String internalFormat = newConverter.toInternalFormat(file.getLocation());
      if (internalFormat != null) {
        file.setInternalLocation(internalFormat);
        getFileIndex().insert(file.getRecord());
      } else {
        notConverted.add(file);
      }
    }

    // remove content where converter returns null
    for (PDOMFile file : notConverted) {
      file.convertIncludersToUnresolved();
      file.clear();
    }
  }