Lua在windows下的安装及环境配置实用指南
2026-09-05
2026-09-11 0
面对实际交付,我看coca的重点不在星标,而在这项能力:Coca is a toolbox which is design for legacy system refactoring and analysis。实际做数据与知识处理时,经常会碰到数据结构、更新策略和可追溯性会决定结果是否可信,所以功能列表并不能代替验证。先用一份规模可控且答案已知的数据集试跑更稳妥;过程中要观察模式兼容、增量更新、查询结果和来源追踪,失败也应能解释原因。整体来看,它适合需要保留数据来路与变更记录的使用者拿来做对照测试,最终决定仍应回到真实结果和维护状态。

Coca - toolbox for system refactoring and analysis
Coca is a toolbox which is design for legacy system refactoring and analysis, includes call graph, concept analysis, api tree, design patterns suggest. Coca 是一个用于系统重构、系统迁移和系统分析的工具箱。它可以分析代码中的测试坏味道、模块化分析、行数统计、分析调用与依赖、Git 分析以及自动化重构等。
Related Tools: Coco is an effective DevOps analysis and auto-suggest tool.
Kotlin version: Chapi
Migration Guide (Chinese Version): 《系统重构与迁移指南》
Inspired by: newlee & Tequila
Refactoring Modeling:
Features List:
Available Commands:
analysis analysis code
api scan HTTP api from annotation
arch project package visualization
bs generate bad smell list and suggestions
call show call graph with specific method
cloc count lines of code with complexity estimation
concept build domain concept from source code
count count most refs function
evaluate evaluate code situation and refactor effort
git analysis git commit history for revs count, summary and suggest
help Help about any command
rcall reverse call graph visualization
refactor auto refactor code
suggest find usable Design Patterns from code
tbs generate tests bad smell
todo scan all todo, and list with time
version version
Getting started
Requirements: graphviz for dot file to image (such as svg, png)
获取 coca 的最简单方法是使用预构建的发行二进制文件之一,该二进制文件可用于 OSX、Linux、发布页面 上的 Windows。
You can also install yourself :
go install github.com/modernizing/coca@latest
Usage
Analysis
coca analysis
Arch
coca arch
Android Studio Gradle DSL Module (merge header)
command: coca arch -x "com.android.tools.idea.gradle.dsl" -H true
Android Studio Gradle DSL Module Elements Part:
command: coca arch -x "com.android.tools.idea.gradle.dsl.parser.elements"
Find Bad Smells
coca bs -s type
Examples Result:
{
"dataClass": [
{
"File": "examples/api/BookController.java",
"BS": "dataClass"
}
],
"lazyElement": [
{
"File": "examples/api/model/BookRepresentaion.java",
"BS": "lazyElement"
}
]
}
Code Line Count
coca cloc
Results:
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go 58 31763 7132 890 23741 2847
Java 44 971 208 21 742 62
Markdown 8 238 75 0 163 0
Gherkin Specificati… 2 32 2 16 14 0
Document Type Defin… 1 293 36 0 257 0
License 1 201 32 0 169 0
SQL 1 2 0 0 2 0
SVG 1 199 0 34 165 0
Shell 1 3 1 1 1 0
XML 1 13 0 0 13 0
gitignore 1 61 8 4 49 0
───────────────────────────────────────────────────────────────────────────────
Total 119 33776 7494 966 25316 2909
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop $803,822
Estimated Schedule Effort 14.120551 months
Estimated People Required 6.743156
───────────────────────────────────────────────────────────────────────────────
Results to json
coca cloc --by-file --format json
Cloc by directory
coca cloc ~/intellij-community/android/ --by-directory --include-ext=java,kt --not-match=".*(Test|Tests)\.(kt|java)"
results csv:
module,summary
adt-branding,169
adt-testutils,257
adt-ui,21987
adt-ui-model,3450
android,361270
android-adb,497
android-common,3280
android-debuggers,3030
android-kotlin,8816
android-lang,24796
android-lang-databinding,6392
android-layout-inspector,2533
...
Cloc Top File
coca cloc ~/intellij-community/android/designer/src/com/android/tools/idea --top-file --top-size 10
output to: coca_reporter/sort_cloc.json and also:
LENGTH
COMPLEXITY
LOCATION
1642
236
ConstraintLayoutHandler.java
1492
375
ConstraintComponentUtilities.java
1189
166
CommonActions.java
1184
325
ConstraintWidget.java
1169
129
SingleWidgetView.java
1115
213
ScoutArrange.java
1097
281
ScoutWidget.java
1081
224
3d/Rasterize.java
1016
159
LayoutlibSceneManager.java
1014
220
TimeLinePanel.java
Build Deps Tree
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
Examples Results:
Identify Spring API
coca api -f
With Count
coca api -r com.phodal.pholedge. -c
or multi package:
coca api -r com.macro.mall.demo.controller.,com.zheng.cms.admin.,com.phodal.pholedge -c
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
| SIZE | METHOD | URI | CALLER |
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
| 36 | GET | /aliyun/oss/policy | controller.OssController.policy |
| 21 | POST | /aliyun/osscallback | controller.OssController.callback |
| 17 | GET | /subject/list | controller.CmsSubjectController.getList |
| 17 | GET | /esProduct/search | search.controller.EsProductController.search |
| 17 | GET | /order/list | controller.OmsOrderController.list |
| 17 | GET | /productAttribute/list/{cid} | controller.PmsProductAttributeController.getList |
| 17 | GET | /productCategory/list/{parentId} | controller.PmsProductCategoryController.getList |
| 17 | GET | /brand/list | controller.PmsBrandController.getList |
| 17 | GET | /esProduct/search/simple | search.controller.EsProductController.search |
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
Git Analysis
coca git -t
Results:
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
| ENTITYNAME | REVSCOUNT | AUTHORCOUNT |
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
| build.gradle | 1326 | 36 |
| src/asciidoc/index.adoc | 239 | 20 |
| build-spring-framework/resources/changelog.txt | 187 | 10 |
| spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java | 170 | 10 |
| spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java | 159 | 15 |
| src/docs/asciidoc/web/webmvc.adoc | 121 | 24 |
| spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java | 118 | 9 |
| src/dist/changelog.txt | 118 | 9 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java | 116 | 15 |
| spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java | 113 | 15 |
| spring-web/src/main/java/org/springframework/http/HttpHeaders.java | 111 | 18 |
| src/docs/asciidoc/web/webflux.adoc | 108 | 21 |
| spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java | 107 | 9 |
| spring-test/spring-test.gradle | 105 | 7 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java | 105 | 13 |
| spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java | 101 | 12 |
| spring-web/src/main/java/org/springframework/web/client/RestTemplate.java | 98 | 17 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java | 96 | 14 |
| org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java | 93 | 4 |
| spring-core/src/main/java/org/springframework/core/ResolvableType.java | 92 | 10 |
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
Concept Analyser
coca concept
Results Examples:
+------------------+--------+
| WORDS | COUNTS |
+------------------+--------+
| context | 590 |
| resolve | 531 |
| path | 501 |
| content | 423 |
| code | 416 |
| resource | 373 |
| property | 372 |
| session | 364 |
| attribute | 349 |
| properties | 343 |
| headers | 330 |
+------------------+--------+
Count Refs
coca count
Results:
+------------+--------------------------------------------------------------------------+
| REFS COUNT | METHOD |
+------------+--------------------------------------------------------------------------+
| 2 | com.phodal.pholedge.book.BookRepository.byId |
| 2 | com.phodal.pholedge.book.model.Book.toRepresentation |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 2 | com.phodal.pholedge.book.BookRepository.save |
| 2 | com.phodal.coca.analysis.JavaCallApp.parse |
| 1 | com.phodal.pholedge.book.model.Book.save |
| 1 | evolution.analysis.jv.calls.JavaCallVisitor.parseNewType |
| 1 | evolution.analysis.jv.calls.JavaCallVisitor.isNotSpecialNewWord |
| 1 | com.phodal.pholedge.book.BookMapper.byId |
| 1 | com.phodal.pholedge.book.BookService.updateBook |
| 1 | com.phodal.pholedge.book.BookService.getBooksLists |
| 1 | com.phodal.pholedge.book.BookService.getBookById |
| 1 | com.phodal.pholedge.book.BookMapper.doSave |
| 1 | com.phodal.pholedge.book.BookMapper.list |
| 1 | com.phodal.pholedge.book.BookService.createBook |
| 1 | com.phodal.pholedge.book.BookFactory.create |
| 1 | com.phodal.pholedge.book.BookRepository.list |
| 1 | com.phodal.pholedge.book.model.Book.create |
+------------+--------------------------------------------------------------------------+
Reverse Call Graph
coca rcall -c org.bytedeco.javacpp.tools.TokenIndexer.get
Results:
digraph G {
edge [dir="back"];
"org.bytedeco.javacpp.tools.Parser.extern" -> "org.bytedeco.javacpp.tools.Parser.declarations";
"org.bytedeco.javacpp.tools.Parser.declarations" -> "org.bytedeco.javacpp.tools.Parser.extern";
...
}
Auto Refactor
support:
coca refactor -R rename.coca -p src/main
coca refactor -m move.config -p .
Evaluate
coca evaluate
Arduino Results(Old Version):
+--------------------------------+-------+-----------------------+-------+-----------+
| TYPE | COUNT | LEVEL | TOTAL | RATE |
+--------------------------------+-------+-----------------------+-------+-----------+
| Nullable / Return Null | 0 | Method | 1615 | 0.00% |
| Utils | 7 | Class | 252 | 2.78% |
| Static Method | 0 | Method | 1615 | 0.43% |
| Average Method Num. | 1615 | Method/Class | 252 | 6.408730 |
| Method Num. Std Dev / 标准差 | 1615 | Class | - | 7.344917 |
| Average Method Length | 13654 | Without Getter/Setter | 1100 | 12.412727 |
| Method Length Std Dev / 标准差 | 1615 | Method | - | 20.047092 |
+--------------------------------+-------+-----------------------+-------+-----------+
New Version:
TYPE
TYPE COUNT
LEVEL
LEVEL TOTAL
VALUE = COUNT / TOTAL
Nullable / Return Null
0
Method
6
0.00%
Utils
0
Class
14
0.00%
Static Method
1
Method
6
0.00%
Average Method Num.
6
Method/Class
14
0.428571
Method Num. Std Dev / 标准差
6
Class
-
0.646206
Average Method Length
0
Without Getter/Setter
0
NaN
Method Length Std Dev / 标准差
0
Method
-
NaN
Evaluate.json examples
{
"Nullable": {
"Items": [
"nonnull.Name.testNull",
"nonnull.Name.orElseNull",
"org.ofbiz.base.util.UtilURL.fromResource",
"org.ofbiz.base.util.UtilURL.getOfbizHomeRelativeLocationFromFilePath",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.of",
"study.huhao.demo.infrastructure.persistence.blog.BlogPO.convertDomain"
]
},
"ServiceSummary": {
"LifecycleMap": null,
"ReturnTypeMap": {
"BookRepresentaion": [
"com.phodal.pholedge.book.BookService.getBookById",
"com.phodal.pholedge.book.BookService.updateBook"
]
},
"RelatedMethod": null
},
"UtilsSummary": {},
"Summary": {
"UtilsCount": 1,
"ClassCount": 64,
"MethodCount": 161,
"StaticMethodCount": 19
}
}
Todo
coca todo
results:
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| DATE | AUTHOR | MESSAGES | FILENAME | LINE |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| 2019-12-09 | Cristian Maglie | happens on macosx, don't know | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 118 |
| | | why | | |
| 2019-12-09 | Cristian Maglie | Make this a method of Theme | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 233 |
| 2019-12-09 | Cristian Maglie | Do a better job in refreshing | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 241 |
| | | only the needed element | | |
| 2019-12-09 | Cristian Maglie | Do a better job in refreshing | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 273 |
| | | only the needed element | | |
| 2019-12-09 | Cristian Maglie | Make this a method of Theme | app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java | 149 |
| 2019-12-09 | Cristian Maglie | happens on macosx, don't know | app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java | 183 |
| | | why | | |
| 2019-12-09 | Cristian Maglie | show error | app/src/processing/app/Base.java | 1440 |
| 2019-12-09 | Cristian Maglie | error when importing. ignoring | app/src/processing/app/Base.java | 2423 |
| | | :( | | |
| 2019-12-09 | Cristian Maglie | Improve / move error handling | app/src/processing/app/Editor.java | 1541 |
| 2019-12-09 | Cristian Maglie | Should be a Theme value? | app/src/processing/app/EditorHeader.java | 78 |
| 2019-12-09 | Cristian Maglie | Should be a Theme value? | app/src/processing/app/EditorStatus.java | 73 |
| 2019-12-09 | Cristian Maglie | Improve decoupling | app/src/processing/app/EditorTab.java | 465 |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
Suggest
coca suggest
results:
+--------+------------------+--------------------------------+
| CLASS | PATTERN | REASON |
+--------+------------------+--------------------------------+
| Insect | factory | too many constructor |
| Bee | factory, builder | complex constructor, too |
| | | many constructor, too many |
| | | parameters |
+--------+------------------+--------------------------------+
Test Bad Smells
coca tbs
results
+---------------------+---------------------------------------------------------------+------+
| TYPE | FILENAME | LINE |
+---------------------+---------------------------------------------------------------+------+
| DuplicateAssertTest | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 107 |
| DuplicateAssertTest | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 41 |
| DuplicateAssertTest | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 63 |
| RedundantPrintTest | app/test/cc/arduino/i18n/I18NTest.java | 71 |
| RedundantPrintTest | app/test/cc/arduino/i18n/I18NTest.java | 72 |
| RedundantPrintTest | app/test/cc/arduino/i18n/I18NTest.java | 77 |
| DuplicateAssertTest | app/test/cc/arduino/net/PACSupportMethodsTest.java | 19 |
| DuplicateAssertTest | app/test/processing/app/macosx/SystemProfilerParserTest.java | 51 |
| DuplicateAssertTest | app/test/processing/app/syntax/PdeKeywordsTest.java | 41 |
| DuplicateAssertTest | app/test/processing/app/tools/ZipDeflaterTest.java | 57 |
| DuplicateAssertTest | app/test/processing/app/tools/ZipDeflaterTest.java | 83 |
| DuplicateAssertTest | app/test/processing/app/tools/ZipDeflaterTest.java | 109 |
+---------------------+---------------------------------------------------------------+------+
Find unused deps
coca deps -p _fixtures/deps/maven_sample
results:
+---------------------------+----------------------------------------+---------+
| GROUPID | ARTIFACTID | SCOPE |
+---------------------------+----------------------------------------+---------+
| org.flywaydb | flyway-core | |
| mysql | mysql-connector-java | runtime |
| org.springframework.cloud | spring-cloud-starter-contract-verifier | test |
+---------------------------+----------------------------------------+---------+
Showcases
Android Studio Analysis Examples. Call with lookup: coca call -l
Roadmap
Documents Todo:
Tech Debt
开发者
安装Go
brew install go
环境
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
克隆
git clone https://github.com/modernizing/coca
测试框架
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
许可证
基于 龙舌兰酒 的拱门
Git 分析灵感来自 Code Maat
测试难闻气味,灵感来自 测试气味示例
@ 2019 Phodal Huang 的 想法。 此代码根据 MPL 许可证分发。请参阅此目录中的 LICENSE。