Skip to content

Commit 29bc36b

Browse files
committed
Merge pull request JetBrains#109 from udalov/kt2438
KT-2438 Prohibit inner classes with the same name
2 parents 0b6166a + 4712dd7 commit 29bc36b

File tree

13 files changed

+101
-25
lines changed

13 files changed

+101
-25
lines changed

compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase
4343

4444
private List<TypeParameterDescriptor> typeParameters;
4545
private Collection<JetType> supertypes = Lists.newArrayList();
46-
private final Collection<ClassDescriptor> innerClasses = Lists.newArrayList();
4746

4847
private TypeConstructor typeConstructor;
4948

@@ -210,10 +209,6 @@ public JetScope getUnsubstitutedInnerClassesScope() {
210209
return innerClassesScope;
211210
}
212211

213-
public Collection<ClassDescriptor> getInnerClasses() {
214-
return innerClasses;
215-
}
216-
217212

218213
public void addSupertype(@NotNull JetType supertype) {
219214
if (!ErrorUtils.isErrorType(supertype)) {
@@ -281,7 +276,6 @@ public DeclarationDescriptor getOwnerForChildren() {
281276
@Override
282277
public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) {
283278
getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor);
284-
innerClasses.add(classDescriptor);
285279
}
286280

287281
@Override

compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,10 @@ public PropertyDescriptor getPropertyByFieldReference(@NotNull Name fieldName) {
107107
public Collection<DeclarationDescriptor> getAllDescriptors() {
108108
return getWorkerScope().getAllDescriptors();
109109
}
110+
111+
@NotNull
112+
@Override
113+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
114+
return getWorkerScope().getOwnDeclaredDescriptors();
115+
}
110116
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.google.common.base.Function;
2020
import com.google.common.base.Predicate;
2121
import com.google.common.collect.Collections2;
22+
import com.google.common.collect.HashMultimap;
23+
import com.google.common.collect.Lists;
2224
import com.google.common.collect.Multimap;
2325
import com.intellij.psi.PsiElement;
2426
import org.jetbrains.annotations.NotNull;
@@ -93,7 +95,7 @@ public void process(@NotNull JetScope rootScope) {
9395
resolveFunctionAndPropertyHeaders();
9496
importsResolver.processMembersImports(rootScope);
9597
checkRedeclarationsInNamespaces();
96-
checkClassObjectInnerClassNames();
98+
checkRedeclarationsInInnerClassNames();
9799
}
98100

99101

@@ -300,22 +302,31 @@ public PsiElement apply(@Nullable JetFile file) {
300302
return declarations;
301303
}
302304

303-
private void checkClassObjectInnerClassNames() {
305+
private void checkRedeclarationsInInnerClassNames() {
304306
for (MutableClassDescriptor classDescriptor : context.getClasses().values()) {
307+
Collection<DeclarationDescriptor> allDescriptors = classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors();
308+
305309
MutableClassDescriptorLite classObj = classDescriptor.getClassObjectDescriptor();
306-
if (classObj == null) {
307-
continue;
310+
if (classObj != null) {
311+
Collection<DeclarationDescriptor> classObjDescriptors = classObj.getScopeForMemberLookup().getOwnDeclaredDescriptors();
312+
if (!classObjDescriptors.isEmpty()) {
313+
allDescriptors = Lists.newArrayList(allDescriptors);
314+
allDescriptors.addAll(classObjDescriptors);
315+
}
308316
}
309317

310-
Collection<ClassDescriptor> myInnerClasses = classDescriptor.getInnerClasses();
311-
Collection<ClassDescriptor> classObjInnerClasses = classObj.getInnerClasses();
318+
Multimap<Name, DeclarationDescriptor> descriptorMap = HashMultimap.create();
319+
for (DeclarationDescriptor desc : allDescriptors) {
320+
if (desc instanceof ClassDescriptor) {
321+
descriptorMap.put(desc.getName(), desc);
322+
}
323+
}
312324

313-
for (ClassDescriptor myInnerClass : myInnerClasses) {
314-
for (ClassDescriptor classObjInnerClass : classObjInnerClasses) {
315-
if (myInnerClass.getName().equals(classObjInnerClass.getName())) {
316-
trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), myInnerClass), myInnerClass.getName().getName()));
317-
trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), classObjInnerClass), classObjInnerClass.getName().getName()));
318-
break;
325+
for (Name name : descriptorMap.keySet()) {
326+
Collection<DeclarationDescriptor> descriptors = descriptorMap.get(name);
327+
if (descriptors.size() > 1) {
328+
for (DeclarationDescriptor descriptor : descriptors) {
329+
trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), (ClassDescriptor)descriptor), descriptor.getName().getName()));
319330
}
320331
}
321332
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,10 @@ public void getImplicitReceiversHierarchy(@NotNull List<ReceiverDescriptor> resu
260260
// a generic implementation can't do this properly
261261
@Override
262262
public abstract String toString();
263+
264+
@NotNull
265+
@Override
266+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
267+
return getAllDescriptors();
268+
}
263269
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,10 @@ public Collection<DeclarationDescriptor> getAllDescriptors() {
166166
}
167167
return allDescriptors;
168168
}
169+
170+
@NotNull
171+
@Override
172+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
173+
throw new UnsupportedOperationException();
174+
}
169175
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/InnerClassesScopeWrapper.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.jetbrains.jet.lang.descriptors.ClassKind;
2525
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
2626
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
27+
import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter;
2728
import org.jetbrains.jet.lang.resolve.name.LabelName;
2829
import org.jetbrains.jet.lang.resolve.name.Name;
2930
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
@@ -34,13 +35,19 @@
3435
/**
3536
* @author svtk
3637
*/
37-
public class InnerClassesScopeWrapper extends JetScopeImpl {
38+
public class InnerClassesScopeWrapper extends AbstractScopeAdapter {
3839
private final JetScope actualScope;
3940

4041
public InnerClassesScopeWrapper(JetScope actualScope) {
4142
this.actualScope = actualScope;
4243
}
4344

45+
@NotNull
46+
@Override
47+
protected JetScope getWorkerScope() {
48+
return actualScope;
49+
}
50+
4451
private boolean isClass(DeclarationDescriptor descriptor) {
4552
return descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.OBJECT;
4653
}
@@ -52,12 +59,6 @@ public ClassifierDescriptor getClassifier(@NotNull Name name) {
5259
return null;
5360
}
5461

55-
@NotNull
56-
@Override
57-
public DeclarationDescriptor getContainingDeclaration() {
58-
return actualScope.getContainingDeclaration();
59-
}
60-
6162
@NotNull
6263
@Override
6364
public Collection<DeclarationDescriptor> getDeclarationsByLabel(LabelName labelName) {

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,7 @@ public String toString() {
9797
* @param result
9898
*/
9999
void getImplicitReceiversHierarchy(@NotNull List<ReceiverDescriptor> result);
100+
101+
@NotNull
102+
Collection<DeclarationDescriptor> getOwnDeclaredDescriptors();
100103
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,10 @@ public Collection<DeclarationDescriptor> getAllDescriptors() {
9595
@Override
9696
public void getImplicitReceiversHierarchy(@NotNull List<ReceiverDescriptor> result) {
9797
}
98+
99+
@NotNull
100+
@Override
101+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
102+
return Collections.emptyList();
103+
}
98104
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,10 @@ public Collection<DeclarationDescriptor> getAllDescriptors() {
162162
}
163163
return allDescriptors;
164164
}
165+
166+
@NotNull
167+
@Override
168+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
169+
return substitute(workerScope.getOwnDeclaredDescriptors());
170+
}
165171
}

compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,4 +533,10 @@ private void addToDeclared(DeclarationDescriptor descriptor) {
533533
public Multimap<Name, DeclarationDescriptor> getDeclaredDescriptorsAccessibleBySimpleName() {
534534
return declaredDescriptorsAccessibleBySimpleName;
535535
}
536+
537+
@NotNull
538+
@Override
539+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
540+
return declaredDescriptorsAccessibleBySimpleName.values();
541+
}
536542
}

compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ public Collection<DeclarationDescriptor> getAllDescriptors() {
116116
return Collections.emptyList();
117117
}
118118

119+
@NotNull
120+
@Override
121+
public Collection<DeclarationDescriptor> getOwnDeclaredDescriptors() {
122+
return Collections.emptyList();
123+
}
119124
}
120125

121126
private static final ClassDescriptorImpl ERROR_CLASS = new ClassDescriptorImpl(ERROR_MODULE, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Name.special("<ERROR CLASS>")) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//KT-2438 Prohibit inner classes with the same name
2+
3+
package kt2438
4+
5+
class B {
6+
class <!REDECLARATION!>C<!>
7+
class <!REDECLARATION!>C<!>
8+
}
9+
10+
11+
12+
class A {
13+
class <!REDECLARATION!>B<!>
14+
15+
class object {
16+
class <!REDECLARATION!>B<!>
17+
class <!REDECLARATION!>B<!>
18+
}
19+
20+
class <!REDECLARATION!>B<!>
21+
}

compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,11 @@ public void testKt2247() throws Exception {
19001900
doTest("compiler/testData/diagnostics/tests/redeclarations/kt2247.kt");
19011901
}
19021902

1903+
@TestMetadata("kt2438.kt")
1904+
public void testKt2438() throws Exception {
1905+
doTest("compiler/testData/diagnostics/tests/redeclarations/kt2438.kt");
1906+
}
1907+
19031908
@TestMetadata("MultiFilePackageRedeclaration.kt")
19041909
public void testMultiFilePackageRedeclaration() throws Exception {
19051910
doTest("compiler/testData/diagnostics/tests/redeclarations/MultiFilePackageRedeclaration.kt");

0 commit comments

Comments
 (0)