SORU
2 AĞUSTOS 2009, Pazar


Nasıl kod tamamlama çalışmıyor mu?

Editörler ve IDE sürü kod tamamlama var. Bazıları "Diğerleri gerçekten değil." zeki çok Daha akıllı türü ile ilgileniyorum. Eğer öyle ise, bir işlev sunan IDEs gördüm mesela) geçerli kapsamı b mevcut) geçerli. dönüş değeri ("[Tab]" sadece doğru tür tamsayı veya değişken bir isim eklenebilecek bir şey döndüren fonksiyonlar bulunmaktadır.) 5 foo sonra örnek Ayrıca daha sık kullanılan veya en uzun seçenek listesi önde verdiklerini gördüm.

Kodu ayrıştırmak gerekiyor farkındayım. Ama genellikle geçerli kod düzenleme geçersiz süre içinde sözdizimi hatası var. Ne kadar eksik ve hataları içeren bir ayrıştırma mı?

Ayrıca zaman kısıtlaması yok. Tamamlanması halinde saniyede bir listesi ile gelip alır, işe yaramaz. Bazen tamamlama algoritması sınıfları binlerce ile ilgilenir.

Bunun için iyi algoritmalar ve veri yapıları nelerdir?

CEVAP
2 AĞUSTOS 2009, Pazar


UnrealScript dil servis ürünümü IntelliSense altyapısı karmaşık ama elimden geldiğince bir bakış burada vereceğim. C# VS2008 SP1 dil hizmeti performans amacım (iyi bir neden için). Değil henüz, ama bu fast/yeterince doğru ben güvenle öneri sonra tek bir karakter yazılmış, beklemeden ctrl alanı veya kullanıcı daktilo . (nokta). Daha fazla bilgi insanlar [Dil Hizmetleri üzerinde çalışan] bu konu hakkında, son kullanıcı daha iyi bir deneyim hiç ürünlerini kullanmalıyım. Orada çok sayıda ürün aldım talihsiz deneyim çalışma ile bu ödemedi böyle dikkatini ayrıntılara ve sonuç olarak ben mücadele ile IDE daha büyüktüm kodlama.

Dil hizmetimde, aşağıdaki gibi ortaya koydu:

  1. İmleci bir ifade olsun. Bu başından beri yürüyorüye erişim ifadesitanımlayıcı sonuna imleci sona erdi. Üye erişim ifadesi genellikle şeklinde aa.bb.cc, da aa.bb(3 2).cc gibi yöntem çağrıları içerebilir.
  2. Olsunbağlamimleci çevreleyen. Bu her zaman derleyici (uzun hikaye) olarak aynı kuralları takip etmez, çünkü çok zor bir iş, ama burada öyle varsayalım. Genellikle bunun anlamı, imlecin içinde olduğu hakkında önbelleğe alınan bilgi alın.
  3. İçerik uygular GetDeclarations() tüm öğeleri kapsamında görünür IEnumerable<IDeclaration> Bir almak için arayabileceğiniz IDeclarationProvider nesne demek. Benim durumumda, bu liste içerir yerliler/parametreleri (eğer bir yöntem), üyeleri (alanları ve yöntemler, statik sadece sürece bir örnek yöntem ve özel üyelerin temel türleri), bütünsel (türleri ve sabitleri için dil üzerinde çalışıyorum) ve anahtar kelimeler. Bu listede adı taşıyan bir öğe olacak aa. İçerik öğesi seçin #1, olarak ifade değerlendirilmesinde ilk adım olarak adı ile numaralandırma 8**, bize bir sonraki adım için IDeclaration bir vermek.
  4. Sonraki, Ben IDeclaration operatör aa temsil IEnumerable<IDeclaration> başka içeren almak için geçerli olan "üyeler" (bir anlamda) aa. . operatör -> operatöründen farklı olduğundan, 16 ** IDeclaration nesneyi doğru olarak uygulamak için bekliyoruz listelenen operatör diyorum.
  5. Bu bildirim listesi cc, ben girene kadar devam ederolabilir veya olmayabiliradı cc ile bir nesne içerir. Bildiğinize eminim, birden çok öğe cc başlangıç olarak görünür. Ben son numaralandırma alıp my documented algorithm geçirilerek bu en yararlı bilgiyi mümkün olan kullanıcı sağlamak için çözmek.

Burada IntelliSense arka uç için bazı notlar:

  • GetMembers uygulamada ETMENİZ tembel değerlendirme mekanizmaları geniş kullanımı yapmak. Benim önbellek her bir nesnenin üyelerine veren bir functor verebilmektedir, ağaç ile karmaşık eylemleri gerçekleştirmek yakınlarındaki önemsiz değildir.
  • Her nesne, üyelerinin List<IDeclaration> tutmak yerine, bir Name bir yapı olduğu List<Name> özel olarak biçimlendirilmiş bir dize üye açıklayan karmasını içeren duruyorum. Nesnelere ad haritalar büyük bir önbellek var. Ben ne zaman bu şekilde, yeniden ayrıştırma dosyası, tüm öğeleri önbellekten dosyasında bildirilen kaldırın ve güncellenen üyeleri ile yeniden yapabilirim. Yol nedeniyle funktorlar yapılandırılmış, ifadeleri hemen yeni öğeler için değerlendirmek.

"" . Önuç ıntellisense

Kullanıcı türü olarak dosya sayısını sınırlayabiliryanlışdoğru olandan daha sık. Gibi, istemiyorum gelişigüzel önbellek bölümleri çıkarmak kullanıcı türleri. Yerde durum özel kurallar Çok sayıda Artan güncellemeleri mümkün olduğunca hızlı bir şekilde işlemek için var. Artan önbellek sadece tutulan yerel bir dosya açın ve yardımcı olun kullanıcı sağlamak değil fark o kendi yazıyor neden arka uç önbellek tutmak hatalı satır/sütun bilgi için işler gibi her iki yöntemde dosya.

  • Bir kurtarıcı faktör benim ayrıştırıcıhızlı. 20000 hattı düşük öncelikli arka plan iş parçacığı üzerinde kendi kendine yeten çalışırken 150ms dosya kaynak tam önbellek güncelleme işleyebilir. Bu çözümleyici, açık bir dosya üzerinde bir geçiş başarıyla (sözdizimsel) tamamlar, dosyanın mevcut durumu genel önbellek taşındı.
  • Eğer dosya sözdizimsel olarak doğru değilse, ANTLR filter parser (sorry about the link - most info is on the mailing list or gathered from reading the source) bir dosya arıyor yeniden ayrıştırma için kullanıyorum:
    • Değişken/alan tanımlamalar.
    • Sınıf/yapı tanımları için imza.
    • Yöntem tanımlar imzası.
  • Yerel önbellek, sınıf ayracı/iç içe geçme düzeyi daha geri gider zaman/metot Tanımlamaları imza ve sonunda başlar yapı. Yöntemleri de başka bir yöntem bildirimi (yerleştirme yöntemleri) ulaşıldığında sona erer.
  • Yerel önbellekte, değişkenler/alanları hemen önceki ile bağlantılıdırkapatılmamışeleman. Kısa kod parçacığını aşağıda bu neden önemli olduğunu bir örnek için bkz.
  • Ayrıca, Kullanıcı tipleri gibi, eşleştirmek bir tablo ekledi/işaretleme karakter aralıkları kaldırıldı duruyorum. Bu ne için kullanılır?
    • Bir yöntem/beri imleci doğru bağlam tespit edebilirim, emin olun tam çözümler arasında dosya var.
    • Bildirim Git emin/Tanım/Referans doğru öğeleri açık dosyaları bulur.

Önceki bölüm için parçacığını kod:

class A
{
    int x; // linked to A

    void foo() // linked to A
    {
        int local; // linked to foo()

    // foo() ends here because bar() is starting
    void bar() // linked to A
    {
        int local2; // linked to bar()
    }

    int y; // linked again to A

Bu düzeni uygulamaya çalıştım IntelliSense özelliklerinin bir listesini eklemek istedim. Pictures of each are located here.

  • Otomatik tamamlama
  • Araç ipuçları
  • Yöntem İpuçları
  • Sınıf Görünüm
  • Kod Tanımı Pencere
  • Tarayıcı (VS 2010 sonunda bunu C ekler#) arayın
  • Anlamsal olarak doğru Bulmak Tüm Başvuruları

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • itfigueres

    itfigueres

    12 EKİM 2013
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • JonnyEthco

    JonnyEthco

    5 EKİM 2006