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();
}
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
throw new IllegalStateException("immutable");
}
@Override
@NotNull
public NamespaceType getNamespaceType() {
@@ -25,7 +25,7 @@ import java.util.Collections;
/**
* @author abreslav
*/
public class ModuleDescriptor extends DeclarationDescriptorImpl implements ClassOrNamespaceDescriptor, NamespaceDescriptorParent, NamespaceLikeBuilder {
public class ModuleDescriptor extends DeclarationDescriptorImpl implements ClassOrNamespaceDescriptor, NamespaceDescriptorParent {
private NamespaceDescriptor rootNs;
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
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
if (namespaceDescriptor.getContainingDeclaration() != this) {
@@ -74,28 +63,4 @@ public class ModuleDescriptor extends DeclarationDescriptorImpl implements Class
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);
}
@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
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor);
@@ -50,7 +50,6 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp
return memberScope;
}
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
return (NamespaceDescriptorImpl) memberScope.getDeclaredNamespace(name);
}
@@ -16,8 +16,13 @@
package org.jetbrains.jet.lang.descriptors;
import org.jetbrains.annotations.NotNull;
/**
* @author Stepan Koltsov
*/
public interface NamespaceDescriptorParent extends DeclarationDescriptor {
void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor);
}
@@ -31,11 +31,6 @@ public interface NamespaceLikeBuilder {
@NotNull
DeclarationDescriptor getOwnerForChildren();
@Nullable
NamespaceDescriptorImpl getNamespace(String name);
void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor);
void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor);
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,
new NamespaceLikeBuilder() {
@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);
new NamespaceLikeBuilderDummy(), owner, files, filesToAnalyzeCompletely, flowDataTraceFactory, configuration);
return bindingTraceContext.getBindingContext();
}
@@ -186,16 +186,6 @@ public class TopDownAnalyzer {
return containingDeclaration;
}
@Override
public NamespaceDescriptorImpl getNamespace(String name) {
throw new UnsupportedOperationException();
}
@Override
public void addNamespace(@NotNull NamespaceDescriptor namespaceDescriptor) {
throw new UnsupportedOperationException();
}
@Override
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
@@ -238,7 +238,7 @@ public class TypeHierarchyResolver {
createNamespaceDescriptorIfNeeded(null, moduleDescriptor, "<root>", true);
}
NamespaceLikeBuilder currentOwner = moduleDescriptor.getRootNs();
NamespaceDescriptorParent currentOwner = moduleDescriptor.getRootNs();
if (currentOwner == null) {
throw new IllegalStateException("must be initialized 5 lines above");
}
@@ -250,7 +250,7 @@ public class TypeHierarchyResolver {
currentOwner = namespaceDescriptor;
context.getTrace().record(REFERENCE_TARGET, nameExpression, currentOwner.getOwnerForChildren());
context.getTrace().record(REFERENCE_TARGET, nameExpression, currentOwner);
context.getTrace().record(RESOLUTION_SCOPE, nameExpression, outerScope);
outerScope = namespaceDescriptor.getMemberScope();
@@ -263,26 +263,26 @@ public class TypeHierarchyResolver {
}
@NotNull
private NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, @NotNull NamespaceLikeBuilder owner, @NotNull String name, boolean root) {
FqName ownerFqName = DescriptorUtils.getFQName(owner.getOwnerForChildren());
private NamespaceDescriptorImpl createNamespaceDescriptorIfNeeded(@Nullable JetFile file, @NotNull NamespaceDescriptorParent owner, @NotNull String name, boolean root) {
FqName fqName;
NamespaceDescriptorImpl namespaceDescriptor;
if (root) {
if (!ownerFqName.equals(FqName.ROOT) || !(owner instanceof ModuleDescriptor)) {
if (!(owner instanceof ModuleDescriptor)) {
throw new IllegalStateException();
}
fqName = FqName.ROOT;
namespaceDescriptor = ((ModuleDescriptor) owner).getRootNs();
}
else {
FqName ownerFqName = DescriptorUtils.getFQName(owner);
fqName = ownerFqName.child(name);
namespaceDescriptor = owner.getNamespace(name);
namespaceDescriptor = ((NamespaceDescriptorImpl) owner).getNamespace(name);
}
if (namespaceDescriptor == null) {
namespaceDescriptor = new NamespaceDescriptorImpl(
(NamespaceDescriptorParent) owner.getOwnerForChildren(),
owner,
Collections.<AnnotationDescriptor>emptyList(), // TODO: annotations
name
);