2012-09-20 48 views
4

我有一個Eclipse自定義編輯器,並且在輸入時實現了「報告錯誤」,但是現在和之後我的錯誤消失(使用JFace註釋)在應該刪除後都不會顯示或留下。AnnotationModel中的競態條件?在Reconciler中丟失錯誤註釋

我使用MonoReconciler與我的實施IReconcilingStrategy。在reconcile步驟中,我呼叫annotationModel.replaceAnnotations刪除舊錯誤並添加新錯誤。大多數時候這工作正常。時不時的更新都將丟失,和我注意到以下幾點:

  • 左側尺的紅色印章消失,但紅色下劃線留
  • 對下一個字符I型,底線就會消失

我在調試器中驗證註釋是正確計算的。輸入一個字符後,下劃線立即消失,並且在調解器延遲500毫秒後不爲。它看起來像是一個丟失的UI更新/重繪。

某處存在競爭條件(協調器在其自己的線程中運行)。我究竟做錯了什麼?我找不到有關此用例的任何文檔。

編輯:重現,結帳scala-worksheet並創建一個新的。類型

object Test { 
    val m = Map('t' -> 1) 
} 

現在編輯箭頭:刪除>。下劃線缺失。鍵入一個空格,它會返回。加回來,下劃線仍然存在,直到你輸入另一個空格。

我固定它通過invalidateTextPresentationSourceViewer,但在我看來,應該沒有必要。我想了解什麼是使用編輯器註釋的正確方法。

PS。丟失的更新也可以在screencast中看到。

回答

0

很難說從遠處看,通常在eclipse中,任何影響ui的變化都應該在ui線程上執行(並且eclipse並不總是會對此提出警告)。 通常情況下,您使用Display.getDefault()。asyncExec(...)在ui線程上執行某些操作,但您可能已經知道這一點。可能發生的排隊變化導致了比賽。

(我已經實現語義突出顯示,錯誤突出等多次爲我工作的公司,Sigasi。如果你能指點你實現我可能能夠找出什麼地方出了錯。)

+0

謝謝你的答案。我嘗試在'asyncExec'內運行'replaceAnnotations',但沒有解決它。代碼在https://github.com/scala-ide/scala-worksheet/blob/master/org.scalaide.worksheet/src/org/scalaide/worksheet/reconciler/ScalaReconcilingStrategy.scala#L37 –

+0

我不能找到'replaceAnnotations'的意思是'updateErrorAnnotations'? – llemieng

+0

順便說一句有沒有一種簡單的方法來重現此問題? – llemieng