diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 410023109b2..830f51cfb3e 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -144,11 +144,6 @@ public class LazyJavaClassMemberScope( return result } - - // TODO - override fun getProperties(name: Name): Collection = listOf() - override fun getAllPropertyNames(): Collection = listOf() - private val nestedClassIndex = c.storageManager.createLazyValue { jClass.getInnerClasses().valuesToMap { c -> c.getName() } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index c8afdb40516..b0ee76b6ec6 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -29,6 +29,13 @@ import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver import java.util.ArrayList import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import java.util.LinkedHashSet +import org.jetbrains.jet.lang.types.JetType +import org.jetbrains.jet.lang.resolve.java.resolver.JavaPropertyResolver +import org.jetbrains.jet.lang.resolve.java.lazy.types.toAttributes +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor +import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl +import java.util.Collections +import org.jetbrains.jet.utils.emptyOrSingletonList import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext import org.jetbrains.annotations.TestOnly import org.jetbrains.jet.utils.Printer @@ -140,6 +147,63 @@ public abstract class LazyJavaMemberScope( override fun getFunctions(name: Name) = _functions(name) protected open fun getAllFunctionNames(): Collection = memberIndex().getAllMetodNames() + val _properties = c.storageManager.createMemoizedFunction { + (name: Name) -> + val properties = ArrayList() + + val field = memberIndex().findFieldByName(name) + if (field != null) { + properties.add(resolveProperty(field)) + } + + if (_containingDeclaration is ClassDescriptor) { + val propertiesFromSupertypes = JavaPropertyResolver.getPropertiesFromSupertypes(name, _containingDeclaration); + + properties.addAll(DescriptorResolverUtils.resolveOverrides(name, propertiesFromSupertypes, properties, _containingDeclaration, + c.errorReporter)); + + } + + properties + } + + private fun resolveProperty(field: JavaField): PropertyDescriptor { + val isVar = !field.isFinal() + val propertyDescriptor = JavaPropertyDescriptor( + getContainingDeclaration(), + c.resolveAnnotations(field.getAnnotations()), + field.getVisibility(), + isVar, + field.getName() + ) + propertyDescriptor.initialize(null, null) + + val propertyType = getPropertyType(field) + val effectiveSignature = c.externalSignatureResolver.resolveAlternativeFieldSignature(field, propertyType, isVar) + val signatureErrors = effectiveSignature.getErrors() + if (!signatureErrors.isEmpty()) { + c.externalSignatureResolver.reportSignatureErrors(propertyDescriptor, signatureErrors) + } + + propertyDescriptor.setType(effectiveSignature.getReturnType(), Collections.emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(getContainingDeclaration()), null : JetType?) + + c.javaResolverCache.recordField(field, propertyDescriptor); + + return propertyDescriptor + } + + private fun getPropertyType(field: JavaField): JetType { + // Fields do not have their own generic parameters + val propertyType = c.typeResolver.transformJavaType(field.getType(), TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes()) + if (JavaPropertyResolver.isStaticFinalField(field)) { + return TypeUtils.makeNotNullable(propertyType) + } + return propertyType + } + + override fun getProperties(name: Name): Collection = _properties(name) + protected open fun getAllPropertyNames(): Collection = memberIndex().getAllFieldNames() + // No object can be defined in Java override fun getObjectDescriptor(name: Name): ClassDescriptor? = null override fun getObjectDescriptors() = emptyList() @@ -147,6 +211,8 @@ public abstract class LazyJavaMemberScope( override fun getLocalVariable(name: Name): VariableDescriptor? = null override fun getDeclarationsByLabel(labelName: LabelName) = emptyList() + override fun getClassifiers(name: Name) = emptyOrSingletonList(getClassifier(name)) + override fun getOwnDeclaredDescriptors() = getAllDescriptors() override fun getAllDescriptors() = allDescriptors() @@ -178,7 +244,6 @@ public abstract class LazyJavaMemberScope( protected abstract fun getAllPackageNames(): Collection protected abstract fun getAllClassNames(): Collection - protected abstract fun getAllPropertyNames(): Collection protected abstract fun addExtraDescriptors(result: MutableCollection) override fun toString() = "Lazy scope for ${getContainingDeclaration()}" diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt index c4a88cb63fa..8c62feac54d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt @@ -79,8 +79,4 @@ public class LazyPackageFragmentScopeForJavaClass( override fun getAllPackageNames(): Collection = jClass.getInnerClasses().iterator() .filter { c -> c.isStatic() && JavaNamespaceResolver.hasStaticMembers(c) } .map { c -> c.getName() }.toList() - - // TODO - override fun getProperties(name: Name): Collection = Collections.emptyList() - override fun getAllPropertyNames() = Collections.emptyList() } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt index bb1a1b5f07b..8253dd60deb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt @@ -21,31 +21,49 @@ import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import org.jetbrains.jet.lang.descriptors.Visibilities +import org.jetbrains.jet.lang.resolve.java.structure.JavaField +import org.jetbrains.jet.lang.resolve.java.structure.JavaMember +import org.jetbrains.jet.utils.valuesToMap trait MemberIndex { fun findMethodsByName(name: Name): Collection fun getAllMetodNames(): Collection + + fun findFieldByName(name: Name): JavaField? + fun getAllFieldNames(): Collection } object EMPTY_MEMBER_INDEX : MemberIndex { override fun findMethodsByName(name: Name) = listOf() override fun getAllMetodNames() = listOf() + + override fun findFieldByName(name: Name): JavaField? = null + override fun getAllFieldNames() = listOf() } class ClassMemberIndex(val jClass: JavaClass, mustBeStatic: Boolean) : MemberIndex { - private val methodFilter = { - (m: JavaMethod) -> + private val memberFilter = { + (m: JavaMember) -> m.isStatic() == mustBeStatic && - !m.isConstructor() && - !DescriptorResolverUtils.isObjectMethodInInterface(m) && m.getVisibility() != Visibilities.PRIVATE } + private val methodFilter = { + (m: JavaMethod) -> + memberFilter(m) && + !m.isConstructor() && + !DescriptorResolverUtils.isObjectMethodInInterface(m) + } + private val methods = jClass.getMethods().iterator().filter(methodFilter).groupBy { m -> m.getName() } + private val fields = jClass.getFields().iterator().filter(memberFilter).valuesToMap { m -> m.getName() } override fun findMethodsByName(name: Name): Collection { return methods[name] ?: listOf() } override fun getAllMetodNames(): Collection = jClass.getAllMethods().iterator().filter(methodFilter).map { m -> m.getName() }.toList() + + override fun findFieldByName(name: Name): JavaField? = fields[name] + override fun getAllFieldNames() = jClass.getAllFields().iterator().filter(memberFilter).map { m -> m.getName() }.toList() } \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java index a1b8e5b6b58..afa31ea997a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java @@ -145,7 +145,7 @@ public final class JavaPropertyResolver { } @NotNull - private static Set getPropertiesFromSupertypes(@NotNull Name name, @NotNull ClassDescriptor descriptor) { + public static Set getPropertiesFromSupertypes(@NotNull Name name, @NotNull ClassDescriptor descriptor) { Set result = new HashSet(); for (JetType supertype : descriptor.getTypeConstructor().getSupertypes()) { for (VariableDescriptor property : supertype.getMemberScope().getProperties(name)) { @@ -156,7 +156,7 @@ public final class JavaPropertyResolver { return result; } - private static boolean isStaticFinalField(@NotNull JavaField field) { + public static boolean isStaticFinalField(@NotNull JavaField field) { return field.isFinal() && field.isStatic(); } }