diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournal.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournal.kt index 8d584e55..1bd06ca9 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournal.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournal.kt @@ -28,13 +28,15 @@ interface MatchJournal : MutableIterable { /** * Add new [Chunk] for matches of principal rules. * Log occurrences discarded by match in current [Chunk]. + * Returns added [Chunk], null for non-principal rules. */ - fun logMatch(match: RuleMatch) + fun logMatch(match: RuleMatch): MatchChunk? /** * Log occurrence activation in current [Chunk]. + * Returns added [Chunk], null for non-principal occurrences. */ - fun logActivation(occ: Occurrence) + fun logActivation(occ: Occurrence): OccChunk? /** * Returns nearest MatchChunk which justifies current chunk. diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt index 4278c93e..00f5b0c5 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt @@ -66,23 +66,33 @@ internal open class MatchJournalImpl( override fun iterator(): MutableIterator = hist.iterator() - override fun logMatch(match: RuleMatch) { + override fun logMatch(match: RuleMatch): MatchChunk? { + var added: MatchChunk? = null + if (ispec.isPrincipal(match.rule())) { - current = MatchChunk(nextChunkId++, match) + added = MatchChunk(nextChunkId++, match) + current = added posPtr.add(current) } // Log discarded occurrences (match as RuleMatchImpl).forEachReplaced { occ -> current.entries.add(Chunk.Entry(occ, true)) } + + return added } - override fun logActivation(occ: Occurrence) { + override fun logActivation(occ: Occurrence): OccChunk? { + var added: OccChunk? = null + if (ispec.isPrincipal(occ.constraint)) { - current = OccChunk(nextChunkId++, occ) + added = OccChunk(nextChunkId++, occ) + current = added posPtr.add(current) } current.entries.add(Chunk.Entry(occ)) + + return added } override fun ancestorMatch(): MatchChunk { @@ -118,11 +128,13 @@ internal open class MatchJournalImpl( while (posPtr.hasPrevious()) { current = posPtr.previous() if (current === pastPos.chunk) { + // todo: need reversed? resetOccurrences(current.entries.drop(pastPos.entriesCount)) current.entries = current.entries.subList(0, pastPos.entriesCount) posPtr.next() // make 'posPtr' to always point right after 'current' return } + // todo: need reversed? resetOccurrences(current.entries) posPtr.remove() }