diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/AbstractNamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/AbstractNamespaceDescriptorImpl.java index c3f84c70cce..4d3a4550d7a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/AbstractNamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/AbstractNamespaceDescriptorImpl.java @@ -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() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptor.java index 784c4c4f516..63709e62f81 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ModuleDescriptor.java @@ -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(); - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index 80999e39ae0..84d4223d013 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -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); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index 223367e0e5b..17990d263b2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -50,7 +50,6 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp return memberScope; } - @Override public NamespaceDescriptorImpl getNamespace(String name) { return (NamespaceDescriptorImpl) memberScope.getDeclaredNamespace(name); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorParent.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorParent.java index 0f135e97e24..7e1d82c9096 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorParent.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorParent.java @@ -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); + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilder.java index 8aa97ad3c2a..a20e788192e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilder.java @@ -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); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilderDummy.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilderDummy.java new file mode 100644 index 00000000000..c55eb7d8d10 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLikeBuilderDummy.java @@ -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(); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java index 8c428b6a5e8..72e0dc4b142 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java @@ -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(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 8dafa7af641..c61e5e1eee8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -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) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 598c7b502b5..da814eeaa06 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -238,7 +238,7 @@ public class TypeHierarchyResolver { createNamespaceDescriptorIfNeeded(null, moduleDescriptor, "", 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.emptyList(), // TODO: annotations name );