Nasıl kod tamamlama çalışmıyor mu? | Netgez.com
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

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • psidot

    psidot

    2 Kasım 2006
  • wwjoshdu

    wwjoshdu

    18 ÅžUBAT 2011