diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassFinderImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassFinderImpl.java index bf099ac34c8..6f0f27f98fe 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassFinderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassFinderImpl.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; +import org.jetbrains.jet.lang.resolve.java.structure.JavaClassImpl; import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; import org.jetbrains.jet.lang.resolve.java.structure.JavaPackageImpl; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -39,7 +40,7 @@ public class JavaClassFinderImpl implements JavaClassFinder { @Override public JavaClass findClass(@NotNull FqName fqName) { PsiClass psiClass = psiClassFinder.findPsiClass(fqName); - return psiClass == null ? null : new JavaClass(psiClass); + return psiClass == null ? null : new JavaClassImpl(psiClass); } @Nullable diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaResolverPsiUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaResolverPsiUtils.java index 72829c8ea76..57329000b9a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaResolverPsiUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaResolverPsiUtils.java @@ -18,18 +18,18 @@ package org.jetbrains.jet.lang.resolve.java; import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; +import org.jetbrains.jet.lang.resolve.java.structure.JavaClassImpl; public class JavaResolverPsiUtils { private JavaResolverPsiUtils() { } public static boolean isCompiledKotlinClass(@NotNull PsiClass psiClass) { - return DescriptorResolverUtils.isCompiledKotlinClass(new JavaClass(psiClass)); + return DescriptorResolverUtils.isCompiledKotlinClass(new JavaClassImpl(psiClass)); } public static boolean isCompiledKotlinPackageClass(@NotNull PsiClass psiClass) { - return DescriptorResolverUtils.isCompiledKotlinPackageClass(new JavaClass(psiClass)); + return DescriptorResolverUtils.isCompiledKotlinPackageClass(new JavaClassImpl(psiClass)); } public static boolean isCompiledKotlinClassOrPackageClass(@NotNull PsiClass psiClass) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClass.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClass.java index 501dcc13a8e..4ddc8c563da 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClass.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClass.java @@ -16,175 +16,69 @@ package org.jetbrains.jet.lang.resolve.java.structure; -import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiCompiledElement; -import com.intellij.psi.PsiTypeParameter; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.Modality; -import org.jetbrains.jet.lang.descriptors.Visibility; -import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker; import org.jetbrains.jet.lang.resolve.name.FqName; -import org.jetbrains.jet.lang.resolve.name.Name; import java.util.Collection; -import static org.jetbrains.jet.lang.resolve.java.structure.JavaElementCollectionFromPsiArrayUtil.*; +public interface JavaClass + extends JavaClassifier, JavaNamedElement, JavaTypeParameterListOwner, JavaModifierListOwner, JavaAnnotationOwner { + @NotNull + @Override + PsiClass getPsi(); -public class JavaClass extends JavaClassifierImpl - implements JavaNamedElement, JavaTypeParameterListOwner, JavaModifierListOwner, JavaAnnotationOwner { - public enum OriginKind { + @NotNull + Collection getInnerClasses(); + + @Nullable + FqName getFqName(); + + boolean isInterface(); + + boolean isAnnotationType(); + + boolean isEnum(); + + @NotNull + ClassKind getKind(); + + @Nullable + JavaClass getOuterClass(); + + @NotNull + Modality getModality(); + + @NotNull + Collection getSupertypes(); + + @NotNull + Collection getMethods(); + + @NotNull + Collection getAllMethods(); + + @NotNull + Collection getFields(); + + @NotNull + Collection getAllFields(); + + @NotNull + Collection getConstructors(); + + @NotNull + JavaClassifierType getDefaultType(); + + @NotNull + OriginKind getOriginKind(); + + enum OriginKind { COMPILED, SOURCE, KOTLIN_LIGHT_CLASS } - - public JavaClass(@NotNull PsiClass psiClass) { - super(psiClass); - assert !(psiClass instanceof PsiTypeParameter) - : "PsiTypeParameter should be wrapped in JavaTypeParameter, not JavaClass: use JavaClassifier.create()"; - } - - @NotNull - public Collection getInnerClasses() { - return classes(getPsi().getInnerClasses()); - } - - @Nullable - public FqName getFqName() { - String qualifiedName = getPsi().getQualifiedName(); - return qualifiedName == null ? null : new FqName(qualifiedName); - } - - @NotNull - @Override - public Name getName() { - return Name.identifier(getPsi().getName()); - } - - public boolean isInterface() { - return getPsi().isInterface(); - } - - public boolean isAnnotationType() { - return getPsi().isAnnotationType(); - } - - public boolean isEnum() { - return getPsi().isEnum(); - } - - @NotNull - public ClassKind getKind() { - if (isInterface()) { - return isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT; - } - return isEnum() ? ClassKind.ENUM_CLASS : ClassKind.CLASS; - } - - @Nullable - public JavaClass getOuterClass() { - PsiClass outer = getPsi().getContainingClass(); - return outer == null ? null : new JavaClass(outer); - } - - @NotNull - public Modality getModality() { - return isAnnotationType() ? Modality.FINAL : Modality.convertFromFlags(isAbstract() || isInterface(), !isFinal()); - } - - @NotNull - @Override - public Collection getTypeParameters() { - return typeParameters(getPsi().getTypeParameters()); - } - - @SuppressWarnings("unchecked") - @NotNull - public Collection getSupertypes() { - // TODO: getPsi().getSuperTypes() ? - Collection superClasses = classifierTypes(getPsi().getExtendsListTypes()); - Collection superInterfaces = classifierTypes(getPsi().getImplementsListTypes()); - return ContainerUtil.collect(ContainerUtil.concat(superClasses, superInterfaces).iterator()); - } - - @NotNull - public Collection getMethods() { - return methods(getPsi().getMethods()); - } - - @NotNull - public Collection getAllMethods() { - return methods(getPsi().getAllMethods()); - } - - @NotNull - public Collection getFields() { - return fields(getPsi().getFields()); - } - - @NotNull - public Collection getAllFields() { - return fields(getPsi().getAllFields()); - } - - @NotNull - public Collection getConstructors() { - return methods(getPsi().getConstructors()); - } - - @Override - public boolean isAbstract() { - return JavaElementUtil.isAbstract(this); - } - - @Override - public boolean isStatic() { - return JavaElementUtil.isStatic(this); - } - - @Override - public boolean isFinal() { - return JavaElementUtil.isFinal(this); - } - - @NotNull - @Override - public Visibility getVisibility() { - return JavaElementUtil.getVisibility(this); - } - - @NotNull - @Override - public Collection getAnnotations() { - return JavaElementUtil.getAnnotations(this); - } - - @Nullable - @Override - public JavaAnnotation findAnnotation(@NotNull FqName fqName) { - return JavaElementUtil.findAnnotation(this, fqName); - } - - @NotNull - public JavaClassifierType getDefaultType() { - return new JavaClassifierTypeImpl(JavaPsiFacade.getElementFactory(getPsi().getProject()).createType(getPsi())); - } - - @NotNull - public OriginKind getOriginKind() { - PsiClass psiClass = getPsi(); - if (psiClass instanceof JetJavaMirrorMarker) { - return OriginKind.KOTLIN_LIGHT_CLASS; - } - else if (psiClass instanceof PsiCompiledElement) { - return OriginKind.COMPILED; - } - else { - return OriginKind.SOURCE; - } - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassImpl.java new file mode 100644 index 00000000000..e7969178527 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassImpl.java @@ -0,0 +1,199 @@ +/* + * 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.lang.resolve.java.structure; + +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiCompiledElement; +import com.intellij.psi.PsiTypeParameter; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.ClassKind; +import org.jetbrains.jet.lang.descriptors.Modality; +import org.jetbrains.jet.lang.descriptors.Visibility; +import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; + +import java.util.Collection; + +import static org.jetbrains.jet.lang.resolve.java.structure.JavaElementCollectionFromPsiArrayUtil.*; + +public class JavaClassImpl extends JavaClassifierImpl implements JavaClass { + public JavaClassImpl(@NotNull PsiClass psiClass) { + super(psiClass); + assert !(psiClass instanceof PsiTypeParameter) + : "PsiTypeParameter should be wrapped in JavaTypeParameter, not JavaClass: use JavaClassifier.create()"; + } + + @Override + @NotNull + public Collection getInnerClasses() { + return classes(getPsi().getInnerClasses()); + } + + @Override + @Nullable + public FqName getFqName() { + String qualifiedName = getPsi().getQualifiedName(); + return qualifiedName == null ? null : new FqName(qualifiedName); + } + + @NotNull + @Override + public Name getName() { + return Name.identifier(getPsi().getName()); + } + + @Override + public boolean isInterface() { + return getPsi().isInterface(); + } + + @Override + public boolean isAnnotationType() { + return getPsi().isAnnotationType(); + } + + @Override + public boolean isEnum() { + return getPsi().isEnum(); + } + + @Override + @NotNull + public ClassKind getKind() { + if (isInterface()) { + return isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT; + } + return isEnum() ? ClassKind.ENUM_CLASS : ClassKind.CLASS; + } + + @Override + @Nullable + public JavaClass getOuterClass() { + PsiClass outer = getPsi().getContainingClass(); + return outer == null ? null : new JavaClassImpl(outer); + } + + @Override + @NotNull + public Modality getModality() { + return isAnnotationType() ? Modality.FINAL : Modality.convertFromFlags(isAbstract() || isInterface(), !isFinal()); + } + + @NotNull + @Override + public Collection getTypeParameters() { + return typeParameters(getPsi().getTypeParameters()); + } + + @SuppressWarnings("unchecked") + @Override + @NotNull + public Collection getSupertypes() { + // TODO: getPsi().getSuperTypes() ? + Collection superClasses = classifierTypes(getPsi().getExtendsListTypes()); + Collection superInterfaces = classifierTypes(getPsi().getImplementsListTypes()); + return ContainerUtil.collect(ContainerUtil.concat(superClasses, superInterfaces).iterator()); + } + + @Override + @NotNull + public Collection getMethods() { + return methods(getPsi().getMethods()); + } + + @Override + @NotNull + public Collection getAllMethods() { + return methods(getPsi().getAllMethods()); + } + + @Override + @NotNull + public Collection getFields() { + return fields(getPsi().getFields()); + } + + @Override + @NotNull + public Collection getAllFields() { + return fields(getPsi().getAllFields()); + } + + @Override + @NotNull + public Collection getConstructors() { + return methods(getPsi().getConstructors()); + } + + @Override + public boolean isAbstract() { + return JavaElementUtil.isAbstract(this); + } + + @Override + public boolean isStatic() { + return JavaElementUtil.isStatic(this); + } + + @Override + public boolean isFinal() { + return JavaElementUtil.isFinal(this); + } + + @NotNull + @Override + public Visibility getVisibility() { + return JavaElementUtil.getVisibility(this); + } + + @NotNull + @Override + public Collection getAnnotations() { + return JavaElementUtil.getAnnotations(this); + } + + @Nullable + @Override + public JavaAnnotation findAnnotation(@NotNull FqName fqName) { + return JavaElementUtil.findAnnotation(this, fqName); + } + + @Override + @NotNull + public JavaClassifierType getDefaultType() { + return new JavaClassifierTypeImpl(JavaPsiFacade.getElementFactory(getPsi().getProject()).createType(getPsi())); + } + + @Override + @NotNull + public OriginKind getOriginKind() { + PsiClass psiClass = getPsi(); + if (psiClass instanceof JetJavaMirrorMarker) { + return OriginKind.KOTLIN_LIGHT_CLASS; + } + else if (psiClass instanceof PsiCompiledElement) { + return OriginKind.COMPILED; + } + else { + return OriginKind.SOURCE; + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassifierImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassifierImpl.java index fbbb7404406..73773971448 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassifierImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaClassifierImpl.java @@ -37,7 +37,7 @@ public abstract class JavaClassifierImpl extends JavaElementImpl implements Java return new JavaTypeParameterImpl((PsiTypeParameter) psiClass); } else { - return new JavaClass(psiClass); + return new JavaClassImpl(psiClass); } } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaElementCollectionFromPsiArrayUtil.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaElementCollectionFromPsiArrayUtil.java index 6c1cb797062..98f338666c7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaElementCollectionFromPsiArrayUtil.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaElementCollectionFromPsiArrayUtil.java @@ -34,7 +34,7 @@ public class JavaElementCollectionFromPsiArrayUtil { if (classes.length == 0) return Collections.emptyList(); List result = new ArrayList(classes.length); for (PsiClass psiClass : classes) { - result.add(new JavaClass(psiClass)); + result.add(new JavaClassImpl(psiClass)); } return result; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaMemberImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaMemberImpl.java index 4de036aeb5c..373a9165136 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaMemberImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaMemberImpl.java @@ -50,7 +50,7 @@ public abstract class JavaMemberImpl extends JavaElementImpl implements JavaMemb public JavaClass getContainingClass() { PsiClass psiClass = getPsi().getContainingClass(); assert psiClass != null : "Member must have a containing class: " + getPsi(); - return new JavaClass(psiClass); + return new JavaClassImpl(psiClass); } @Override diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaTypeParameterImpl.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaTypeParameterImpl.java index 961396709a4..6292bfbcc1e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaTypeParameterImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaTypeParameterImpl.java @@ -62,7 +62,7 @@ public class JavaTypeParameterImpl extends JavaClassifierImpl implements JavaTyp return new JavaMethodImpl((PsiMethod) owner); } else if (owner instanceof PsiClass) { - return new JavaClass((PsiClass) owner); + return new JavaClassImpl((PsiClass) owner); } else if (owner != null) { throw new UnsupportedOperationException("Unsupported type parameter list owner: " + owner);