Coca is a toolbox which is design for legacy system refactoring. Coca 是一个用于系统重构、系统迁移和系统分析的瑞士军刀。它可以分析代码中的 badsmell,行数统计,分析调用与依赖,进行 Git 分析,以及自动化重构等。
Refactoring Modeling:
Todo:
- Show all todos and history
- Suggest API for Design Patterns
- factory pattern
- strategy
install
go get -u github.com/phodal/coca
help:
Usage:
coca [command]
Available Commands:
analysis analysis package
api scan api
bs bad smell analysis
call call graph api
cloc cloc [FILE or DIRECTORY]
concept concept api
count count code
evaluate evaluate refactor effort
git git analysis
help Help about any command
rcall reverse call
refactor auto refactor code
suggest simple holmes
todo scan todo
version print the version number of Coca
coca analysis
coca bs -s type
Examples Result:
{
"dataClass": [
{
"File": "examples/api/BookController.java",
"BS": "dataClass"
}
...
],
"lazyElement": [
{
"File": "examples/api/model/BookRepresentaion.java",
"BS": "lazyElement"
}
...
]
}
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
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
Examples Results:
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 |
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
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 |
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
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 |
+------------------+--------+
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 |
+------------+--------------------------------------------------------------------------+
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";
...
}
support:
- rename
- move
- remove unused import
- remove unused class
coca refactor -R rename.coca -p src/main
coca refactor -m move.config -p .
coca evaluate
custom [customKeyGenerator customCacheManager]
throw [throwUnchecked throwCheckedSync throwUncheckedSync throwChecked]
evict [evictWithException evictAllEarly evictAll evict evictEarly]
multi [multiCacheAndEvict multiCache multiUpdate multiEvict multiConditionalCacheAndEvict]
conditional [conditional conditionalUpdate conditionalSync]
unknown [unknownCustomCacheManager unknownCustomKeyGenerator]
throw [throwException throwCheckedException]
put [putWithException put]
early [earlyRemoveWithException earlyRemoveAllWithException earlyRemoveAll earlyPut earlyPutWithException earlyRemove]
evict [evictAll evictWithException evict evictEarly evictAllEarly]
coca todo
results:
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
| DATE | AUTHOR | MESSAGES | FILENAME | LINE |
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
| 2019-12-19 | Phodal Huang | 支持 interface 在同一个包内 | core/adapter/api/JavaApiListener.go | 200 |
| 2019-12-21 | Phodal Huang | 处理链试调用 | core/adapter/bs/BadSmellListener.go | 305 |
| 2019-12-18 | Phodal Huang | update this reflect | core/adapter/bs/BadSmellListener.go | 363 |
| 2019-12-15 | Phodal Huang | update for array | core/adapter/bs/BadSmellListener.go | 388 |
| 2019-12-24 | Phodal Huang | 支持依赖注入 | core/adapter/call/JavaCallListener.go | 108 |
| 2019-12-24 | Phodal Huang | add inner creator examples | core/adapter/call/JavaCallListener.go | 209 |
| 2019-12-24 | Phodal Huang | add inner creator examples | core/adapter/call/JavaCallListener.go | 215 |
| 2019-12-24 | Phodal Huang | | core/adapter/call/JavaCallListener.go | 270 |
| 2019-12-20 | Phodal Huang | 处理链试调用 | core/adapter/call/JavaCallListener.go | 324 |
+------------+--------------+--------------------------------+---------------------------------------------------+-------+
coca suggest
results:
+--------+---------+---------------------+
| CLASS | PATTERN | REASON |
+--------+---------+---------------------+
| Insect | factory | to many constructor |
| Bee | factory | to many constructor |
+--------+---------+---------------------+
Install Go
brew install go
Env
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
clone
git clone https://github.com/phodal/coca
Test Frameworks
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
@ 2019 A Phodal Huang's Idea. This code is distributed under the MPL license. See LICENSE
in this directory.