J2K: adding type arguments where they are needed and removing them where they are redundant

This commit is contained in:
Valentin Kipyatkov
2014-07-15 20:43:38 +04:00
parent f836278acc
commit 957ffb0313
31 changed files with 213 additions and 95 deletions
@@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.j2k.Converter;
import org.jetbrains.jet.j2k.ConverterSettings;
import org.jetbrains.jet.j2k.FilesConversionScope;
import org.jetbrains.jet.plugin.j2k.J2kPostProcessor;
import java.util.List;
@@ -52,7 +53,10 @@ public class JavaToKotlinAction extends AnAction {
return;
}
final Converter converter = Converter.object$.create(project, ConverterSettings.defaultSettings, new FilesConversionScope(selectedJavaFiles));
final Converter converter = Converter.object$.create(project,
ConverterSettings.defaultSettings,
new FilesConversionScope(selectedJavaFiles),
J2kPostProcessor.instance$);
CommandProcessor.getInstance().executeCommand(
project,
new Runnable() {
@@ -32,7 +32,7 @@ import org.jetbrains.jet.plugin.editor.JetEditorOptions
import java.awt.datatransfer.Transferable
import com.intellij.openapi.util.TextRange
import com.intellij.psi.codeStyle.CodeStyleManager
import com.intellij.codeInsight.editorActions.ReferenceTransferableData
import org.jetbrains.jet.plugin.j2k.J2kPostProcessor;
public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBlockTransferableData>() {
@@ -85,7 +85,10 @@ public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBl
}
private fun convertCopiedCodeToKotlin(code: CopiedCode, file: PsiJavaFile): String {
val converter = Converter.create(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)))
val converter = Converter.create(file.getProject(),
ConverterSettings.defaultSettings,
FilesConversionScope(listOf(file)),
J2kPostProcessor)
val startOffsets = code.getStartOffsets()
val endOffsets = code.getEndOffsets()
assert(startOffsets.size == endOffsets.size) { "Must have the same size" }
@@ -84,14 +84,9 @@ public class RemoveExplicitTypeArguments : JetSelfTargetingIntention<JetTypeArgu
return args == newArgs
}
class CallWithoutTypeArgs(call: Call) : DelegatingCall(call) {
override fun getTypeArguments(): MutableList<JetTypeProjection> {
return ArrayList<JetTypeProjection>()
}
private class CallWithoutTypeArgs(call: Call) : DelegatingCall(call) {
override fun getTypeArguments(): List<JetTypeProjection> = listOf()
override fun getTypeArgumentList() = null
}
override fun applyTo(element: JetTypeArgumentList, editor: Editor) {
@@ -0,0 +1,48 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.plugin.j2k
import org.jetbrains.jet.j2k.PostProcessor
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.plugin.intentions.RemoveExplicitTypeArguments
import org.jetbrains.jet.plugin.caches.resolve.getAnalysisResults
import java.util.ArrayList
public object J2kPostProcessor : PostProcessor {
override fun analyzeFile(file: JetFile): BindingContext {
return file.getAnalysisResults().getBindingContext()
}
override fun doAdditionalProcessing(file: JetFile) {
val redundantTypeArgs = ArrayList<JetTypeArgumentList>()
file.accept(object : JetTreeVisitorVoid(){
override fun visitTypeArgumentList(typeArgumentList: JetTypeArgumentList) {
if (RemoveExplicitTypeArguments().isApplicableTo(typeArgumentList)) {
redundantTypeArgs.add(typeArgumentList)
return
}
super.visitTypeArgumentList(typeArgumentList)
}
})
for (typeArgs in redundantTypeArgs) {
typeArgs.delete()
}
}
}