Initial version of lazy Java type resolver
This commit is contained in:
+15
@@ -0,0 +1,15 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragment
|
||||
import org.jetbrains.jet.storage.MemoizedFunctionToNullable
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
|
||||
public open class LazyJavaSubModule(
|
||||
c: LazyJavaResolverContext,
|
||||
module: ModuleDescriptor
|
||||
) {
|
||||
public val packageFragments: MemoizedFunctionToNullable<FqName, NamespaceDescriptor>
|
||||
= c.storageManager.createMemoizedFunctionWithNullableValues {fqName -> LazyJavaPackageFragment(c, module, fqName)}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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.lazy
|
||||
|
||||
import org.jetbrains.jet.storage.StorageManager
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.types.LazyJavaTypeResolver
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaTypeParameter
|
||||
import org.jetbrains.jet.lang.resolve.java.JavaClassFinder
|
||||
|
||||
open class LazyJavaResolverContext(
|
||||
val storageManager: StorageManager,
|
||||
val finder: JavaClassFinder,
|
||||
val javaClassResolver: LazyJavaClassResolver
|
||||
)
|
||||
|
||||
fun LazyJavaResolverContext.withTypes(
|
||||
typeParameterResolver: TypeParameterResolver = TypeParameterResolver.EMPTY
|
||||
) = LazyJavaResolverContextWithTypes(
|
||||
storageManager,
|
||||
finder,
|
||||
javaClassResolver,
|
||||
LazyJavaTypeResolver(this, typeParameterResolver),
|
||||
typeParameterResolver)
|
||||
|
||||
class LazyJavaResolverContextWithTypes(
|
||||
storageManager: StorageManager,
|
||||
finder: JavaClassFinder,
|
||||
javaClassResolver: LazyJavaClassResolver,
|
||||
val typeResolver: LazyJavaTypeResolver,
|
||||
val typeParameterResolver: TypeParameterResolver
|
||||
) : LazyJavaResolverContext(storageManager, finder, javaClassResolver)
|
||||
|
||||
fun LazyJavaResolverContextWithTypes.child(
|
||||
containingDeclaration: DeclarationDescriptor,
|
||||
typeParameters: Set<JavaTypeParameter>
|
||||
): LazyJavaResolverContextWithTypes = this.withTypes(LazyJavaTypeParameterResolver(this, containingDeclaration, typeParameters))
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.jet.lang.types.JetType
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.lang.types.TypeConstructor
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver
|
||||
import org.jetbrains.jet.utils.emptyOrSingletonList
|
||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
|
||||
import java.util.Collections
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContextWithTypes
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorFactory
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.child
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage
|
||||
|
||||
class LazyJavaClassDescriptor(
|
||||
private val c: LazyJavaResolverContextWithTypes,
|
||||
containingDeclaration: DeclarationDescriptor,
|
||||
fqName: FqName,
|
||||
private val jClass: JavaClass
|
||||
) : ClassDescriptorBase(containingDeclaration, fqName.shortName()), LazyJavaDescriptor {
|
||||
|
||||
private val innerC: LazyJavaResolverContextWithTypes = c.child(this, jClass.getTypeParameters().toSet())
|
||||
|
||||
private val _kind = JavaClassResolver.determineClassKind(jClass)
|
||||
private val _modality = JavaClassResolver.determineClassModality(jClass)
|
||||
private val _visibility = jClass.getVisibility()
|
||||
private val _isInner = JavaClassResolver.isInnerClass(jClass)
|
||||
|
||||
override fun getKind() = _kind
|
||||
override fun getModality() = _modality
|
||||
override fun getVisibility() = _visibility
|
||||
override fun isInner() = _isInner
|
||||
|
||||
private val _typeConstructor = c.storageManager.createLazyValue { LazyJavaClassTypeConstructor() }
|
||||
override fun getTypeConstructor() = _typeConstructor()
|
||||
|
||||
private val _scopeForMemberLookup = c.storageManager.createLazyValue {
|
||||
// TODO
|
||||
throw UnsupportedOperationException()
|
||||
}
|
||||
|
||||
override fun getScopeForMemberLookup() = _scopeForMemberLookup()
|
||||
|
||||
private val _thisAsReceiverParameter = c.storageManager.createLazyValue { DescriptorFactory.createLazyReceiverParameterDescriptor(this) }
|
||||
override fun getThisAsReceiverParameter() = _thisAsReceiverParameter()
|
||||
|
||||
// TODO
|
||||
override fun getUnsubstitutedInnerClassesScope(): JetScope = JetScope.EMPTY
|
||||
|
||||
override fun getUnsubstitutedPrimaryConstructor(): ConstructorDescriptor? = null
|
||||
|
||||
// TODO
|
||||
override fun getConstructors() = emptyOrSingletonList(getUnsubstitutedPrimaryConstructor())
|
||||
|
||||
override fun getClassObjectType(): JetType? = null
|
||||
|
||||
override fun getClassObjectDescriptor(): ClassDescriptor? = null
|
||||
|
||||
// TODO
|
||||
override fun getAnnotations(): List<AnnotationDescriptor> = Collections.emptyList()
|
||||
|
||||
private inner class LazyJavaClassTypeConstructor : TypeConstructor {
|
||||
|
||||
private val _parameters = c.storageManager.createLazyValue {
|
||||
this@LazyJavaClassDescriptor.jClass.getTypeParameters().map {
|
||||
p ->
|
||||
innerC.typeParameterResolver.resolveTypeParameter(p)
|
||||
?: throw AssertionError("Parameter $p surely belongs to class $jClass, so it must be resolved")
|
||||
}
|
||||
}
|
||||
|
||||
override fun getParameters(): List<TypeParameterDescriptor> = _parameters()
|
||||
|
||||
private val _supertypes = c.storageManager.createLazyValue {
|
||||
jClass.getSupertypes().map {
|
||||
supertype ->
|
||||
innerC.typeResolver.transformJavaType(supertype, TypeUsage.SUPERTYPE)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSupertypes(): Collection<JetType> = _supertypes()
|
||||
|
||||
override fun getAnnotations() = Collections.emptyList<AnnotationDescriptor>()
|
||||
|
||||
override fun isFinal() = !getModality().isOverridable()
|
||||
|
||||
override fun isDenotable() = true
|
||||
|
||||
override fun getDeclarationDescriptor() = this@LazyJavaClassDescriptor
|
||||
|
||||
override fun toString(): String? = getName().asString()
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
|
||||
public trait LazyJavaDescriptor : DeclarationDescriptor
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.*
|
||||
import org.jetbrains.jet.storage.NotNullLazyValue
|
||||
import org.jetbrains.jet.lang.resolve.name.LabelName
|
||||
import org.jetbrains.jet.lang.resolve.name.Name
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||
import org.jetbrains.jet.utils.emptyList
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
||||
import org.jetbrains.annotations.TestOnly
|
||||
import org.jetbrains.jet.utils.Printer
|
||||
|
||||
public abstract class LazyJavaMemberScope(
|
||||
private val c: LazyJavaResolverContext,
|
||||
private val _containingDeclaration: DeclarationDescriptor
|
||||
) : JetScope {
|
||||
private val allDescriptors: NotNullLazyValue<MutableCollection<DeclarationDescriptor>> = c.storageManager.createLazyValue{computeAllDescriptors()}
|
||||
|
||||
override fun getContainingDeclaration() = _containingDeclaration
|
||||
|
||||
// No object can be defined in Java
|
||||
override fun getObjectDescriptor(name: Name): ClassDescriptor? = null
|
||||
override fun getObjectDescriptors() = emptyList<ClassDescriptor>()
|
||||
|
||||
// namespaces should be resolved elsewhere
|
||||
override fun getNamespace(name: Name): NamespaceDescriptor? = null
|
||||
|
||||
override fun getLocalVariable(name: Name): VariableDescriptor? = null
|
||||
override fun getDeclarationsByLabel(labelName: LabelName) = emptyList<DeclarationDescriptor>()
|
||||
|
||||
override fun getOwnDeclaredDescriptors() = getAllDescriptors()
|
||||
override fun getAllDescriptors() = allDescriptors()
|
||||
|
||||
private fun computeAllDescriptors(): MutableCollection<DeclarationDescriptor> {
|
||||
val result = arrayListOf<DeclarationDescriptor>()
|
||||
|
||||
for (name in getAllClassNames()) {
|
||||
val descriptor = getClassifier(name)
|
||||
assert(descriptor != null) {"Descriptor not found for name " + name + " in " + getContainingDeclaration()}
|
||||
result.add(descriptor!!)
|
||||
}
|
||||
|
||||
for (name in getAllFunctionNames()) {
|
||||
result.addAll(getFunctions(name))
|
||||
}
|
||||
|
||||
for (name in getAllPropertyNames()) {
|
||||
result.addAll(getProperties(name))
|
||||
}
|
||||
|
||||
addExtraDescriptors(result)
|
||||
|
||||
return result
|
||||
}
|
||||
protected abstract fun getAllClassNames(): Collection<Name>
|
||||
protected abstract fun getAllPropertyNames(): Collection<Name>
|
||||
protected abstract fun getAllFunctionNames(): Collection<Name>
|
||||
protected abstract fun addExtraDescriptors(result: MutableCollection<in DeclarationDescriptor>)
|
||||
|
||||
TestOnly
|
||||
override fun printScopeStructure(p: Printer) {
|
||||
p.println(javaClass.getSimpleName(), " {")
|
||||
p.pushIndent()
|
||||
|
||||
p.println("containigDeclaration: ${getContainingDeclaration()}")
|
||||
|
||||
p.popIndent()
|
||||
p.println("}")
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.impl.AbstractNamespaceDescriptorImpl
|
||||
import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorParent
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||
import org.jetbrains.jet.utils.emptyList
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe
|
||||
|
||||
public class LazyJavaPackageFragment(
|
||||
c: LazyJavaResolverContext,
|
||||
containingDeclaration: NamespaceDescriptorParent,
|
||||
private val _fqName: FqName
|
||||
) : AbstractNamespaceDescriptorImpl(
|
||||
containingDeclaration,
|
||||
emptyList(),
|
||||
if (_fqName.isRoot()) FqNameUnsafe.ROOT_NAME else _fqName.shortName()
|
||||
), NamespaceDescriptor, LazyJavaDescriptor {
|
||||
|
||||
private val _memberScope = LazyJavaPackageFragmentScope(c, this)
|
||||
|
||||
override fun getMemberScope() = _memberScope
|
||||
override fun getFqName() = _fqName
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.*
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||
import org.jetbrains.jet.lang.resolve.name.Name
|
||||
import java.util.Collections
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.withTypes
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.TypeParameterResolver
|
||||
|
||||
public class LazyJavaPackageFragmentScope(
|
||||
private val c: LazyJavaResolverContext,
|
||||
containingDeclaration: NamespaceDescriptor
|
||||
) : LazyJavaMemberScope(c.withTypes(), containingDeclaration) {
|
||||
|
||||
private val fqName = DescriptorUtils.getFQName(containingDeclaration).toSafe()
|
||||
private val classes = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> {
|
||||
name ->
|
||||
val fqName = fqName.child(name)
|
||||
val javaClass = c.finder.findClass(fqName)
|
||||
if (javaClass == null)
|
||||
null
|
||||
else
|
||||
LazyJavaClassDescriptor(c.withTypes(TypeParameterResolver.EMPTY), containingDeclaration, fqName, javaClass)
|
||||
}
|
||||
|
||||
override fun getAllClassNames(): Collection<Name> {
|
||||
val javaPackage = c.finder.findPackage(fqName)
|
||||
assert(javaPackage != null) { "Package not found: $fqName" }
|
||||
return javaPackage!!.getClasses().map { c -> c.getName() }
|
||||
}
|
||||
|
||||
override fun getAllPropertyNames() = Collections.emptyList<Name>()
|
||||
override fun getAllFunctionNames() = Collections.emptyList<Name>()
|
||||
|
||||
override fun addExtraDescriptors(result: MutableCollection<in DeclarationDescriptor>) {
|
||||
// no extra descriptors
|
||||
}
|
||||
|
||||
override fun getClassifier(name: Name): ClassifierDescriptor? = classes(name)
|
||||
|
||||
// TODO
|
||||
override fun getProperties(name: Name): Collection<VariableDescriptor> = Collections.emptyList()
|
||||
|
||||
// TODO
|
||||
override fun getFunctions(name: Name): Collection<FunctionDescriptor> = Collections.emptyList()
|
||||
|
||||
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
||||
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* 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.lazy.descriptors
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.impl.AbstractLazyTypeParameterDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.lang.types.Variance
|
||||
import org.jetbrains.jet.lang.types.JetType
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaTypeParameter
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.types.LazyJavaTypeResolver
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContextWithTypes
|
||||
|
||||
class LazyJavaTypeParameterDescriptor(
|
||||
private val c: LazyJavaResolverContextWithTypes,
|
||||
public val javaTypeParameter: JavaTypeParameter,
|
||||
containingDeclaration: DeclarationDescriptor
|
||||
) : AbstractLazyTypeParameterDescriptor(
|
||||
c.storageManager,
|
||||
containingDeclaration,
|
||||
name = javaTypeParameter.getName(),
|
||||
variance = Variance.INVARIANT,
|
||||
isReified = false,
|
||||
index = javaTypeParameter.getIndex()
|
||||
) {
|
||||
|
||||
override fun resolveUpperBounds(): Set<JetType> {
|
||||
val bounds = javaTypeParameter.getUpperBounds()
|
||||
if (bounds.isEmpty()) {
|
||||
return setOf(KotlinBuiltIns.getInstance().getDefaultBound())
|
||||
}
|
||||
else {
|
||||
return bounds.map {
|
||||
javaType -> c.typeResolver.transformJavaType(javaType, TypeUsage.UPPER_BOUND)
|
||||
}.toSet()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* 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.lazy
|
||||
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaTypeParameter
|
||||
import org.jetbrains.jet.utils.toMap
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaTypeParameterDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.types.LazyJavaTypeResolver
|
||||
|
||||
trait LazyJavaClassResolver {
|
||||
fun resolveClass(javaClass: JavaClass): ClassDescriptor?
|
||||
}
|
||||
|
||||
trait TypeParameterResolver {
|
||||
class object {
|
||||
object EMPTY : TypeParameterResolver {
|
||||
override fun resolveTypeParameter(javaTypeParameter: JavaTypeParameter): TypeParameterDescriptor? = null
|
||||
}
|
||||
}
|
||||
|
||||
fun resolveTypeParameter(javaTypeParameter: JavaTypeParameter): TypeParameterDescriptor?
|
||||
}
|
||||
|
||||
class TypeParameterResolverImpl(
|
||||
_typeParameters: Collection<LazyJavaTypeParameterDescriptor>,
|
||||
private val parent: TypeParameterResolver = TypeParameterResolver.EMPTY
|
||||
) : TypeParameterResolver {
|
||||
|
||||
private val parameters = _typeParameters.toMap { p -> p.javaTypeParameter }
|
||||
|
||||
override fun resolveTypeParameter(javaTypeParameter: JavaTypeParameter): TypeParameterDescriptor? {
|
||||
return parameters[javaTypeParameter] ?: parent.resolveTypeParameter(javaTypeParameter)
|
||||
}
|
||||
}
|
||||
|
||||
class LazyJavaTypeParameterResolver(
|
||||
val c: LazyJavaResolverContextWithTypes,
|
||||
private val containingDeclaration: DeclarationDescriptor,
|
||||
private val typeParameters: Set<JavaTypeParameter>
|
||||
) : TypeParameterResolver {
|
||||
|
||||
private val resolve: (JavaTypeParameter) -> TypeParameterDescriptor? = c.storageManager.createMemoizedFunctionWithNullableValues {
|
||||
javaTypeParameter ->
|
||||
if (javaTypeParameter in typeParameters)
|
||||
LazyJavaTypeParameterDescriptor(
|
||||
c.withTypes(this),
|
||||
javaTypeParameter,
|
||||
containingDeclaration
|
||||
)
|
||||
else null
|
||||
}
|
||||
|
||||
override fun resolveTypeParameter(javaTypeParameter: JavaTypeParameter): TypeParameterDescriptor? {
|
||||
return resolve(javaTypeParameter) ?: c.typeParameterResolver.resolveTypeParameter(javaTypeParameter)
|
||||
}
|
||||
}
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* 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.lazy.types
|
||||
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaType
|
||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaWildcardType
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage.*
|
||||
import org.jetbrains.jet.lang.resolve.java.resolver.*
|
||||
import org.jetbrains.jet.lang.types.Variance.*
|
||||
import org.jetbrains.jet.lang.types.*
|
||||
import org.jetbrains.kotlin.util.iif
|
||||
import org.jetbrains.jet.utils.*
|
||||
import org.jetbrains.jet.storage.*
|
||||
import org.jetbrains.kotlin.util.eq
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaPrimitiveType
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaArrayType
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClassifierType
|
||||
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaTypeParameter
|
||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
|
||||
import org.jetbrains.kotlin.util.sure
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.TypeParameterResolver
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaTypeParameterDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.TypeParameterResolverImpl
|
||||
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||
|
||||
class LazyJavaTypeResolver(
|
||||
private val c: LazyJavaResolverContext,
|
||||
private val typeParameterResolver: TypeParameterResolver
|
||||
) {
|
||||
private val NOT_NULL_POSITIONS = setOf(TYPE_ARGUMENT, UPPER_BOUND, SUPERTYPE_ARGUMENT, SUPERTYPE)
|
||||
|
||||
public fun transformJavaType(javaType: JavaType, howThisTypeIsUsed: TypeUsage): JetType {
|
||||
return when (javaType) {
|
||||
is JavaPrimitiveType -> {
|
||||
val canonicalText = javaType.getCanonicalText()
|
||||
val jetType = JavaToKotlinClassMap.getInstance().mapPrimitiveKotlinClass(canonicalText)
|
||||
assert(jetType != null, "Primitive type is not found: " + canonicalText)
|
||||
return jetType!!
|
||||
}
|
||||
is JavaClassifierType -> LazyJavaClassifierType(javaType, howThisTypeIsUsed).applyNullablility(howThisTypeIsUsed)
|
||||
is JavaArrayType -> transformArrayType(javaType, howThisTypeIsUsed).applyNullablility(howThisTypeIsUsed)
|
||||
else -> throw UnsupportedOperationException("Unsupported type: " + javaType)
|
||||
}
|
||||
}
|
||||
|
||||
public fun transformArrayType(arrayType: JavaArrayType, howThisTypeIsUsed: TypeUsage, isVararg: Boolean = false): JetType {
|
||||
val javaComponentType = arrayType.getComponentType()
|
||||
if (javaComponentType is JavaPrimitiveType) {
|
||||
val jetType = JavaToKotlinClassMap.getInstance().mapPrimitiveKotlinClass("[" + javaComponentType.getCanonicalText())
|
||||
if (jetType != null) return jetType
|
||||
}
|
||||
|
||||
val projectionKind = if (howThisTypeIsUsed == MEMBER_SIGNATURE_CONTRAVARIANT && !isVararg) OUT_VARIANCE else INVARIANT
|
||||
|
||||
val howArgumentTypeIsUsed = isVararg.iif(MEMBER_SIGNATURE_CONTRAVARIANT, TYPE_ARGUMENT)
|
||||
val componentType = transformJavaType(javaComponentType, howArgumentTypeIsUsed)
|
||||
return TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getArrayType(projectionKind, componentType))
|
||||
}
|
||||
|
||||
private fun JetType.applyNullablility(howThisTypeIsUsed: TypeUsage): JetType {
|
||||
return TypeUtils.makeNullableAsSpecified(this, howThisTypeIsUsed !in NOT_NULL_POSITIONS)
|
||||
}
|
||||
|
||||
private fun transformToTypeProjection(
|
||||
javaType: JavaType,
|
||||
howThisTypeIsUsed: TypeUsage,
|
||||
typeConstructorBeingApplied: () -> TypeConstructor,
|
||||
typeParameterIndex: Int
|
||||
): TypeProjection {
|
||||
return when (javaType) {
|
||||
is JavaWildcardType -> {
|
||||
val bound = javaType.getBound()
|
||||
if (bound == null)
|
||||
LazyStarProjection(c, typeConstructorBeingApplied, typeParameterIndex)
|
||||
else {
|
||||
TypeProjectionImpl(javaType.isExtends().iif(OUT_VARIANCE, IN_VARIANCE), transformJavaType(bound, UPPER_BOUND))
|
||||
}
|
||||
}
|
||||
else -> TypeProjectionImpl(INVARIANT, transformJavaType(javaType, howThisTypeIsUsed))
|
||||
}
|
||||
}
|
||||
|
||||
private class LazyStarProjection(
|
||||
c: LazyJavaResolverContext,
|
||||
typeConstructor: () -> TypeConstructor,
|
||||
typeParameterIndex: Int
|
||||
) : TypeProjectionBase() {
|
||||
private val typeParameter by c.storageManager.createLazyValue {typeConstructor().getParameters()[typeParameterIndex]}
|
||||
|
||||
override fun getProjectionKind() = typeParameter.getVariance().eq(OUT_VARIANCE).iif(INVARIANT, OUT_VARIANCE)
|
||||
override fun getType() = typeParameter.getUpperBoundsAsType()
|
||||
}
|
||||
|
||||
private inner class LazyJavaClassifierType(
|
||||
private val javaType: JavaClassifierType,
|
||||
private val howThisTypeIsUsed: TypeUsage
|
||||
) : LazyType(c.storageManager) {
|
||||
|
||||
|
||||
override fun computeTypeConstructor(): TypeConstructor {
|
||||
val classifier = javaType.getClassifier()
|
||||
if (classifier == null) {
|
||||
return ErrorUtils.createErrorTypeConstructor("Unresolved java classifier: " + javaType.getPresentableText())
|
||||
}
|
||||
return when (classifier) {
|
||||
is JavaClass -> {
|
||||
val fqName = classifier.getFqName()
|
||||
.sure("Class type should have a FQ name: " + classifier)
|
||||
val classData = JavaToKotlinClassMap.getInstance().mapKotlinClass(fqName, howThisTypeIsUsed)
|
||||
?: c.javaClassResolver.resolveClass(classifier)
|
||||
|
||||
classData?.getTypeConstructor()
|
||||
?: ErrorUtils.createErrorTypeConstructor("Unresolved java classifier: " + javaType.getPresentableText())
|
||||
}
|
||||
is JavaTypeParameter -> {
|
||||
typeParameterResolver.resolveTypeParameter(classifier)?.getTypeConstructor()
|
||||
?: ErrorUtils.createErrorTypeConstructor("Unresolved Java type parameter: " + javaType.getPresentableText())
|
||||
}
|
||||
else -> throw IllegalStateException("Unknown classifier kind: $classifier")
|
||||
}
|
||||
}
|
||||
|
||||
override fun computeArguments(): List<TypeProjection> {
|
||||
var howTheProjectionIsUsed = howThisTypeIsUsed.eq(SUPERTYPE).iif(SUPERTYPE_ARGUMENT, TYPE_ARGUMENT)
|
||||
return javaType.getTypeArguments().withIndices().map {
|
||||
p ->
|
||||
val (i, t) = p
|
||||
transformToTypeProjection(t, howTheProjectionIsUsed, {getConstructor()}, i)
|
||||
}.toList()
|
||||
}
|
||||
|
||||
override fun computeMemberScope(): JetScope {
|
||||
val descriptor = getConstructor().getDeclarationDescriptor()!!
|
||||
|
||||
if (descriptor is TypeParameterDescriptor) return descriptor.getDefaultType().getMemberScope()
|
||||
|
||||
return (descriptor as ClassDescriptor).getMemberScope(getArguments())
|
||||
}
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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.lazy.types
|
||||
|
||||
import org.jetbrains.jet.storage.StorageManager
|
||||
import org.jetbrains.jet.lang.types.TypeConstructor
|
||||
import org.jetbrains.jet.lang.types.TypeProjection
|
||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||
import org.jetbrains.jet.lang.types.AbstractJetType
|
||||
|
||||
abstract class LazyType(storageManager: StorageManager) : AbstractJetType() {
|
||||
|
||||
private val _typeConstructor = storageManager.createLazyValue {computeTypeConstructor()}
|
||||
override fun getConstructor(): TypeConstructor = _typeConstructor()
|
||||
|
||||
protected abstract fun computeTypeConstructor(): TypeConstructor
|
||||
|
||||
private val _arguments = storageManager.createLazyValue {computeArguments()}
|
||||
override fun getArguments(): List<TypeProjection> = _arguments()
|
||||
|
||||
protected abstract fun computeArguments(): List<TypeProjection>
|
||||
|
||||
private val _memberScope = storageManager.createLazyValue {computeMemberScope()}
|
||||
override fun getMemberScope() = _memberScope()
|
||||
|
||||
protected abstract fun computeMemberScope(): JetScope
|
||||
|
||||
override fun isNullable() = false
|
||||
|
||||
override fun isError() = false
|
||||
|
||||
override fun getAnnotations(): List<AnnotationDescriptor> = listOf()
|
||||
}
|
||||
Reference in New Issue
Block a user