Umutsuzca ihtiyacı olan bir IDE genişleten bir COM eklentisi yazıyorum. İlgili birçok özellik var, ancak bu yazı uğruna 2'ye daraltalım:
- Kullanıcının modüllerde ve üyelerinde gezinmesine olanak tanıyan bir treeview görüntüleyen bir Kod Gezgini araç penceresi vardır .
- Kullanıcının kod sorunlarında gezinmesini ve bunları otomatik olarak düzeltmesini sağlayan bir veri görünümü gösteren bir Kod Denetimleri araç penceresi vardır .
Her iki araçta da, açılan tüm projelerde tüm kodu ayrıştıran zaman uyumsuz bir görevi başlatan bir "Yenile" düğmesi vardır; Kod Explorer inşa etmek ayrıştırma sonuçları kullanan ağaç ve Kod Denetimleri kodu sorunlarını bulup onun içinde sonuçlarını görüntülemek için ayrıştırma sonuçlarını kullanır DataGridView .
Burada yapmaya çalıştığım, Kod Gezgini yenilendiğinde, Kod Denetimleri bunu bilir ve Kod Gezgini'nin yaptığı ayrıştırma işlemini yeniden yapmak zorunda kalmadan kendini yenileyebilmesi için ayrıştırma sonuçlarını özellikler arasında paylaşmaktır. .
Ne yaptım, ayrıştırıcı sınıfımı özellikleri kayıt olabilir bir olay sağlayıcı yaptı:
private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.SolutionTree.Nodes.Clear();
foreach (var result in e.ParseResults)
{
var node = new TreeNode(result.Project.Name);
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
AddProjectNodes(result, node);
Control.SolutionTree.Nodes.Add(node);
}
Control.EnableRefresh();
});
}
private void _parser_ParseStarted(object sender, ParseStartedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.EnableRefresh(false);
Control.SolutionTree.Nodes.Clear();
foreach (var name in e.ProjectNames)
{
var node = new TreeNode(name + " (parsing...)");
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
Control.SolutionTree.Nodes.Add(node);
}
});
}
Ve çalışıyor. Sahip olduğum sorun, bu ... işe yarıyor - Yani, kod denetimleri yenilendiğinde, ayrıştırıcı kod gezgini (ve herkes) söyler "ahbap, birisi ayrıştırma, bu konuda yapmak istediğiniz bir şey? " - ve ayrıştırma tamamlandığında, ayrıştırıcı dinleyicilerine "çocuklar, sizin için taze ayrıştırma sonuçlarım var, bu konuda yapmak istediğiniz herhangi bir şey var mı?"
Bunun yarattığı sorunu göstermek için size bir örnek vereyim:
- Kullanıcı "bekle, ben burada çalışıyorum" söyleyen Kod Gezgini getirir; kullanıcı IDE üzerinde çalışmaya devam ediyor, Kod Gezgini kendini yeniden çiziyor, hayat güzel.
- Kullanıcı daha sonra kullanıcıya "bekle, burada çalışıyorum" diyen Kod Denetimlerini getirir; Ayrıştırıcı Kod Gezgini'ne "dostum, birisi ayrışıyor, bu konuda yapmak istediğiniz herhangi bir şey?" - Kod Gezgini kullanıcıya "bekle, burada çalışıyorum"; kullanıcı IDE'de çalışmaya devam edebilir, ancak yenilendiği için Kod Gezgini'nde gezinemez. Kod denetimlerinin de tamamlanmasını bekliyor.
- Kullanıcı ele almak istediği inceleme sonuçlarında bir kod sorunu görür; ona gitmek için çift tıklayın, kodla ilgili bir sorun olduğunu onaylayın ve "Düzelt" düğmesini tıklayın. Modül değiştirildi ve yeniden ayrıştırılması gerekiyor, bu nedenle kod denetimleri onunla devam ediyor; Kod Gezgini kullanıcıya "bekle, burada çalışıyorum", ...
Bunun nereye gittiğini görüyor musunuz? Sevmiyorum ve bahse girerim kullanıcılar da sevmez. Neyi kaçırıyorum? Ayrıştırma sonuçlarını özellikler arasında paylaşmaya nasıl devam etmeliyim, ancak yine de özelliğin ne zaman çalışması gerektiğini kontrol eden kullanıcıyı nasıl kontrol edebilirim ?
Sormamın nedeni, gerçek çalışmayı kullanıcı aktif olarak yenilemeye karar verene kadar ertelersem ve ayrıştırma sonuçlarını geldikçe "önbelleğe alsaydım ..." Muhtemelen eski bir ayrıştırma sonucundaki kod sorunlarını bulma ... kelimenin tam anlamıyla beni her bir özelliğin kendi ayrıştırma sonuçlarıyla çalıştığı bir kareye geri getiriyor: ayrıştırma sonuçlarını özellikler arasında paylaşabilmem ve güzel bir UX almamın bir yolu var mı?
Kod c # , ama kod aramıyorum, kavramları arıyorum .
VBAParser
ANTLR tarafından üretiliyor ve bana bir ayrıştırma ağacı veriyor, ancak özellikler bunu tüketmiyor. RubberduckParser
Ayrıştırma ağacını alır onu yürür ve sorunlar bir VBProjectParseResult
içerdiğini Declaration
olan nesneleri tüm bunların References
çözülmesi - en o özellikler girişi için almak neyi .. bu yüzden evet, hemen hemen hepsi ya hiç bir durum. Yine RubberduckParser
de değiştirilmemiş modülleri yeniden ayrıştırmayacak kadar akıllıdır. Ancak bir darboğaz varsa ayrıştırma ile değil, kod denetimleri ile.