diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.kt index ad3387a4a06..8e4ed4fbdc8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationResolver.kt @@ -17,65 +17,44 @@ package org.jetbrains.kotlin.resolve import com.google.common.collect.HashMultimap -import com.google.common.collect.Lists import com.google.common.collect.Multimap import com.google.common.collect.Sets -import com.intellij.openapi.util.Pair import com.intellij.psi.PsiElement -import com.intellij.util.containers.ContainerUtil -import kotlin.Function1 -import kotlin.KotlinPackage import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetElement -import org.jetbrains.kotlin.psi.JetFile -import org.jetbrains.kotlin.psi.JetNamedDeclaration import org.jetbrains.kotlin.psi.JetPackageDirective import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider import org.jetbrains.kotlin.resolve.lazy.TopLevelDescriptorProvider -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor -import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.utils.* import javax.inject.Inject import java.util.HashSet import org.jetbrains.kotlin.diagnostics.Errors.REDECLARATION +import kotlin.properties.Delegates public class DeclarationResolver { - private var annotationResolver: AnnotationResolver? = null - private var trace: BindingTrace? = null - + private var _annotationResolver: AnnotationResolver by Delegates.notNull() + private var _trace: BindingTrace by Delegates.notNull() Inject public fun setAnnotationResolver(annotationResolver: AnnotationResolver) { - this.annotationResolver = annotationResolver + this._annotationResolver = annotationResolver } Inject public fun setTrace(trace: BindingTrace) { - this.trace = trace + this._trace = trace } - public fun resolveAnnotationsOnFiles(c: TopDownAnalysisContext, scopeProvider: FileScopeProvider) { - val file2scope = c.getFiles().keysToMap(object : Function1 { - override fun invoke(file: JetFile): JetScope { - return scopeProvider.getFileScope(file) - } - }) - - resolveAnnotationsOnFiles(file2scope) - } - - private fun resolveAnnotationsOnFiles(file2scope: Map) { - for (entry in file2scope.entrySet()) { - val file = entry.getKey() - val fileScope = entry.getValue() - annotationResolver!!.resolveAnnotationsWithArguments(fileScope, file.getAnnotationEntries(), trace) - annotationResolver!!.resolveAnnotationsWithArguments(fileScope, file.getDanglingAnnotations(), trace) + val filesToScope = c.getFiles().keysToMap { scopeProvider.getFileScope(it) } + for ((file, fileScope) in filesToScope) { + _annotationResolver.resolveAnnotationsWithArguments(fileScope, file.getAnnotationEntries(), _trace) + _annotationResolver.resolveAnnotationsWithArguments(fileScope, file.getDanglingAnnotations(), _trace) } } @@ -86,14 +65,12 @@ public class DeclarationResolver { continue } - var allDescriptors: MutableCollection = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors() - + var allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors() val classObj = classDescriptor.getDefaultObjectDescriptor() if (classObj != null) { val classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors() - if (!classObjDescriptors.isEmpty()) { - allDescriptors = Lists.newArrayList(allDescriptors) - allDescriptors.addAll(classObjDescriptors) + if (classObjDescriptors.isNotEmpty()) { + allDescriptors = allDescriptors + classObjDescriptors } } @@ -111,80 +88,63 @@ public class DeclarationResolver { private fun reportRedeclarations(descriptorMap: Multimap) { val redeclarations = Sets.newHashSet>() for (name in descriptorMap.keySet()) { - val descriptors = descriptorMap.get(name) - if (descriptors.size() > 1) { - // We mustn't compare PropertyDescriptor with PropertyDescriptor because we do this at OverloadResolver - for (descriptor in descriptors) { - if (descriptor is ClassDescriptor) { - for (descriptor2 in descriptors) { - if (descriptor == descriptor2) { - continue - } + val descriptors = descriptorMap[name] + if (descriptors.size() <= 1) { + continue + } + // We mustn't compare PropertyDescriptor with PropertyDescriptor because we do this at OverloadResolver + for (descriptor in descriptors) { + if (descriptor is ClassDescriptor) { + for (descriptor2 in descriptors) { + if (descriptor identityEquals descriptor2) { + continue + } - redeclarations.add(Pair.create(DescriptorToSourceUtils.classDescriptorToDeclaration(descriptor as ClassDescriptor), descriptor.getName())) - if (descriptor2 is PropertyDescriptor) { - redeclarations.add(Pair.create(DescriptorToSourceUtils.descriptorToDeclaration(descriptor2), descriptor2.getName())) - } + redeclarations.add(Pair(DescriptorToSourceUtils.classDescriptorToDeclaration(descriptor), descriptor.getName())) + if (descriptor2 is PropertyDescriptor) { + redeclarations.add(Pair(DescriptorToSourceUtils.descriptorToDeclaration(descriptor2), descriptor2.getName())) } } } } } - for (redeclaration in redeclarations) { - trace!!.report(REDECLARATION.on(redeclaration.getFirst(), redeclaration.getSecond().asString())) + for ((first, second) in redeclarations) { + _trace.report(REDECLARATION.on(first, second.asString())) } } public fun checkRedeclarationsInPackages(topLevelDescriptorProvider: TopLevelDescriptorProvider, topLevelFqNames: Multimap) { - for (entry in topLevelFqNames.asMap().entrySet()) { - val fqName = entry.getKey() - val declarationsOrPackageDirectives = entry.getValue() - + for ((fqName, declarationsOrPackageDirectives) in topLevelFqNames.asMap()) { if (fqName.isRoot()) continue val descriptors = getTopLevelDescriptorsByFqName(topLevelDescriptorProvider, fqName) if (descriptors.size() > 1) { for (declarationOrPackageDirective in declarationsOrPackageDirectives) { - val reportAt = if (declarationOrPackageDirective is JetNamedDeclaration) - declarationOrPackageDirective - else - (declarationOrPackageDirective as JetPackageDirective).getNameIdentifier() - trace!!.report(Errors.REDECLARATION.on(reportAt, fqName.shortName().asString())) + val reportAt = + if (declarationOrPackageDirective is JetPackageDirective) declarationOrPackageDirective.getNameIdentifier() + else declarationOrPackageDirective + _trace.report(Errors.REDECLARATION.on(reportAt, fqName.shortName().asString())) } } } } - class object { + private fun getTopLevelDescriptorsByFqName(topLevelDescriptorProvider: TopLevelDescriptorProvider, fqName: FqName): Set { + val parentFqName = fqName.parent() - public fun getConstructorOfDataClass(classDescriptor: ClassDescriptor): ConstructorDescriptor { - val constructors = classDescriptor.getConstructors() - assert(constructors.size() == 1) { "Data class must have only one constructor: " + classDescriptor.getConstructors() } - return constructors.iterator().next() + val descriptors = HashSet() + + val parentFragment = topLevelDescriptorProvider.getPackageFragment(parentFqName) + if (parentFragment != null) { + // Filter out extension properties + descriptors.addAll(parentFragment.getMemberScope().getProperties(fqName.shortName()).filter { + it.getExtensionReceiverParameter() == null + }) } - private fun getTopLevelDescriptorsByFqName(topLevelDescriptorProvider: TopLevelDescriptorProvider, fqName: FqName): Set { - val parentFqName = fqName.parent() - - val descriptors = HashSet() - - val parentFragment = topLevelDescriptorProvider.getPackageFragment(parentFqName) - if (parentFragment != null) { - // Filter out extension properties - descriptors.addAll(KotlinPackage.filter(parentFragment.getMemberScope().getProperties(fqName.shortName()), object : Function1 { - override fun invoke(descriptor: VariableDescriptor): Boolean? { - return descriptor.getExtensionReceiverParameter() == null - } - })) - } - - ContainerUtil.addIfNotNull(descriptors, topLevelDescriptorProvider.getPackageFragment(fqName)) - - descriptors.addAll(topLevelDescriptorProvider.getTopLevelClassDescriptors(fqName)) - return descriptors - } + descriptors.addIfNotNull(topLevelDescriptorProvider.getPackageFragment(fqName)) + descriptors.addAll(topLevelDescriptorProvider.getTopLevelClassDescriptors(fqName)) + return descriptors } - - }