Aptana Journal #7: Alias


Pada petualangan sebelumnya, constructor jQuery berhasil dimunculkan dengan baik.  Tapi hal ini tidak berlaku untuk $.  Sebagai informasi, $ adalah alias untuk jQuery sehingga apa yang muncul sebagai constructor jQuery juga harus muncul sebagai $.   Pendekatan yang saya pakai mungkin akan menghilangkan perbedaan antara static method dan instance method, tapi ini adalah trade-off yang masih dapat ditoleransi.   Okay, tapi content assist dan context info untuk $  saat ini tidak bekerja dengan baik!  Padahal, saya sudah menambahkan baris berikut ini di file *.sdocml:

... 
  <aliases>
    <alias name="$" type="jQuery" />
  </aliases>
...

Mengapa content assist masih tidak bekerja dengan baik?  Untuk menjawab pertanyaan ini, saya kembali melihat isi method index() di class SDocMLFileIndexingParticipant. Bagian yang menarik adalah di berikut ini:

public void index(BuildContext context, Index index, IProgressMonitor monitor) throws CoreException
{

   ... // diabaikan

   // process results
   JSIndexWriter indexer = new JSIndexWriter();
   TypeElement[] types = reader.getTypes();
   AliasElement[] aliases = reader.getAliases();
   URI location = context.getURI();

   ... // diabaikan

   for (AliasElement alias: aliases)
   {
      String typeName = alias.getType();
      PropertyElement property = window.getProperty(typeName);
      if (property!=null)
      {
         if (property instanceof FunctionElement)
         {
            property = new FunctionElement((FunctionElement) property);
         }
         else
         {
            property = new PropertyElement(property);
         }
         property.setName(alias.getName());
      }
      else 
      {
         property = new PropertyElement();
         property.setName(alias.getName());
         property.addType(typeName);
      }
      window.addProperty(property);
   }

   indexer.writeType(index, window, location);

   ... // kode diabaikan
}

Pada kode program di atas, terlihat bahwa window.getProperty(typeName) akan dipanggil untuk mendapatkan tipe alias. Hasil kembaliannya selalu 1 buah PropertyElement!  Padahal $ harusnya adalah alias untuk seluruh variasi constructor jQuery (yang jumlahnya lebih dari 1).

Oleh sebab itu, saya menambahkan sebuah method baru di class TypeElement yang akan mengembalikan seluruh PropertyElement dengan nama yang sama (bila ada!). Berikut ini adalah isi method tersebut:

public List<PropertyElement> getProperties(String name)
{
  List<PropertyElement> listReturn = new ArrayList<PropertyElement>();
  if (name!=null && name.length()>0 && this._properties!=null) {
    for (PropertyElement property: this._properties) {
      if (name.equals(property.getName())) {
        listReturn.add(property);
      }
    }
  }
  return listReturn;
}

Berikutnya saya menyesuaikan method index() di SDocMLFileIndexingParticipant agar memanggil method yang baru saya buat di atas, dimana perubahan yang saya lakukan terlihat seperti berikut ini:

... // kode program di abaikan
for (AliasElement alias: aliases)
{
  String typeName = alias.getType();
  List<PropertyElement> listProperties = window.getProperties(typeName);
  if (listProperties.size() > 0) {
    for (PropertyElement property: listProperties) {
      if (property instanceof FunctionElement) {
        property = new FunctionElement((FunctionElement) property);
      } else {
        property = new PropertyElement(property);
      }
      property.setName(alias.getName());
      window.addProperty(property);
    }
  } else {
    PropertyElement property = new PropertyElement();
    property.setName(alias.getName());
    property.addType(typeName);
    window.addProperty(property);
  }
}
... // kode program diabaikan

Perjuangan masih belum selesai sampai disini!  Karena deskripsi dokumentasi tiba-tiba saja hilang entah kemana!!! Loh?  Mengapa?

Untuk menjawab keanehan baru tersebut, saya memeriksa isi constructor FunctionElement. Okay, constructor akan men-copy beberapa nilai dari base seperti _parameters, _returnTypes, dan sebagainya. Tidak ada yang men-copy _description disini!

Okay, berarti copy _description mungkin dilaksanakan di parent class-nya yaitu PropertyElement. Jadi, saya memeriksa isi constructor PropertyElement. Disini beberapa nilai dari base seperti _owningType, _types dan _examples akan di-copy! Tapi tidak ada yang men-copy _description sama sekali!  Wow, padahal _examples saja di-copy disini, masa _description tidak diikutkan? Oleh sebab itu, saya mengubah constructor PropertyElement sehingga terlihat seperti berikut ini:

public PropertyElement(PropertyElement base)
{
  this._owningType = base.getOwningType();
  this._isInstanceProperty = base.isInstanceProperty();
  this._isClassProperty = base.isClassProperty();
  this._isInternal = base.isInternal();
  this._types = new ArrayList<ReturnTypeElement>(base.getTypes());
  this._examples = new ArrayList<String>(base.getExamples());

  // Menambah deskripsi
  super.setDescription(base.getDescription());
}

Sekarang content assist dan context info untuk $ dapat bekerja dengan baik seperti yang terlihat di gambar berikut ini:

Content Assist  Untuk Tanda $

Content Assist Untuk Tanda $

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: