blob: 99c1a07921e9d4ed3b0614cfc7a67e4d1d1ffef1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package groovy.bugs
import groovy.test.GroovyTestCase
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.tools.FileSystemCompiler
class Groovy6755Bug extends GroovyTestCase {
public void testDeeepGenericJointCompilationImportResolution() {
File workDir = new File("target/tmp/Groovy6755Bug")
workDir.deleteDir()
workDir.mkdirs()
File classesDir = new File(workDir, "classes")
classesDir.mkdirs()
final File itemJava = new File(workDir, "a/Item.java");
itemJava.parentFile.mkdirs()
itemJava.text = """
package a;
public interface Item {
}
"""
final File itemListListGroovy = new File(workDir, "b/ItemListList.groovy");
itemListListGroovy.parentFile.mkdirs()
itemListListGroovy.text = """
package b
// Use a star import from a different package here to expose the bug
import a.*
import java.util.List
class ItemListList {
// The local class must be a generic type of a generic type
static List<List<Item>> ITEMS
}
"""
try {
// needs to be joint compiler
FileSystemCompiler.commandLineCompile(
"-j -sourcepath ${workDir.path} -d ${classesDir.path} ${itemJava.path} ${itemListListGroovy.path}".
split(' '), true)
// So the bug would produce an ItemListList with a field of type:
// java.util.List<java.util.List<Item>>
// note that Item is not fully qualified as a.Item as it should be
// and thus reference to the class will fail during loading. Instead
// of analysing the class, We'll just trigger a classload of it
// to ensure that it ended up being valid. If the bug exists,
// then we should get an error like 'Type Item not present'
CompilerConfiguration cc = new CompilerConfiguration();
cc.setClasspath(classesDir.path);
// I'm sure there's a nicer way of triggering this via the classloader, but this will do
new GroovyShell(cc).evaluate("""
import b.ItemListList
def x = ItemListList.ITEMS
""")
} finally {
workDir.deleteDir()
}
}
}