Support data class componentN functions in lazy resolve
Lazy resolve LoadKotlin test class regenerated. No new diagnostic tests (run lazy resolve diagnostic test generator for this purpose). #KT-2628 Fixed
This commit is contained in:
+48
-2
@@ -29,7 +29,9 @@ import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
||||
import org.jetbrains.jet.lang.types.DeferredType;
|
||||
import org.jetbrains.jet.lang.types.ErrorUtils;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
import org.jetbrains.jet.util.lazy.LazyValue;
|
||||
|
||||
import java.util.*;
|
||||
@@ -144,14 +146,39 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
}
|
||||
generateDelegatingDescriptors(name, MemberExtractor.EXTRACT_FUNCTIONS, result);
|
||||
generateEnumClassObjectMethods(result, name);
|
||||
generateDataClassMethods(result, name);
|
||||
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
|
||||
}
|
||||
|
||||
private void generateDataClassMethods(@NotNull Collection<FunctionDescriptor> result, @NotNull Name name) {
|
||||
if (!JetStandardLibrary.isData(thisDescriptor)) return;
|
||||
|
||||
ConstructorDescriptor constructor = getPrimaryConstructor();
|
||||
if (constructor == null) return;
|
||||
|
||||
int parameterIndex = 0;
|
||||
for (ValueParameterDescriptor parameter : constructor.getValueParameters()) {
|
||||
if (ErrorUtils.isErrorType(parameter.getType())) continue;
|
||||
Set<VariableDescriptor> properties = getProperties(parameter.getName());
|
||||
if (properties.isEmpty()) continue;
|
||||
assert properties.size() == 1 : "A constructor parameter is resolved to more than one (" + properties.size() + ") property: " + parameter;
|
||||
PropertyDescriptor property = (PropertyDescriptor) properties.iterator().next();
|
||||
if (property == null) continue;
|
||||
++parameterIndex;
|
||||
|
||||
if (name.equals(Name.identifier(DescriptorResolver.COMPONENT_FUNCTION_NAME_PREFIX + parameterIndex))) {
|
||||
SimpleFunctionDescriptor functionDescriptor =
|
||||
DescriptorResolver.createComponentFunctionDescriptor(parameterIndex, property,
|
||||
parameter, thisDescriptor, resolveSession.getTrace());
|
||||
result.add(functionDescriptor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void generateEnumClassObjectMethods(@NotNull Collection<? super FunctionDescriptor> result, @NotNull Name name) {
|
||||
if (!isEnumClassObject()) return;
|
||||
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) thisDescriptor.getContainingDeclaration();
|
||||
|
||||
if (name.equals(DescriptorResolver.VALUES_METHOD_NAME)) {
|
||||
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
|
||||
.createEnumClassObjectValuesMethod(thisDescriptor, resolveSession.getTrace());
|
||||
@@ -245,6 +272,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addExtraDescriptors() {
|
||||
for (JetType supertype : thisDescriptor.getTypeConstructor().getSupertypes()) {
|
||||
@@ -261,6 +289,24 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
|
||||
getFunctions(DescriptorResolver.VALUES_METHOD_NAME);
|
||||
getFunctions(DescriptorResolver.VALUE_OF_METHOD_NAME);
|
||||
|
||||
addDataClassMethods();
|
||||
}
|
||||
|
||||
private void addDataClassMethods() {
|
||||
if (!JetStandardLibrary.isData(thisDescriptor)) return;
|
||||
|
||||
ConstructorDescriptor constructor = getPrimaryConstructor();
|
||||
if (constructor == null) return;
|
||||
|
||||
// Generate componentN functions until there's no such function for some n
|
||||
int n = 1;
|
||||
while (true) {
|
||||
Name componentName = Name.identifier(DescriptorResolver.COMPONENT_FUNCTION_NAME_PREFIX + n);
|
||||
Set<FunctionDescriptor> functions = getFunctions(componentName);
|
||||
if (functions.isEmpty()) break;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+45
-1
@@ -30,7 +30,7 @@ import org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparing
|
||||
@InnerTestClasses({LazyResolveNamespaceComparingTestGenerated.LoadKotlin.class, LazyResolveNamespaceComparingTestGenerated.LoadJava.class, LazyResolveNamespaceComparingTestGenerated.NamespaceComparator.class})
|
||||
public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest {
|
||||
@TestMetadata("compiler/testData/loadKotlin")
|
||||
@InnerTestClasses({LoadKotlin.Class.class, LoadKotlin.ClassFun.class, LoadKotlin.ClassObject.class, LoadKotlin.Constructor.class, LoadKotlin.Fun.class, LoadKotlin.Prop.class, LoadKotlin.Type.class, LoadKotlin.Visibility.class})
|
||||
@InnerTestClasses({LoadKotlin.Class.class, LoadKotlin.ClassFun.class, LoadKotlin.ClassObject.class, LoadKotlin.Constructor.class, LoadKotlin.DataClass.class, LoadKotlin.Fun.class, LoadKotlin.Prop.class, LoadKotlin.Type.class, LoadKotlin.Visibility.class})
|
||||
public static class LoadKotlin extends AbstractLazyResolveNamespaceComparingTest {
|
||||
public void testAllFilesPresentInLoadKotlin() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/loadKotlin"), "kt", true);
|
||||
@@ -268,6 +268,49 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/loadKotlin/dataClass")
|
||||
public static class DataClass extends AbstractLazyResolveNamespaceComparingTest {
|
||||
public void testAllFilesPresentInDataClass() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/loadKotlin/dataClass"), "kt", true);
|
||||
}
|
||||
|
||||
@TestMetadata("MixedComponents.kt")
|
||||
public void testMixedComponents() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/MixedComponents.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("NoComponents.kt")
|
||||
public void testNoComponents() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/NoComponents.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("OneVal.kt")
|
||||
public void testOneVal() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/OneVal.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("OpenDataClass.kt")
|
||||
public void testOpenDataClass() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/OpenDataClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("OpenPropertyFinalComponent.kt")
|
||||
public void testOpenPropertyFinalComponent() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/OpenPropertyFinalComponent.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("TwoVals.kt")
|
||||
public void testTwoVals() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/TwoVals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("TwoVars.kt")
|
||||
public void testTwoVars() throws Exception {
|
||||
doTestSinglePackage("compiler/testData/loadKotlin/dataClass/TwoVars.kt");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/loadKotlin/fun")
|
||||
@InnerTestClasses({Fun.GenericWithTypeVariables.class, Fun.GenericWithoutTypeVariables.class, Fun.NonGeneric.class})
|
||||
public static class Fun extends AbstractLazyResolveNamespaceComparingTest {
|
||||
@@ -850,6 +893,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
|
||||
suite.addTestSuite(ClassFun.class);
|
||||
suite.addTestSuite(ClassObject.class);
|
||||
suite.addTestSuite(Constructor.class);
|
||||
suite.addTestSuite(DataClass.class);
|
||||
suite.addTest(Fun.innerSuite());
|
||||
suite.addTestSuite(Prop.class);
|
||||
suite.addTestSuite(Type.class);
|
||||
|
||||
Reference in New Issue
Block a user