Aptana Journal #6: Struktur Class Yang Aneh


Berangkat dari petualangan sebelumnya, dimana saya mengira semuanya sudah beres, tapi ternyata tidak.  Content assist dan context info hanya bekerja dengan benar di statement pertama.  Pada statement atau baris berikutnya, context info mulai sedikit ngawur.  Bahkan context info sama sekali tidak muncul untuk JavaScript yang berada dalam HTML.   Mengapa bisa demikian?

Setelah melakukan penelurusan, saya menemukan bahwa permasalahan terletak pada nilai contextInformationOffset yang diberikan pada saat memanggil method showContextInformation() di insertProposal() di class CompletionProposalPopup:

private void insertProposal(ICompletionProposal p, char trigger, int stateMask, final int offset)
{
  ... // kode diabaikan
  try
  {
     ... // kode diabaikan
     if (info != null)
     {
        int contextInformationOffset;
        if (p instanceof ICompletionProposalExtension)
        {
           ICompletionProposalExtension e = (ICompletionProposalExtension) p;
           contextInformationOffset = e.getContextInformationPosition();
        }
        ... // kode diabaikan
        fContentAssistant.showContextInformation(info, contextInformationOffset);
     }
     else
     {
        fContentAssistant.showContextInformation(null, -1);
     }
}

Nilai contextInformationOffset yang saya peroleh selalu 0 apapun yang terjadi.  Padahal ini seharusnya mengikuti posisi context.  Mengapa demikian?

Sebuah proposal untuk function diwakili oleh PropertyElementProposal.  Class tersebut diturunkan dari class CommonCompletionProposal.  Pada class CommonCompletionProposal, saya dapat menemukan atribut _replacementOffset dan method getContextInformationPosition().  Secara insting, saya mengira bahwa atribut dan method tersebut dipakai untuk menyimpan offset.   Dengan demikian, saya tinggal menyertakan nilai yang dibutuhkan melalu constructor di PropertyElementProposal.  Karena PropertyElementProposal adalah turunan dari CommonCompletionProposal, maka nilai tersebut seharusnya tinggal dipakai.

Lalu apa yang salah?  Well, asumsi saya terlalu naif!  Hal ini terbukti setelah saya memeriksa isi method getContextInformationPosition() di CommonCompletionProposal yang berupa:

public int getContextInformationPosition()
{
  return 0;
}

Ternyata apapun yang terjadi, nilai yang dikembalikan selalu 0.

Untuk mengatasi permasalahan yang ada, saya akan men-override method getContextInformationPosition() yang ada di CommonCompletionProposal dengan yang ada di PropertyElementProposal. Dengan demikian, perilaku CommonCompletionProposal tetap sama, karena saya tidak yakin kenapa nilai kembaliannya harus 0; sementara cukup perilaku PropertyElementProposal yang berubah sesuai dengan kebutuhan saya. Berikut ini adalah isi getContextInformationPosition() di PropertyElementProposal:

@Override
public int getContextInformationPosition()
{
  return super._replacementOffset;
}

Setelah penambahan method ini, context info akhirnya bekerja sesuai dengan yang diharapkan.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: