changeset: 303975:a1dd0ed0dda9 branch: release81 tag: tip parent: 303966:9e3d45fe3360 user: Vladimir Voskresensky date: Wed Nov 11 17:52:00 2015 +0300 summary: fixed #226012 - [74cat] AssertionError: no object for UID KeyBasedUID on FileKey diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/content/file/FileContent.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/content/file/FileContent.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/content/file/FileContent.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/content/file/FileContent.java @@ -542,7 +542,8 @@ fileComponentInstantiations = Union2.createSecond(new WeakContainer(owner, fileInstantiationsKey)); this.errors = createErrors(Collections.emptySet()); - PersistentUtils.readErrorDirectives(this.errors, input); + // ErrorDirectiveImpl does not have UID, so deserialize using containingFile directly + PersistentUtils.readErrorDirectives(this.errors, file, input); parserErrorsCount = input.readInt(); this.fakeIncludeRegistrations = createFakeIncludes(Collections.emptyList()); diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/ErrorDirectiveImpl.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/ErrorDirectiveImpl.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/ErrorDirectiveImpl.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/ErrorDirectiveImpl.java @@ -113,8 +113,8 @@ // serialization @SuppressWarnings("unchecked") - public ErrorDirectiveImpl(RepositoryDataInput input) throws IOException { - super(input); + public ErrorDirectiveImpl(FileImpl containingFile, RepositoryDataInput input) throws IOException { + super(containingFile, input); // ErrorDirectiveImpl does not have UID, so deserialize using containingFile directly this.msg = PersistentUtils.readUTF(input, DefaultCache.getManager()); if (input.readBoolean()) { this.ppState = PersistentUtils.readPreprocState(input); diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/OffsetableBase.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/OffsetableBase.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/OffsetableBase.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/OffsetableBase.java @@ -70,8 +70,8 @@ * @author Vladimir Kvashin */ public abstract class OffsetableBase implements CsmOffsetable, Disposable, CsmValidable { - private /*final*/ CsmFile fileRef; // set in onDispose, used as marker of invalid object - private final CsmUID fileUID; + private final CsmFile fileRef;// we keep ref to file, because it owns disposing flag from project + private boolean isValid = true; private final int startPosition; private final int endPosition; @@ -84,36 +84,36 @@ protected OffsetableBase(CsmFile file, int start, int end) { // Parameters.notNull("file can not be null", file); // NOI18N - this.fileUID = UIDCsmConverter.fileToUID(file); - this.fileRef = null;// to prevent error with "final" + this.fileRef = file; if(end < start) { if(CndUtils.isDebugMode()) { CndUtils.assertTrueInConsole(false, "end < start for " + ((file != null)?file.getAbsolutePath():"null file") + ":[" + start + "-" + end + "]"); // NOI18N } end = start; } + CsmUID fileUID = UIDCsmConverter.fileToUID(file); this.startPosition = PositionManager.createPositionID(fileUID, start, PositionManager.Position.Bias.FOWARD); this.endPosition = PositionManager.createPositionID(fileUID, end, PositionManager.Position.Bias.BACKWARD); } @Override final public int getStartOffset() { - return PositionManager.getOffset(fileUID, startPosition); + return PositionManager.getOffset(fileRef, startPosition); } @Override final public int getEndOffset() { - return endPosition != 0 ? PositionManager.getOffset(fileUID, endPosition) : PositionManager.getOffset(fileUID, startPosition); + return endPosition != 0 ? PositionManager.getOffset(fileRef, endPosition) : PositionManager.getOffset(fileRef, startPosition); } @Override public final Position getStartPosition() { - return PositionManager.getPosition(fileUID, startPosition); + return PositionManager.getPosition(fileRef, startPosition); } @Override public final Position getEndPosition() { - return PositionManager.getPosition(fileUID, endPosition); + return PositionManager.getPosition(fileRef, endPosition); } public static int getStartOffset(AST node) { @@ -155,12 +155,12 @@ @Override public CsmFile getContainingFile() { - return _getFile(true); + return this.fileRef; } @Override public boolean isValid() { - return CsmBaseUtilities.isValid(_getFile(false)) && this.fileRef == null; + return isValid && CsmBaseUtilities.isValid(this.fileRef); } @Override @@ -179,38 +179,39 @@ } private synchronized void onDispose() { - if (fileRef == null) { - // restore container from it's UID - this.fileRef = UIDCsmConverter.UIDtoFile(fileUID); - assert this.fileRef != null : "no object for UID " + fileUID; - } - } - - private synchronized CsmFile _getFile(boolean checkNull) { - CsmFile file = this.fileRef; - if (file == null) { - file = UIDCsmConverter.UIDtoFile(fileUID); - assert file != null || !checkNull: "no object for UID " + fileUID + " in object " + getClass() + ":" + getOffsetString(); - } - return file; - } + this.isValid = false; + } public void write(RepositoryDataOutput output) throws IOException { output.writeInt(startPosition); output.writeInt(endPosition); + CsmUID fileUID = UIDCsmConverter.fileToUID(fileRef); // not null UID - assert this.fileUID != null; - UIDObjectFactory.getDefaultFactory().writeUID(this.fileUID, output); + assert fileUID != null; + UIDObjectFactory.getDefaultFactory().writeUID(fileUID, output); } protected OffsetableBase(RepositoryDataInput input) throws IOException { startPosition = input.readInt(); endPosition = input.readInt(); - this.fileUID = UIDObjectFactory.getDefaultFactory().readUID(input); + CsmUID fileUID = UIDObjectFactory.getDefaultFactory().readUID(input); // not null UID - assert this.fileUID != null; - this.fileRef = null; + assert fileUID != null; + this.fileRef = UIDCsmConverter.UIDtoFile(fileUID); + this.isValid = (this.fileRef != null); + } + + protected OffsetableBase(CsmFile containingFile, RepositoryDataInput input) throws IOException { + // must be in sync with the above constructor + startPosition = input.readInt(); + endPosition = input.readInt(); + + CsmUID fileUID = UIDObjectFactory.getDefaultFactory().readUID(input); + // not null UID + assert fileUID != null; + this.fileRef = containingFile; + this.isValid = (this.fileRef != null); } // test trace method @@ -221,9 +222,9 @@ protected CharSequence getPositionString() { StringBuilder sb = new StringBuilder(); sb.append('['); - CsmFile containingFile = _getFile(false); + CsmFile containingFile = this.fileRef; if (containingFile == null) { - sb.append(" NO CONTAINER ").append(fileUID);// NOI18N + sb.append(" NO CONTAINER ");// NOI18N } else { sb.append(containingFile.getName()); } @@ -256,7 +257,7 @@ return false; } final OffsetableBase other = (OffsetableBase) obj; - if (this.fileUID != other.fileUID && (this.fileUID == null || !this.fileUID.equals(other.fileUID))) { + if ((this.fileRef == null || !this.fileRef.equals(other.fileRef))) { return false; } if (this.startPosition != other.startPosition) { @@ -271,7 +272,7 @@ @Override public int hashCode() { int hash = 7; - hash = 47 * hash + (this.fileUID != null ? this.fileUID.hashCode() : 0); + hash = 47 * hash + (this.fileRef != null ? this.fileRef.hashCode() : 0); hash = 47 * hash + this.startPosition; hash = 47 * hash + this.endPosition; return hash; diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/PositionManager.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/PositionManager.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/PositionManager.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/csm/core/PositionManager.java @@ -71,9 +71,12 @@ } public static CsmOffsetable.Position getPosition(CsmUID uid, int posID) { - CsmFile file = UIDCsmConverter.UIDtoFile(uid); + return getPosition(UIDCsmConverter.UIDtoFile(uid), posID); + } + + public static CsmOffsetable.Position getPosition(CsmFile file, int posID) { if (file instanceof FileImpl) { - return new LazyOffsPositionImpl((FileImpl) file, getOffset(uid, posID)); + return new LazyOffsPositionImpl((FileImpl) file, getOffset(file, posID)); } else { return new PositionImpl(posID); } @@ -101,6 +104,20 @@ // } } + public static int getOffset(CsmFile file, int posID) { + if (IMPL == Impl.trivial) { + return posID; + } + throw new UnsupportedOperationException("Not yet implemented "); // NOI18N + } + + public static int createPositionID(CsmFile file, int offset, Position.Bias bias) { + if (IMPL == Impl.trivial) { + return offset; + } + throw new UnsupportedOperationException("Not yet implemented "); // NOI18N + } + public static int createPositionID(CsmUID uid, int offset, Position.Bias bias) { if (IMPL == Impl.trivial) { return offset; diff --git a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/repository/PersistentUtils.java b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/repository/PersistentUtils.java --- a/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/repository/PersistentUtils.java +++ b/cnd.modelimpl/src/org/netbeans/modules/cnd/modelimpl/repository/PersistentUtils.java @@ -83,6 +83,7 @@ import org.netbeans.modules.cnd.modelimpl.csm.TypeBasedSpecializationParameterImpl; import org.netbeans.modules.cnd.modelimpl.csm.VariadicSpecializationParameterImpl; import org.netbeans.modules.cnd.modelimpl.csm.core.ErrorDirectiveImpl; +import org.netbeans.modules.cnd.modelimpl.csm.core.FileImpl; import org.netbeans.modules.cnd.modelimpl.csm.deep.CompoundStatementImpl; import org.netbeans.modules.cnd.modelimpl.csm.deep.ExpandedExpressionBase; import org.netbeans.modules.cnd.modelimpl.csm.deep.LazyTryCatchStatementImpl; @@ -116,10 +117,11 @@ //PersistentUtils.writeUTF(rootUrl, output); } - public static void readErrorDirectives(Set errors, RepositoryDataInput input) throws IOException { + public static void readErrorDirectives(Set errors, FileImpl containingFile, RepositoryDataInput input) throws IOException { int size = input.readInt(); for (int i = 0; i < size; i++) { - ErrorDirectiveImpl offs = new ErrorDirectiveImpl(input); + // ErrorDirectiveImpl does not have UID, so deserialize using containingFile directly + ErrorDirectiveImpl offs = new ErrorDirectiveImpl(containingFile, input); errors.add(offs); } }