more root ns

This commit is contained in:
Stepan Koltsov
2012-03-14 20:13:55 +04:00
parent 316010be37
commit 76e49f1865
10 changed files with 76 additions and 113 deletions
@@ -44,6 +44,11 @@ public abstract class AbstractNamespaceDescriptorImpl extends DeclarationDescrip
return (NamespaceDescriptorParent) super.getContainingDeclaration(); return (NamespaceDescriptorParent) super.getContainingDeclaration();
} }
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
throw new IllegalStateException("immutable");
}
@Override @Override
@NotNull @NotNull
public NamespaceType getNamespaceType() { public NamespaceType getNamespaceType() {
@@ -25,7 +25,7 @@ import java.util.Collections;
/** /**
* @author abreslav * @author abreslav
*/ */
public class ModuleDescriptor extends DeclarationDescriptorImpl implements ClassOrNamespaceDescriptor, NamespaceDescriptorParent, NamespaceLikeBuilder { public class ModuleDescriptor extends DeclarationDescriptorImpl implements ClassOrNamespaceDescriptor, NamespaceDescriptorParent {
private NamespaceDescriptor rootNs; private NamespaceDescriptor rootNs;
public ModuleDescriptor(String name) { public ModuleDescriptor(String name) {
@@ -55,17 +55,6 @@ public class ModuleDescriptor extends DeclarationDescriptorImpl implements Class
} }
@NotNull
@Override
public DeclarationDescriptor getOwnerForChildren() {
return this;
}
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
throw new IllegalStateException();
}
@Override @Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) { public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
if (namespaceDescriptor.getContainingDeclaration() != this) { if (namespaceDescriptor.getContainingDeclaration() != this) {
@@ -74,28 +63,4 @@ public class ModuleDescriptor extends DeclarationDescriptorImpl implements Class
setRootNs(namespaceDescriptor); setRootNs(namespaceDescriptor);
} }
@Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
throw new IllegalStateException();
}
@Override
public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) {
throw new IllegalStateException();
}
@Override
public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
throw new IllegalStateException();
}
@Override
public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
throw new IllegalStateException();
}
@Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
throw new IllegalStateException();
}
} }
@@ -261,16 +261,6 @@ public class MutableClassDescriptorLite extends MutableDeclarationDescriptor imp
getScopeForMemberLookupAsWritableScope().addFunctionDescriptor(functionDescriptor); getScopeForMemberLookupAsWritableScope().addFunctionDescriptor(functionDescriptor);
} }
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
throw new UnsupportedOperationException("Classes do not define namespaces");
}
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
throw new UnsupportedOperationException("Classes do not define namespaces");
}
@Override @Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor); getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor);
@@ -50,7 +50,6 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp
return memberScope; return memberScope;
} }
@Override
public NamespaceDescriptorImpl getNamespace(String name) { public NamespaceDescriptorImpl getNamespace(String name) {
return (NamespaceDescriptorImpl) memberScope.getDeclaredNamespace(name); return (NamespaceDescriptorImpl) memberScope.getDeclaredNamespace(name);
} }
@@ -16,8 +16,13 @@
package org.jetbrains.jet.lang.descriptors; package org.jetbrains.jet.lang.descriptors;
import org.jetbrains.annotations.NotNull;
/** /**
* @author Stepan Koltsov * @author Stepan Koltsov
*/ */
public interface NamespaceDescriptorParent extends DeclarationDescriptor { public interface NamespaceDescriptorParent extends DeclarationDescriptor {
void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor);
} }
@@ -31,11 +31,6 @@ public interface NamespaceLikeBuilder {
@NotNull @NotNull
DeclarationDescriptor getOwnerForChildren(); DeclarationDescriptor getOwnerForChildren();
@Nullable
NamespaceDescriptorImpl getNamespace(String name);
void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor);
void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor); void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor);
void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor); void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor);
@@ -0,0 +1,55 @@
/*
* Copyright 2010-2012 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.descriptors;
import org.jetbrains.annotations.NotNull;
/**
* @author Stepan Koltsov
*/
public class NamespaceLikeBuilderDummy implements NamespaceLikeBuilder {
@NotNull
@Override
public DeclarationDescriptor getOwnerForChildren() {
throw new IllegalStateException();
}
@Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
throw new IllegalStateException();
}
@Override
public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) {
throw new IllegalStateException();
}
@Override
public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
throw new IllegalStateException();
}
@Override
public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
throw new IllegalStateException();
}
@Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
throw new IllegalStateException();
}
}
@@ -135,51 +135,10 @@ public class AnalyzingUtils {
} }
}); });
// dummy builder is used because "root" is module descriptor,
// namespaces added to module explicitly in
TopDownAnalyzer.process(project, bindingTraceContext, scope, TopDownAnalyzer.process(project, bindingTraceContext, scope,
new NamespaceLikeBuilder() { new NamespaceLikeBuilderDummy(), owner, files, filesToAnalyzeCompletely, flowDataTraceFactory, configuration);
@NotNull
@Override
public DeclarationDescriptor getOwnerForChildren() {
return owner;
}
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
return (NamespaceDescriptorImpl) scope.getDeclaredNamespace(name);
}
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
scope.addNamespace(namespaceDescriptor);
}
@Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
throw new IllegalStateException("A class shouldn't sit right under a module: " + classDescriptor);
}
@Override
public void addObjectDescriptor(@NotNull MutableClassDescriptorLite objectDescriptor) {
throw new IllegalStateException("An object shouldn't sit right under a module: " + objectDescriptor);
}
@Override
public void addFunctionDescriptor(@NotNull SimpleFunctionDescriptor functionDescriptor) {
throw new IllegalStateException("A function shouldn't sit right under a module: " + functionDescriptor);
}
@Override
public void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor) {
throw new IllegalStateException("A property shouldn't sit right under a module: " + propertyDescriptor);
}
@Override
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptorLite classObjectDescriptor) {
throw new IllegalStateException("Must be guaranteed not to happen by the parser");
}
}, owner,
files, filesToAnalyzeCompletely, flowDataTraceFactory, configuration);
return bindingTraceContext.getBindingContext(); return bindingTraceContext.getBindingContext();
} }
@@ -186,16 +186,6 @@ public class TopDownAnalyzer {
return containingDeclaration; return containingDeclaration;
} }
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
throw new UnsupportedOperationException();
}
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
throw new UnsupportedOperationException();
}
@Override @Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
@@ -238,7 +238,7 @@ public class TypeHierarchyResolver {
createNamespaceDescriptorIfNeeded(null, moduleDescriptor, "<root>", true); createNamespaceDescriptorIfNeeded(null, moduleDescriptor, "<root>", true);
} }
NamespaceLikeBuilder currentOwner = moduleDescriptor.getRootNs(); NamespaceDescriptorParent currentOwner = moduleDescriptor.getRootNs();
if (currentOwner == null) { if (currentOwner == null) {
throw new IllegalStateException("must be initialized 5 lines above"); throw new IllegalStateException("must be initialized 5 lines above");
} }
@@ -250,7 +250,7 @@ public class TypeHierarchyResolver {
currentOwner = namespaceDescriptor; currentOwner = namespaceDescriptor;
context.getTrace().record(REFERENCE_TARGET, nameExpression, currentOwner.getOwnerForChildren()); context.getTrace().record(REFERENCE_TARGET, nameExpression, currentOwner);
context.getTrace().record(RESOLUTION_SCOPE, nameExpression, outerScope); context.getTrace().record(RESOLUTION_SCOPE, nameExpression, outerScope);
outerScope = namespaceDescriptor.getMemberScope(); outerScope = namespaceDescriptor.getMemberScope();
@@ -263,26 +263,26 @@ public class TypeHierarchyResolver {
} }
@NotNull @NotNull
private NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, @NotNull NamespaceLikeBuilder owner, @NotNull String name, boolean root) { private NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, @NotNull NamespaceDescriptorParent owner, @NotNull String name, boolean root) {
FqName ownerFqName = DescriptorUtils.getFQName(owner.getOwnerForChildren());
FqName fqName; FqName fqName;
NamespaceDescriptorImpl namespaceDescriptor; NamespaceDescriptorImpl namespaceDescriptor;
if (root) { if (root) {
if (!ownerFqName.equals(FqName.ROOT) || !(owner instanceof ModuleDescriptor)) { if (!(owner instanceof ModuleDescriptor)) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
fqName = FqName.ROOT; fqName = FqName.ROOT;
namespaceDescriptor = ((ModuleDescriptor) owner).getRootNs(); namespaceDescriptor = ((ModuleDescriptor) owner).getRootNs();
} }
else { else {
FqName ownerFqName = DescriptorUtils.getFQName(owner);
fqName = ownerFqName.child(name); fqName = ownerFqName.child(name);
namespaceDescriptor = owner.getNamespace(name); namespaceDescriptor = ((NamespaceDescriptorImpl) owner).getNamespace(name);
} }
if (namespaceDescriptor == null) { if (namespaceDescriptor == null) {
namespaceDescriptor = new NamespaceDescriptorImpl( namespaceDescriptor = new NamespaceDescriptorImpl(
(NamespaceDescriptorParent) owner.getOwnerForChildren(), owner,
Collections.<AnnotationDescriptor>emptyList(), // TODO: annotations Collections.<AnnotationDescriptor>emptyList(), // TODO: annotations
name name
); );