Filter enum synthetic methods for stub based classes

Fixed #KT-36095
This commit is contained in:
Igor Yakovlev
2020-03-26 23:36:31 +03:00
parent 172a45a637
commit 43468c6d55
3 changed files with 45 additions and 25 deletions
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.asJava
import com.intellij.psi.PsiMethod
import com.intellij.psi.SyntheticElement
import org.jetbrains.kotlin.resolve.DescriptorUtils
fun isSyntheticValuesOrValueOfMethod(method: PsiMethod): Boolean {
if (method !is SyntheticElement) return false
return DescriptorUtils.ENUM_VALUE_OF.asString() == method.name || DescriptorUtils.ENUM_VALUES.asString() == method.name
}
@@ -19,17 +19,15 @@ package org.jetbrains.kotlin.load.java.structure.impl
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiTypeParameter import com.intellij.psi.PsiTypeParameter
import com.intellij.psi.SyntheticElement
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.asJava.KtLightClassMarker
import org.jetbrains.kotlin.asJava.isSyntheticValuesOrValueOfMethod
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtPsiUtil
import org.jetbrains.kotlin.resolve.DescriptorUtils
class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass), VirtualFileBoundJavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl { class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass), VirtualFileBoundJavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl {
init { init {
@@ -80,7 +78,7 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass)
// Return type seems to be null for example for the 'clone' Groovy method generated by @AutoClone (see EA-73795) // Return type seems to be null for example for the 'clone' Groovy method generated by @AutoClone (see EA-73795)
return methods( return methods(
psi.methods.filter { method -> psi.methods.filter { method ->
!method.isConstructor && method.returnType != null && !isSyntheticValuesOrValueOfMethod(method) !method.isConstructor && method.returnType != null && !(isEnum && isSyntheticValuesOrValueOfMethod(method))
} }
).distinct() ).distinct()
} }
@@ -124,12 +122,6 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass)
override fun getAnnotationOwnerPsi() = psi.modifierList override fun getAnnotationOwnerPsi() = psi.modifierList
private fun isSyntheticValuesOrValueOfMethod(method: PsiMethod): Boolean {
if (!isEnum) return false
if (method !is SyntheticElement) return false
return DescriptorUtils.ENUM_VALUE_OF.asString() == method.name || DescriptorUtils.ENUM_VALUES.asString() == method.name
}
private fun assertNotLightClass() { private fun assertNotLightClass() {
val psiClass = psi val psiClass = psi
if (psiClass !is KtLightClassMarker) return if (psiClass !is KtLightClassMarker) return
@@ -1,34 +1,23 @@
/* /*
* Copyright 2010-2016 JetBrains s.r.o. * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
* 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.kotlin.asJava.builder; package org.jetbrains.kotlin.asJava.builder;
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.impl.compiled.ClsClassImpl; import com.intellij.psi.impl.compiled.ClsClassImpl;
import com.intellij.psi.impl.compiled.ClsEnumConstantImpl; import com.intellij.psi.impl.compiled.ClsEnumConstantImpl;
import com.intellij.psi.impl.compiled.ClsFieldImpl; import com.intellij.psi.impl.compiled.ClsFieldImpl;
import com.intellij.psi.impl.compiled.ClsRepositoryPsiElement;
import com.intellij.psi.impl.java.stubs.*; import com.intellij.psi.impl.java.stubs.*;
import com.intellij.psi.stubs.StubBase; import com.intellij.psi.stubs.StubBase;
import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static org.jetbrains.kotlin.asJava.SyntheticElementUtilsKt.isSyntheticValuesOrValueOfMethod;
public class ClsWrapperStubPsiFactory extends StubPsiFactory { public class ClsWrapperStubPsiFactory extends StubPsiFactory {
public static final Key<LightElementOrigin> ORIGIN = Key.create("ORIGIN"); public static final Key<LightElementOrigin> ORIGIN = Key.create("ORIGIN");
public static final ClsWrapperStubPsiFactory INSTANCE = new ClsWrapperStubPsiFactory(); public static final ClsWrapperStubPsiFactory INSTANCE = new ClsWrapperStubPsiFactory();
@@ -54,6 +43,30 @@ public class ClsWrapperStubPsiFactory extends StubPsiFactory {
public PsiClass getSourceMirrorClass() { public PsiClass getSourceMirrorClass() {
return null; return null;
} }
@NotNull
@Override
public PsiMethod[] getMethods() {
PsiMethod[] baseMethods = super.getMethods();
if (!isEnum()) return baseMethods;
int filteredArraySize = 0;
for (PsiMethod method : baseMethods) {
if (!isSyntheticValuesOrValueOfMethod(method)) filteredArraySize++;
}
if (filteredArraySize == baseMethods.length) return baseMethods;
PsiMethod[] filteredMethods = new PsiMethod[filteredArraySize];
int index = 0;
for (PsiMethod method : baseMethods) {
if (!isSyntheticValuesOrValueOfMethod(method)) {
filteredMethods[index] = method;
index++;
}
}
return filteredMethods;
}
}; };
} }