تجسم تأثیر تغییرات کد

آیا تا به حال با مشکلی مواجه شده اید که تغییر کد شما به طور ناخواسته بر سایر قسمت های برنامه شما تأثیر بگذارد؟ من روی توسعه یک ابزار تجزیه و تحلیل استاتیک منبع باز به نام Inga کار کرده ام. هدف آن، خودکارسازی تجسم نقاط انتهایی API و اجزای رابط کاربری است که تحت تأثیر تغییرات کد در یک محیط یکپارچه سازی پیوسته (CI) قرار دارند.
AST چیست؟
برای درک بهتر نحوه عملکرد تحلیل کد، اجازه دهید با بحث در مورد مفهوم درخت نحو انتزاعی (AST) شروع کنیم. هنگام کار با کد، شناسایی منابع کد و تجزیه و تحلیل ساختار صرفاً بر اساس کاراکترها چالش برانگیز است. بنابراین قبل از انجام تحلیل کد، کد را به AST تبدیل می کنیم که ساختار کد را در قالب درختی نشان می دهد.
AST حاوی داده های اساسی زیر است:
- نوع (به عنوان مثال، کلاس، روش)
- نام
- محدوده کد
- گره های کودک
چگونه تاثیر تغییرات کد را پیدا کنیم
اکنون، بیایید بررسی کنیم که چگونه تغییرات کد تحت تأثیر را با استفاده از AST پیدا می کنیم. دو جنبه کلیدی باید در نظر گرفته شود: تعاریف (مانند روش ها یا اعضا) و مراجع. ما کد و AST را با هم مقایسه می کنیم.
تعاریف را پیدا کنید
به عنوان مثال، اگر یک تغییر کد در بلوک the ایجاد کنیم create
روش، میتوانیم با بررسی موقعیتهای متن شروع و پایان گره AST مربوطه، تعریف آسیبدیده را پیدا کنیم.
با این حال، یافتن منابع پیچیده تر است. از آنجا که create
را می توان در چندین مکان در یک پروژه تعریف کرد، ما نمی توانیم به یک جستجوی ساده تکیه کنیم.
روند | نام پیدا شد | |
---|---|---|
1 | دریافت نام گره بسته | app.service |
2 | نام گره کلاس را دریافت کنید | app.service.order |
3 | نام گره متد را دریافت کنید | app.service.Order.create |
منابع را بیابید
برای یافتن فراخوانی متد، نوع خاصی از گره AST را جستجو می کنیم که با فراخوانی متد مطابقت دارد. در این مورد، ما به دنبال گره ای هستیم که با نام متد هدف مطابقت داشته باشد create
، که ما به تازگی آن را جستجو کرده ایم. از آنجا، میتوانیم درخت را به سمت بالا طی کنیم تا نام کلاس را تعیین کنیم و در نهایت نام منحصربهفرد «app.service.Order.create» را به دست آوریم که با تعریف هدف مرتبط است.
روند | نام پیدا شد | |
---|---|---|
1 | پیدا کن create فراخوانی روش |
ايجاد كردن |
2 | تعریف کلاس را پیدا کنید order عضو |
سفارش دهید. ایجاد کنید |
3 | واردات برای Order
|
app.service.Order.create |
نتیجه
ما میتوانیم نقاط ورودی مراجع فراخوانی را با استفاده از رویکرد چرخهای برای شناسایی نامهای منحصربهفرد در تعاریف و مراجع تعیین کنیم. این تکنیک تجزیه و تحلیل به ما اجازه می دهد تا با پروژه های نوشته شده به چندین زبان مانند جاوا و کاتلین کار کنیم.
Inga در حال حاضر در حال توسعه است. اگر این ابزار را جالب میدانید، لطفاً به آن ستاره بدهید ⭐️ و بازخورد بدهید. متشکرم!
تجسم تغییرات کد و تاثیر آن بر کاربران
یک ابزار تجزیه و تحلیل ایستا که منابع را از کد تغییر یافته جستجو می کند تا نقاط ورودی را که تأثیر زیادی بر کاربر دارند شناسایی کند.
چرا؟
کد روزانه تغییر می کند، و همیشه مهم است که تأثیر تغییرات را بررسی کنید در بسیاری از موارد، بررسی تأثیر تغییر بستگی به هوشیاری نویسنده در نوشتن کد دارد، که تشخیص اثرات ناخواسته در طول بررسی کد و QA را دشوار می کند. مراحل این ابزار کیفیت نرم افزار را با تشخیص تغییرات ناخواسته در مراحل اولیه بهبود می بخشد.
شروع سریع
در کانتینر Docker اجرا کنید:
جاوا / کاتلین
docker run --rm -v $PWD:/work ghcr.io/seachicken/inga:latest-java --root-path /work --base-commit main
جاوا اسکریپت / TypeScript
docker run --rm -v $PWD:/work ghcr.io/seachicken/inga:latest-typescript --root-path /work --base-commit main
استفاده
inga [options]
گزینه ها
--root-path <string>
مسیر نسبی پروژه مورد تجزیه و تحلیل، بنابراین اگر این گزینه را ندهید، به طور پیش فرض مسیر اجرای دستور را تعیین می کند.
--exclude
…