├── .editorconfig ├── .github └── workflows │ └── gradle-build.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── kotlinrminer-cli ├── build.gradle.kts └── src │ ├── main │ └── java │ │ └── org │ │ └── jetbrains │ │ └── research │ │ └── kotlinrminer │ │ └── cli │ │ ├── CodeRangeProvider.java │ │ ├── GitHistoryKotlinRMiner.java │ │ ├── GitService.java │ │ ├── KotlinRMiner.java │ │ ├── Refactoring.java │ │ ├── RefactoringHandler.java │ │ ├── RefactoringMinerTimedOutException.java │ │ ├── UMLModelPsiReaderCli.java │ │ ├── decomposition │ │ ├── AbstractCall.java │ │ ├── AbstractCodeFragment.java │ │ ├── AbstractCodeMapping.java │ │ ├── AbstractExpression.java │ │ ├── AbstractStatement.java │ │ ├── AnonymousClassDeclarationObject.java │ │ ├── CompositeStatementObject.java │ │ ├── CompositeStatementObjectMapping.java │ │ ├── CompositeType.java │ │ ├── FunctionType.java │ │ ├── LambdaExpressionObject.java │ │ ├── LeafMapping.java │ │ ├── LeafType.java │ │ ├── LocationInfo.java │ │ ├── LocationInfoProvider.java │ │ ├── ObjectCreation.java │ │ ├── OperationBody.java │ │ ├── OperationInvocation.java │ │ ├── StatementObject.java │ │ ├── TryStatementObject.java │ │ ├── TypeReplacementAnalysis.java │ │ ├── UMLOperationBodyMapper.java │ │ ├── UMLOperationBodyMapperComparator.java │ │ ├── Untyped.java │ │ ├── VariableDeclaration.java │ │ ├── VariableDeclarationProvider.java │ │ ├── VariableReferenceExtractor.java │ │ ├── VariableReplacementAnalysis.java │ │ ├── VariableScope.java │ │ ├── Visitor.java │ │ └── replacement │ │ │ ├── ClassInstanceCreationWithMethodInvocationReplacement.java │ │ │ ├── CompositeReplacement.java │ │ │ ├── MethodInvocationReplacement.java │ │ │ ├── MethodInvocationWithClassInstanceCreationReplacement.java │ │ │ ├── ObjectCreationReplacement.java │ │ │ ├── VariableDeclarationReplacement.java │ │ │ └── VariableReplacementWithMethodInvocation.java │ │ ├── diff │ │ ├── CallTree.java │ │ ├── CallTreeNode.java │ │ ├── ClassMoveComparator.java │ │ ├── ClassRenameComparator.java │ │ ├── CodeRange.java │ │ ├── ExtractOperationDetection.java │ │ ├── InlineOperationDetection.java │ │ ├── MovedClassToAnotherSourceFolder.java │ │ ├── RenamePattern.java │ │ ├── UMLAnnotationDiff.java │ │ ├── UMLAnnotationListDiff.java │ │ ├── UMLAttributeDiff.java │ │ ├── UMLClassBaseDiff.java │ │ ├── UMLClassDiff.java │ │ ├── UMLClassMoveDiff.java │ │ ├── UMLClassRenameDiff.java │ │ ├── UMLFileDiff.java │ │ ├── UMLGeneralizationDiff.java │ │ ├── UMLModelDiff.java │ │ ├── UMLOperationDiff.java │ │ ├── UMLParameterDiff.java │ │ └── refactoring │ │ │ ├── AddMethodAnnotationRefactoring.java │ │ │ ├── AddParameterRefactoring.java │ │ │ ├── CandidateAttributeRefactoring.java │ │ │ ├── CandidateExtractClassRefactoring.java │ │ │ ├── CandidateMergeVariableRefactoring.java │ │ │ ├── CandidateSplitVariableRefactoring.java │ │ │ ├── ChangeAttributeTypeRefactoring.java │ │ │ ├── ChangeVariableTypeRefactoring.java │ │ │ ├── ExtractAttributeRefactoring.java │ │ │ ├── ExtractClassRefactoring.java │ │ │ ├── ExtractOperationRefactoring.java │ │ │ ├── ExtractSuperClassRefactoring.java │ │ │ ├── ExtractVariableRefactoring.java │ │ │ ├── InlineOperationRefactoring.java │ │ │ ├── InlineVariableRefactoring.java │ │ │ ├── MergeVariableRefactoring.java │ │ │ ├── ModifyMethodAnnotationRefactoring.java │ │ │ ├── MoveAndRenameClassRefactoring.java │ │ │ ├── MoveAttributeRefactoring.java │ │ │ ├── MoveClassRefactoring.java │ │ │ ├── MoveOperationRefactoring.java │ │ │ ├── MoveSourceFolderRefactoring.java │ │ │ ├── PullUpAttributeRefactoring.java │ │ │ ├── PullUpOperationRefactoring.java │ │ │ ├── PushDownAttributeRefactoring.java │ │ │ ├── PushDownOperationRefactoring.java │ │ │ ├── RemoveMethodAnnotationRefactoring.java │ │ │ ├── RemoveParameterRefactoring.java │ │ │ ├── RenameAttributeRefactoring.java │ │ │ ├── RenameClassRefactoring.java │ │ │ ├── RenameOperationRefactoring.java │ │ │ ├── RenamePackageRefactoring.java │ │ │ ├── RenameVariableRefactoring.java │ │ │ ├── ReorderParameterRefactoring.java │ │ │ └── SplitVariableRefactoring.java │ │ ├── uml │ │ ├── UMLAbstractClass.java │ │ ├── UMLAnnotation.java │ │ ├── UMLAttribute.java │ │ ├── UMLClass.java │ │ ├── UMLClassMatcher.java │ │ ├── UMLCompanionObject.java │ │ ├── UMLFile.java │ │ ├── UMLGeneralization.java │ │ ├── UMLJavadoc.java │ │ ├── UMLModel.java │ │ ├── UMLObject.java │ │ ├── UMLOperation.java │ │ ├── UMLParameter.java │ │ ├── UMLRealization.java │ │ ├── UMLTagElement.java │ │ ├── UMLType.java │ │ └── UMLTypeParameter.java │ │ └── util │ │ ├── EnvironmentManager.java │ │ ├── JsonUtil.java │ │ ├── KotlinLightVirtualFile.java │ │ └── ReplacementUtil.java │ └── test │ ├── java │ └── TestAllRefactorings.java │ └── resources │ └── data.json ├── kotlinrminer-common ├── build.gradle └── src │ └── main │ └── java │ └── org │ └── jetbrains │ └── research │ └── kotlinrminer │ └── common │ ├── RefactoringType.java │ ├── decomposition │ └── CodeElementType.java │ ├── replacement │ ├── AddVariableReplacement.java │ ├── ConsistentReplacementDetector.java │ ├── IntersectionReplacement.java │ ├── MergeVariableReplacement.java │ ├── Replacement.java │ └── SplitVariableReplacement.java │ └── util │ ├── PrefixSuffixUtils.java │ └── StringDistance.java ├── kotlinrminer-ide ├── build.gradle ├── gradle.properties └── src │ └── main │ └── java │ └── org │ └── jetbrains │ └── research │ └── kotlinrminer │ └── ide │ ├── CodeRangeProvider.java │ ├── KotlinRMiner.kt │ ├── Refactoring.java │ ├── RefactoringMinerTimedOutException.java │ ├── UMLModelPsiReader.java │ ├── decomposition │ ├── AbstractCall.java │ ├── AbstractCodeFragment.java │ ├── AbstractCodeMapping.java │ ├── AbstractExpression.java │ ├── AbstractStatement.java │ ├── AnonymousClassDeclarationObject.java │ ├── CompositeStatementObject.java │ ├── CompositeStatementObjectMapping.java │ ├── CompositeType.java │ ├── FunctionType.java │ ├── LambdaExpressionObject.java │ ├── LeafMapping.java │ ├── LeafType.java │ ├── LocationInfo.java │ ├── LocationInfoProvider.java │ ├── ObjectCreation.java │ ├── OperationBody.java │ ├── OperationInvocation.java │ ├── StatementObject.java │ ├── TryStatementObject.java │ ├── TypeReplacementAnalysis.java │ ├── UMLOperationBodyMapper.java │ ├── UMLOperationBodyMapperComparator.java │ ├── Untyped.java │ ├── VariableDeclaration.java │ ├── VariableDeclarationProvider.java │ ├── VariableReferenceExtractor.java │ ├── VariableReplacementAnalysis.java │ ├── VariableScope.java │ ├── Visitor.java │ └── replacement │ │ ├── ClassInstanceCreationWithMethodInvocationReplacement.java │ │ ├── CompositeReplacement.java │ │ ├── MethodInvocationReplacement.java │ │ ├── MethodInvocationWithClassInstanceCreationReplacement.java │ │ ├── ObjectCreationReplacement.java │ │ ├── VariableDeclarationReplacement.java │ │ └── VariableReplacementWithMethodInvocation.java │ ├── diff │ ├── CallTree.java │ ├── CallTreeNode.java │ ├── ClassMoveComparator.java │ ├── ClassRenameComparator.java │ ├── CodeRange.java │ ├── ExtractOperationDetection.java │ ├── InlineOperationDetection.java │ ├── MovedClassToAnotherSourceFolder.java │ ├── RenamePattern.java │ ├── UMLAnnotationDiff.java │ ├── UMLAnnotationListDiff.java │ ├── UMLAttributeDiff.java │ ├── UMLClassBaseDiff.java │ ├── UMLClassDiff.java │ ├── UMLClassMoveDiff.java │ ├── UMLClassRenameDiff.java │ ├── UMLFileDiff.java │ ├── UMLGeneralizationDiff.java │ ├── UMLModelDiff.java │ ├── UMLOperationDiff.java │ ├── UMLParameterDiff.java │ └── refactoring │ │ ├── AddMethodAnnotationRefactoring.java │ │ ├── AddParameterRefactoring.java │ │ ├── CandidateAttributeRefactoring.java │ │ ├── CandidateExtractClassRefactoring.java │ │ ├── CandidateMergeVariableRefactoring.java │ │ ├── CandidateSplitVariableRefactoring.java │ │ ├── ChangeAttributeTypeRefactoring.java │ │ ├── ChangeVariableTypeRefactoring.java │ │ ├── ExtractAttributeRefactoring.java │ │ ├── ExtractClassRefactoring.java │ │ ├── ExtractOperationRefactoring.java │ │ ├── ExtractSuperClassRefactoring.java │ │ ├── ExtractVariableRefactoring.java │ │ ├── InlineOperationRefactoring.java │ │ ├── InlineVariableRefactoring.java │ │ ├── MergeVariableRefactoring.java │ │ ├── ModifyMethodAnnotationRefactoring.java │ │ ├── MoveAndRenameClassRefactoring.java │ │ ├── MoveAttributeRefactoring.java │ │ ├── MoveClassRefactoring.java │ │ ├── MoveOperationRefactoring.java │ │ ├── MoveSourceFolderRefactoring.java │ │ ├── PullUpAttributeRefactoring.java │ │ ├── PullUpOperationRefactoring.java │ │ ├── PushDownAttributeRefactoring.java │ │ ├── PushDownOperationRefactoring.java │ │ ├── RemoveMethodAnnotationRefactoring.java │ │ ├── RemoveParameterRefactoring.java │ │ ├── RenameAttributeRefactoring.java │ │ ├── RenameClassRefactoring.java │ │ ├── RenameOperationRefactoring.java │ │ ├── RenamePackageRefactoring.java │ │ ├── RenameVariableRefactoring.java │ │ ├── ReorderParameterRefactoring.java │ │ └── SplitVariableRefactoring.java │ ├── uml │ ├── UMLAbstractClass.java │ ├── UMLAnnotation.java │ ├── UMLAttribute.java │ ├── UMLClass.java │ ├── UMLClassMatcher.java │ ├── UMLCompanionObject.java │ ├── UMLFile.java │ ├── UMLGeneralization.java │ ├── UMLJavadoc.java │ ├── UMLModel.java │ ├── UMLObject.java │ ├── UMLOperation.java │ ├── UMLParameter.java │ ├── UMLRealization.java │ ├── UMLTagElement.java │ ├── UMLType.java │ └── UMLTypeParameter.java │ └── util │ ├── PsiUtils.java │ └── ReplacementUtil.java └── settings.gradle /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = false 9 | max_line_length = 120 10 | tab_width = 4 11 | ij_java_class_count_to_use_import_on_demand = 100 12 | ij_java_names_count_to_use_import_on_demand = 100 13 | 14 | [*.yml] 15 | indent_size = 2 -------------------------------------------------------------------------------- /.github/workflows/gradle-build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | strategy: 13 | matrix: 14 | java_version: [ '17' ] 15 | 16 | name: Run tests with Java ${{matrix.java_version}} 17 | runs-on: ubuntu-latest 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | - name: Set up JDK for Java ${{matrix.java_version}} 22 | uses: actions/setup-java@v3 23 | with: 24 | java-version: ${{matrix.java_version}} 25 | distribution: liberica 26 | cache: gradle 27 | - name: Build with Gradle 28 | run: ./gradlew build -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .gradle 3 | build 4 | *tmp/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Nikolaos Tsantalis 4 | Copyright (c) 2020 JetBrains N.V. 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kotlinRMiner 2 | [![JB Research](https://jb.gg/badges/research-flat-square.svg)](https://research.jetbrains.org/) 3 | [![Build](https://github.com/JetBrains-Research/kotlinRMiner/actions/workflows/gradle-build.yml/badge.svg?branch=master)](https://github.com/JetBrains-Research/kotlinRMiner/actions/workflows/gradle-build.yml) 4 | 5 | A library that detects performed refactorings in changes in Kotlin code. 6 | 7 | ## About 8 | The library is based on [RefactoringMiner](https://github.com/tsantalis/RefactoringMiner), a tool that detects performed refactorings in code changes written in Java. 9 | The tool analyzes commit history of a Git project, parses code changes in each commit, uses detection rules and heuristics to detect performed refactorings, and returns a list of detected refactorings in each commit with a description. 10 | 11 | Currently, kotlinRMiner supports the detection of the following refactorings: 12 | 1. Move Class 13 | 2. Rename Class 14 | 3. Rename Method 15 | 4. Add Parameter 16 | 5. Remove Parameter 17 | 6. Reorder Parameter 18 | 7. Move Method 19 | 8. Move And Rename Class 20 | 9. Move And Rename Method 21 | 10. Extract Method 22 | 11. Inline Method 23 | 12. Pull Up Method 24 | 13. Push Down Method 25 | 14. Extract Superclass 26 | 15. Extract Class 27 | 16. Extract Interface 28 | 17. Extract And Move Method 29 | 18. Move And Inline Method 30 | 19. Change Attribute Type 31 | 20. Change Variable Type 32 | 21. Change Parameter Type 33 | 22. Move Attribute 34 | 23. Pull Up Attribute 35 | 24. Push Down Attribute 36 | 25. Rename Attribute 37 | 26. Rename Variable 38 | 27. Inline Variable 39 | 28. Extract variable 40 | 41 | ## Usage 42 | #### As a dependency: 43 | kotlinRMiner is published in [JitPack](https://jitpack.io/), you can add the dependency to your dependencies list: 44 | 45 | ```implementation 'com.github.JetBrains-Research:kotlinRMiner:v1.2'``` 46 | 47 | #### As CLI: 48 | 1. Clone the repository 49 | 50 | ```git clone https://github.com/JetBrains-Research/kotlinRMiner.git``` 51 | 52 | 2. Run ```./gradlew jar``` in the project directory 53 | 54 | 3. Now you can use a library as CLI 55 | 56 | ```cd kotlinrminer-cli/build/libs``` 57 | 58 | ```java -jar kotlinRMiner-cli-1.0.jar