blob: aac3c9cd2181ccc9337a7d11157889cacb87c382 [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 groovy.transform.CompileStatic
import org.codehaus.groovy.control.CompilationUnit
import static org.codehaus.groovy.control.Phases.CLASS_GENERATION
@CompileStatic
final class Groovy9074 extends GroovyTestCase {
void _FIXME_testWildcardCapture() {
def err = shouldFail '''
@groovy.transform.CompileStatic
class Main {
private static Collection<?> c = new ArrayList<String>()
static main(args) {
c.add(new Object())
}
}
'''
// TODO: This is just a sample message; Java produces this for the equivalent code.
assert err =~ / The method add\(capture#1-of \?\) in the type Collection<capture#1-of \?> is not applicable for the arguments \(Object\)/
}
void _FIXME_testWildcardExtends() {
def err = shouldFail '''
import java.awt.Canvas
abstract class Shape {
abstract void draw(Canvas c)
}
class Circle extends Shape {
private int x, y, radius
@Override void draw(Canvas c) {}
}
class Rectangle extends Shape {
private int x, y, width, height
@Override void draw(Canvas c) {}
}
@groovy.transform.CompileStatic
void addRectangle(List<? extends Shape> shapes) {
shapes.add(0, new Rectangle()) // TODO: compile-time error!
}
'''
// TODO: This is just a sample message; Java produces this for the equivalent code.
assert err =~ / The method add(capture#1-of \?) in the type List<capture#1-of \?> is not applicable for the arguments \(Rectangle\)/
}
void testWildcardSuper() {
assertScript '''
import java.awt.Canvas
abstract class Shape {
abstract void draw(Canvas c)
}
class Circle extends Shape {
private int x, y, radius
@Override void draw(Canvas c) {}
}
class Rectangle extends Shape {
private int x, y, width, height
@Override void draw(Canvas c) {}
}
@groovy.transform.CompileStatic
void addRectangle(List<? super Shape> shapes) {
shapes.add(0, new Rectangle())
}
List<Shape> list = []
addRectangle(list)
assert list.size() == 1
assert list.get(0) instanceof Rectangle
'''
}
void testWildcardExtends2() {
new CompilationUnit().with {
addSource 'Main.groovy', '''
class Factory {
def <T> T make(Class<T> type, ... args) {}
}
@groovy.transform.CompileStatic
void test(Factory fact, Rule rule) {
Type bean = fact.make(rule.type)
}
'''
addSource 'Rule.groovy', '''
class Rule {
Class<? extends Type> getType() {
}
}
'''
addSource 'Type.groovy', '''
interface Type {
}
'''
compile CLASS_GENERATION
}
}
void _FIXME_testWildcardSuper2() {
new CompilationUnit().with {
addSource 'Main.groovy', '''
class Factory {
def <T> T make(Class<T> type, ... args) {}
}
@groovy.transform.CompileStatic
void test(Factory fact, Rule rule) {
Type bean = fact.make(rule.type) // can't assign "? super Type" to "Type"
}
'''
addSource 'Rule.groovy', '''
class Rule {
Class<? super Type> getType() {
}
}
'''
addSource 'Type.groovy', '''
interface Type {
}
'''
def err = shouldFail {
compile CLASS_GENERATION
}
assert err =~ "cannot convert from capture#1-of ? super Type to Type"
}
}
}