ceylon / ceylon-spec

DEPRECATED
Apache License 2.0
108 stars 34 forks source link

refinedDeclaration != refinedDeclaration.refinedDeclaration #1435

Closed jvasileff closed 8 years ago

jvasileff commented 8 years ago

In some cases when satisfying Iterable and Sequence, refinedDeclaration does not yield the topmost declaration.

To reproduce, alter com/redhat/ceylon/model/typechecker/model/Declaration.java to have:

    public Declaration getRefinedDeclaration() {
        if (actualCompleter != null) {
            completeActual();
        }
        if (! refinedDeclaration.equals(refinedDeclaration.refinedDeclaration)) {
            System.out.println("**** Ooops:");
            System.out.println("  " + this);
            System.out.println("  " + refinedDeclaration);
            System.out.println("  " + refinedDeclaration.refinedDeclaration);
        }
        return refinedDeclaration;
    }

and run ant clean publish in ceylon-dist.

Partial output:

ceylon.language.java:
[ceylon-compile] **** Ooops:
[ceylon-compile]   value ArraySequence<Element>.size => Integer
[ceylon-compile]   value Sequence<Element>.size => Integer
[ceylon-compile]   value Iterable<Element,Absent>.size => Integer
[ceylon-compile] **** Ooops:
[ceylon-compile]   value ArraySequence<Element>.size => Integer
[ceylon-compile]   value Sequence<Element>.size => Integer
[ceylon-compile]   value Iterable<Element,Absent>.size => Integer
[ceylon-compile] **** Ooops:
[ceylon-compile]   value ArraySequence<Element>.rest => Element[]
[ceylon-compile]   value Sequence<Element>.rest => Element[]
[ceylon-compile]   value Iterable<Element,Absent>.rest => {Element*}
[ceylon-compile] **** Ooops:
[ceylon-compile]   value ArraySequence<Element>.rest => Element[]
[ceylon-compile]   value Sequence<Element>.rest => Element[]
[ceylon-compile]   value Iterable<Element,Absent>.rest => {Element*}
[ceylon-compile] **** Ooops:
[ceylon-compile]   value anonymous#9.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String
[ceylon-compile] **** Ooops:
[ceylon-compile]   value anonymous#9.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String
[ceylon-compile] **** Ooops:
[ceylon-compile]   value Iterable<Element,Absent>.repeat.anonymous#16.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String
[ceylon-compile] **** Ooops:
[ceylon-compile]   value Iterable<Element,Absent>.repeat.anonymous#16.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String
[ceylon-compile] **** Ooops:
[ceylon-compile]   value anonymous#17.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String
[ceylon-compile] **** Ooops:
[ceylon-compile]   value anonymous#17.string => String
[ceylon-compile]   value Iterable<Element,Absent>.string => String
[ceylon-compile]   value Object.string => String

Edit: changed != to ! x.equals(y)

gavinking commented 8 years ago

@jvasileff thanks so much for noticing and reporting this one—it could have gone under the radar causing tiny subtle problems for ages w/o us noticing...