Refactor additional resolve for reference in packages

This commit is contained in:
Nikolay Krasko
2013-07-12 14:26:46 +04:00
parent c2e8282fb9
commit 51f690ed4d
3 changed files with 36 additions and 9 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor;
import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.name.NameUtils;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.TypeConstructor;
@@ -127,7 +128,8 @@ public class ResolveSessionUtils {
JetNamedFunction.class, JetClassInitializer.class,
JetProperty.class, JetDelegationSpecifierList.class,
JetImportDirective.class, JetAnnotationEntry.class,
JetTypeParameter.class, JetTypeConstraint.class);
JetTypeParameter.class, JetTypeConstraint.class,
JetNamespaceHeader.class);
if (resolveElement != null) {
JetFile file = (JetFile) jetElement.getContainingFile();
@@ -164,6 +166,9 @@ public class ResolveSessionUtils {
typeConstraintAdditionalResolve(resolveSession, jetElement);
return resolveSession.getBindingContext();
}
else if (resolveElement instanceof JetNamespaceHeader) {
namespaceRefAdditionalResolve(resolveSession, (JetNamespaceHeader) resolveElement, trace, jetElement);
}
else {
assert false : "Invalid type of the topmost parent";
}
@@ -171,18 +176,32 @@ public class ResolveSessionUtils {
return trace.getBindingContext();
}
if (jetElement instanceof JetExpression) {
JetExpression jetExpression = (JetExpression) jetElement;
// Setup resolution scope explicitly
if (trace.getBindingContext().get(BindingContext.RESOLUTION_SCOPE, jetExpression) == null) {
JetScope scope = getExpressionMemberScope(resolveSession, jetExpression);
return trace.getBindingContext();
}
private static void namespaceRefAdditionalResolve(
ResolveSession resolveSession,
JetNamespaceHeader header, DelegatingBindingTrace trace, JetElement jetElement
) {
if (jetElement instanceof JetSimpleNameExpression) {
JetSimpleNameExpression packageNameExpression = (JetSimpleNameExpression) jetElement;
if (trace.getBindingContext().get(BindingContext.RESOLUTION_SCOPE, packageNameExpression) == null) {
JetScope scope = getExpressionMemberScope(resolveSession, packageNameExpression);
if (scope != null) {
trace.record(BindingContext.RESOLUTION_SCOPE, jetExpression, scope);
trace.record(BindingContext.RESOLUTION_SCOPE, packageNameExpression, scope);
}
}
Name name = packageNameExpression.getReferencedNameAsName();
if (NameUtils.isValidIdentified(name.asString())) {
if (trace.getBindingContext().get(BindingContext.REFERENCE_TARGET, packageNameExpression) == null) {
FqName fqName = header.getParentFqName(packageNameExpression).child(name);
NamespaceDescriptor packageDescriptor = resolveSession.getPackageDescriptorByFqName(fqName);
assert packageDescriptor != null: "Package descriptor should be present in session for " + fqName;
trace.record(BindingContext.REFERENCE_TARGET, packageNameExpression, packageDescriptor);
}
}
}
return trace.getBindingContext();
}
private static void typeConstraintAdditionalResolve(KotlinCodeAnalyzer analyzer, JetElement jetElement) {
@@ -0,0 +1,3 @@
package test1.test2.<caret>test3.test4
// REF: test3
@@ -71,6 +71,11 @@ public class ReferenceResolveTestGenerated extends AbstractResolveBaseTest {
doTest("idea/testData/resolve/references/CtrlClickResolve.kt");
}
@TestMetadata("PackageReference.kt")
public void testPackageReference() throws Exception {
doTest("idea/testData/resolve/references/PackageReference.kt");
}
@TestMetadata("PackageReferenceInImport.kt")
public void testPackageReferenceInImport() throws Exception {
doTest("idea/testData/resolve/references/PackageReferenceInImport.kt");