From e317764a88207ca0a428eb909305ffe054f59a3d Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sun, 16 Sep 2012 10:08:36 +0300 Subject: [PATCH] correct access flags for package private (coming from java) #KT-2781 fixed --- .../jet/compiler/android/SpecialFiles.java | 5 ++- .../jetbrains/jet/codegen/CodegenUtil.java | 6 ++-- .../jet/codegen/GeneratedClassLoader.java | 10 ++++-- .../resolve/java/JavaDescriptorResolver.java | 2 +- .../testData/codegen/regressions/kt2781.java | 25 ++++++++++++++ .../testData/codegen/regressions/kt2781.kt | 1 + .../jetbrains/jet/codegen/ClassGenTest.java | 5 +++ .../jet/codegen/CodegenTestCase.java | 34 ++++++++++++++++--- 8 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2781.java create mode 100644 compiler/testData/codegen/regressions/kt2781.kt diff --git a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java index 4dfbbd1e203..ff4b0e87ae5 100644 --- a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java +++ b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/SpecialFiles.java @@ -19,7 +19,8 @@ package org.jetbrains.jet.compiler.android; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import java.util.*; +import java.util.Map; +import java.util.Set; /** * @author Natalia.Ukhorskaya @@ -120,6 +121,8 @@ public class SpecialFiles { excludedFiles.add("kt1779.kt"); // Bug KT-2202 - private fun tryToComputeNext() in AbstractIterator.kt excludedFiles.add("kt344.jet"); // Bug KT-2251 excludedFiles.add("kt529.kt"); // Bug + + excludedFiles.add("kt2981.kt"); // with java } private SpecialFiles() { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 96d9d9101d8..7ffa3ff9d97 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -37,10 +37,7 @@ import org.jetbrains.jet.lang.psi.JetClassObject; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetObjectDeclaration; import org.jetbrains.jet.lang.resolve.DescriptorUtils; -import org.jetbrains.jet.lang.resolve.java.JvmAbi; -import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; -import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; @@ -70,6 +67,7 @@ public class CodegenUtil { .put(Visibilities.PUBLIC, ACC_PUBLIC) .put(Visibilities.INTERNAL, ACC_PUBLIC) .put(Visibilities.LOCAL, NO_FLAG_LOCAL) + .put(JavaDescriptorResolver.PACKAGE_VISIBILITY, NO_FLAG_PACKAGE_PRIVATE) .build(); private static final Set PRIMITIVE_NUMBER_CLASSES = Sets.newHashSet( diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java index af9b12388ca..8e15208ddb4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java @@ -18,14 +18,18 @@ package org.jetbrains.jet.codegen; import org.jetbrains.annotations.NotNull; +import java.net.URL; +import java.net.URLClassLoader; + /** * @author yole + * @author alex.tkachman */ -public class GeneratedClassLoader extends ClassLoader { +public class GeneratedClassLoader extends URLClassLoader { private ClassFileFactory state; - public GeneratedClassLoader(@NotNull ClassFileFactory state, ClassLoader parentClassLoader) { - super(parentClassLoader); + public GeneratedClassLoader(@NotNull ClassFileFactory state, ClassLoader parentClassLoader, URL...urls) { + super(urls, parentClassLoader); this.state = state; } 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 1a9b6a5b2c0..66130db9c49 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 @@ -72,7 +72,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public static final ModuleDescriptor FAKE_ROOT_MODULE = new ModuleDescriptor(JAVA_ROOT); - private static Visibility PACKAGE_VISIBILITY = new Visibility("package", false) { + public static Visibility PACKAGE_VISIBILITY = new Visibility("package", false) { @Override protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { NamespaceDescriptor parentPackage = DescriptorUtils.getParentOfType(what, NamespaceDescriptor.class); diff --git a/compiler/testData/codegen/regressions/kt2781.java b/compiler/testData/codegen/regressions/kt2781.java new file mode 100644 index 00000000000..e56dc828fa8 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2781.java @@ -0,0 +1,25 @@ +/* + * 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. + */ + +import java.lang.String; + +class J { + String value; + + J(String value) { + this.value = value; + } +} diff --git a/compiler/testData/codegen/regressions/kt2781.kt b/compiler/testData/codegen/regressions/kt2781.kt new file mode 100644 index 00000000000..e55a25ffd59 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2781.kt @@ -0,0 +1 @@ +fun box() = J("OK").value diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 114151cd4e0..066ed9d83e1 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -601,4 +601,9 @@ public class ClassGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt2626.kt"); } + + public void testKt2781() throws Exception { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFileWithJava("regressions/kt2781.kt", true); + } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index e3386b20590..e46f2d47e22 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -156,8 +156,12 @@ public abstract class CodegenTestCase extends UsefulTestCase { } protected void blackBoxFile(String filename, String expected) { + blackBoxFile(filename, expected, false); + } + + protected void blackBoxFile(String filename, String expected, boolean classPathInTheSameClassLoader) { loadFile(filename); - blackBox(expected); + blackBox(expected, classPathInTheSameClassLoader); } protected void blackBoxFileByFullPath(String filename) { @@ -214,9 +218,13 @@ public abstract class CodegenTestCase extends UsefulTestCase { } protected void blackBox(String expected) { + blackBox(expected, false); + } + + protected void blackBox(String expected, boolean classPathInTheSameClassLoader) { GenerationState state = generateClassesInFileGetState(); - GeneratedClassLoader loader = createClassLoader(state.getFactory()); + GeneratedClassLoader loader = createClassLoader(state.getFactory(), classPathInTheSameClassLoader); String r; @@ -275,6 +283,10 @@ public abstract class CodegenTestCase extends UsefulTestCase { } protected void blackBoxFileWithJava(@NotNull String ktFile) throws Exception { + blackBoxFileWithJava(ktFile, false); + } + + protected void blackBoxFileWithJava(@NotNull String ktFile, boolean classPathInTheSameClassLoader) throws Exception { File javaClassesTempDirectory = new File(FileUtil.getTempDirectory(), "java-classes"); JetTestUtils.mkdirs(javaClassesTempDirectory); List options = Arrays.asList( @@ -287,10 +299,14 @@ public abstract class CodegenTestCase extends UsefulTestCase { myEnvironment = new JetCoreEnvironment(getTestRootDisposable(), CompileCompilerDependenciesTest.compilerConfigurationForTests( ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK, JetTestUtils.getAnnotationsJar(), javaClassesTempDirectory)); - blackBoxFile(ktFile); + blackBoxFile(ktFile, "OK", classPathInTheSameClassLoader); } protected GeneratedClassLoader createClassLoader(ClassFileFactory codegens) { + return createClassLoader(codegens, false); + } + + protected GeneratedClassLoader createClassLoader(ClassFileFactory codegens, boolean classPathInTheSameClassLoader) { List urls = Lists.newArrayList(); for (File file : myEnvironment.getConfiguration().getList(JVMConfigurationKeys.CLASSPATH_KEY)) { try { @@ -299,8 +315,16 @@ public abstract class CodegenTestCase extends UsefulTestCase { throw new RuntimeException(e); } } - ClassLoader parentClassLoader = new URLClassLoader(urls.toArray(new URL[0]), CodegenTestCase.class.getClassLoader()); - return new GeneratedClassLoader(codegens, parentClassLoader); + + final URL[] urlsArray = urls.toArray(new URL[0]); + + if (!classPathInTheSameClassLoader) { + ClassLoader parentClassLoader = new URLClassLoader(urlsArray, CodegenTestCase.class.getClassLoader()); + return new GeneratedClassLoader(codegens, parentClassLoader); + } + else { + return new GeneratedClassLoader(codegens, CodegenTestCase.class.getClassLoader(), urlsArray); + } } protected String generateToText() {