আমি এমন একটি সিওএম অ্যাড-ইন লিখছি যা এটির IDE প্রসারিত করে যা এটির মারাত্মক প্রয়োজন। এতে অনেকগুলি বৈশিষ্ট্য জড়িত রয়েছে, তবে আসুন এই পোস্টের জন্য এটি 2 এ সংকুচিত করুন:
- একটা ব্যাপার কোড এক্সপ্লোরার toolwindow যে প্রদর্শনগুলির একটি ট্রিভিউ ব্যবহারকারী নেভিগেট মডিউল এবং তাদের সদস্যদের ক্ষমতা প্রদান করে।
- একটি আছে কোড পরিদর্শন toolwindow যে প্রদর্শনগুলির একটি datagridview ব্যবহারকারী নেভিগেট কোড বিষয় করতে দেয় এবং সেগুলি স্বয়ংক্রিয়ভাবে ঠিক যে।
উভয় সরঞ্জামের একটি "রিফ্রেশ" বোতাম রয়েছে যা একটি খোলামেলা কার্য শুরু করে যা সমস্ত খোলা প্রকল্পের সমস্ত কোডকে বিশ্লেষণ করে; কোড এক্সপ্লোরার পার্স ফলাফল ব্যবহার নির্মাণের ট্রিভিউ , এবং কোড পরিদর্শন পার্স ফলাফল ব্যবহার কোড কোনো সমস্যার সম্মুখীন এবং তার ফলাফল প্রদর্শন করে datagridview ।
আমি এখানে যা করার চেষ্টা করছি তা বৈশিষ্ট্যের মধ্যে পার্সিং ফলাফলগুলি ভাগ করে নেওয়া, যাতে কোড এক্সপ্লোরার রিফ্রেশ করে, তখন কোড পরিদর্শনগুলি এটি সম্পর্কে জানে এবং কোড এক্সপ্লোরার সবেমাত্র পার্সিংয়ের কাজটি পুনরায় না করেই নিজেকে রিফ্রেশ করতে পারে can ।
তাই আমি যা করেছি, আমি আমার পার্সার ক্লাসকে একটি ইভেন্ট সরবরাহকারী তৈরি করেছি যা বৈশিষ্ট্যগুলি এতে নিবন্ধিত করতে পারে:
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);
}
});
}
এবং এটি কাজ করে। আমার যে সমস্যাটি হচ্ছে তা হ'ল ... এটি কাজ করে - মানে, কোড পরিদর্শনগুলি রিফ্রেশ হয়ে গেলে, পার্সার কোড এক্সপ্লোরারকে (এবং অন্য সবাইকে) "দোস্ত, কারও পার্সিং, আপনি এটি সম্পর্কে কিছু করতে চান? " - এবং পার্সিং সম্পূর্ণ হওয়ার পরে, পার্সার তার শ্রোতাদের বলছে "ছেলেরা, আপনার জন্য আমার নতুন বিশ্লেষণের ফলাফল রয়েছে, আপনি এটি সম্পর্কে কিছু করতে চান?"।
এটি যে সমস্যার সৃষ্টি করে তা চিত্রিত করার জন্য আপনাকে একটি উদাহরণ দিয়ে যেতে দাও:
- ব্যবহারকারী কোড এক্সপ্লোরার এনেছে, যা ব্যবহারকারীকে বলে "ধরে থাকুন, আমি এখানে কাজ করছি"; ব্যবহারকারী আইডিইতে কাজ চালিয়ে যান, কোড এক্সপ্লোরার নিজেই আবার চিত্রিত করে, জীবন সুন্দর is
- তারপরে ব্যবহারকারী কোড পরিদর্শনগুলি নিয়ে আসে, যা ব্যবহারকারীকে "ধরে রাখুন, আমি এখানে কাজ করছি" বলে; বিশ্লেষক কোড এক্সপ্লোরারকে "দোস্ত, কারোর পার্সিং, আপনি এটি সম্পর্কে কিছু করতে চান?" - কোড এক্সপ্লোরার ব্যবহারকারীকে বলে "ধরে থাক, আমি এখানে কাজ করছি"; ব্যবহারকারী এখনও আইডিইতে কাজ করতে পারেন, তবে কোড এক্সপ্লোরার নেভিগেট করতে পারবেন না কারণ এটি সতেজ। এবং কোডের পরিদর্শনগুলিও সম্পূর্ণ হওয়ার জন্য তিনি অপেক্ষা করছেন।
- ব্যবহারকারী পরিদর্শন ফলাফলগুলিতে তারা সম্বোধন করতে চান এমন একটি কোড সমস্যা দেখে; তারা এতে নেভিগেট করতে ডাবল-ক্লিক করুন, কোডটিতে কোনও সমস্যা আছে তা নিশ্চিত করুন এবং "ফিক্স" বোতামটি ক্লিক করুন। মডিউলটি সংশোধন করা হয়েছিল এবং পুনরায় পার্স করা দরকার, তাই কোড পরিদর্শনগুলি এর সাথে এগিয়ে যায়; কোড এক্সপ্লোরার ব্যবহারকারীকে "ধরে রাখুন, আমি এখানে কাজ করছি", ...
এই কোথায় যাচ্ছে দেখুন? আমি এটি পছন্দ করি না এবং আমি বাজি ধরেছি যে ব্যবহারকারীরা এটি পছন্দ করবেন না। আমি কী মিস করছি? বৈশিষ্ট্যগুলির মধ্যে পার্স ফলাফলগুলি ভাগ করে নেওয়ার বিষয়ে আমার কীভাবে যাওয়া উচিত, তবে বৈশিষ্ট্যটির কাজটি কখন করা উচিত তা নিয়ন্ত্রণের মধ্যে রেখেই যায় ?
আমি যে কারণটি জিজ্ঞাসা করছি তার কারণ হ'ল আমি বুঝতে পেরেছিলাম যে যদি ব্যবহারকারী সক্রিয়ভাবে রিফ্রেশ করার সিদ্ধান্ত না নেয় এবং পার্সের ফলাফলগুলি "ক্যাশে" না আসে ততক্ষণ যদি আমি আসল কাজ স্থগিত করি ... তবে আমি একটি বৃক্ষদর্শনকে রিফ্রেশ করব এবং সম্ভাব্য বাসি পার্স ফলাফলে কোড ইস্যুগুলি সনাক্ত করা ... যা আক্ষরিক অর্থে আমাকে আবার স্কোয়ার একতে নিয়ে আসে, যেখানে প্রতিটি বৈশিষ্ট্য তার নিজস্ব বিশ্লেষণ ফলাফলের সাথে কাজ করে: বৈশিষ্ট্যের মধ্যে পার্স ফলাফলগুলি ভাগ করে নেওয়ার এবং কোনও সুন্দর ইউএক্স রাখার কোনও উপায় আছে কি?
কোডটি সি # , তবে আমি কোড খুঁজছি না, আমি ধারণার সন্ধান করছি ।
VBAParser
দ্বারা উত্পাদিত হয় এবং আমাকে একটি পার্স গাছ দেয়, তবে বৈশিষ্ট্যগুলি সেটিকে গ্রাস করে না। RubberduckParser
পারসে ট্রি লাগে, এটা পদচারনা, এবং বিষয় একটি VBProjectParseResult
যে রয়েছে Declaration
বস্তু আছে তাদের সমস্ত References
সমস্যাগুলি সমাধান করা - যে কি বৈশিষ্ট্য ইনপুট জন্য নেওয়া .. তাই হ্যাঁ, এটা প্রায় কাছাকাছি একটি সম্পূর্ণ বা বাজে অবস্থা। RubberduckParser
না পুনরায় পার্স মডিউল যা যদিও পরিবর্তিত হয়নি স্মার্ট যথেষ্ট। তবে যদি কোনও বাধা থাকে তবে এটি পার্সিংয়ের সাথে নয়, কোড কোডটি রয়েছে with