From 8ad5db5bd92e924a599eaf6cdfcf49d6587e3133 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 24 Mar 2012 20:36:43 +0400 Subject: [PATCH] Fix KT-1639: extend JFrame #KT-1639 Fixed --- .../resolve/java/JavaDescriptorResolver.java | 55 +++++++++++++------ .../java/JavaDescriptorResolverHelper.java | 9 +-- .../tests/regressions/kt1639-JFrame.jet | 9 +++ 3 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.jet diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 03ebd7ec9ec..ccb75ede668 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1081,25 +1081,12 @@ public class JavaDescriptorResolver { Map membersForProperties = scopeData.namedMembersMap; for (Map.Entry entry : membersForProperties.entrySet()) { NamedMembers namedMembers = entry.getValue(); - if (namedMembers.propertyAccessors == null) { - continue; - } - String propertyName = entry.getKey(); resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName, "class or namespace " + psiClass.getQualifiedName()); descriptors.addAll(namedMembers.propertyDescriptors); } - for (JetType supertype : getSupertypes(scopeData)) { - for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) { - // TODO: ugly - if (descriptor instanceof VariableDescriptor) { - descriptors.add((VariableDescriptor) descriptor); - } - } - } - return descriptors; } @@ -1142,8 +1129,7 @@ public class JavaDescriptorResolver { } if (namedMembers.propertyAccessors == null) { - namedMembers.propertyDescriptors = Collections.emptySet(); - return; + namedMembers.propertyAccessors = Collections.emptyList(); } TypeVariableResolver typeVariableResolver = TypeVariableResolvers.classTypeVariableResolver(owner, context); @@ -1193,7 +1179,7 @@ public class JavaDescriptorResolver { } - Set r = new HashSet(1); + Set propertiesFromCurrent = new HashSet(1); int regularProperitesCount = 0; for (GroupingValue members : map.values()) { @@ -1324,10 +1310,33 @@ public class JavaDescriptorResolver { trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor); - r.add(propertyDescriptor); + propertiesFromCurrent.add(propertyDescriptor); } - namedMembers.propertyDescriptors = r; + + Set propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName); + + final Set properties = Sets.newHashSet(); + + if (owner instanceof ClassDescriptor) { + ClassDescriptor classDescriptor = (ClassDescriptor) owner; + + OverrideResolver.generateOverridesInFunctionGroup(propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() { + @Override + public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { + properties.add((PropertyDescriptor) fakeOverride); + } + + @Override + public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) { + // nop + } + }); + } + + properties.addAll(propertiesFromCurrent); + + namedMembers.propertyDescriptors = properties; } private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) { @@ -1380,6 +1389,16 @@ public class JavaDescriptorResolver { return r; } + private Set getPropertiesFromSupertypes(ResolverScopeData scopeData, String propertyName) { + Set r = new HashSet(); + for (JetType supertype : getSupertypes(scopeData)) { + for (VariableDescriptor property : supertype.getMemberScope().getProperties(propertyName)) { + r.add((PropertyDescriptor) property); + } + } + return r; + } + private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) { // TODO: store scopeData in Java*Scope ResolverScopeData scopeData; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java index b72d55ab414..b619ee8f2ea 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java @@ -81,15 +81,16 @@ class JavaDescriptorResolverHelper { private void processFields() { if (!kotlin) { - for (PsiField field0 : psiClass.getPsiClass().getFields()) { + for (PsiField field0 : psiClass.getPsiClass().getAllFields()) { PsiFieldWrapper field = new PsiFieldWrapper(field0); - + + // group must be created even for excluded field + NamedMembers namedMembers = getNamedMembers(field.getName()); + if (!includeMember(field)) { continue; } - NamedMembers namedMembers = getNamedMembers(field.getName()); - TypeSource type = new TypeSource("", field.getType(), field0); namedMembers.addPropertyAccessor(new PropertyAccessorData(field, type, null)); } diff --git a/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.jet b/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.jet new file mode 100644 index 00000000000..e2430bb729a --- /dev/null +++ b/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.jet @@ -0,0 +1,9 @@ +package test + +import javax.swing.JFrame + +class KFrame() : JFrame() { + { + val x = this.accessibleContext // make sure field is visible + } +}