langtools/src/jdk.jshell/share/classes/jdk/jshell/VarTypePrinter.java
author rfield
Wed, 08 Feb 2017 10:43:16 -0800
changeset 43758 868af3718a21
parent 43140 1e40241dc2d4
child 44186 fe848a208b20
permissions -rw-r--r--
8173845: JShell API: not patch compatible Reviewed-by: jlahoda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43134
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     1
/*
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     4
 *
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    10
 *
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    15
 * accompanied this code).
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    16
 *
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    20
 *
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    23
 * questions.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    24
 */
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    25
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    26
package jdk.jshell;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    27
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    28
import java.util.HashSet;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    29
import com.sun.tools.javac.code.Type;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    30
import com.sun.tools.javac.code.Type.ClassType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    31
import com.sun.tools.javac.util.JavacMessages;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    32
import java.util.Locale;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    33
import java.util.Set;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    34
import java.util.function.BinaryOperator;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    35
import com.sun.tools.javac.code.BoundKind;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    36
import com.sun.tools.javac.code.Flags;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    37
import com.sun.tools.javac.code.Symtab;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    38
import com.sun.tools.javac.code.Type.CapturedType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    39
import com.sun.tools.javac.code.Type.TypeMapping;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    40
import com.sun.tools.javac.code.Type.TypeVar;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    41
import com.sun.tools.javac.code.Type.WildcardType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    42
import com.sun.tools.javac.code.Types;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    43
import com.sun.tools.javac.code.Types.SimpleVisitor;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    44
import com.sun.tools.javac.util.List;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    45
import static com.sun.tools.javac.code.BoundKind.EXTENDS;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    46
import static com.sun.tools.javac.code.BoundKind.SUPER;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    47
import static com.sun.tools.javac.code.BoundKind.UNBOUND;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    48
import static com.sun.tools.javac.code.Type.ArrayType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    49
import static com.sun.tools.javac.code.TypeTag.BOT;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    50
import static com.sun.tools.javac.code.TypeTag.WILDCARD;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    51
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    52
/**
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    53
 * Print variable types in source form.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    54
 * TypeProjection and CaptureScanner are copied from Types in the JEP-286
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    55
 * Sandbox by Maurizio.  The checks for Non-Denotable in TypePrinter are
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    56
 * cribbed from denotableChecker of the same source.
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    57
 *
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    58
 * @author Maurizio Cimadamore
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    59
 * @author Robert Field
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    60
 */
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    61
class VarTypePrinter extends TypePrinter {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    62
    private static final String WILD = "?";
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    63
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    64
    private final Symtab syms;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    65
    private final Types types;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    66
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    67
    VarTypePrinter(JavacMessages messages, BinaryOperator<String> fullClassNameAndPackageToClass,
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    68
            Symtab syms, Types types) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    69
        super(messages, fullClassNameAndPackageToClass);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    70
        this.syms = syms;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    71
        this.types = types;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    72
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    73
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    74
    @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    75
    String toString(Type t) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    76
        return super.toString(upward(t));
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    77
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    78
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    79
    @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    80
    public String visitTypeVar(TypeVar t, Locale locale) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    81
        /* Any type variable mentioned in the inferred type must have been declared as a type parameter
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    82
                  (i.e cannot have been produced by inference (18.4))
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    83
         */
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    84
        // and beyond that, there are no global type vars, so if there are any
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    85
        // type variables left, they need to be eliminated
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    86
        return WILD; // Non-denotable
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    87
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    88
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    89
    @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    90
    public String visitCapturedType(CapturedType t, Locale locale) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    91
        /* Any type variable mentioned in the inferred type must have been declared as a type parameter
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    92
                  (i.e cannot have been produced by capture conversion (5.1.10))
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    93
         */
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    94
        return WILD; // Non-denotable
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    95
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    96
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    97
    public Type upward(Type t) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    98
        List<Type> captures = captures(t);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
    99
        return upward(t, captures);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   100
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   101
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   102
    /************* Following from JEP-286 Types.java ***********/
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   103
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   104
    public Type upward(Type t, List<Type> vars) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   105
        return t.map(new TypeProjection(vars), true);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   106
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   107
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   108
    public List<Type> captures(Type t) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   109
        CaptureScanner cs = new CaptureScanner();
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   110
        Set<Type> captures = new HashSet<>();
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   111
        cs.visit(t, captures);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   112
        return List.from(captures);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   113
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   114
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   115
    class CaptureScanner extends SimpleVisitor<Void, Set<Type>> {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   116
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   117
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   118
        public Void visitType(Type t, Set<Type> types) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   119
            return null;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   120
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   121
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   122
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   123
        public Void visitClassType(ClassType t, Set<Type> seen) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   124
            if (t.isCompound()) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   125
                types.directSupertypes(t).forEach(s -> visit(s, seen));
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   126
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   127
                t.allparams().forEach(ta -> visit(ta, seen));
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   128
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   129
            return null;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   130
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   131
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   132
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   133
        public Void visitArrayType(ArrayType t, Set<Type> seen) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   134
            return visit(t.elemtype, seen);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   135
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   136
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   137
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   138
        public Void visitWildcardType(WildcardType t, Set<Type> seen) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   139
            visit(t.type, seen);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   140
            return null;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   141
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   142
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   143
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   144
        public Void visitTypeVar(TypeVar t, Set<Type> seen) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   145
            if ((t.tsym.flags() & Flags.SYNTHETIC) != 0 && seen.add(t)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   146
                visit(t.getUpperBound(), seen);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   147
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   148
            return null;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   149
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   150
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   151
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   152
        public Void visitCapturedType(CapturedType t, Set<Type> seen) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   153
            if (seen.add(t)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   154
                visit(t.getUpperBound(), seen);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   155
                visit(t.getLowerBound(), seen);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   156
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   157
            return null;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   158
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   159
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   160
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   161
    class TypeProjection extends TypeMapping<Boolean> {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   162
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   163
        List<Type> vars;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   164
        Set<Type> seen = new HashSet<>();
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   165
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   166
        public TypeProjection(List<Type> vars) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   167
            this.vars = vars;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   168
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   169
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   170
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   171
        public Type visitClassType(ClassType t, Boolean upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   172
            if (upward && !t.isCompound() && t.tsym.name.isEmpty()) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   173
                //lift anonymous class type to first supertype (class or interface)
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   174
                return types.directSupertypes(t).last();
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   175
            } else if (t.isCompound()) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   176
                List<Type> components = types.directSupertypes(t);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   177
                List<Type> components1 = components.map(c -> c.map(this, upward));
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   178
                if (components == components1) return t;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   179
                else return types.makeIntersectionType(components1);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   180
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   181
                Type outer = t.getEnclosingType();
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   182
                Type outer1 = visit(outer, upward);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   183
                List<Type> typarams = t.getTypeArguments();
43140
1e40241dc2d4 8172530: JShell: TypeProjection .stream().map(...).collect(...) must be replaced with .map(...)
rfield
parents: 43134
diff changeset
   184
                List<Type> typarams1 = typarams.map(ta -> mapTypeArgument(ta, upward));
43134
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   185
                if (typarams1.stream().anyMatch(ta -> ta.hasTag(BOT))) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   186
                    //not defined
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   187
                    return syms.botType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   188
                }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   189
                if (outer1 == outer && typarams1 == typarams) return t;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   190
                else return new ClassType(outer1, typarams1, t.tsym, t.getMetadata()) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   191
                    @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   192
                    protected boolean needsStripping() {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   193
                        return true;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   194
                    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   195
                };
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   196
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   197
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   198
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   199
        protected Type makeWildcard(Type upper, Type lower) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   200
            BoundKind bk;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   201
            Type bound;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   202
            if (upper.hasTag(BOT)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   203
                upper = syms.objectType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   204
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   205
            boolean isUpperObject = types.isSameType(upper, syms.objectType);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   206
            if (!lower.hasTag(BOT) && isUpperObject) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   207
                bound = lower;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   208
                bk = SUPER;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   209
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   210
                bound = upper;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   211
                bk = isUpperObject ? UNBOUND : EXTENDS;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   212
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   213
            return new WildcardType(bound, bk, syms.boundClass);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   214
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   215
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   216
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   217
        public Type visitTypeVar(TypeVar t, Boolean upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   218
            if (vars.contains(t)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   219
                try {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   220
                    if (seen.add(t)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   221
                        return (upward ?
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   222
                                t.getUpperBound() :
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   223
                                (t.getLowerBound() == null) ?
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   224
                                        syms.botType :
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   225
                                        t.getLowerBound())
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   226
                                    .map(this, upward);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   227
                    } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   228
                        //cycle
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   229
                        return syms.objectType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   230
                    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   231
                } finally {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   232
                    seen.remove(t);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   233
                }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   234
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   235
                return t;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   236
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   237
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   238
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   239
        @Override
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   240
        public Type visitWildcardType(WildcardType wt, Boolean upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   241
            if (upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   242
                return wt.isExtendsBound() ?
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   243
                        wt.type.map(this, upward) :
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   244
                        syms.objectType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   245
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   246
                return wt.isSuperBound() ?
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   247
                        wt.type.map(this, upward) :
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   248
                        syms.botType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   249
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   250
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   251
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   252
        private Type mapTypeArgument(Type t, boolean upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   253
            if (!t.containsAny(vars)) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   254
                return t;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   255
            } else if (!t.hasTag(WILDCARD) && !upward) {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   256
                //not defined
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   257
                return syms.botType;
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   258
            } else {
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   259
                Type upper = t.map(this, upward);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   260
                Type lower = t.map(this, !upward);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   261
                return makeWildcard(upper, lower);
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   262
            }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   263
        }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   264
    }
006808ae5f6e 8171981: JShell: Fails compilation: new Object().getClass().getSuperclass()
rfield
parents:
diff changeset
   265
}