Checking primary flag in constructors loaded from Java.

This commit is contained in:
Evgeny Gerashchenko
2012-12-17 20:42:07 +04:00
parent 7fcbb3d563
commit 1ab555a51b
6 changed files with 371 additions and 350 deletions
@@ -50,6 +50,7 @@ public abstract class AbstractLoadCompiledKotlinTest extends TestCaseWithTmpdir
Assert.assertEquals("test", namespaceFromSource.getName().getName()); Assert.assertEquals("test", namespaceFromSource.getName().getName());
NamespaceDescriptor namespaceFromClass = LoadDescriptorUtil.loadTestNamespaceAndBindingContextFromBinaries( NamespaceDescriptor namespaceFromClass = LoadDescriptorUtil.loadTestNamespaceAndBindingContextFromBinaries(
tmpdir, getTestRootDisposable(), ConfigurationKind.JDK_ONLY).first; tmpdir, getTestRootDisposable(), ConfigurationKind.JDK_ONLY).first;
compareNamespaces(namespaceFromSource, namespaceFromClass, NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT, txtFile); compareNamespaces(namespaceFromSource, namespaceFromClass,
NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT.checkPrimaryConstructors(true), txtFile);
} }
} }
@@ -57,7 +57,7 @@ public final class LoadKotlinCustomTest extends TestCaseWithTmpdir {
NamespaceDescriptor namespaceFromSource = exhaust.getBindingContext().get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, NamespaceDescriptor namespaceFromSource = exhaust.getBindingContext().get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR,
TEST_PACKAGE_FQNAME); TEST_PACKAGE_FQNAME);
assert namespaceFromSource != null; assert namespaceFromSource != null;
compareNamespaces(namespaceFromSource, namespaceFromSource, NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT, compareNamespaces(namespaceFromSource, namespaceFromSource, NamespaceComparator.DONT_INCLUDE_METHODS_OF_OBJECT.checkPrimaryConstructors(true),
expectedFile); expectedFile);
} }
@@ -42,9 +42,15 @@ public abstract class AbstractLazyResolveNamespaceComparingTest extends KotlinTe
return createEnvironmentWithMockJdk(ConfigurationKind.JDK_AND_ANNOTATIONS); return createEnvironmentWithMockJdk(ConfigurationKind.JDK_AND_ANNOTATIONS);
} }
private void doTest( protected void doTestCheckingConstructors(String testFileName) throws IOException {
String testFileName doTest(testFileName, true);
) throws IOException { }
protected void doTestNotCheckingConstructors(String testFileName) throws IOException {
doTest(testFileName, false);
}
private void doTest(String testFileName, boolean checkPrimaryConstructors) throws IOException {
List<JetFile> files = JetTestUtils List<JetFile> files = JetTestUtils
.createTestFiles(testFileName, FileUtil.loadFile(new File(testFileName), true), .createTestFiles(testFileName, FileUtil.loadFile(new File(testFileName), true),
new JetTestUtils.TestFileFactory<JetFile>() { new JetTestUtils.TestFileFactory<JetFile>() {
@@ -69,10 +75,6 @@ public abstract class AbstractLazyResolveNamespaceComparingTest extends KotlinTe
public boolean apply(NamespaceDescriptor namespaceDescriptor) { public boolean apply(NamespaceDescriptor namespaceDescriptor) {
return !namespaceDescriptor.getName().equals(Name.identifier("jet")); return !namespaceDescriptor.getName().equals(Name.identifier("jet"));
} }
}), serializeResultsTo); }).checkPrimaryConstructors(checkPrimaryConstructors), serializeResultsTo);
}
protected void doTestSinglePackage(String testFileName) throws Exception {
doTest(testFileName);
} }
} }
@@ -88,28 +88,39 @@ public class NamespaceComparator {
return serialized; return serialized;
} }
public static final Configuration DONT_INCLUDE_METHODS_OF_OBJECT = new Configuration(false, Predicates.<FqNameUnsafe>alwaysTrue(), Predicates.<NamespaceDescriptor>alwaysTrue()); public static final Configuration DONT_INCLUDE_METHODS_OF_OBJECT = new Configuration(false, false, Predicates.<FqNameUnsafe>alwaysTrue(), Predicates.<NamespaceDescriptor>alwaysTrue());
public static final Configuration RECURSIVE = new Configuration(true, Predicates.<FqNameUnsafe>alwaysTrue(), Predicates.<NamespaceDescriptor>alwaysTrue()); public static final Configuration RECURSIVE = new Configuration(false, true, Predicates.<FqNameUnsafe>alwaysTrue(), Predicates.<NamespaceDescriptor>alwaysTrue());
public static final Configuration NON_RECURSIVE = new Configuration(true, Predicates.<FqNameUnsafe>alwaysFalse(), Predicates.<NamespaceDescriptor>alwaysTrue()); public static final Configuration NON_RECURSIVE = new Configuration(false, true, Predicates.<FqNameUnsafe>alwaysFalse(), Predicates.<NamespaceDescriptor>alwaysTrue());
public static class Configuration { public static class Configuration {
private final boolean checkPrimaryConstructors;
private final boolean includeObject; private final boolean includeObject;
private final Predicate<FqNameUnsafe> recurseIntoPackage; private final Predicate<FqNameUnsafe> recurseIntoPackage;
private final Predicate<NamespaceDescriptor> includeIntoOutput; private final Predicate<NamespaceDescriptor> includeIntoOutput;
public Configuration(boolean includeObject, Predicate<FqNameUnsafe> recurseIntoPackage, Predicate<NamespaceDescriptor> includeIntoOutput) { public Configuration(
boolean checkPrimaryConstructors,
boolean includeObject,
Predicate<FqNameUnsafe> recurseIntoPackage,
Predicate<NamespaceDescriptor> includeIntoOutput
) {
this.checkPrimaryConstructors = checkPrimaryConstructors;
this.includeObject = includeObject; this.includeObject = includeObject;
this.recurseIntoPackage = recurseIntoPackage; this.recurseIntoPackage = recurseIntoPackage;
this.includeIntoOutput = includeIntoOutput; this.includeIntoOutput = includeIntoOutput;
} }
public Configuration filterOutput(@NotNull Predicate<NamespaceDescriptor> includeIntoOutput) { public Configuration filterOutput(@NotNull Predicate<NamespaceDescriptor> includeIntoOutput) {
return new Configuration(includeObject, recurseIntoPackage, includeIntoOutput); return new Configuration(checkPrimaryConstructors, includeObject, recurseIntoPackage, includeIntoOutput);
} }
public Configuration filterRecusion(@NotNull Predicate<FqNameUnsafe> recurseIntoPackage) { public Configuration filterRecusion(@NotNull Predicate<FqNameUnsafe> recurseIntoPackage) {
return new Configuration(includeObject, recurseIntoPackage, includeIntoOutput); return new Configuration(checkPrimaryConstructors, includeObject, recurseIntoPackage, includeIntoOutput);
}
public Configuration checkPrimaryConstructors(boolean checkPrimaryConstructors) {
return new Configuration(checkPrimaryConstructors, includeObject, recurseIntoPackage, includeIntoOutput);
} }
} }
@@ -218,11 +229,11 @@ public class NamespaceComparator {
sb.append(at); sb.append(at);
} }
private static String serializedDeclarationSets(Collection<? extends DeclarationDescriptor> ds) { private String serializedDeclarationSets(Collection<? extends DeclarationDescriptor> ds) {
List<String> strings = new ArrayList<String>(); List<String> strings = new ArrayList<String>();
for (DeclarationDescriptor d : ds) { for (DeclarationDescriptor d : ds) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
new Serializer(sb).serialize(d); new Serializer(conf.checkPrimaryConstructors, sb).serialize(d);
strings.add(sb.toString()); strings.add(sb.toString());
} }
@@ -262,8 +273,8 @@ public class NamespaceComparator {
StringBuilder sba = new StringBuilder(); StringBuilder sba = new StringBuilder();
StringBuilder sbb = new StringBuilder(); StringBuilder sbb = new StringBuilder();
new FullContentSerialier(sba).serialize((ClassDescriptor) a); new FullContentSerialier(conf.checkPrimaryConstructors, sba).serialize((ClassDescriptor) a);
new FullContentSerialier(sbb).serialize((ClassDescriptor) b); new FullContentSerialier(conf.checkPrimaryConstructors, sbb).serialize((ClassDescriptor) b);
String as = sba.toString(); String as = sba.toString();
String bs = sbb.toString(); String bs = sbb.toString();
@@ -332,10 +343,12 @@ public class NamespaceComparator {
private static final MethodCache SERIALIZER_METHOD_CACHE = new MethodCache(Serializer.class); private static final MethodCache SERIALIZER_METHOD_CACHE = new MethodCache(Serializer.class);
protected final boolean checkPrimaryConstructors;
protected final StringBuilder sb; protected final StringBuilder sb;
public Serializer(StringBuilder sb) { public Serializer(boolean checkPrimaryConstructors, StringBuilder sb) {
this.checkPrimaryConstructors = checkPrimaryConstructors;
this.sb = sb; this.sb = sb;
} }
@@ -406,7 +419,7 @@ public class NamespaceComparator {
List<AnnotationDescriptor> annotations = filterAnnotations(fun.getAnnotations()); List<AnnotationDescriptor> annotations = filterAnnotations(fun.getAnnotations());
if (!annotations.isEmpty()) { if (!annotations.isEmpty()) {
new Serializer(sb).serializeSeparated(annotations, " "); new Serializer(checkPrimaryConstructors, sb).serializeSeparated(annotations, " ");
sb.append(" "); sb.append(" ");
} }
@@ -416,17 +429,22 @@ public class NamespaceComparator {
if (fun.getKind() != CallableMemberDescriptor.Kind.DECLARATION) { if (fun.getKind() != CallableMemberDescriptor.Kind.DECLARATION) {
sb.append("/*"); sb.append("/*");
new Serializer(sb).serialize(fun.getKind()); new Serializer(checkPrimaryConstructors, sb).serialize(fun.getKind());
sb.append("*/ "); sb.append("*/ ");
} }
if (fun instanceof ConstructorDescriptor) { if (fun instanceof ConstructorDescriptor) {
sb.append("/*constructor*/ "); if (((ConstructorDescriptor) fun).isPrimary() && checkPrimaryConstructors) {
sb.append("/*primary constructor*/ ");
}
else {
sb.append("/*constructor*/ ");
}
} }
sb.append("fun "); sb.append("fun ");
if (!fun.getTypeParameters().isEmpty()) { if (!fun.getTypeParameters().isEmpty()) {
sb.append("<"); sb.append("<");
new Serializer(sb).serializeCommaSeparated(fun.getTypeParameters()); new Serializer(checkPrimaryConstructors, sb).serializeCommaSeparated(fun.getTypeParameters());
sb.append(">"); sb.append(">");
} }
@@ -483,7 +501,7 @@ public class NamespaceComparator {
List<AnnotationDescriptor> annotations = filterAnnotations(prop.getAnnotations()); List<AnnotationDescriptor> annotations = filterAnnotations(prop.getAnnotations());
if (!annotations.isEmpty()) { if (!annotations.isEmpty()) {
new Serializer(sb).serializeSeparated(annotations, " "); new Serializer(checkPrimaryConstructors, sb).serializeSeparated(annotations, " ");
sb.append(" "); sb.append(" ");
} }
@@ -493,7 +511,7 @@ public class NamespaceComparator {
if (prop.getKind() != CallableMemberDescriptor.Kind.DECLARATION) { if (prop.getKind() != CallableMemberDescriptor.Kind.DECLARATION) {
sb.append("/*"); sb.append("/*");
new Serializer(sb).serialize(prop.getKind()); new Serializer(checkPrimaryConstructors, sb).serialize(prop.getKind());
sb.append("*/ "); sb.append("*/ ");
} }
@@ -505,7 +523,7 @@ public class NamespaceComparator {
} }
if (!prop.getTypeParameters().isEmpty()) { if (!prop.getTypeParameters().isEmpty()) {
sb.append(" <"); sb.append(" <");
new Serializer(sb).serializeCommaSeparated(prop.getTypeParameters()); new Serializer(checkPrimaryConstructors, sb).serializeCommaSeparated(prop.getTypeParameters());
sb.append("> "); sb.append("> ");
} }
sb.append("!"); sb.append("!");
@@ -642,7 +660,7 @@ public class NamespaceComparator {
private static final MethodCache TYPE_SERIALIZER_METHOD_CACHE = new MethodCache(TypeSerializer.class); private static final MethodCache TYPE_SERIALIZER_METHOD_CACHE = new MethodCache(TypeSerializer.class);
public TypeSerializer(StringBuilder sb) { public TypeSerializer(StringBuilder sb) {
super(sb); super(false, sb);
} }
@Override @Override
@@ -689,8 +707,8 @@ public class NamespaceComparator {
private static final MethodCache NAMESPACE_PREFIX_SERIALIZER_METHOD_CACHE = new MethodCache(NamespacePrefixSerializer.class); private static final MethodCache NAMESPACE_PREFIX_SERIALIZER_METHOD_CACHE = new MethodCache(NamespacePrefixSerializer.class);
public NamespacePrefixSerializer(StringBuilder sb) { private NamespacePrefixSerializer(boolean checkPrimaryConstructors, StringBuilder sb) {
super(sb); super(checkPrimaryConstructors, sb);
} }
@Override @Override
@@ -717,8 +735,8 @@ public class NamespaceComparator {
private static final MethodCache FULL_CONTENT_SERIALIZER_METHOD_CACHE = new MethodCache(FullContentSerialier.class); private static final MethodCache FULL_CONTENT_SERIALIZER_METHOD_CACHE = new MethodCache(FullContentSerialier.class);
private class FullContentSerialier extends Serializer { private class FullContentSerialier extends Serializer {
private FullContentSerialier(StringBuilder sb) { private FullContentSerialier(boolean checkPrimaryConstructors, StringBuilder sb) {
super(sb); super(checkPrimaryConstructors, sb);
} }
@Override @Override
@@ -729,7 +747,7 @@ public class NamespaceComparator {
public void serialize(ClassDescriptor klass) { public void serialize(ClassDescriptor klass) {
if (!klass.getAnnotations().isEmpty()) { if (!klass.getAnnotations().isEmpty()) {
new Serializer(sb).serializeSeparated(klass.getAnnotations(), " "); new Serializer(checkPrimaryConstructors, sb).serializeSeparated(klass.getAnnotations(), " ");
sb.append(" "); sb.append(" ");
} }
serialize(klass.getVisibility()); serialize(klass.getVisibility());
@@ -741,7 +759,7 @@ public class NamespaceComparator {
sb.append(" "); sb.append(" ");
sb.append("!"); sb.append("!");
new Serializer(sb).serialize(klass); new Serializer(checkPrimaryConstructors, sb).serialize(klass);
if (!klass.getTypeConstructor().getParameters().isEmpty()) { if (!klass.getTypeConstructor().getParameters().isEmpty()) {
sb.append("<"); sb.append("<");
@@ -765,7 +783,7 @@ public class NamespaceComparator {
for (ConstructorDescriptor constructor : klass.getConstructors()) { for (ConstructorDescriptor constructor : klass.getConstructors()) {
StringBuilder constructorSb = new StringBuilder(); StringBuilder constructorSb = new StringBuilder();
new Serializer(constructorSb).serialize(constructor); new Serializer(checkPrimaryConstructors, constructorSb).serialize(constructor);
memberStrings.add(constructorSb.toString()); memberStrings.add(constructorSb.toString());
} }
@@ -777,13 +795,13 @@ public class NamespaceComparator {
} }
} }
StringBuilder memberSb = new StringBuilder(); StringBuilder memberSb = new StringBuilder();
new FullContentSerialier(memberSb).serialize(member); new FullContentSerialier(checkPrimaryConstructors, memberSb).serialize(member);
memberStrings.add(memberSb.toString()); memberStrings.add(memberSb.toString());
} }
for (DeclarationDescriptor object : memberScope.getObjectDescriptors()) { for (DeclarationDescriptor object : memberScope.getObjectDescriptors()) {
StringBuilder objectSb = new StringBuilder(); StringBuilder objectSb = new StringBuilder();
new FullContentSerialier(objectSb).serialize(object); new FullContentSerialier(checkPrimaryConstructors, objectSb).serialize(object);
memberStrings.add(objectSb.toString()); memberStrings.add(objectSb.toString());
} }
@@ -807,7 +825,7 @@ public class NamespaceComparator {
private class ClassObjectSerializer extends FullContentSerialier { private class ClassObjectSerializer extends FullContentSerialier {
private ClassObjectSerializer(StringBuilder sb) { private ClassObjectSerializer(StringBuilder sb) {
super(sb); super(false, sb);
} }
@Override @Override
@@ -172,9 +172,9 @@ public class GenerateTests {
"compiler/tests/", "compiler/tests/",
"LazyResolveNamespaceComparingTestGenerated", "LazyResolveNamespaceComparingTestGenerated",
AbstractLazyResolveNamespaceComparingTest.class, AbstractLazyResolveNamespaceComparingTest.class,
testModel("compiler/testData/loadKotlin", "doTestSinglePackage"), testModel("compiler/testData/loadKotlin", "doTestCheckingConstructors"),
testModel("compiler/testData/loadJava", "doTestSinglePackage"), testModel("compiler/testData/loadJava", "doTestNotCheckingConstructors"),
testModel("compiler/testData/lazyResolve/namespaceComparator", "doTestSinglePackage") testModel("compiler/testData/lazyResolve/namespaceComparator", "doTestCheckingConstructors")
); );
generateTest( generateTest(