Implement "Safe Delete" refactoring for type parameters
Conflicts: idea/src/org/jetbrains/jet/plugin/refactoring/safeDelete/KotlinSafeDeleteProcessor.java Conflicts: generators/org/jetbrains/jet/generators/tests/GenerateTests.java Conflicts: generators/org/jetbrains/jet/generators/tests/GenerateTests.java
This commit is contained in:
@@ -911,6 +911,35 @@ public class JetPsiUtil {
|
|||||||
return (names.size() > partIndex) ? names.get(partIndex) : header.getLastPartExpression();
|
return (names.size() > partIndex) ? names.get(partIndex) : header.getLastPartExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete given element and all the elements separating it from the neighboring elements of the same class
|
||||||
|
public static void deleteElementWithDelimiters(@NotNull PsiElement element) {
|
||||||
|
PsiElement paramBefore = PsiTreeUtil.getPrevSiblingOfType(element, element.getClass());
|
||||||
|
|
||||||
|
PsiElement from;
|
||||||
|
PsiElement to;
|
||||||
|
if (paramBefore != null) {
|
||||||
|
from = paramBefore.getNextSibling();
|
||||||
|
to = element;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PsiElement paramAfter = PsiTreeUtil.getNextSiblingOfType(element, element.getClass());
|
||||||
|
|
||||||
|
from = element;
|
||||||
|
to = paramAfter != null ? paramAfter.getPrevSibling() : element;
|
||||||
|
}
|
||||||
|
|
||||||
|
PsiElement parent = element.getParent();
|
||||||
|
|
||||||
|
parent.deleteChildRange(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete element if it doesn't contain children of a given type
|
||||||
|
public static <T extends PsiElement> void deleteChildlessElement(PsiElement element, Class<T> childClass) {
|
||||||
|
if (PsiTreeUtil.getChildrenOfType(element, childClass) == null) {
|
||||||
|
element.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static PsiElement ascendIfPropertyAccessor(PsiElement element) {
|
public static PsiElement ascendIfPropertyAccessor(PsiElement element) {
|
||||||
if (element instanceof JetPropertyAccessor) {
|
if (element instanceof JetPropertyAccessor) {
|
||||||
return element.getParent();
|
return element.getParent();
|
||||||
|
|||||||
+2
-2
@@ -36,13 +36,13 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
public void testAllFilesPresentInBoxWithStdlib() throws Exception {
|
public void testAllFilesPresentInBoxWithStdlib() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/boxWithStdlib/annotations")
|
@TestMetadata("compiler/testData/codegen/boxWithStdlib/annotations")
|
||||||
public static class Annotations extends AbstractBlackBoxCodegenTest {
|
public static class Annotations extends AbstractBlackBoxCodegenTest {
|
||||||
public void testAllFilesPresentInAnnotations() throws Exception {
|
public void testAllFilesPresentInAnnotations() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib/annotations"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/boxWithStdlib/annotations"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("defaultParameterValues.kt")
|
@TestMetadata("defaultParameterValues.kt")
|
||||||
public void testDefaultParameterValues() throws Exception {
|
public void testDefaultParameterValues() throws Exception {
|
||||||
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
|
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ public class JetElementDescriptionProvider implements ElementDescriptionProvider
|
|||||||
@Override
|
@Override
|
||||||
public String getElementDescription(@NotNull PsiElement element, @NotNull ElementDescriptionLocation location) {
|
public String getElementDescription(@NotNull PsiElement element, @NotNull ElementDescriptionLocation location) {
|
||||||
if (location instanceof UsageViewLongNameLocation) {
|
if (location instanceof UsageViewLongNameLocation) {
|
||||||
if (element instanceof PsiNamedElement && element instanceof JetElement) {
|
if (element instanceof PsiNamedElement && element instanceof JetElement) {
|
||||||
return ((PsiNamedElement)element).getName();
|
return ((PsiNamedElement) element).getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (location instanceof RefactoringDescriptionLocation) {
|
else if (location instanceof RefactoringDescriptionLocation) {
|
||||||
if (element instanceof JetClass) {
|
if (element instanceof JetClass) {
|
||||||
@@ -39,16 +39,16 @@ public class JetElementDescriptionProvider implements ElementDescriptionProvider
|
|||||||
return (jetClass.isTrait() ? "Trait " : "Class ") + jetClass.getName();
|
return (jetClass.isTrait() ? "Trait " : "Class ") + jetClass.getName();
|
||||||
}
|
}
|
||||||
if (element instanceof JetObjectDeclaration || element instanceof JetObjectDeclarationName) {
|
if (element instanceof JetObjectDeclaration || element instanceof JetObjectDeclarationName) {
|
||||||
return "Object " + ((PsiNamedElement)element).getName();
|
return "Object " + ((PsiNamedElement) element).getName();
|
||||||
}
|
}
|
||||||
if (element instanceof JetNamedFunction) {
|
if (element instanceof JetNamedFunction) {
|
||||||
return "Function " + ((PsiNamedElement)element).getName();
|
return "Function " + ((PsiNamedElement) element).getName();
|
||||||
}
|
}
|
||||||
if (element instanceof JetProperty) {
|
if (element instanceof JetProperty) {
|
||||||
return "Property " + ((PsiNamedElement)element).getName();
|
return "Property " + ((PsiNamedElement) element).getName();
|
||||||
}
|
}
|
||||||
if (element instanceof JetTypeParameter) {
|
if (element instanceof JetTypeParameter) {
|
||||||
return "Type parameter " + ((PsiNamedElement)element).getName();
|
return "Type parameter " + ((PsiNamedElement) element).getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
+110
-1
@@ -31,6 +31,7 @@ import com.intellij.refactoring.safeDelete.JavaSafeDeleteProcessor;
|
|||||||
import com.intellij.refactoring.safeDelete.NonCodeUsageSearchInfo;
|
import com.intellij.refactoring.safeDelete.NonCodeUsageSearchInfo;
|
||||||
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteOverrideAnnotation;
|
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteOverrideAnnotation;
|
||||||
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteOverridingMethodUsageInfo;
|
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteOverridingMethodUsageInfo;
|
||||||
|
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceJavaDeleteUsageInfo;
|
||||||
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceSimpleDeleteUsageInfo;
|
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceSimpleDeleteUsageInfo;
|
||||||
import com.intellij.usageView.UsageInfo;
|
import com.intellij.usageView.UsageInfo;
|
||||||
import com.intellij.util.*;
|
import com.intellij.util.*;
|
||||||
@@ -56,7 +57,8 @@ public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
|||||||
|| element instanceof JetObjectDeclarationName
|
|| element instanceof JetObjectDeclarationName
|
||||||
|| element instanceof JetNamedFunction
|
|| element instanceof JetNamedFunction
|
||||||
|| element instanceof PsiMethod
|
|| element instanceof PsiMethod
|
||||||
|| element instanceof JetProperty;
|
|| element instanceof JetProperty
|
||||||
|
|| element instanceof JetTypeParameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -108,6 +110,9 @@ public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
|||||||
}
|
}
|
||||||
return findPropertyUsages(property, allElementsToDelete, result);
|
return findPropertyUsages(property, allElementsToDelete, result);
|
||||||
}
|
}
|
||||||
|
if (element instanceof JetTypeParameter) {
|
||||||
|
return findTypeParameterUsages((JetTypeParameter) element, allElementsToDelete, result);
|
||||||
|
}
|
||||||
return getSearchInfo(element, allElementsToDelete);
|
return getSearchInfo(element, allElementsToDelete);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,6 +314,101 @@ public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
|||||||
return getSearchInfo(property, allElementsToDelete);
|
return getSearchInfo(property, allElementsToDelete);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static NonCodeUsageSearchInfo findTypeParameterUsages(
|
||||||
|
final JetTypeParameter parameter,
|
||||||
|
final PsiElement[] allElementsToDelete,
|
||||||
|
final List<UsageInfo> result
|
||||||
|
) {
|
||||||
|
NonCodeUsageSearchInfo searchInfo = getSearchInfo(parameter, allElementsToDelete);
|
||||||
|
|
||||||
|
ReferencesSearch.search(parameter).forEach(new Processor<PsiReference>() {
|
||||||
|
@Override
|
||||||
|
public boolean process(PsiReference reference) {
|
||||||
|
PsiElement element = reference.getElement();
|
||||||
|
|
||||||
|
if (!isInside(element, allElementsToDelete)) {
|
||||||
|
result.add(new SafeDeleteReferenceSimpleDeleteUsageInfo(element, parameter, false));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
JetTypeParameterListOwner owner = PsiTreeUtil.getParentOfType(parameter, JetTypeParameterListOwner.class);
|
||||||
|
if (owner == null) return searchInfo;
|
||||||
|
|
||||||
|
List<JetTypeParameter> parameterList = owner.getTypeParameters();
|
||||||
|
final int parameterCount = parameterList.size();
|
||||||
|
final int parameterIndex = parameterList.indexOf(parameter);
|
||||||
|
|
||||||
|
ReferencesSearch.search(owner).forEach(
|
||||||
|
new Processor<PsiReference>() {
|
||||||
|
@Override
|
||||||
|
public boolean process(PsiReference reference) {
|
||||||
|
if (reference instanceof PsiJavaCodeReferenceElement) {
|
||||||
|
processJavaTypeArgumentListCandidate(
|
||||||
|
(PsiJavaCodeReferenceElement) reference, parameterIndex, parameterCount, result, parameter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
processKotlinTypeArgumentListCandidate(reference, parameterIndex, result, parameter);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return searchInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processJavaTypeArgumentListCandidate(
|
||||||
|
PsiJavaCodeReferenceElement reference,
|
||||||
|
int parameterIndex,
|
||||||
|
int parameterCount,
|
||||||
|
List<UsageInfo> result,
|
||||||
|
PsiElement parameter
|
||||||
|
) {
|
||||||
|
PsiReferenceParameterList parameterList = reference.getParameterList();
|
||||||
|
if (parameterList != null) {
|
||||||
|
PsiTypeElement[] typeArgs = parameterList.getTypeParameterElements();
|
||||||
|
if (typeArgs.length > parameterIndex) {
|
||||||
|
if (typeArgs.length == 1 && parameterCount > 1
|
||||||
|
&& typeArgs[0].getType() instanceof PsiDiamondType) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
result.add(new SafeDeleteReferenceJavaDeleteUsageInfo(typeArgs[parameterIndex], parameter, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processKotlinTypeArgumentListCandidate(
|
||||||
|
PsiReference reference,
|
||||||
|
int parameterIndex,
|
||||||
|
List<UsageInfo> result,
|
||||||
|
JetTypeParameter parameter
|
||||||
|
) {
|
||||||
|
PsiElement referencedElement = reference.getElement();
|
||||||
|
|
||||||
|
JetTypeArgumentList argList = null;
|
||||||
|
|
||||||
|
JetUserType type = PsiTreeUtil.getParentOfType(referencedElement, JetUserType.class);
|
||||||
|
if (type != null) {
|
||||||
|
argList = type.getTypeArgumentList();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
JetCallExpression callExpression = PsiTreeUtil.getParentOfType(referencedElement, JetCallExpression.class);
|
||||||
|
if (callExpression != null) {
|
||||||
|
argList = callExpression.getTypeArgumentList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argList != null) {
|
||||||
|
List<JetTypeProjection> projections = argList.getArguments();
|
||||||
|
if (parameterIndex < projections.size()) {
|
||||||
|
result.add(new SafeDeleteTypeArgumentListUsageInfo(projections.get(parameterIndex), parameter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mostly copied from JavaSafeDeleteProcessor.validateOverridingMethods
|
* Mostly copied from JavaSafeDeleteProcessor.validateOverridingMethods
|
||||||
* Revision: d4fc033
|
* Revision: d4fc033
|
||||||
@@ -561,6 +661,15 @@ public class KotlinSafeDeleteProcessor extends JavaSafeDeleteProcessor {
|
|||||||
cleanUpOverrides(setter);
|
cleanUpOverrides(setter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (element instanceof JetTypeParameter) {
|
||||||
|
deleteElementAndCleanParent(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteElementAndCleanParent(PsiElement element) {
|
||||||
|
PsiElement parent = element.getParent();
|
||||||
|
JetPsiUtil.deleteElementWithDelimiters(element);
|
||||||
|
JetPsiUtil.deleteChildlessElement(parent, element.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean checkPsiMethodEquality(PsiMethod method1, PsiMethod method2) {
|
private static boolean checkPsiMethodEquality(PsiMethod method1, PsiMethod method2) {
|
||||||
|
|||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 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.refactoring.safeDelete;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteReferenceSimpleDeleteUsageInfo;
|
||||||
|
import com.intellij.util.IncorrectOperationException;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
|
|
||||||
|
public class SafeDeleteTypeArgumentListUsageInfo extends SafeDeleteReferenceSimpleDeleteUsageInfo {
|
||||||
|
public SafeDeleteTypeArgumentListUsageInfo(@NotNull JetTypeProjection typeProjection, @NotNull JetTypeParameter parameter) {
|
||||||
|
super(typeProjection, parameter, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteElement() throws IncorrectOperationException {
|
||||||
|
PsiElement element = getElement();
|
||||||
|
if (element != null) {
|
||||||
|
KotlinSafeDeleteProcessor.deleteElementAndCleanParent(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class A<<caret>X, Y, Z> {
|
||||||
|
fun foo(x: X) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y>(x: X, y: Y) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Int>("123", 123)
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter Y has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class A<<caret>X, Y: X, Z> {
|
||||||
|
fun foo(x: X) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 2 usages that are not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
class A<<caret>X, Y, Z> where Y: X {
|
||||||
|
}
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<<caret>X> {
|
||||||
|
fun foo<Y, Z>() where Y: X {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<Number>) {
|
||||||
|
a.foo<Int, String>()
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class A<out <caret>X: Comparable<X>, in Y: Number, Z>
|
||||||
|
|
||||||
|
val a = A<String, Int, Any>()
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class A<in Y: Number, Z>
|
||||||
|
|
||||||
|
val a = A<Int, Any>()
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class A<out X: Comparable<X>, in <caret>Y: Number, Z>
|
||||||
|
|
||||||
|
val a = A<String, Int, Any>()
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class A<out X: Comparable<X>, Z>
|
||||||
|
|
||||||
|
val a = A<String, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
open class A<<caret>X, Y, Z>
|
||||||
|
|
||||||
|
class B<T, U>: A<T, String, U>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
open class A<Y, Z>
|
||||||
|
|
||||||
|
class B<T, U>: A<String, U>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
open class A<<caret>X, Y, Z>
|
||||||
|
|
||||||
|
class B<T, U>: A<String, T, U>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
open class A<Y, Z>
|
||||||
|
|
||||||
|
class B<T, U>: A<T, U>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<<caret>X, Y, Z>
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<Y, Z>
|
||||||
|
|
||||||
|
val a = A<String, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<X, <caret>Y, Z>
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<X, Z>
|
||||||
|
|
||||||
|
val a = A<Int, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<X, Y, <caret>Z>
|
||||||
|
|
||||||
|
val a = A<Int, String, Any>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<X, Y>
|
||||||
|
|
||||||
|
val a = A<Int, String>()
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y, Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Int, Any>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Any>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Y, <caret>Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Int, Any>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Y>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Int>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A<<caret>X>
|
||||||
|
|
||||||
|
val a = A<Int>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A
|
||||||
|
|
||||||
|
val a = A()
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo<Int>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(a: A<String>) {
|
||||||
|
a.foo()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<<caret>X, Y, Z> {
|
||||||
|
fun foo(x: X) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Int>foo("123", 123)
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y>(x: X, y: Y) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter Y has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<<caret>X, Y: X, Z> {
|
||||||
|
fun foo(x: X) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 2 usages that are not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
class A<<caret>X, Y, Z> where Y: X {
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<Number> a) {
|
||||||
|
a.<Int, String>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<<caret>X> {
|
||||||
|
fun foo<Y, Z>() where Y: X {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
Type parameter X has 1 usage that is not safe to delete.
|
||||||
|
Of those 0 usages are in strings, comments, or non-code files.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A a = new A()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A a = new A()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class A<<caret>X, Y, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<Y, Z>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<String, Int, Object> a = new A<String, Int, Object>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, Object> a = new A<Int, Object>()
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<out <caret>X: Comparable<X>, in Y: Number, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<in Y: Number, Z>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<String, Int, Object> a = new A<String, Int, Object>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<String, Object> a = new A<String, Object>()
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<out X: Comparable<X>, in <caret>Y: Number, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<out X: Comparable<X>, Z>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B<T, U> extends A<T, String, U> {
|
||||||
|
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B<T, U> extends A<String, U> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
open class A<<caret>X, Y, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
open class A<Y, Z>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B<T, U> extends A<String, T, U> {
|
||||||
|
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B<T, U> extends A<T, U> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
open class A<<caret>X, Y, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
open class A<Y, Z>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<String, Object> a = new A<String, Object>()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class A<<caret>X, Y, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<Y, Z>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, Object> a = new A<Int, Object>()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class A<X, <caret>Y, Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<X, Z>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String, Object> a = new A<Int, String, Object>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int, String> a = new A<Int, String>()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class A<X, Y, <caret>Z>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A<X, Y>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Int, Object>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Object>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y, Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Int, Object>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Int>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Y, <caret>Z>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<Y>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A<Int> a = new A<Int>()
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class B {
|
||||||
|
A a = new A()
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class A<<caret>X>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.<Int>foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class B {
|
||||||
|
void bar(A<String> a) {
|
||||||
|
a.foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo<<caret>Y>() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class A<X> {
|
||||||
|
fun foo() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user